summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcharsyam <charsyam@gmail.com>2013-04-30 12:07:58 +0900
committerantirez <antirez@gmail.com>2013-05-02 15:35:59 +0200
commit9cd06e4406377254c4d788299d11e4a040c200d6 (patch)
tree6e5e1eb75985d9303541f6df9a8177b0534364a9
parente5ef85c4441b8cdfdbd39dc2626376311f36e4ec (diff)
downloadredis-9cd06e4406377254c4d788299d11e4a040c200d6.tar.gz
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.
-rw-r--r--src/aof.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/aof.c b/src/aof.c
index 56a985e72..9e602ce01 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;