diff options
author | Trond Norbye <trond.norbye@gmail.com> | 2011-07-18 19:19:28 +0200 |
---|---|---|
committer | Trond Norbye <trond.norbye@gmail.com> | 2011-07-18 19:19:28 +0200 |
commit | 1f2da98dba878e16b45bec03ca615aeb16b4530d (patch) | |
tree | 7bb23bb5c745559caed00c8b4c3c9e4e4debc30b | |
parent | 7aed1faec4ce74b4e7a6db9dd3de724ebdaa8be9 (diff) | |
download | memcached-1f2da98dba878e16b45bec03ca615aeb16b4530d.tar.gz |
Issue 183 - Reclaim items dead by flush_all
-rw-r--r-- | engines/default_engine/items.c | 5 | ||||
-rw-r--r-- | t/issue_183.t | 23 |
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"); |