flush_all functionality at given time
Brad Fitzpatrick
brad at danga.com
Tue Aug 9 23:01:34 PDT 2005
Checked in to cvs. Thanks!
On Wed, 6 Jul 2005, Elizabeth Mattijsen wrote:
> Because I needed a way to flush all memcached backend servers, but
> not at exactly the same time (to reduce load peaks), I've added some
> simple functionality to the memcached protocol in the "flush_all"
> command that allows you to specify a time at which the flush will
> actually occur (instead of always at the moment the "flush_all"
> command is received).
>
> So, apart from just "flush_all", you can now also specify an
> expiration for the flush to occur.
>
> flush_all\r\n // flushes now
> flush_all 10\r\n // flushes in 10 seconds
> flush_all 1120673174\r\n // flushes at Wed Jul 6 18:06:14 2005 GMT
>
>
> Below you will find the patch to add this functionality. I've also
> added this as an attachment in case my mailer messes up the
> whitespace so that the patch cannot be applied (it has been known to
> do that in the past).
>
>
> Hope this will make it to the standard distribution of memcached at
> some point soon.
>
> On a related note: I noticed that Cache::Memcached module does not
> contain support for "flush_all" yet. Would it be a good idea if I
> supplied patches for adding that functionality to Cache::Memcached as
> well?
>
>
> Elizabeth Mattijsen
> =======================================================================
> --- memcached.c.1.1.12 2005-04-05 02:10:26.000000000 +0200
> +++ memcached.c 2005-07-06 20:01:02.000000000 +0200
> @@ -619,8 +619,8 @@
> if (it && (it->it_flags & ITEM_DELETED)) {
> it = 0;
> }
> - if (settings.oldest_live && it &&
> - it->time <= settings.oldest_live) {
> + if (settings.oldest_live && settings.oldest_live <= now &&
> + it && it->time <= settings.oldest_live) {
> item_unlink(it);
> it = 0;
> }
> @@ -707,8 +707,23 @@
> return;
> }
>
> - if (strcmp(command, "flush_all") == 0) {
> - settings.oldest_live = time(0);
> + if (strncmp(command, "flush_all", 9) == 0) {
> + time_t exptime = 0;
> + int res;
> +
> + if (strcmp(command, "flush_all") == 0) {
> + settings.oldest_live = time(0);
> + out_string(c, "OK");
> + return;
> + }
> +
> + res = sscanf(command, "%*s %ld", &exptime);
> + if (res != 1) {
> + out_string(c, "ERROR");
> + return;
> + }
> +
> + settings.oldest_live = realtime(exptime);
> out_string(c, "OK");
> return;
> }
> --- doc/protocol.txt.1.1.12 2004-04-26 23:26:48.000000000 +0200
> +++ doc/protocol.txt 2005-07-06 20:09:24.000000000 +0200
> @@ -359,16 +359,17 @@
> Other commands
> --------------
>
> -"flush_all" is a command with no arguments. It always succeeds,
> -and the server sends "OK\r\n" in response. Its effect is to immediately
> -invalidate all existing items: none of them will be returned in
> -response to a retrieval command (unless it's stored again under the
> -same key *after* flush_all has been executed). flush_all doesn't
> +"flush_all" is a command with an optional numeric argument. It always
> +succeeds, and the server sends "OK\r\n" in response. Its effect is to
> +invalidate all existing items immediately (by default) or after the
> +expiration specified. After invalidation none of the items will be returned
> +in response to a retrieval command (unless it's stored again under the
> +same key *after* flush_all has invalidated the items). flush_all doesn't
> actually free all the memory taken up by existing items; that will
> happen gradually as new items are stored. The most precise definition
> of what flush_all does is the following: it causes all items whose
> -update time is earlier than the time at which flush_all was executed
> -to be ignored for retrieval purposes.
> +update time is earlier than the time at which flush_all was set to be
> +executed to be ignored for retrieval purposes.
>
> "version" is a command with no arguments:
>
More information about the memcached
mailing list