From 9cd06e4406377254c4d788299d11e4a040c200d6 Mon Sep 17 00:00:00 2001 From: charsyam Date: Tue, 30 Apr 2013 12:07:58 +0900 Subject: [PATCH] Fix AOF bug: expire could be removed from key on AOF rewrite. There was a race condition in the AOF rewrite code that, with bad enough timing, could cause a volatile key just about to expire to be turned into a non-volatile key. The bug was never reported to cause actualy issues, but was found analytically by an user in the Redis mailing list: https://groups.google.com/forum/?fromgroups=#!topic/redis-db/Kvh2FAGK4Uk This commit fixes issue #1079. --- src/aof.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/aof.c b/src/aof.c index 56a985e7..9e602ce0 100644 --- a/src/aof.c +++ b/src/aof.c @@ -884,6 +884,9 @@ int rewriteAppendOnlyFile(char *filename) { expiretime = getExpire(db,&key); + /* If this key is already expired skip it */ + if (expiretime != -1 && expiretime < now) continue; + /* Save the key and associated value */ if (o->type == REDIS_STRING) { /* Emit a SET command */ @@ -906,8 +909,6 @@ int rewriteAppendOnlyFile(char *filename) { /* Save the expire time */ if (expiretime != -1) { char cmd[]="*3\r\n$9\r\nPEXPIREAT\r\n"; - /* If this key is already expired skip it */ - if (expiretime < now) continue; if (rioWrite(&aof,cmd,sizeof(cmd)-1) == 0) goto werr; if (rioWriteBulkObject(&aof,&key) == 0) goto werr; if (rioWriteBulkLongLong(&aof,expiretime) == 0) goto werr;