summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSchuster <boazyeah@gmail.com>2012-10-22 11:44:20 +0200
committerantirez <antirez@gmail.com>2012-10-22 11:44:20 +0200
commite5f794ff3abd844a08c0b01faa15550fd7014d7c (patch)
treec8c21101a458989c6774c4941b73bdafa813c9bc /src
parentc2661ed7612b9534afe9f1c9c6381b430f5dd0c3 (diff)
downloadredis-e5f794ff3abd844a08c0b01faa15550fd7014d7c.tar.gz
redis-check-dump now understands dumps produced by Redis 2.6
(Commit message from @antirez as it was missign in the original commits, also the patch was modified a bit to still work with 2.4 dumps and to avoid if expressions that are always true due to checked types range) This commit changes redis-check-dump to account for new encodings and for the new MSTIME expire format. It also refactors the test for valid type into a function. The code is still compatible with Redis 2.4 generated dumps. This fixes issue #709.
Diffstat (limited to 'src')
-rw-r--r--src/redis-check-dump.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/redis-check-dump.c b/src/redis-check-dump.c
index 5eac925ae..65309e767 100644
--- a/src/redis-check-dump.c
+++ b/src/redis-check-dump.c
@@ -31,6 +31,7 @@
#define REDIS_ENCODING_HT 3 /* Encoded as an hash table */
/* Object types only used for dumping to disk */
+#define REDIS_EXPIRETIME_MS 252
#define REDIS_EXPIRETIME 253
#define REDIS_SELECTDB 254
#define REDIS_EOF 255
@@ -111,6 +112,16 @@ static char types[256][16];
/* Prototypes */
uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l);
+/* Return true if 't' is a valid object type. */
+int checkType(unsigned char t) {
+ /* In case a new object type is added, update the following
+ * condition as necessary. */
+ return
+ (t >= REDIS_HASH_ZIPMAP && t <= REDIS_HASH_ZIPLIST) ||
+ t <= REDIS_HASH ||
+ t >= REDIS_EXPIRETIME_MS;
+}
+
/* when number of bytes to read is negative, do a peek */
int readBytes(void *target, long num) {
char peek = (num < 0) ? 1 : 0;
@@ -152,7 +163,7 @@ int loadType(entry *e) {
/* this byte needs to qualify as type */
unsigned char t;
if (readBytes(&t, 1)) {
- if (t <= 4 || (t >=9 && t <= 12) || t >= 253) {
+ if (checkType(t)) {
e->type = t;
return 1;
} else {
@@ -168,16 +179,18 @@ int loadType(entry *e) {
int peekType() {
unsigned char t;
- if (readBytes(&t, -1) && (t <= 4 || (t >=9 && t <= 12) || t >= 253))
+ if (readBytes(&t, -1) && (checkType(t)))
return t;
return -1;
}
/* discard time, just consume the bytes */
-int processTime() {
+int processTime(int type) {
uint32_t offset = CURR_OFFSET;
- unsigned char t[4];
- if (readBytes(t, 4)) {
+ unsigned char t[8];
+ int timelen = (type == REDIS_EXPIRETIME_MS) ? 8 : 4;
+
+ if (readBytes(t,timelen)) {
return 1;
} else {
SHIFT_ERROR(offset, "Could not read time");
@@ -472,8 +485,9 @@ entry loadEntry() {
return e;
} else {
/* optionally consume expire */
- if (e.type == REDIS_EXPIRETIME) {
- if (!processTime()) return e;
+ if (e.type == REDIS_EXPIRETIME ||
+ e.type == REDIS_EXPIRETIME_MS) {
+ if (!processTime(e.type)) return e;
if (!loadType(&e)) return e;
}