Blame t/slabs-reassign-chunked.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 tests => 8;
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
my $server = new_memcached('-m 60 -o slab_reassign,slab_automove,lru_crawler,lru_maintainer,slab_chunk_max=4096');
Packit Service 584ef9
my $sock = $server->sock;
Packit Service 584ef9
Packit Service 584ef9
sub dump_stats {
Packit Service 584ef9
    my $s = shift;
Packit Service 584ef9
    my $filter = shift || '';
Packit Service 584ef9
    for my $k (sort keys %$s) {
Packit Service 584ef9
        if ($filter) {
Packit Service 584ef9
            next unless $k =~ m/$filter/;
Packit Service 584ef9
        }
Packit Service 584ef9
        print STDERR "STAT: $k = ", $s->{$k}, "\n";
Packit Service 584ef9
    }
Packit Service 584ef9
}
Packit Service 584ef9
Packit Service 584ef9
my $value;
Packit Service 584ef9
{
Packit Service 584ef9
    my @chars = ("C".."Z");
Packit Service 584ef9
    for (1 .. 11000) {
Packit Service 584ef9
        $value .= $chars[rand @chars];
Packit Service 584ef9
    }
Packit Service 584ef9
}
Packit Service 584ef9
my $keycount = 5100;
Packit Service 584ef9
Packit Service 584ef9
my $res;
Packit Service 584ef9
for (1 .. $keycount) {
Packit Service 584ef9
#    print STDERR "HI $_\n";
Packit Service 584ef9
    print $sock "set nfoo$_ 0 0 11000 noreply\r\n$value\r\n";
Packit Service 584ef9
#    print $sock "set nfoo$_ 0 0 11000\r\n$value\r\n";
Packit Service 584ef9
#    my $res = scalar <$sock>;
Packit Service 584ef9
#    print STDERR "RES: $res\n";
Packit Service 584ef9
}
Packit Service 584ef9
Packit Service 584ef9
my $todelete = 0;
Packit Service 584ef9
{
Packit Service 584ef9
    my $stats = mem_stats($sock);
Packit Service 584ef9
    cmp_ok($stats->{curr_items}, '>', 4000, "stored at least 4000 11k items");
Packit Service 584ef9
    $todelete = $stats->{curr_items} / 2;
Packit Service 584ef9
#    for ('evictions', 'reclaimed', 'curr_items', 'cmd_set', 'bytes') {
Packit Service 584ef9
#        print STDERR "$_: ", $stats->{$_}, "\n";
Packit Service 584ef9
#    }
Packit Service 584ef9
}
Packit Service 584ef9
Packit Service 584ef9
{
Packit Service 584ef9
    my $s = mem_stats($sock, 'slabs');
Packit Service 584ef9
    my $sid;
Packit Service 584ef9
    # Find the highest ID to source from.
Packit Service 584ef9
    for my $k (keys %$s) {
Packit Service 584ef9
        next unless $k =~ m/^(\d+):/;
Packit Service 584ef9
        $sid = $s->{$k} if $s->{$k} > $1;
Packit Service 584ef9
    }
Packit Service 584ef9
    for (my $x = 0; $x < 3; $x++) {
Packit Service 584ef9
        print $sock "slabs reassign 17 0\r\n";
Packit Service 584ef9
        my $res = scalar <$sock>;
Packit Service 584ef9
        chomp $res;
Packit Service 584ef9
    #    print STDERR "SLABS REASSIGN RESULT: $res\n";
Packit Service 584ef9
        sleep 1;
Packit Service 584ef9
    }
Packit Service 584ef9
}
Packit Service 584ef9
Packit Service 584ef9
# Make room in old class so rescues can happen when we switch slab classes.
Packit Service 584ef9
#for (1 .. $todelete) {
Packit Service 584ef9
#    print $sock "delete nfoo$_ noreply\r\n";
Packit Service 584ef9
#}
Packit Service 584ef9
Packit Service 584ef9
# Give  LRU mover some time to reclaim slab chunks.
Packit Service 584ef9
#sleep 1;
Packit Service 584ef9
Packit Service 584ef9
{
Packit Service 584ef9
    my $stats = mem_stats($sock);
Packit Service 584ef9
    cmp_ok($stats->{slab_global_page_pool}, '>', 0, 'global page pool > 0');
Packit Service 584ef9
    cmp_ok($stats->{slab_reassign_chunk_rescues}, '>', 0, 'some chunk rescues happened');
Packit Service 584ef9
}
Packit Service 584ef9
Packit Service 584ef9
{
Packit Service 584ef9
    my $hits = 0;
Packit Service 584ef9
    for (1 .. $keycount) {
Packit Service 584ef9
        print $sock "get nfoo$_\r\n";
Packit Service 584ef9
        my $body = scalar(<$sock>);
Packit Service 584ef9
        my $expected = "VALUE nfoo$_ 0 11000\r\n$value\r\nEND\r\n";
Packit Service 584ef9
        if ($body =~ /^END/) {
Packit Service 584ef9
            next;
Packit Service 584ef9
        } else {
Packit Service 584ef9
            $body .= scalar(<$sock>) . scalar(<$sock>);
Packit Service 584ef9
            if ($body ne $expected) {
Packit Service 584ef9
                die "Something terrible has happened: $expected\nBODY:\n$body\nDONETEST\n";
Packit Service 584ef9
            }
Packit Service 584ef9
            $hits++;
Packit Service 584ef9
        }
Packit Service 584ef9
    }
Packit Service 584ef9
    cmp_ok($hits, '>', 0, "fetched back $hits values after reassignment");
Packit Service 584ef9
}
Packit Service 584ef9
Packit Service 584ef9
$value = "A"x3000;
Packit Service 584ef9
for (1 .. $keycount) {
Packit Service 584ef9
    print $sock "set ifoo$_ 0 0 3000 noreply\r\n$value\r\n";
Packit Service 584ef9
}
Packit Service 584ef9
Packit Service 584ef9
my $missing = 0;
Packit Service 584ef9
my $hits = 0;
Packit Service 584ef9
for (1 .. $keycount) {
Packit Service 584ef9
    print $sock "get ifoo$_\r\n";
Packit Service 584ef9
    my $body = scalar(<$sock>);
Packit Service 584ef9
    my $expected = "VALUE ifoo$_ 0 3000\r\n$value\r\nEND\r\n";
Packit Service 584ef9
    if ($body =~ /^END/) {
Packit Service 584ef9
        $missing++;
Packit Service 584ef9
    } else {
Packit Service 584ef9
        $body .= scalar(<$sock>) . scalar(<$sock>);
Packit Service 584ef9
        if ($body ne $expected) {
Packit Service 584ef9
            print STDERR "Something terrible has happened: $expected\nBODY:\n$body\nDONETEST\n";
Packit Service 584ef9
        } else {
Packit Service 584ef9
            $hits++;
Packit Service 584ef9
        }
Packit Service 584ef9
    }
Packit Service 584ef9
}
Packit Service 584ef9
#print STDERR "HITS: $hits, MISSES: $missing\n";
Packit Service 584ef9
Packit Service 584ef9
{
Packit Service 584ef9
    my $stats = mem_stats($sock);
Packit Service 584ef9
    cmp_ok($stats->{evictions}, '<', 2000, 'evictions were less than 2000');
Packit Service 584ef9
#    for ('evictions', 'reclaimed', 'curr_items', 'cmd_set', 'bytes') {
Packit Service 584ef9
#        print STDERR "$_: ", $stats->{$_}, "\n";
Packit Service 584ef9
#    }
Packit Service 584ef9
}
Packit Service 584ef9
Packit Service 584ef9
cmp_ok($hits, '>', 4000, 'were able to fetch back 2/3rds of 8k keys');
Packit Service 584ef9
my $stats_done = mem_stats($sock);
Packit Service 584ef9
cmp_ok($stats_done->{slab_reassign_chunk_rescues}, '>', 0, 'some reassign chunk rescues happened');
Packit Service 584ef9
# Reassign rescues won't happen here because the headers are of a different
Packit Service 584ef9
# size and we aren't moving pages out of that slab class
Packit Service 584ef9
#cmp_ok($stats_done->{slab_reassign_rescues}, '>', 0, 'some reassign rescues happened');
Packit Service 584ef9
cmp_ok($stats_done->{slab_reassign_evictions_nomem}, '>', 0, 'some reassign evictions happened');
Packit Service 584ef9