summaryrefslogtreecommitdiff
path: root/src/module.c
diff options
context:
space:
mode:
authorOran Agra <oran@redislabs.com>2019-07-21 17:41:03 +0300
committerOran Agra <oran@redislabs.com>2019-07-22 21:15:33 +0300
commit3b6aeea44cf8bdc64214a5f145da55453722a9a2 (patch)
tree103e66717e30499dc4a2b3c7c8ef27133a323140 /src/module.c
parentbc5cb168f504c188c7e67ca61853fd73c341fa62 (diff)
downloadredis-3b6aeea44cf8bdc64214a5f145da55453722a9a2.tar.gz
Implement module api for aux data in rdb
Other changes: * fix memory leak in error handling of rdb loading of type OBJ_MODULE
Diffstat (limited to 'src/module.c')
-rw-r--r--src/module.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/module.c b/src/module.c
index f4f753c00..812a54e04 100644
--- a/src/module.c
+++ b/src/module.c
@@ -29,6 +29,7 @@
#include "server.h"
#include "cluster.h"
+#include "rdb.h"
#include <dlfcn.h>
#define REDISMODULE_CORE 1
@@ -3078,6 +3079,11 @@ moduleType *RM_CreateDataType(RedisModuleCtx *ctx, const char *name, int encver,
moduleTypeMemUsageFunc mem_usage;
moduleTypeDigestFunc digest;
moduleTypeFreeFunc free;
+ struct {
+ moduleTypeAuxLoadFunc aux_load;
+ moduleTypeAuxSaveFunc aux_save;
+ int aux_save_triggers;
+ } v2;
} *tms = (struct typemethods*) typemethods_ptr;
moduleType *mt = zcalloc(sizeof(*mt));
@@ -3089,6 +3095,11 @@ moduleType *RM_CreateDataType(RedisModuleCtx *ctx, const char *name, int encver,
mt->mem_usage = tms->mem_usage;
mt->digest = tms->digest;
mt->free = tms->free;
+ if (tms->version >= 2) {
+ mt->aux_load = tms->v2.aux_load;
+ mt->aux_save = tms->v2.aux_save;
+ mt->aux_save_triggers = tms->v2.aux_save_triggers;
+ }
memcpy(mt->name,name,sizeof(mt->name));
listAddNodeTail(ctx->module->types,mt);
return mt;
@@ -3355,6 +3366,36 @@ loaderr:
return 0; /* Never reached. */
}
+/* Iterate over modules, and trigger rdb aux saving for the ones modules types
+ * who asked for it. */
+ssize_t rdbSaveModulesAux(rio *rdb, int when) {
+ size_t total_written = 0;
+ dictIterator *di = dictGetIterator(modules);
+ dictEntry *de;
+
+ while ((de = dictNext(di)) != NULL) {
+ struct RedisModule *module = dictGetVal(de);
+ listIter li;
+ listNode *ln;
+
+ listRewind(module->types,&li);
+ while((ln = listNext(&li))) {
+ moduleType *mt = ln->value;
+ if (!mt->aux_save || !(mt->aux_save_triggers & when))
+ continue;
+ ssize_t ret = rdbSaveSingleModuleAux(rdb, when, mt);
+ if (ret==-1) {
+ dictReleaseIterator(di);
+ return -1;
+ }
+ total_written += ret;
+ }
+ }
+
+ dictReleaseIterator(di);
+ return total_written;
+}
+
/* --------------------------------------------------------------------------
* Key digest API (DEBUG DIGEST interface for modules types)
* -------------------------------------------------------------------------- */