summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrond Norbye <trond.norbye@gmail.com>2011-07-18 19:19:28 +0200
committerTrond Norbye <trond.norbye@gmail.com>2011-07-18 19:19:28 +0200
commit1f2da98dba878e16b45bec03ca615aeb16b4530d (patch)
tree7bb23bb5c745559caed00c8b4c3c9e4e4debc30b
parent7aed1faec4ce74b4e7a6db9dd3de724ebdaa8be9 (diff)
downloadmemcached-1f2da98dba878e16b45bec03ca615aeb16b4530d.tar.gz
Issue 183 - Reclaim items dead by flush_all
-rw-r--r--engines/default_engine/items.c5
-rw-r--r--t/issue_183.t23
2 files changed, 26 insertions, 2 deletions
diff --git a/engines/default_engine/items.c b/engines/default_engine/items.c
index 19c0070..f9145c2 100644
--- a/engines/default_engine/items.c
+++ b/engines/default_engine/items.c
@@ -98,14 +98,15 @@ hash_item *do_item_alloc(struct default_engine *engine,
/* do a quick check if we have any expired items in the tail.. */
int tries = search_items;
hash_item *search;
-
+ rel_time_t oldest_live = engine->config.oldest_live;
rel_time_t current_time = engine->server.core->get_current_time();
for (search = engine->items.tails[id];
tries > 0 && search != NULL;
tries--, search=search->prev) {
if (search->refcount == 0 &&
- (search->exptime != 0 && search->exptime < current_time)) {
+ ((search->time < oldest_live) || //dead by flush
+ (search->exptime != 0 && search->exptime < current_time))) {
it = search;
/* I don't want to actually free the object, just steal
* the item to avoid to grab the slab mutex twice ;-)
diff --git a/t/issue_183.t b/t/issue_183.t
new file mode 100644
index 0000000..94b956c
--- /dev/null
+++ b/t/issue_183.t
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More tests => 5;
+use FindBin qw($Bin);
+use lib "$Bin/lib";
+use MemcachedTest;
+
+my $server = new_memcached();
+my $sock = $server->sock;
+print $sock "set key 0 0 1\r\n1\r\n";
+is (scalar <$sock>, "STORED\r\n", "stored key");
+my $s1 = mem_stats($sock);
+my $r1 = $s1->{"reclaimed"};
+is ($r1, "0", "Objects should not be reclaimed");
+sleep(2);
+print $sock "flush_all\r\n";
+is (scalar <$sock>, "OK\r\n", "Cache flushed");
+print $sock "set key 0 0 1\r\n1\r\n";
+is (scalar <$sock>, "STORED\r\n", "stored key");
+my $s2 = mem_stats($sock);
+my $r2 = $s2->{"reclaimed"};
+is ($r2, "1", "Objects should be reclaimed");