Unverified Commit 86cbddc4 authored by Salvatore Sanfilippo's avatar Salvatore Sanfilippo Committed by GitHub
Browse files

Merge pull request #6838 from oranagra/rm_scan_dict_rehash

RM_Scan disable dict rehashing
parents 4ccb56d0 28ef18a8
......@@ -871,6 +871,10 @@ unsigned long dictScan(dict *d,
if (dictSize(d) == 0) return 0;
/* Having a safe iterator means no rehashing can happen, see _dictRehashStep.
* This is needed in case the scan callback tries to do dictFind or alike. */
d->iterators++;
if (!dictIsRehashing(d)) {
t0 = &(d->ht[0]);
m0 = t0->sizemask;
......@@ -937,6 +941,9 @@ unsigned long dictScan(dict *d,
} while (v & (m0 ^ m1));
}
/* undo the ++ at the top */
d->iterators--;
return v;
}
......
......@@ -6555,7 +6555,11 @@ void RM_ScanCursorDestroy(RedisModuleScanCursor *cursor) {
*
* The function will return 1 if there are more elements to scan and 0 otherwise,
* possibly setting errno if the call failed.
* It is also possible to restart and existing cursor using RM_CursorRestart. */
* It is also possible to restart and existing cursor using RM_CursorRestart.
*
* NOTE: You must avoid doing any database changes from within the callback, you should avoid any
* RedisModule_OpenKey or RedisModule_Call, if you need to do these, you need to keep the key name
* and do any work you need to do after the call to Scan returns. */
int RM_Scan(RedisModuleCtx *ctx, RedisModuleScanCursor *cursor, RedisModuleScanCB fn, void *privdata) {
if (cursor->done) {
errno = ENOENT;
......@@ -6635,7 +6639,11 @@ static void moduleScanKeyCallback(void *privdata, const dictEntry *de) {
*
* The function will return 1 if there are more elements to scan and 0 otherwise,
* possibly setting errno if the call failed.
* It is also possible to restart and existing cursor using RM_CursorRestart. */
* It is also possible to restart and existing cursor using RM_CursorRestart.
*
* NOTE: You must avoid doing any database changes from within the callback, you should avoid any
* RedisModule_OpenKey or RedisModule_Call, if you need to do these, you need to keep the field name
* and do any work you need to do after the call to Scan returns. */
int RM_ScanKey(RedisModuleKey *key, RedisModuleScanCursor *cursor, RedisModuleScanKeyCB fn, void *privdata) {
if (key == NULL || key->value == NULL) {
errno = EINVAL;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment