|
Packit |
4e8bc4 |
#!/usr/bin/perl
|
|
Packit |
4e8bc4 |
# Networked logging tests.
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
use strict;
|
|
Packit |
4e8bc4 |
use warnings;
|
|
Packit |
4e8bc4 |
use Socket qw/SO_RCVBUF/;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
use Test::More tests => 13;
|
|
Packit |
4e8bc4 |
use FindBin qw($Bin);
|
|
Packit |
4e8bc4 |
use lib "$Bin/lib";
|
|
Packit |
4e8bc4 |
use MemcachedTest;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $server = new_memcached('-m 60 -o watcher_logbuf_size=8');
|
|
Packit |
4e8bc4 |
my $client = $server->sock;
|
|
Packit |
4e8bc4 |
my $watcher = $server->new_sock;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# This doesn't return anything.
|
|
Packit |
4e8bc4 |
print $watcher "watch\n";
|
|
Packit |
4e8bc4 |
my $res = <$watcher>;
|
|
Packit |
4e8bc4 |
is($res, "OK\r\n", "watcher enabled");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $client "get foo\n";
|
|
Packit |
4e8bc4 |
$res = <$client>;
|
|
Packit |
4e8bc4 |
is($res, "END\r\n", "basic get works");
|
|
Packit |
4e8bc4 |
my $spacer = "X"x180;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# This is a flaky test... depends on buffer sizes. Could either have memc
|
|
Packit |
4e8bc4 |
# shrink the watcher buffer, or loop this and keep doubling until we get some
|
|
Packit |
4e8bc4 |
# skipped values.
|
|
Packit |
4e8bc4 |
for (1 .. 80000) {
|
|
Packit |
4e8bc4 |
print $client "get foo$_$spacer\n";
|
|
Packit |
4e8bc4 |
$res = <$client>;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Let the logger thread catch up before we start reading.
|
|
Packit |
4e8bc4 |
sleep 1;
|
|
Packit |
4e8bc4 |
my $do_fetch = 0;
|
|
Packit |
4e8bc4 |
#print STDERR "RESULT: $res\n";
|
|
Packit |
4e8bc4 |
while (my $log = <$watcher>) {
|
|
Packit |
4e8bc4 |
# The "skipped" line won't actually print until some space frees up in the
|
|
Packit |
4e8bc4 |
# buffer, so we need to occasionally cause new lines to generate.
|
|
Packit |
4e8bc4 |
if (($do_fetch++ % 100) == 0) {
|
|
Packit |
4e8bc4 |
print $client "get foo\n";
|
|
Packit |
4e8bc4 |
$res = <$client>;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
next unless $log =~ m/skipped/;
|
|
Packit |
4e8bc4 |
like($log, qr/skipped=/, "skipped some lines");
|
|
Packit |
4e8bc4 |
# This should unjam more of the text.
|
|
Packit |
4e8bc4 |
print $client "get foob\n";
|
|
Packit |
4e8bc4 |
$res = <$client>;
|
|
Packit |
4e8bc4 |
last;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
$res = <$watcher>;
|
|
Packit |
4e8bc4 |
like($res, qr/ts=\d+\.\d+\ gid=\d+ type=item_get/, "saw a real log line after a skip");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# testing the longest uri encoded key length
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $new_watcher = $server->new_sock;
|
|
Packit |
4e8bc4 |
print $new_watcher "watch mutations\n";
|
|
Packit |
4e8bc4 |
my $watch_res = <$new_watcher>;
|
|
Packit |
4e8bc4 |
my $key = "";
|
|
Packit |
4e8bc4 |
my $max_keylen = 250;
|
|
Packit |
4e8bc4 |
for (1 .. $max_keylen) { $key .= "#"; }
|
|
Packit |
4e8bc4 |
print $client "set $key 0 0 9\r\nmemcached\r\n";
|
|
Packit |
4e8bc4 |
$res = <$client>;
|
|
Packit |
4e8bc4 |
is ($res, "STORED\r\n", "stored the long key");
|
|
Packit |
4e8bc4 |
if ($res eq "STORED\r\n") {
|
|
Packit |
4e8bc4 |
$watch_res = <$new_watcher>;
|
|
Packit |
4e8bc4 |
my $max_uri_keylen = $max_keylen * 3 + length("key=");
|
|
Packit |
4e8bc4 |
my @tab = split(/\s+/, $watch_res);
|
|
Packit |
4e8bc4 |
is (length($tab[3]), $max_uri_keylen, "got the correct uri encoded key length");;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# test combined logs
|
|
Packit |
4e8bc4 |
# fill to evictions, then enable watcher, set again, and look for both lines
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $value = "B"x11000;
|
|
Packit |
4e8bc4 |
my $keycount = 8000;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
for (1 .. $keycount) {
|
|
Packit |
4e8bc4 |
print $client "set n,foo$_ 0 0 11000 noreply\r\n$value\r\n";
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
$watcher = $server->new_sock;
|
|
Packit |
4e8bc4 |
print $watcher "watch mutations evictions\n";
|
|
Packit |
4e8bc4 |
$res = <$watcher>;
|
|
Packit |
4e8bc4 |
is($res, "OK\r\n", "new watcher enabled");
|
|
Packit |
4e8bc4 |
my $watcher2 = $server->new_sock;
|
|
Packit |
4e8bc4 |
print $watcher2 "watch evictions\n";
|
|
Packit |
4e8bc4 |
$res = <$watcher2>;
|
|
Packit |
4e8bc4 |
is($res, "OK\r\n", "evictions watcher enabled");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $client "set bfoo 0 0 11000 noreply\r\n$value\r\n";
|
|
Packit |
4e8bc4 |
my $found_log = 0;
|
|
Packit |
4e8bc4 |
my $found_ev = 0;
|
|
Packit |
4e8bc4 |
while (my $log = <$watcher>) {
|
|
Packit |
4e8bc4 |
$found_log = 1 if ($log =~ m/type=item_store/);
|
|
Packit |
4e8bc4 |
$found_ev = 1 if ($log =~ m/type=eviction/);
|
|
Packit |
4e8bc4 |
last if ($found_log && $found_ev);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
is($found_log, 1, "found rawcmd log entry");
|
|
Packit |
4e8bc4 |
is($found_ev, 1, "found eviction log entry");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# test cas command logs
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
$watcher = $server->new_sock;
|
|
Packit |
4e8bc4 |
print $watcher "watch mutations\n";
|
|
Packit |
4e8bc4 |
$res = <$watcher>;
|
|
Packit |
4e8bc4 |
is($res, "OK\r\n", "mutations watcher enabled");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $client "cas cas_watch_key 0 0 5 0\r\nvalue\r\n";
|
|
Packit |
4e8bc4 |
my $tries = 30;
|
|
Packit |
4e8bc4 |
my $found_cas = 0;
|
|
Packit |
4e8bc4 |
while (my $log = <$watcher>) {
|
|
Packit |
4e8bc4 |
$found_cas = 1 if ($log =~ m/cmd=cas/ && $log =~ m/cas_watch_key/);
|
|
Packit |
4e8bc4 |
last if ($tries-- == 0 || $found_cas);
|
|
Packit |
4e8bc4 |
sleep 1;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
is($found_cas, 1, "correctly logged cas command");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# test no_watch option
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $nowatch_server = new_memcached('-W');
|
|
Packit |
4e8bc4 |
my $watchsock = $nowatch_server->new_sock;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $watchsock "watch mutations\n";
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $watchresult = <$watchsock>;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
is($watchresult, "CLIENT_ERROR watch commands not allowed\r\n", "attempted watch gave client error with no_watch option set");
|
|
Packit |
4e8bc4 |
}
|