Blame t/restart.t

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