diff options
author | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2011-04-22 09:39:18 +0200 |
---|---|---|
committer | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2011-04-22 09:41:07 +0200 |
commit | bf3692797df817c3abfd430a017f55ce9c9ecf87 (patch) | |
tree | b5785d245779021706290a9c49f53f1ce7014621 | |
parent | da06854477b5bb2462576d529fa0570925bd421d (diff) | |
download | redis-bf3692797df817c3abfd430a017f55ce9c9ecf87.tar.gz |
Use correct argc/argv for cleanup when loading AOF
-rw-r--r-- | src/aof.c | 8 | ||||
-rw-r--r-- | tests/integration/aof.tcl | 18 |
2 files changed, 23 insertions, 3 deletions
@@ -285,9 +285,11 @@ int loadAppendOnlyFile(char *filename) { /* The fake client should not have a reply */ redisAssert(fakeClient->bufpos == 0 && listLength(fakeClient->reply) == 0); - /* Clean up, ready for the next command */ - for (j = 0; j < argc; j++) decrRefCount(argv[j]); - zfree(argv); + /* Clean up. Command code may have changed argv/argc so we use the + * argv/argc of the client instead of the local variables. */ + for (j = 0; j < fakeClient->argc; j++) + decrRefCount(fakeClient->argv[j]); + zfree(fakeClient->argv); /* Handle swapping while loading big datasets when VM is on */ force_swapout = 0; diff --git a/tests/integration/aof.tcl b/tests/integration/aof.tcl index c7ba93c19..927969b62 100644 --- a/tests/integration/aof.tcl +++ b/tests/integration/aof.tcl @@ -83,4 +83,22 @@ tags {"aof"} { assert_equal "" [$client get bar] } } + + ## Test that SPOP (that modifies the client its argc/argv) is correctly free'd + create_aof { + append_to_aof [formatCommand sadd set foo] + append_to_aof [formatCommand sadd set bar] + append_to_aof [formatCommand spop set] + } + + start_server_aof [list dir $server_path] { + test "AOF+SPOP: Server should have been started" { + assert_equal 1 [is_alive $srv] + } + + test "AOF+SPOP: Set should have 1 member" { + set client [redis [dict get $srv host] [dict get $srv port]] + assert_equal 1 [$client scard set] + } + } } |