summaryrefslogtreecommitdiff
path: root/src/t_hash.c
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2012-06-11 23:44:34 +0200
committerantirez <antirez@gmail.com>2012-06-12 00:41:48 +0200
commitee789e157c767be9cbf90af5232bfeacc533e308 (patch)
tree4307e550e9f9590a2684dfbc5cb9b6b509916950 /src/t_hash.c
parentc0de45924c4033a8650b627e75b7fd6396c52187 (diff)
downloadredis-ee789e157c767be9cbf90af5232bfeacc533e308.tar.gz
Dump ziplist hex value on failed assertion.
The ziplist -> hashtable conversion code is triggered every time an hash value must be promoted to a full hash table because the number or size of elements reached the threshold. If a problem in the ziplist causes the same field to be present multiple times, the assertion of successful addition of the element inside the hash table will fail, crashing server with a failed assertion, but providing little information about the problem. This code adds a new logging function to perform the hex dump of binary data, and makes sure that the ziplist -> hashtable conversion code uses this new logging facility to dump the content of the ziplist when the assertion fails. This change was originally made in order to investigate issue #547.
Diffstat (limited to 'src/t_hash.c')
-rw-r--r--src/t_hash.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/t_hash.c b/src/t_hash.c
index 5b7a347ab..aa021b038 100644
--- a/src/t_hash.c
+++ b/src/t_hash.c
@@ -403,7 +403,11 @@ void hashTypeConvertZiplist(robj *o, int enc) {
value = hashTypeCurrentObject(hi, REDIS_HASH_VALUE);
value = tryObjectEncoding(value);
ret = dictAdd(dict, field, value);
- redisAssert(ret == DICT_OK);
+ if (ret != DICT_OK) {
+ redisLogHexDump(REDIS_WARNING,"ziplist with dup elements dump",
+ o->ptr,ziplistBlobLen(o->ptr));
+ redisAssert(ret == DICT_OK);
+ }
}
hashTypeReleaseIterator(hi);