From 2d7162bb1db39bbdd80e3d2c99899f6d9ac4b2d6 Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Wed, 27 Jul 2011 12:29:36 +0200 Subject: [PATCH 1/4] HDEL: Abort deleting fields when hash is removed --- src/t_hash.c | 5 ++++- tests/unit/type/hash.tcl | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/t_hash.c b/src/t_hash.c index 4b9b37d6..83ca5b27 100644 --- a/src/t_hash.c +++ b/src/t_hash.c @@ -403,8 +403,11 @@ void hdelCommand(redisClient *c) { for (j = 2; j < c->argc; j++) { if (hashTypeDelete(o,c->argv[j])) { - if (hashTypeLength(o) == 0) dbDelete(c->db,c->argv[1]); deleted++; + if (hashTypeLength(o) == 0) { + dbDelete(c->db,c->argv[1]); + break; + } } } if (deleted) { diff --git a/tests/unit/type/hash.tcl b/tests/unit/type/hash.tcl index 9b043d3f..718bc04a 100644 --- a/tests/unit/type/hash.tcl +++ b/tests/unit/type/hash.tcl @@ -235,6 +235,13 @@ start_server {tags {"hash"}} { r hgetall myhash } {b 2} + test {HDEL - hash becomes empty before deleting all specified fields} { + r del myhash + r hmset myhash a 1 b 2 c 3 + assert_equal 3 [r hdel myhash a b c d e] + assert_equal 0 [r exists myhash] + } + test {HEXISTS} { set rv {} set k [lindex [array names smallhash *] 0] From 4d6bf65c42d213c716c5878343b9e1456ffcd327 Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Wed, 27 Jul 2011 14:46:17 +0200 Subject: [PATCH 2/4] Wait for Lua to be built before linking redis-server --- src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index ee4bfc50..a45002de 100644 --- a/src/Makefile +++ b/src/Makefile @@ -169,7 +169,7 @@ dependencies: ../deps/jemalloc/lib/libjemalloc.a: cd ../deps/jemalloc && ./configure $(JEMALLOC_CFLAGS) --with-jemalloc-prefix=je_ --enable-cc-silence && $(MAKE) lib/libjemalloc.a -redis-server: $(OBJ) +redis-server: dependencies $(OBJ) $(QUIET_LINK)$(CC) -o $(PRGNAME) $(CCOPT) $(DEBUG) $(OBJ) $(CCLINK) $(ALLOC_LINK) ../deps/lua/src/liblua.a redis-benchmark: dependencies $(BENCHOBJ) From bb831c313c32a64446484e66c275aaba55d2d818 Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Wed, 27 Jul 2011 15:03:48 +0200 Subject: [PATCH 3/4] Fix adding bulk reply when getcwd fails --- src/config.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 6f9657dd..d470dab1 100644 --- a/src/config.c +++ b/src/config.c @@ -508,12 +508,11 @@ void configGetCommand(redisClient *c) { if (stringmatch(pattern,"dir",0)) { char buf[1024]; - addReplyBulkCString(c,"dir"); - if (getcwd(buf,sizeof(buf)) == NULL) { + if (getcwd(buf,sizeof(buf)) == NULL) buf[0] = '\0'; - } else { - addReplyBulkCString(c,buf); - } + + addReplyBulkCString(c,"dir"); + addReplyBulkCString(c,buf); matches++; } if (stringmatch(pattern,"dbfilename",0)) { From 47cadab42b2489705263de54bf7ea980b5fe0df0 Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 27 Jul 2011 16:39:03 +0200 Subject: [PATCH 4/4] TODO updated --- TODO | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/TODO b/TODO index d45b3504..aeb58229 100644 --- a/TODO +++ b/TODO @@ -52,42 +52,18 @@ OPTIMIZATIONS * Redis big lists as linked lists of small ziplists? Possibly a simple heuristic that join near nodes when some node gets smaller than the low_level, and split it into two if gets bigger than high_level. -REPORTING -========= - -* Better INFO output with sections. - RANDOM ====== +* Server should abort when getcwd() fails if there is some kind of persistence configured. Check this in the cron loop. * Clients should be closed as far as the output buffer list is bigger than a given number of elements (configurable in redis.conf) * Should the redis default configuration, and the default redis.conf, just bind 127.0.0.1? KNOWN BUGS ========== -* What happens in the following scenario: - 1) We are reading an AOF file. - 2) SETEX FOO 5 BAR - 3) APPEND FOO ZAP - What happens if between 1 and 2 for some reason (system under huge load - or alike) too many time passes? We should prevent expires while the - AOF is loading. * #519: Slave may have expired keys that were never read in the master (so a DEL is not sent in the replication channel) but are already expired since a lot of time. Maybe after a given delay that is undoubltly greater than the replication link latency we should expire this key on the slave on access? - -DISKSTORE TODO -============== - -* Fix FLUSHALL/FLUSHDB: the queue of pending reads/writes should be handled. -* Check that 00/00 and ff/ff exist at startup, otherwise exit with error. -* Implement sync flush option, where data is written synchronously on disk when a command is executed. -* Implement MULTI/EXEC as transaction abstract API to diskstore.c, with transaction_start, transaction_end, and a journal to recover. -* Stop BGSAVE thread on shutdown and any other condition where the child is killed during normal bgsave. -* Fix RANDOMKEY to really do something interesting -* Fix DBSIZE to really do something interesting -* Add a DEBUG command to check if an entry is or not in memory currently -* dscache.c near 236, kobj = createStringObject... we could use static obj.