summaryrefslogtreecommitdiff
path: root/src/dict.c
diff options
context:
space:
mode:
author赵磊 <zhaolei21@meituan.com>2018-05-08 15:30:11 +0800
committer赵磊 <zhaolei21@meituan.com>2018-05-08 15:30:11 +0800
commit8d93f924ea44c4139d690a914af662b6f059709a (patch)
treeae2908551fccb8acfe517af9b1bdb463b001dd32 /src/dict.c
parente6b0e8d9ec4561a07864358af8d2d4e81ac413fc (diff)
downloadredis-8d93f924ea44c4139d690a914af662b6f059709a.tar.gz
Fix dictScan(): It can't scan all buckets when dict is shrinking.
Diffstat (limited to 'src/dict.c')
-rw-r--r--src/dict.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/dict.c b/src/dict.c
index 97e636805..18cb9ee79 100644
--- a/src/dict.c
+++ b/src/dict.c
@@ -858,6 +858,15 @@ unsigned long dictScan(dict *d,
de = next;
}
+ /* Set unmasked bits so incrementing the reversed cursor
+ * operates on the masked bits */
+ v |= ~m0;
+
+ /* Increment the reverse cursor */
+ v = rev(v);
+ v++;
+ v = rev(v);
+
} else {
t0 = &d->ht[0];
t1 = &d->ht[1];
@@ -892,22 +901,16 @@ unsigned long dictScan(dict *d,
de = next;
}
- /* Increment bits not covered by the smaller mask */
- v = (((v | m0) + 1) & ~m0) | (v & m0);
+ /* Increment the reverse cursor not covered by the smaller mask.*/
+ v |= ~m1;
+ v = rev(v);
+ v++;
+ v = rev(v);
/* Continue while bits covered by mask difference is non-zero */
} while (v & (m0 ^ m1));
}
- /* Set unmasked bits so incrementing the reversed cursor
- * operates on the masked bits of the smaller table */
- v |= ~m0;
-
- /* Increment the reverse cursor */
- v = rev(v);
- v++;
- v = rev(v);
-
return v;
}