summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2014-09-05 09:56:26 +0200
committerantirez <antirez@gmail.com>2014-09-08 10:57:03 +0200
commita4ec67290e5dba2152a4e389ce72c14b8926789f (patch)
tree4139bacc29ac17f2755ed49aa816f2736c57d093
parent5bb0da34ba4a743b696a7324632f8e0dfd6817d0 (diff)
downloadredis-a4ec67290e5dba2152a4e389ce72c14b8926789f.tar.gz
AOF loading: split handling of format errors from unexpected EOF.
-rw-r--r--src/aof.c17
-rw-r--r--tests/integration/aof.tcl2
2 files changed, 11 insertions, 8 deletions
diff --git a/src/aof.c b/src/aof.c
index 5d46a21c4..2f543ba7c 100644
--- a/src/aof.c
+++ b/src/aof.c
@@ -645,7 +645,7 @@ int loadAppendOnlyFile(char *filename) {
argsds = sdsnewlen(NULL,len);
if (len && fread(argsds,len,1,fp) == 0) goto fmterr;
argv[j] = createObject(REDIS_STRING,argsds);
- if (fread(buf,2,1,fp) == 0) goto fmterr; /* discard CRLF */
+ if (fread(buf,2,1,fp) == 0) goto readerr; /* discard CRLF */
}
/* Command lookup */
@@ -673,7 +673,7 @@ int loadAppendOnlyFile(char *filename) {
/* This point can only be reached when EOF is reached without errors.
* If the client is in the middle of a MULTI/EXEC, log error and quit. */
- if (fakeClient->flags & REDIS_MULTI) goto readerr;
+ if (fakeClient->flags & REDIS_MULTI) goto uxeof;
fclose(fp);
freeFakeClient(fakeClient);
@@ -683,14 +683,17 @@ int loadAppendOnlyFile(char *filename) {
server.aof_rewrite_base_size = server.aof_current_size;
return REDIS_OK;
-readerr:
- if (feof(fp)) {
- redisLog(REDIS_WARNING,"Unexpected end of file reading the append only file");
- } else {
+readerr: /* Read error. If feof(fp) is true, fall through to unexpected EOF. */
+ if (!feof(fp)) {
redisLog(REDIS_WARNING,"Unrecoverable error reading the append only file: %s", strerror(errno));
+ exit(1);
}
+
+uxeof: /* Unexpected AOF end of file. */
+ redisLog(REDIS_WARNING,"Unexpected end of file reading the append only file");
exit(1);
-fmterr:
+
+fmterr: /* Format error. */
redisLog(REDIS_WARNING,"Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>");
exit(1);
}
diff --git a/tests/integration/aof.tcl b/tests/integration/aof.tcl
index 9a24a96bd..cbffc812e 100644
--- a/tests/integration/aof.tcl
+++ b/tests/integration/aof.tcl
@@ -56,7 +56,7 @@ tags {"aof"} {
start_server_aof [list dir $server_path] {
test "Short read: Server should have logged an error" {
- set pattern "*Bad file format reading the append only file*"
+ set pattern "*Unexpected end of file reading the append only file*"
set retry 10
while {$retry} {
set result [exec tail -n1 < [dict get $srv stdout]]