|
Packit |
4e8bc4 |
#!/usr/bin/perl
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
use strict;
|
|
Packit |
4e8bc4 |
use warnings;
|
|
Packit |
4e8bc4 |
use Test::More tests => 12;
|
|
Packit |
4e8bc4 |
use FindBin qw($Bin);
|
|
Packit |
4e8bc4 |
use lib "$Bin/lib";
|
|
Packit |
4e8bc4 |
use MemcachedTest;
|
|
Packit |
4e8bc4 |
use Data::Dumper qw/Dumper/;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $server = new_memcached('-m 60 -o slab_reassign,slab_automove,lru_crawler,lru_maintainer,slab_automove_window=3');
|
|
Packit |
4e8bc4 |
my $sock = $server->sock;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $value = "B"x11000;
|
|
Packit |
4e8bc4 |
my $keycount = 5000;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $res;
|
|
Packit |
4e8bc4 |
for (1 .. $keycount) {
|
|
Packit |
4e8bc4 |
print $sock "set nfoo$_ 0 0 11000 noreply\r\n$value\r\n";
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $todelete = 0;
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
cmp_ok($stats->{curr_items}, '>', 4000, "stored at least 4000 11k items");
|
|
Packit |
4e8bc4 |
$todelete = $stats->{curr_items};
|
|
Packit |
4e8bc4 |
# for ('evictions', 'reclaimed', 'curr_items', 'cmd_set', 'bytes') {
|
|
Packit |
4e8bc4 |
# print STDERR "$_: ", $stats->{$_}, "\n";
|
|
Packit |
4e8bc4 |
# }
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Make room in old class so rescues can happen when we switch slab classes.
|
|
Packit |
4e8bc4 |
for (1 .. $todelete) {
|
|
Packit |
4e8bc4 |
next unless $_ % 2 == 0;
|
|
Packit |
4e8bc4 |
print $sock "delete nfoo$_ noreply\r\n";
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $tries;
|
|
Packit |
4e8bc4 |
for ($tries = 20; $tries > 0; $tries--) {
|
|
Packit |
4e8bc4 |
sleep 1;
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
if ($stats->{slab_global_page_pool} > 24) {
|
|
Packit |
4e8bc4 |
last;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
cmp_ok($tries, '>', 0, 'some pages moved back to global pool');
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
$value = "B"x7000;
|
|
Packit |
4e8bc4 |
for (1 .. $keycount) {
|
|
Packit |
4e8bc4 |
print $sock "set ifoo$_ 0 0 7000 noreply\r\n$value\r\n";
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $missing = 0;
|
|
Packit |
4e8bc4 |
my $hits = 0;
|
|
Packit |
4e8bc4 |
for (1 .. $keycount) {
|
|
Packit |
4e8bc4 |
print $sock "get ifoo$_\r\n";
|
|
Packit |
4e8bc4 |
my $body = scalar(<$sock>);
|
|
Packit |
4e8bc4 |
my $expected = "VALUE ifoo$_ 0 7000\r\n$value\r\nEND\r\n";
|
|
Packit |
4e8bc4 |
if ($body =~ /^END/) {
|
|
Packit |
4e8bc4 |
$missing++;
|
|
Packit |
4e8bc4 |
} else {
|
|
Packit |
4e8bc4 |
$body .= scalar(<$sock>) . scalar(<$sock>);
|
|
Packit |
4e8bc4 |
if ($body ne $expected) {
|
|
Packit |
4e8bc4 |
print STDERR "Something terrible has happened: $expected\nBODY:\n$body\nDONETEST\n";
|
|
Packit |
4e8bc4 |
} else {
|
|
Packit |
4e8bc4 |
$hits++;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
#print STDERR "HITS: $hits, MISSES: $missing\n";
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
cmp_ok($stats->{evictions}, '<', 2000, 'evictions were less than 2000');
|
|
Packit |
4e8bc4 |
# for ('evictions', 'reclaimed', 'curr_items', 'cmd_set', 'bytes') {
|
|
Packit |
4e8bc4 |
# print STDERR "$_: ", $stats->{$_}, "\n";
|
|
Packit |
4e8bc4 |
# }
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Force reassign evictions by moving too much memory manually.
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $s = mem_stats($sock, 'slabs');
|
|
Packit |
4e8bc4 |
my $max_pages = 0;
|
|
Packit |
4e8bc4 |
my $scls = 0;
|
|
Packit |
4e8bc4 |
for my $k (keys %$s) {
|
|
Packit |
4e8bc4 |
next unless $k =~ m/^(\d+)\:total_pages/;
|
|
Packit |
4e8bc4 |
if ($s->{$k} > $max_pages) {
|
|
Packit |
4e8bc4 |
$max_pages = $s->{$k};
|
|
Packit |
4e8bc4 |
$scls = $1;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
my $tries;
|
|
Packit |
4e8bc4 |
for ($tries = 10; $tries > 0; $tries--) {
|
|
Packit |
4e8bc4 |
print $sock "slabs reassign $scls 1\r\n";
|
|
Packit |
4e8bc4 |
my $res = <$sock>;
|
|
Packit |
4e8bc4 |
sleep 1;
|
|
Packit |
4e8bc4 |
my $s = mem_stats($sock);
|
|
Packit |
4e8bc4 |
last if $s->{slab_reassign_evictions_nomem} > 0;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
cmp_ok($tries, '>', 0, 'some reassign evictions happened');
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
cmp_ok($hits, '>', 2000, 'were able to fetch back some of the small keys');
|
|
Packit |
4e8bc4 |
my $stats_done = mem_stats($sock);
|
|
Packit |
4e8bc4 |
cmp_ok($stats_done->{slab_reassign_rescues}, '>', 0, 'some reassign rescues happened');
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "flush_all\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "OK\r\n", "did flush_all");
|
|
Packit |
4e8bc4 |
my $tries;
|
|
Packit |
4e8bc4 |
for ($tries = 20; $tries > 0; $tries--) {
|
|
Packit |
4e8bc4 |
sleep 1;
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
if ($stats->{slab_global_page_pool} > 50) {
|
|
Packit |
4e8bc4 |
last;
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
cmp_ok($tries, '>', 0, 'reclaimed at least 50 pages before timeout');
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock, "slabs");
|
|
Packit |
4e8bc4 |
is($stats->{total_malloced}, 62914560, "total_malloced is what we expect");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Set into an entirely new class. Overload a bit to try to cause problems.
|
|
Packit |
4e8bc4 |
$value = "B"x4096;
|
|
Packit |
4e8bc4 |
for (1 .. $keycount * 4) {
|
|
Packit |
4e8bc4 |
print $sock "set jfoo$_ 0 0 4096 noreply\r\n$value\r\n";
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
cmp_ok($stats->{curr_items}, '>', 10000, "stored at least 10000 4k items");
|
|
Packit |
4e8bc4 |
is($stats->{slab_global_page_pool}, 0, "drained the global page pool");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
{
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($sock, "slabs");
|
|
Packit |
4e8bc4 |
is($stats->{total_malloced}, 62914560, "total_malloced is same after re-assignment");
|
|
Packit |
4e8bc4 |
}
|