Commit f2ffb592 authored by Pieter Noordhuis's avatar Pieter Noordhuis Committed by antirez
Browse files

Use safe dictionary iterator from KEYS

Every matched key in a KEYS call is checked for expiration. When the key
is set to expire, the call to `getExpire` will assert that the key also
exists in the main dictionary. This in turn causes a rehashing step to
be executed. Rehashing a dictionary when there is an iterator active may
result in the iterator emitting duplicate entries, or not emitting some
entries at all. By using a safe iterator, the rehash step is omitted.
parent 9cb09c4d
...@@ -273,7 +273,7 @@ void keysCommand(redisClient *c) { ...@@ -273,7 +273,7 @@ void keysCommand(redisClient *c) {
unsigned long numkeys = 0; unsigned long numkeys = 0;
void *replylen = addDeferredMultiBulkLength(c); void *replylen = addDeferredMultiBulkLength(c);
di = dictGetIterator(c->db->dict); di = dictGetSafeIterator(c->db->dict);
allkeys = (pattern[0] == '*' && pattern[1] == '\0'); allkeys = (pattern[0] == '*' && pattern[1] == '\0');
while((de = dictNext(di)) != NULL) { while((de = dictNext(di)) != NULL) {
sds key = dictGetEntryKey(de); sds key = dictGetEntryKey(de);
......
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