|
Packit |
4e8bc4 |
#!/usr/bin/perl
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
use strict;
|
|
Packit |
4e8bc4 |
use warnings;
|
|
Packit |
4e8bc4 |
use Test::More tests => 130;
|
|
Packit |
4e8bc4 |
use FindBin qw($Bin);
|
|
Packit |
4e8bc4 |
use lib "$Bin/lib";
|
|
Packit |
4e8bc4 |
use MemcachedTest;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Enable manual slab reassign, cap at 6 slabs
|
|
Packit |
4e8bc4 |
my $server = new_memcached('-o slab_reassign -m 4');
|
|
Packit |
4e8bc4 |
my $stats = mem_stats($server->sock, ' settings');
|
|
Packit |
4e8bc4 |
is($stats->{slab_reassign}, "yes");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $sock = $server->sock;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Fill a largeish slab until it evicts (honors the -m 6)
|
|
Packit |
4e8bc4 |
my $bigdata = 'x' x 70000; # slab 31
|
|
Packit |
4e8bc4 |
for (1 .. 60) {
|
|
Packit |
4e8bc4 |
print $sock "set bfoo$_ 0 0 70000\r\n", $bigdata, "\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "STORED\r\n", "stored key");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Fill a smaller slab until it evicts
|
|
Packit |
4e8bc4 |
my $smalldata = 'y' x 20000; # slab 25
|
|
Packit |
4e8bc4 |
for (1 .. 60) {
|
|
Packit |
4e8bc4 |
print $sock "set sfoo$_ 0 0 20000\r\n", $smalldata, "\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "STORED\r\n", "stored key");
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $items_before = mem_stats($sock, "items");
|
|
Packit |
4e8bc4 |
isnt($items_before->{"items:31:evicted"}, 0, "slab 31 evicted is nonzero");
|
|
Packit |
4e8bc4 |
isnt($items_before->{"items:25:evicted"}, 0, "slab 25 evicted is nonzero");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
my $slabs_before = mem_stats($sock, "slabs");
|
|
Packit |
4e8bc4 |
# Move a large slab to the smaller slab
|
|
Packit |
4e8bc4 |
print $sock "slabs reassign 31 25\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "OK\r\n", "slab rebalancer started");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Still working out how/if to signal the thread. For now, just sleep.
|
|
Packit |
4e8bc4 |
sleep 2;
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Check that stats counters increased
|
|
Packit |
4e8bc4 |
my $slabs_after = mem_stats($sock, "slabs");
|
|
Packit |
4e8bc4 |
$stats = mem_stats($sock);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
isnt($stats->{slabs_moved}, 0, "slabs moved is nonzero");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Check that slab stats reflect the change
|
|
Packit |
4e8bc4 |
ok($slabs_before->{"31:total_pages"} != $slabs_after->{"31:total_pages"},
|
|
Packit |
4e8bc4 |
"slab 31 pagecount changed");
|
|
Packit |
4e8bc4 |
ok($slabs_before->{"25:total_pages"} != $slabs_after->{"25:total_pages"},
|
|
Packit |
4e8bc4 |
"slab 25 pagecount changed");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Try to move another slab, see that you can move two in a row
|
|
Packit |
4e8bc4 |
print $sock "slabs reassign 31 25\r\n";
|
|
Packit |
4e8bc4 |
like(scalar <$sock>, qr/^OK/, "Cannot re-run against class with empty space");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Try to move a page backwards. Should complain that source class isn't "safe"
|
|
Packit |
4e8bc4 |
# to move from.
|
|
Packit |
4e8bc4 |
# TODO: Wait until the above command completes, then try to move it back?
|
|
Packit |
4e8bc4 |
# Seems pointless...
|
|
Packit |
4e8bc4 |
#print $sock "slabs reassign 25 31\r\n";
|
|
Packit |
4e8bc4 |
#like(scalar <$sock>, qr/^UNSAFE/, "Cannot move an unsafe slab back");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Try to insert items into both slabs
|
|
Packit |
4e8bc4 |
print $sock "set bfoo51 0 0 70000\r\n", $bigdata, "\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "STORED\r\n", "stored key");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
print $sock "set sfoo51 0 0 20000\r\n", $smalldata, "\r\n";
|
|
Packit |
4e8bc4 |
is(scalar <$sock>, "STORED\r\n", "stored key");
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
# Do need to come up with better automated tests for this.
|