Blame t/slabhang.t

Packit 4e8bc4
#!/usr/bin/perl
Packit 4e8bc4
Packit 4e8bc4
use strict;
Packit 4e8bc4
use warnings;
Packit 4e8bc4
Packit 4e8bc4
use Test::More;
Packit 4e8bc4
Packit 4e8bc4
use FindBin qw($Bin);
Packit 4e8bc4
use lib "$Bin/lib";
Packit 4e8bc4
use MemcachedTest;
Packit 4e8bc4
Packit 4e8bc4
plan skip_all => 'Test is flaky. Needs special hooks.';
Packit 4e8bc4
Packit 4e8bc4
plan tests => 74;
Packit 4e8bc4
Packit 4e8bc4
# start up a server with 10 maximum connections
Packit 4e8bc4
my $server = new_memcached("-m 16 -o modern");
Packit 4e8bc4
my $sock = $server->sock;
Packit 4e8bc4
my $hangsock = $server->new_sock;
Packit 4e8bc4
my $value = "B"x260144;
Packit 4e8bc4
my $key = 0;
Packit 4e8bc4
Packit 4e8bc4
# disable the normal automover.
Packit 4e8bc4
print $sock "slabs automove 0\r\n";
Packit 4e8bc4
is(scalar <$sock>, "OK\r\n", "automover disabled");
Packit 4e8bc4
Packit 4e8bc4
# These aren't set to expire.
Packit 4e8bc4
my $mget = '';
Packit 4e8bc4
for ($key = 0; $key < 70; $key++) {
Packit 4e8bc4
    $mget .= "key$key ";
Packit 4e8bc4
    print $sock "set key$key 0 0 260144\r\n$value\r\n";
Packit 4e8bc4
    is(scalar <$sock>, "STORED\r\n", "stored key$key");
Packit 4e8bc4
}
Packit 4e8bc4
chop $mget;
Packit 4e8bc4
Packit 4e8bc4
# Don't intend to read the results, need to fill the socket.
Packit 4e8bc4
print $hangsock "get $mget\r\n";
Packit 4e8bc4
#sleep 8;
Packit 4e8bc4
my $stats = mem_stats($sock, "slabs");
Packit 4e8bc4
my $source = 0;
Packit 4e8bc4
for my $key (keys %$stats) {
Packit 4e8bc4
    if ($key =~ m/^(\d+):total_pages/) {
Packit 4e8bc4
        my $sid = $1;
Packit 4e8bc4
        if ($stats->{$key} > 10) {
Packit 4e8bc4
            $source = $sid;
Packit 4e8bc4
            last;
Packit 4e8bc4
        }
Packit 4e8bc4
    }
Packit 4e8bc4
}
Packit 4e8bc4
isnt($source, 0, "found the source slab: $source");
Packit 4e8bc4
Packit 4e8bc4
my $busy;
Packit 4e8bc4
my $tomove = 4;
Packit 4e8bc4
my $reassign = "slabs reassign $source 1\r\n";
Packit 4e8bc4
while ($tomove) {
Packit 4e8bc4
    $busy = 0;
Packit 4e8bc4
    print $sock $reassign;
Packit 4e8bc4
    my $res = scalar <$sock>;
Packit 4e8bc4
    while ($res =~ m/^BUSY/) {
Packit 4e8bc4
        if ($hangsock && $busy > 5) {
Packit 4e8bc4
            # unjam the pipeline
Packit 4e8bc4
            $hangsock->close;
Packit 4e8bc4
        }
Packit 4e8bc4
        last if ($busy > 10);
Packit 4e8bc4
        sleep 1;
Packit 4e8bc4
        $busy++;
Packit 4e8bc4
        print $sock $reassign;
Packit 4e8bc4
        $res = scalar <$sock>;
Packit 4e8bc4
    }
Packit 4e8bc4
    last if ($busy > 10);
Packit 4e8bc4
    $tomove--;
Packit 4e8bc4
}
Packit 4e8bc4
Packit 4e8bc4
ok($busy <= 10, "didn't time out moving pages");
Packit 4e8bc4
Packit 4e8bc4
$stats = mem_stats($sock);
Packit 4e8bc4
isnt($stats->{"slab_reassign_busy_deletes"}, "0", "deleted some busy items");