diff options
author | antirez <antirez@gmail.com> | 2012-06-11 23:44:34 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2012-06-12 00:41:48 +0200 |
commit | ee789e157c767be9cbf90af5232bfeacc533e308 (patch) | |
tree | 4307e550e9f9590a2684dfbc5cb9b6b509916950 /src/t_hash.c | |
parent | c0de45924c4033a8650b627e75b7fd6396c52187 (diff) | |
download | redis-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.c | 6 |
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); |