diff options
author | charsyam <charsyam@gmail.com> | 2013-04-30 12:07:58 +0900 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2013-05-02 15:35:59 +0200 |
commit | 9cd06e4406377254c4d788299d11e4a040c200d6 (patch) | |
tree | 6e5e1eb75985d9303541f6df9a8177b0534364a9 | |
parent | e5ef85c4441b8cdfdbd39dc2626376311f36e4ec (diff) | |
download | redis-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.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -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; |