From: antirez Date: Tue, 13 Mar 2012 09:59:29 +0000 (+0100) Subject: RDB hashes loading, fixed another bug in the loading of HT-encoded hashes: when the... X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/c3e7441dadf1d287c76c1c0a3cab68f15a875dbd RDB hashes loading, fixed another bug in the loading of HT-encoded hashes: when the hash entry is too big for ziplist, add the field, then convert. The code used to break before the new entry was inserted, resulting into missing fields in the loaded Hash object. --- diff --git a/src/rdb.c b/src/rdb.c index 4a56659d..519b645d 100644 --- a/src/rdb.c +++ b/src/rdb.c @@ -856,6 +856,10 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) { if (value == NULL) return NULL; redisAssert(field->encoding == REDIS_ENCODING_RAW); + /* Add pair to ziplist */ + o->ptr = ziplistPush(o->ptr, field->ptr, sdslen(field->ptr), ZIPLIST_TAIL); + o->ptr = ziplistPush(o->ptr, value->ptr, sdslen(value->ptr), ZIPLIST_TAIL); + /* Convert to hash table if size threshold is exceeded */ if (sdslen(field->ptr) > server.hash_max_ziplist_value || sdslen(value->ptr) > server.hash_max_ziplist_value) @@ -863,10 +867,6 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) { hashTypeConvert(o, REDIS_ENCODING_HT); break; } - - /* Add pair to ziplist */ - o->ptr = ziplistPush(o->ptr, field->ptr, sdslen(field->ptr), ZIPLIST_TAIL); - o->ptr = ziplistPush(o->ptr, value->ptr, sdslen(value->ptr), ZIPLIST_TAIL); } /* Load remaining fields and values into the hash table */