mirror of https://github.com/redis/redis.git
				
				
				
			Modules: RM_Replicate() test module: initial implementation.
This commit is contained in:
		
							parent
							
								
									1bca62c4b7
								
							
						
					
					
						commit
						45cd8e03ca
					
				| 
						 | 
					@ -13,7 +13,7 @@ endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.SUFFIXES: .c .so .xo .o
 | 
					.SUFFIXES: .c .so .xo .o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all: commandfilter.so testrdb.so fork.so infotest.so
 | 
					all: commandfilter.so testrdb.so fork.so infotest.so propagate.so
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.c.xo:
 | 
					.c.xo:
 | 
				
			||||||
	$(CC) -I../../src $(CFLAGS) $(SHOBJ_CFLAGS) -fPIC -c $< -o $@
 | 
						$(CC) -I../../src $(CFLAGS) $(SHOBJ_CFLAGS) -fPIC -c $< -o $@
 | 
				
			||||||
| 
						 | 
					@ -22,6 +22,7 @@ commandfilter.xo: ../../src/redismodule.h
 | 
				
			||||||
fork.xo: ../../src/redismodule.h
 | 
					fork.xo: ../../src/redismodule.h
 | 
				
			||||||
testrdb.xo: ../../src/redismodule.h
 | 
					testrdb.xo: ../../src/redismodule.h
 | 
				
			||||||
infotest.xo: ../../src/redismodule.h
 | 
					infotest.xo: ../../src/redismodule.h
 | 
				
			||||||
 | 
					propagate.xo: ../../src/redismodule.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
commandfilter.so: commandfilter.xo
 | 
					commandfilter.so: commandfilter.xo
 | 
				
			||||||
	$(LD) -o $@ $< $(SHOBJ_LDFLAGS) $(LIBS) -lc
 | 
						$(LD) -o $@ $< $(SHOBJ_LDFLAGS) $(LIBS) -lc
 | 
				
			||||||
| 
						 | 
					@ -35,3 +36,5 @@ testrdb.so: testrdb.xo
 | 
				
			||||||
infotest.so: infotest.xo
 | 
					infotest.so: infotest.xo
 | 
				
			||||||
	$(LD) -o $@ $< $(SHOBJ_LDFLAGS) $(LIBS) -lc
 | 
						$(LD) -o $@ $< $(SHOBJ_LDFLAGS) $(LIBS) -lc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					propagate.so: propagate.xo
 | 
				
			||||||
 | 
						$(LD) -o $@ $< $(SHOBJ_LDFLAGS) $(LIBS) -lc
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,82 @@
 | 
				
			||||||
 | 
					/* This module is used to test the propagation (replication + AOF) of
 | 
				
			||||||
 | 
					 * commands, via the RedisModule_Replicate() interface, in asynchronous
 | 
				
			||||||
 | 
					 * contexts, such as callbacks not implementing commands, and thread safe
 | 
				
			||||||
 | 
					 * contexts.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * We create a timer callback and a threads using a thread safe context.
 | 
				
			||||||
 | 
					 * Using both we try to propagate counters increments, and later we check
 | 
				
			||||||
 | 
					 * if the replica contains the changes as expected.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (c) 2019, Salvatore Sanfilippo <antirez at gmail dot com>
 | 
				
			||||||
 | 
					 * All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *   * Redistributions of source code must retain the above copyright notice,
 | 
				
			||||||
 | 
					 *     this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *   * Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *     notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *     documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *   * Neither the name of Redis nor the names of its contributors may be used
 | 
				
			||||||
 | 
					 *     to endorse or promote products derived from this software without
 | 
				
			||||||
 | 
					 *     specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
				
			||||||
 | 
					 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
				
			||||||
 | 
					 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
				
			||||||
 | 
					 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
				
			||||||
 | 
					 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
				
			||||||
 | 
					 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
				
			||||||
 | 
					 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
				
			||||||
 | 
					 * POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define REDISMODULE_EXPERIMENTAL_API
 | 
				
			||||||
 | 
					#include "redismodule.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Timer callback. */
 | 
				
			||||||
 | 
					void timerHandler(RedisModuleCtx *ctx, void *data) {
 | 
				
			||||||
 | 
					    REDISMODULE_NOT_USED(ctx);
 | 
				
			||||||
 | 
					    REDISMODULE_NOT_USED(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static int times = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    printf("Fired!\n");
 | 
				
			||||||
 | 
					    RedisModule_Replicate(ctx,"INCR","c","timer");
 | 
				
			||||||
 | 
					    times++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (times < 10)
 | 
				
			||||||
 | 
					        RedisModule_CreateTimer(ctx,100,timerHandler,NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int propagateTestCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    REDISMODULE_NOT_USED(argv);
 | 
				
			||||||
 | 
					    REDISMODULE_NOT_USED(argc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    RedisModuleTimerID tid = RedisModule_CreateTimer(ctx,100,timerHandler,NULL);
 | 
				
			||||||
 | 
					    REDISMODULE_NOT_USED(tid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    RedisModule_ReplyWithSimpleString(ctx,"OK");
 | 
				
			||||||
 | 
					    return REDISMODULE_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
 | 
				
			||||||
 | 
					    REDISMODULE_NOT_USED(argv);
 | 
				
			||||||
 | 
					    REDISMODULE_NOT_USED(argc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (RedisModule_Init(ctx,"propagate-test",1,REDISMODULE_APIVER_1)
 | 
				
			||||||
 | 
					            == REDISMODULE_ERR) return REDISMODULE_ERR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (RedisModule_CreateCommand(ctx,"propagate-test",
 | 
				
			||||||
 | 
					                propagateTestCommand,
 | 
				
			||||||
 | 
					                "",1,1,1) == REDISMODULE_ERR)
 | 
				
			||||||
 | 
					            return REDISMODULE_ERR;
 | 
				
			||||||
 | 
					    return REDISMODULE_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue