summaryrefslogtreecommitdiff
path: root/t/slabs-reassign2.t
blob: c8e6c1eb955819039dbbfb075c7e3b9190ef7290 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/perl

use strict;
use warnings;
use Test::More tests => 11;
use FindBin qw($Bin);
use lib "$Bin/lib";
use MemcachedTest;

my $server = new_memcached('-m 64 -o slab_reassign,slab_automove=2,lru_crawler,lru_maintainer');
my $sock = $server->sock;

my $value = "B"x10240;
my $keycount = 6000;

my $res;
for (1 .. $keycount) {
    print $sock "set nfoo$_ 0 0 10240 noreply\r\n$value\r\n";
}

{
    my $stats = mem_stats($sock);
    is($stats->{curr_items}, $keycount, "stored $keycount 10k items");
#    for ('evictions', 'reclaimed', 'curr_items', 'cmd_set', 'bytes') {
#        print STDERR "$_: ", $stats->{$_}, "\n";
#    }
}

$value = "B"x8096;
for (1 .. $keycount) {
    print $sock "set ifoo$_ 0 0 8096 noreply\r\n$value\r\n";
}

my $missing = 0;
my $hits = 0;
for (1 .. $keycount) {
    print $sock "get ifoo$_\r\n";
    my $body = scalar(<$sock>);
    my $expected = "VALUE ifoo$_ 0 8096\r\n$value\r\nEND\r\n";
    if ($body =~ /^END/) {
        $missing++;
    } else {
        $body .= scalar(<$sock>) . scalar(<$sock>);
        if ($body ne $expected) {
            print STDERR "Something terrible has happened: $expected\nBODY:\n$body\nDONETEST\n";
        } else {
            $hits++;
        }
    }
}
#print STDERR "HITS: $hits, MISSES: $missing\n";

{
    my $stats = mem_stats($sock);
    cmp_ok($stats->{evictions}, '<', 2000, 'evictions were less than 2000');
#    for ('evictions', 'reclaimed', 'curr_items', 'cmd_set', 'bytes') {
#        print STDERR "$_: ", $stats->{$_}, "\n";
#    }
}

cmp_ok($hits, '>', 4000, 'were able to fetch back 2/3rds of 8k keys');
my $stats_done = mem_stats($sock);
cmp_ok($stats_done->{slab_reassign_rescues}, '>', 0, 'some reassign rescues happened');
cmp_ok($stats_done->{slab_reassign_evictions_nomem}, '>', 0, 'some reassing evictions happened');

print $sock "flush_all\r\n";
is(scalar <$sock>, "OK\r\n", "did flush_all");
my $tries;
for ($tries = 20; $tries > 0; $tries--) {
    sleep 1;
    my $stats = mem_stats($sock);
    if ($stats->{slab_global_page_pool} == 61) {
        last;
    }
}
cmp_ok($tries, '>', 0, 'reclaimed 61 pages before timeout');

{
    my $stats = mem_stats($sock, "slabs");
    is($stats->{total_malloced}, 68157440, "total_malloced is what we expect");
}

# Set into an entirely new class. Overload a bit to try to cause problems.
$value = "B"x4096;
for (1 .. $keycount * 4) {
    print $sock "set jfoo$_ 0 0 4096 noreply\r\n$value\r\n";
}

{
    my $stats = mem_stats($sock);
    is($stats->{curr_items}, 14490, "stored 14490 4k items");
    is($stats->{slab_global_page_pool}, 0, "drained the global page pool");
}

{
    my $stats = mem_stats($sock, "slabs");
    is($stats->{total_malloced}, 68157440, "total_malloced is same after re-assignment");
}