|
Packit |
4e8bc4 |
#!/usr/bin/perl
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
use strict;
|
|
Packit |
4e8bc4 |
use warnings;
|
|
Packit |
4e8bc4 |
use Test::More;
|
|
Packit |
4e8bc4 |
use FindBin qw($Bin);
|
|
Packit |
4e8bc4 |
use lib "$Bin/lib";
|
|
Packit |
4e8bc4 |
use MemcachedTest;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# NOTE: Do not use this feature on top of a filesystem, please use a ram disk!
|
|
Packit |
4e8bc4 |
# These tests use /tmp/ as some systems do not have or have a weirdly small
|
|
Packit |
4e8bc4 |
# /dev/shm.
|
|
Packit |
4e8bc4 |
my $mem_path = "/tmp/mc_restart.$$";
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# read a invalid metadata file
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $meta_path = "$mem_path.meta";
|
|
Packit |
4e8bc4 |
open(my $f, "> $meta_path") || die("Can't open a metadata file.");
|
|
Packit |
4e8bc4 |
eval { new_memcached("-e $mem_path"); };
|
|
Packit |
4e8bc4 |
unlink($meta_path);
|
|
Packit |
4e8bc4 |
ok($@, "Died with an empty metadata file");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $server = new_memcached("-m 128 -e $mem_path -I 2m");
|
|
Packit |
4e8bc4 |
my $sock = $server->sock;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
diag "Set some values, various sizes.";
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $cur = 2;
|
|
Packit |
4e8bc4 |
my $cnt = 0;
|
|
Packit |
4e8bc4 |
my $end = 2**20;
|
|
Packit |
4e8bc4 |
while ($cur <= $end) {
|
|
Packit |
4e8bc4 |
my $val = 'x' x $cur;
|
|
Packit |
4e8bc4 |
print $sock "set foo${cnt} 0 0 $cur\r\n$val\r\n";
|
|
Packit |
4e8bc4 |
like(scalar <$sock>, qr/STORED/, "stored $cur size item");
|
|
Packit |
4e8bc4 |
$cur *= 2;
|
|
Packit |
4e8bc4 |
$cnt++;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
diag "load enough items to change hash power level";
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
is($stats->{hash_power_level}, 16, "starting hash level is 16");
|
|
Packit |
4e8bc4 |
my $todo = 2**17;
|
|
Packit |
4e8bc4 |
my $good = 1;
|
|
Packit |
4e8bc4 |
while ($todo--) {
|
|
Packit |
4e8bc4 |
print $sock "set z${todo} 0 0 0\r\n\r\n";
|
|
Packit |
4e8bc4 |
my $res = <$sock>;
|
|
Packit |
4e8bc4 |
$good = 0 if ($res !~ m/STORED/);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
is($good, 1, "set responses were all STORED");
|
|
Packit |
4e8bc4 |
sleep 3; # sigh.
|
|
Packit |
4e8bc4 |
$stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
is($stats->{hash_power_level}, 17, "new hash power level is 17");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Now delete all these items, so the auto-restore won't cause the hash
|
|
Packit |
4e8bc4 |
# table to re-inflate, but the restart code should restore the hash table
|
|
Packit |
4e8bc4 |
# to where it was regardless.
|
|
Packit |
4e8bc4 |
$todo = 2**17;
|
|
Packit |
4e8bc4 |
$good = 1;
|
|
Packit |
4e8bc4 |
while ($todo--) {
|
|
Packit |
4e8bc4 |
print $sock "delete z${todo}\r\n";
|
|
Packit |
4e8bc4 |
my $res = <$sock>;
|
|
Packit |
4e8bc4 |
$good = 0 if ($res !~ m/DELETED/);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
is($good, 1, "delete responses were all DELETED");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
diag "Load a couple chunked items";
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $cur = 768000;
|
|
Packit |
4e8bc4 |
my $cnt = 0;
|
|
Packit |
4e8bc4 |
my $end = $cur + 1024;
|
|
Packit |
4e8bc4 |
while ($cur <= $end) {
|
|
Packit |
4e8bc4 |
my $val = 'x' x $cur;
|
|
Packit |
4e8bc4 |
print $sock "set chunk${cnt} 0 0 $cur\r\n$val\r\n";
|
|
Packit |
4e8bc4 |
like(scalar <$sock>, qr/STORED/, "stored $cur size item");
|
|
Packit |
4e8bc4 |
$cur += 50;
|
|
Packit |
4e8bc4 |
$cnt++;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
diag "Data that should expire while stopped.";
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
print $sock "set low1 0 8 2\r\nbo\r\n";
|
|
Packit |
4e8bc4 |
like(scalar <$sock>, qr/STORED/, "stored low ttl item");
|
|
Packit |
4e8bc4 |
# This one should stay.
|
|
Packit |
4e8bc4 |
print $sock "set low2 0 20 2\r\nmo\r\n";
|
|
Packit |
4e8bc4 |
like(scalar <$sock>, qr/STORED/, "stored low ttl item");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# make sure it's okay to stop with a logger watcher enabled.
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $wsock = $server->new_sock;
|
|
Packit |
4e8bc4 |
print $wsock "watch fetchers mutations\n";
|
|
Packit |
4e8bc4 |
my $res = <$wsock>;
|
|
Packit |
4e8bc4 |
is($res, "OK\r\n", "watcher enabled");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
$server->graceful_stop();
|
|
Packit |
4e8bc4 |
diag "killed, waiting";
|
|
Packit |
4e8bc4 |
# TODO: add way to wait for server to fully exit..
|
|
Packit |
4e8bc4 |
sleep 10;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
$server = new_memcached("-m 128 -e $mem_path -I 2m");
|
|
Packit |
4e8bc4 |
$sock = $server->sock;
|
|
Packit |
4e8bc4 |
diag "reconnected";
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
is($stats->{hash_power_level}, 17, "restarted hash power level is 17");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
diag "low TTL item should be gone";
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
mem_get_is($sock, 'low1', undef);
|
|
Packit |
4e8bc4 |
# but this one should exist.
|
|
Packit |
4e8bc4 |
mem_get_is($sock, 'low2', 'mo');
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# initially inserted items.
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $cur = 2;
|
|
Packit |
4e8bc4 |
my $cnt = 0;
|
|
Packit |
4e8bc4 |
my $end = 1000000;
|
|
Packit |
4e8bc4 |
while ($cur < $end) {
|
|
Packit |
4e8bc4 |
my $val = 'x' x $cur;
|
|
Packit |
4e8bc4 |
mem_get_is($sock, 'foo' . $cnt, $val);
|
|
Packit |
4e8bc4 |
$cur *= 2;
|
|
Packit |
4e8bc4 |
$cnt++;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# chunked items.
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $cur = 768000;
|
|
Packit |
4e8bc4 |
my $cnt = 0;
|
|
Packit |
4e8bc4 |
my $end = $cur + 1024;
|
|
Packit |
4e8bc4 |
while ($cur <= $end) {
|
|
Packit |
4e8bc4 |
my $val = 'x' x $cur;
|
|
Packit |
4e8bc4 |
mem_get_is($sock, 'chunk' . $cnt, $val);
|
|
Packit |
4e8bc4 |
$cur += 50;
|
|
Packit |
4e8bc4 |
$cnt++;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
done_testing();
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
END {
|
|
Packit |
4e8bc4 |
unlink $mem_path if $mem_path;
|
|
Packit |
4e8bc4 |
}
|