mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 09:00:51 +00:00
Fix saving of zero-length lists.
Normally in modern Redis you can't create zero-len lists, however it's possible to load them from old RDB files generated, for instance, using Redis 2.8 (see issue #4409). The "Right Thing" would be not loading such lists at all, but this requires to hook in rdb.c random places in a not great way, for a problem that is at this point, at best, minor. Here in this commit instead I just fix the fact that zero length lists, materialized as quicklists with the first node set to NULL, were iterated in the wrong way while they are saved, leading to a crash. The other parts of the list implementation are apparently able to deal with empty lists correctly, even if they are no longer a thing.
This commit is contained in:
parent
34d5804d4c
commit
a1944c3e4d
@ -656,7 +656,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
|
|||||||
if ((n = rdbSaveLen(rdb,ql->len)) == -1) return -1;
|
if ((n = rdbSaveLen(rdb,ql->len)) == -1) return -1;
|
||||||
nwritten += n;
|
nwritten += n;
|
||||||
|
|
||||||
do {
|
while(node) {
|
||||||
if (quicklistNodeIsCompressed(node)) {
|
if (quicklistNodeIsCompressed(node)) {
|
||||||
void *data;
|
void *data;
|
||||||
size_t compress_len = quicklistGetLzf(node, &data);
|
size_t compress_len = quicklistGetLzf(node, &data);
|
||||||
@ -666,7 +666,8 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
|
|||||||
if ((n = rdbSaveRawString(rdb,node->zl,node->sz)) == -1) return -1;
|
if ((n = rdbSaveRawString(rdb,node->zl,node->sz)) == -1) return -1;
|
||||||
nwritten += n;
|
nwritten += n;
|
||||||
}
|
}
|
||||||
} while ((node = node->next));
|
node = node->next;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
serverPanic("Unknown list encoding");
|
serverPanic("Unknown list encoding");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user