Blame t/restart.t

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
}