diff options
Diffstat (limited to 'src/defrag.c')
-rw-r--r-- | src/defrag.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/src/defrag.c b/src/defrag.c index 16b1a4d2d..d4983c6d5 100644 --- a/src/defrag.c +++ b/src/defrag.c @@ -128,6 +128,27 @@ robj *activeDefragStringOb(robj* ob, long *defragged) { return ret; } +/* Defrag helper for lua scripts + * + * returns NULL in case the allocation wasn't moved. + * when it returns a non-null value, the old pointer was already released + * and should NOT be accessed. */ +luaScript *activeDefragLuaScript(luaScript *script, long *defragged) { + luaScript *ret = NULL; + + /* try to defrag script struct */ + if ((ret = activeDefragAlloc(script))) { + script = ret; + (*defragged)++; + } + + /* try to defrag actual script object */ + robj *ob = activeDefragStringOb(script->body, defragged); + if (ob) script->body = ob; + + return ret; +} + /* Defrag helper for dictEntries to be used during dict iteration (called on * each step). Returns a stat of how many pointers were moved. */ long dictIterDefragEntry(dictIterator *iter) { @@ -256,6 +277,7 @@ long activeDefragZsetEntry(zset *zs, dictEntry *de) { #define DEFRAG_SDS_DICT_VAL_IS_SDS 1 #define DEFRAG_SDS_DICT_VAL_IS_STROB 2 #define DEFRAG_SDS_DICT_VAL_VOID_PTR 3 +#define DEFRAG_SDS_DICT_VAL_LUA_SCRIPT 4 /* Defrag a dict with sds key and optional value (either ptr, sds or robj string) */ long activeDefragSdsDict(dict* d, int val_type) { @@ -280,6 +302,10 @@ long activeDefragSdsDict(dict* d, int val_type) { void *newptr, *ptr = dictGetVal(de); if ((newptr = activeDefragAlloc(ptr))) de->v.val = newptr, defragged++; + } else if (val_type == DEFRAG_SDS_DICT_VAL_LUA_SCRIPT) { + void *newptr, *ptr = dictGetVal(de); + if ((newptr = activeDefragLuaScript(ptr, &defragged))) + de->v.val = newptr; } defragged += dictIterDefragEntry(di); } @@ -939,7 +965,7 @@ long defragOtherGlobals() { /* there are many more pointers to defrag (e.g. client argv, output / aof buffers, etc. * but we assume most of these are short lived, we only need to defrag allocations * that remain static for a long time */ - defragged += activeDefragSdsDict(evalScriptsDict(), DEFRAG_SDS_DICT_VAL_IS_STROB); + defragged += activeDefragSdsDict(evalScriptsDict(), DEFRAG_SDS_DICT_VAL_LUA_SCRIPT); defragged += moduleDefragGlobals(); return defragged; } @@ -1130,7 +1156,7 @@ void activeDefragCycle(void) { /* Move on to next database, and stop if we reached the last one. */ if (++current_db >= server.dbnum) { /* defrag other items not part of the db / keys */ - defragOtherGlobals(); + server.stat_active_defrag_hits += defragOtherGlobals(); long long now = ustime(); size_t frag_bytes; |