From d9ece78091f1dc15332b16131258fb25d9ba3224 Mon Sep 17 00:00:00 2001 From: Tomash Brechko Date: Fri, 22 Feb 2008 04:57:41 +0000 Subject: [PATCH] Implement 'noreply' option for update commands. (Tomash Brechko ) Commands add, set, replace, append, prepend, cas, delete, incr, decr, flush_all, verbosity can take last optional parameter, 'noreply', which instructs the server to not send the reply. Add benchmark script for noreply parameter. git-svn-id: http://code.sixapart.com/svn/memcached/trunk/server@708 b0b603af-a30f-0410-a34e-baf09ae79d0b --- devtools/bench_noreply.pl | 51 ++++++++++++++++++++++++++++++++++++ doc/protocol.txt | 53 ++++++++++++++++++++++++------------- memcached.c | 55 ++++++++++++++++++++++++++++++++------- memcached.h | 1 + t/noreply.t | 53 +++++++++++++++++++++++++++++++++++++ 5 files changed, 185 insertions(+), 28 deletions(-) create mode 100644 devtools/bench_noreply.pl create mode 100644 t/noreply.t diff --git a/devtools/bench_noreply.pl b/devtools/bench_noreply.pl new file mode 100644 index 00000000..365c6825 --- /dev/null +++ b/devtools/bench_noreply.pl @@ -0,0 +1,51 @@ +#! /usr/bin/perl +# +use warnings; +use strict; + +use IO::Socket::INET; + +use FindBin; + +@ARGV == 1 or @ARGV == 2 + or die "Usage: $FindBin::Script HOST:PORT [COUNT]\n"; + +# Note that it's better to run the test over the wire, because for +# localhost the task may become CPU bound. +my $addr = $ARGV[0]; +my $count = $ARGV[1] || 10_000; + +my $sock = IO::Socket::INET->new(PeerAddr => $addr, + Timeout => 3); +die "$!\n" unless $sock; + + +# By running 'noreply' test first we also ensure there are no reply +# packets left in the network. +foreach my $noreply (1, 0) { + use Time::HiRes qw(gettimeofday tv_interval); + + print "'noreply' is ", $noreply ? "enabled" : "disabled", ":\n"; + my $param = $noreply ? 'noreply' : ''; + my $start = [gettimeofday]; + foreach (1 .. $count) { + print $sock "add foo 0 0 1 $param\r\n1\r\n"; + scalar<$sock> unless $noreply; + print $sock "set foo 0 0 1 $param\r\n1\r\n"; + scalar<$sock> unless $noreply; + print $sock "replace foo 0 0 1 $param\r\n1\r\n"; + scalar<$sock> unless $noreply; + print $sock "append foo 0 0 1 $param\r\n1\r\n"; + scalar<$sock> unless $noreply; + print $sock "prepend foo 0 0 1 $param\r\n1\r\n"; + scalar<$sock> unless $noreply; + print $sock "incr foo 1 $param\r\n"; + scalar<$sock> unless $noreply; + print $sock "decr foo 1 $param\r\n"; + scalar<$sock> unless $noreply; + print $sock "delete foo $param\r\n"; + scalar<$sock> unless $noreply; + } + my $end = [gettimeofday]; + printf("update commands: %.2f secs\n\n", tv_interval($start, $end)); +} diff --git a/doc/protocol.txt b/doc/protocol.txt index c72f50ea..3d1d2e86 100644 --- a/doc/protocol.txt +++ b/doc/protocol.txt @@ -126,9 +126,10 @@ Storage commands First, the client sends a command line which looks like this: - []\r\n + [noreply]\r\n +cas [noreply]\r\n -- is "set", "add", "replace", "append", "prepend", or "cas" +- is "set", "add", "replace", "append" or "prepend" "set" means "store this data". @@ -174,6 +175,12 @@ First, the client sends a command line which looks like this: Clients should use the value returned from the "gets" command when issuing "cas" updates. +- "noreply" optional parameter instructs the server to not send the + reply. NOTE: if the request line is malformed, the server can't + parse "noreply" option reliably. In this case it may send the error + to the client, and not reading it on the client side will break + things. Client should construct only valid requests. + After this line, the client sends the data block: \r\n @@ -245,7 +252,7 @@ Deletion The command "delete" allows for explicit deletion of items: -delete