Skip to content

Commit

Permalink
Merge pull request redis#4907 from youjiali1995/fix-dictScan
Browse files Browse the repository at this point in the history
Fix dictScan(): It can't scan all buckets when dict is shrinking.
  • Loading branch information
antirez committed Jun 1, 2018
2 parents f5dad06 + cb48077 commit 5418bfb
Showing 1 changed file with 14 additions and 11 deletions.
25 changes: 14 additions & 11 deletions src/dict.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 5418bfb

Please sign in to comment.