diff options
author | Keyur <kgovande@etsy.com> | 2012-09-04 21:54:14 +0000 |
---|---|---|
committer | dormando <dormando@rydia.net> | 2013-12-08 17:55:01 -0800 |
commit | 058af0d85b2fb95319f9512fa4a99c2e8a412899 (patch) | |
tree | b884b84d5a08f9bdd6615328435933e3b99481ea | |
parent | 6695ccbc525c36d693aaa3e8337b36aa0c784424 (diff) | |
download | memcached-058af0d85b2fb95319f9512fa4a99c2e8a412899.tar.gz |
Make tail leak expiry time configurable
-rw-r--r-- | items.c | 2 | ||||
-rw-r--r-- | memcached.c | 16 | ||||
-rw-r--r-- | memcached.h | 3 |
3 files changed, 18 insertions, 3 deletions
@@ -125,7 +125,7 @@ item *do_item_alloc(char *key, const size_t nkey, const int flags, /* Old rare bug could cause a refcount leak. We haven't seen * it in years, but we leave this code in to prevent failures * just in case */ - if (search->time + TAIL_REPAIR_TIME < current_time) { + if (search->time + settings.tail_repair_time < current_time) { itemstats[id].tailrepairs++; search->refcount = 1; do_item_unlink_nolock(search, hv); diff --git a/memcached.c b/memcached.c index f3b9939..cc89a12 100644 --- a/memcached.c +++ b/memcached.c @@ -226,6 +226,7 @@ static void settings_init(void) { settings.slab_reassign = false; settings.slab_automove = 0; settings.shutdown_command = false; + settings.tail_repair_time = TAIL_REPAIR_TIME_DEFAULT; } /* @@ -2624,6 +2625,7 @@ static void process_stat_settings(ADD_STAT add_stats, void *c) { APPEND_STAT("hashpower_init", "%d", settings.hashpower_init); APPEND_STAT("slab_reassign", "%s", settings.slab_reassign ? "yes" : "no"); APPEND_STAT("slab_automove", "%d", settings.slab_automove); + APPEND_STAT("tail_repair_time", "%d", settings.tail_repair_time); } static void process_stat(conn *c, token_t *tokens, const size_t ntokens) { @@ -4523,6 +4525,9 @@ static void usage(void) { " table should be. Can be grown at runtime if not big enough.\n" " Set this based on \"STAT hash_power_level\" before a \n" " restart.\n" + " - tail_repair_time: Time in seconds that indicates how long to wait before\n" + " forcefully taking over the LRU tail item whose refcount has leaked.\n" + " The default is 3 hours.\n" ); return; } @@ -4757,13 +4762,15 @@ int main (int argc, char **argv) { MAXCONNS_FAST = 0, HASHPOWER_INIT, SLAB_REASSIGN, - SLAB_AUTOMOVE + SLAB_AUTOMOVE, + TAIL_REPAIR_TIME }; char *const subopts_tokens[] = { [MAXCONNS_FAST] = "maxconns_fast", [HASHPOWER_INIT] = "hashpower", [SLAB_REASSIGN] = "slab_reassign", [SLAB_AUTOMOVE] = "slab_automove", + [TAIL_REPAIR_TIME] = "tail_repair_time", NULL }; @@ -5033,6 +5040,13 @@ int main (int argc, char **argv) { return 1; } break; + case TAIL_REPAIR_TIME: + if (subopts_value == NULL) { + fprintf(stderr, "Missing numeric argument for tail_repair_time\n"); + return 1; + } + settings.tail_repair_time = atoi(subopts_value); + break; default: printf("Illegal suboption \"%s\"\n", subopts_value); return 1; diff --git a/memcached.h b/memcached.h index 91b6502..9308db9 100644 --- a/memcached.h +++ b/memcached.h @@ -76,7 +76,7 @@ /** How long an object can reasonably be assumed to be locked before harvesting it on a low memory condition. */ -#define TAIL_REPAIR_TIME (3 * 3600) +#define TAIL_REPAIR_TIME_DEFAULT (3 * 3600) /* warning: don't use these macros with a function, as it evals its arg twice */ #define ITEM_get_cas(i) (((i)->it_flags & ITEM_CAS) ? \ @@ -308,6 +308,7 @@ struct settings { int slab_automove; /* Whether or not to automatically move slabs */ int hashpower_init; /* Starting hash power level */ bool shutdown_command; /* allow shutdown command */ + int tail_repair_time; /* LRU tail refcount leak repair time */ }; extern struct stats stats; |