summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxuzhou <xuzhou1@jd.com>2017-06-16 17:51:38 +0800
committerantirez <antirez@gmail.com>2017-06-22 11:01:27 +0200
commit63e1c9f22495564a1ab5e1cd3e0c832870a25769 (patch)
treef4e14d8d19455e1387e7c9da865c6dd70cad6375
parent0231156f6a318bf5391e9255e3174400e4b65a2d (diff)
downloadredis-63e1c9f22495564a1ab5e1cd3e0c832870a25769.tar.gz
Fix set with ex/px option when propagated to aof
-rw-r--r--src/aof.c17
-rw-r--r--src/server.c2
-rw-r--r--src/server.h3
-rw-r--r--tests/unit/expire.tcl15
4 files changed, 36 insertions, 1 deletions
diff --git a/src/aof.c b/src/aof.c
index 9b15ad1d0..071657dd4 100644
--- a/src/aof.c
+++ b/src/aof.c
@@ -536,6 +536,23 @@ void feedAppendOnlyFile(struct redisCommand *cmd, int dictid, robj **argv, int a
buf = catAppendOnlyGenericCommand(buf,3,tmpargv);
decrRefCount(tmpargv[0]);
buf = catAppendOnlyExpireAtCommand(buf,cmd,argv[1],argv[2]);
+ } else if (cmd->proc == setCommand) {
+ int i;
+ robj *exarg = NULL, *pxarg = NULL;
+ /* Translate SET [EX seconds][PX milliseconds] to SET and PEXPIREAT */
+ buf = catAppendOnlyGenericCommand(buf,3,argv);
+ for (i = 3; i < argc; i ++) {
+ if (sdsEncodedObject(argv[i]) && !strcasecmp(argv[i]->ptr, "ex"))
+ exarg = argv[i+1];
+
+ if (sdsEncodedObject(argv[i]) && !strcasecmp(argv[i]->ptr, "px"))
+ pxarg = argv[i+1];
+ }
+ serverAssert(!(exarg && pxarg));
+ if (exarg)
+ buf = catAppendOnlyExpireAtCommand(buf,server.expireCommand,argv[1],exarg);
+ if (pxarg)
+ buf = catAppendOnlyExpireAtCommand(buf,server.pexpireCommand,argv[1],pxarg);
} else {
/* All the other commands don't need translation or need the
* same translation already operated in the command vector
diff --git a/src/server.c b/src/server.c
index ba93eb789..a3c132840 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1500,6 +1500,8 @@ void initServerConfig(void) {
server.rpopCommand = lookupCommandByCString("rpop");
server.sremCommand = lookupCommandByCString("srem");
server.execCommand = lookupCommandByCString("exec");
+ server.expireCommand = lookupCommandByCString("expire");
+ server.pexpireCommand = lookupCommandByCString("pexpire");
/* Slow log */
server.slowlog_log_slower_than = CONFIG_DEFAULT_SLOWLOG_LOG_SLOWER_THAN;
diff --git a/src/server.h b/src/server.h
index 18924090f..aaad64bdd 100644
--- a/src/server.h
+++ b/src/server.h
@@ -909,7 +909,8 @@ struct redisServer {
off_t loading_process_events_interval_bytes;
/* Fast pointers to often looked up command */
struct redisCommand *delCommand, *multiCommand, *lpushCommand, *lpopCommand,
- *rpopCommand, *sremCommand, *execCommand;
+ *rpopCommand, *sremCommand, *execCommand, *expireCommand,
+ *pexpireCommand;
/* Fields used only for stats */
time_t stat_starttime; /* Server start time */
long long stat_numcommands; /* Number of processed commands */
diff --git a/tests/unit/expire.tcl b/tests/unit/expire.tcl
index 0a50dd31b..eddc7c303 100644
--- a/tests/unit/expire.tcl
+++ b/tests/unit/expire.tcl
@@ -204,4 +204,19 @@ start_server {tags {"expire"}} {
catch {r expire foo ""} e
set e
} {*not an integer*}
+
+ test {SET - use EX/PX option, TTL should not be reseted after loadaof} {
+ r config set appendonly yes
+ r set foo bar EX 100
+ after 2000
+ r debug loadaof
+ set ttl [r ttl foo]
+ assert {$ttl <= 98 && $ttl > 90}
+
+ r set foo bar PX 100000
+ after 2000
+ r debug loadaof
+ set ttl [r ttl foo]
+ assert {$ttl <= 98 && $ttl > 90}
+ }
}