diff options
Diffstat (limited to 'tests/modules/testrdb.c')
-rw-r--r-- | tests/modules/testrdb.c | 136 |
1 files changed, 94 insertions, 42 deletions
diff --git a/tests/modules/testrdb.c b/tests/modules/testrdb.c index 5d9382a3a..6786fdf2e 100644 --- a/tests/modules/testrdb.c +++ b/tests/modules/testrdb.c @@ -13,39 +13,47 @@ RedisModuleType *testrdb_type = NULL; RedisModuleString *before_str = NULL; RedisModuleString *after_str = NULL; -void replBackupCallback(RedisModuleCtx *ctx, RedisModuleEvent e, uint64_t sub, void *data) +/* Global values used to keep aux from db being loaded (in case of async_loading) */ +RedisModuleString *before_str_temp = NULL; +RedisModuleString *after_str_temp = NULL; + +/* Indicates whether there is an async replication in progress. + * We control this value from RedisModuleEvent_ReplAsyncLoad events. */ +int async_loading = 0; + +void replAsyncLoadCallback(RedisModuleCtx *ctx, RedisModuleEvent e, uint64_t sub, void *data) { REDISMODULE_NOT_USED(e); REDISMODULE_NOT_USED(data); - static RedisModuleString *before_str_backup = NULL; - static RedisModuleString *after_str_backup = NULL; switch (sub) { - case REDISMODULE_SUBEVENT_REPL_BACKUP_CREATE: - assert(before_str_backup == NULL); - assert(after_str_backup == NULL); - before_str_backup = before_str; - after_str_backup = after_str; - before_str = NULL; - after_str = NULL; + case REDISMODULE_SUBEVENT_REPL_ASYNC_LOAD_STARTED: + assert(async_loading == 0); + async_loading = 1; break; - case REDISMODULE_SUBEVENT_REPL_BACKUP_RESTORE: + case REDISMODULE_SUBEVENT_REPL_ASYNC_LOAD_ABORTED: + /* Discard temp aux */ + if (before_str_temp) + RedisModule_FreeString(ctx, before_str_temp); + if (after_str_temp) + RedisModule_FreeString(ctx, after_str_temp); + before_str_temp = NULL; + after_str_temp = NULL; + + async_loading = 0; + break; + case REDISMODULE_SUBEVENT_REPL_ASYNC_LOAD_COMPLETED: if (before_str) RedisModule_FreeString(ctx, before_str); if (after_str) RedisModule_FreeString(ctx, after_str); - before_str = before_str_backup; - after_str = after_str_backup; - before_str_backup = NULL; - after_str_backup = NULL; - break; - case REDISMODULE_SUBEVENT_REPL_BACKUP_DISCARD: - if (before_str_backup) - RedisModule_FreeString(ctx, before_str_backup); - if (after_str_backup) - RedisModule_FreeString(ctx, after_str_backup); - before_str_backup = NULL; - after_str_backup = NULL; + before_str = before_str_temp; + after_str = after_str_temp; + + before_str_temp = NULL; + after_str_temp = NULL; + + async_loading = 0; break; default: assert(0); @@ -105,24 +113,47 @@ int testrdb_aux_load(RedisModuleIO *rdb, int encver, int when) { if (conf_aux_count==0) assert(0); RedisModuleCtx *ctx = RedisModule_GetContextFromIO(rdb); if (when == REDISMODULE_AUX_BEFORE_RDB) { - if (before_str) - RedisModule_FreeString(ctx, before_str); - before_str = NULL; - int count = RedisModule_LoadSigned(rdb); - if (RedisModule_IsIOError(rdb)) - return REDISMODULE_ERR; - if (count) - before_str = RedisModule_LoadString(rdb); + if (async_loading == 0) { + if (before_str) + RedisModule_FreeString(ctx, before_str); + before_str = NULL; + int count = RedisModule_LoadSigned(rdb); + if (RedisModule_IsIOError(rdb)) + return REDISMODULE_ERR; + if (count) + before_str = RedisModule_LoadString(rdb); + } else { + if (before_str_temp) + RedisModule_FreeString(ctx, before_str_temp); + before_str_temp = NULL; + int count = RedisModule_LoadSigned(rdb); + if (RedisModule_IsIOError(rdb)) + return REDISMODULE_ERR; + if (count) + before_str_temp = RedisModule_LoadString(rdb); + } } else { - if (after_str) - RedisModule_FreeString(ctx, after_str); - after_str = NULL; - int count = RedisModule_LoadSigned(rdb); - if (RedisModule_IsIOError(rdb)) - return REDISMODULE_ERR; - if (count) - after_str = RedisModule_LoadString(rdb); + if (async_loading == 0) { + if (after_str) + RedisModule_FreeString(ctx, after_str); + after_str = NULL; + int count = RedisModule_LoadSigned(rdb); + if (RedisModule_IsIOError(rdb)) + return REDISMODULE_ERR; + if (count) + after_str = RedisModule_LoadString(rdb); + } else { + if (after_str_temp) + RedisModule_FreeString(ctx, after_str_temp); + after_str_temp = NULL; + int count = RedisModule_LoadSigned(rdb); + if (RedisModule_IsIOError(rdb)) + return REDISMODULE_ERR; + if (count) + after_str_temp = RedisModule_LoadString(rdb); + } } + if (RedisModule_IsIOError(rdb)) return REDISMODULE_ERR; return REDISMODULE_OK; @@ -162,6 +193,21 @@ int testrdb_get_before(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) return REDISMODULE_OK; } +/* For purpose of testing module events, expose variable state during async_loading. */ +int testrdb_async_loading_get_before(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) +{ + REDISMODULE_NOT_USED(argv); + if (argc != 1){ + RedisModule_WrongArity(ctx); + return REDISMODULE_OK; + } + if (before_str_temp) + RedisModule_ReplyWithString(ctx, before_str_temp); + else + RedisModule_ReplyWithStringBuffer(ctx, "", 0); + return REDISMODULE_OK; +} + int testrdb_set_after(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { if (argc != 2){ @@ -226,11 +272,10 @@ int testrdb_get_key(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { REDISMODULE_NOT_USED(argv); REDISMODULE_NOT_USED(argc); - if (RedisModule_Init(ctx,"testrdb",1,REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR; - RedisModule_SetModuleOptions(ctx, REDISMODULE_OPTIONS_HANDLE_IO_ERRORS); + RedisModule_SetModuleOptions(ctx, REDISMODULE_OPTIONS_HANDLE_IO_ERRORS | REDISMODULE_OPTIONS_HANDLE_REPL_ASYNC_LOAD); if (argc > 0) RedisModule_StringToLongLong(argv[0], &conf_aux_count); @@ -274,6 +319,9 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) if (RedisModule_CreateCommand(ctx,"testrdb.get.before", testrdb_get_before,"",0,0,0) == REDISMODULE_ERR) return REDISMODULE_ERR; + if (RedisModule_CreateCommand(ctx,"testrdb.async_loading.get.before", testrdb_async_loading_get_before,"",0,0,0) == REDISMODULE_ERR) + return REDISMODULE_ERR; + if (RedisModule_CreateCommand(ctx,"testrdb.set.after", testrdb_set_after,"deny-oom",0,0,0) == REDISMODULE_ERR) return REDISMODULE_ERR; @@ -287,7 +335,7 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) return REDISMODULE_ERR; RedisModule_SubscribeToServerEvent(ctx, - RedisModuleEvent_ReplBackup, replBackupCallback); + RedisModuleEvent_ReplAsyncLoad, replAsyncLoadCallback); return REDISMODULE_OK; } @@ -297,5 +345,9 @@ int RedisModule_OnUnload(RedisModuleCtx *ctx) { RedisModule_FreeString(ctx, before_str); if (after_str) RedisModule_FreeString(ctx, after_str); + if (before_str_temp) + RedisModule_FreeString(ctx, before_str_temp); + if (after_str_temp) + RedisModule_FreeString(ctx, after_str_temp); return REDISMODULE_OK; } |