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