Attempt to defrag a module data type value. Depending on complexity, * the operation may happen immediately or be scheduled for later. * * Returns 1 if the operation has been completed or 0 if it needs to * be scheduled for late defrag. */
| 9185 | * be scheduled for late defrag. |
| 9186 | */ |
| 9187 | int moduleDefragValue(robj *key, robj *value, long *defragged) { |
| 9188 | moduleValue *mv = value->ptr; |
| 9189 | moduleType *mt = mv->type; |
| 9190 | |
| 9191 | /* Try to defrag moduleValue itself regardless of whether or not |
| 9192 | * defrag callbacks are provided. |
| 9193 | */ |
| 9194 | moduleValue *newmv = activeDefragAlloc(mv); |
| 9195 | if (newmv) { |
| 9196 | (*defragged)++; |
| 9197 | value->ptr = mv = newmv; |
| 9198 | } |
| 9199 | |
| 9200 | if (!mt->defrag) |
| 9201 | return 1; |
| 9202 | |
| 9203 | /* Use free_effort to determine complexity of module value, and if |
| 9204 | * necessary schedule it for defragLater instead of quick immediate |
| 9205 | * defrag. |
| 9206 | */ |
| 9207 | if (mt->free_effort) { |
| 9208 | size_t effort = mt->free_effort(key, mv->value); |
| 9209 | if (!effort) |
| 9210 | effort = SIZE_MAX; |
| 9211 | if (effort > server.active_defrag_max_scan_fields) { |
| 9212 | return 0; /* Defrag later */ |
| 9213 | } |
| 9214 | } |
| 9215 | |
| 9216 | RedisModuleDefragCtx defrag_ctx = { 0, 0, NULL }; |
| 9217 | mt->defrag(&defrag_ctx, key, &mv->value); |
| 9218 | (*defragged) += defrag_ctx.defragged; |
| 9219 | return 1; |
| 9220 | } |
| 9221 | |
| 9222 | /* Call registered module API defrag functions */ |
| 9223 | long moduleDefragGlobals(void) { |
no test coverage detected