summaryrefslogtreecommitdiff
path: root/t/slabs-reassign-chunked.t
diff options
context:
space:
mode:
authordormando <dormando@rydia.net>2016-07-11 19:06:56 -0700
committerdormando <dormando@rydia.net>2016-07-12 18:42:46 -0700
commitee461d1102053668758e19922813617a0cb9bba6 (patch)
tree2049dcc9b83fd9b20a3216ece114ab6a54d89f77 /t/slabs-reassign-chunked.t
parent6975235c3d3a3af812a1fc2896f07d9dab1d2eee (diff)
downloadmemcached-ee461d1102053668758e19922813617a0cb9bba6.tar.gz
slabs reassigns works with chunks and chunked items.
also fixes the new LRU algorithm to balance by total bytes used rather than total chunks used, since total chunks used isn't tracked for multi-chunk items. also fixes a bug where the lru limit wasn't being utilized for HOT_LRU also some cleanup from previous commits.
Diffstat (limited to 't/slabs-reassign-chunked.t')
-rw-r--r--t/slabs-reassign-chunked.t129
1 files changed, 129 insertions, 0 deletions
diff --git a/t/slabs-reassign-chunked.t b/t/slabs-reassign-chunked.t
new file mode 100644
index 0000000..2a104e2
--- /dev/null
+++ b/t/slabs-reassign-chunked.t
@@ -0,0 +1,129 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More tests => 8;
+use FindBin qw($Bin);
+use lib "$Bin/lib";
+use MemcachedTest;
+
+my $server = new_memcached('-m 60 -o slab_reassign,slab_automove,lru_crawler,lru_maintainer,slab_chunk_max=4096');
+my $sock = $server->sock;
+
+sub dump_stats {
+ my $s = shift;
+ my $filter = shift || '';
+ for my $k (sort keys %$s) {
+ if ($filter) {
+ next unless $k =~ m/$filter/;
+ }
+ print STDERR "STAT: $k = ", $s->{$k}, "\n";
+ }
+}
+
+my $value;
+{
+ my @chars = ("C".."Z");
+ for (1 .. 11000) {
+ $value .= $chars[rand @chars];
+ }
+}
+my $keycount = 5100;
+
+my $res;
+for (1 .. $keycount) {
+# print STDERR "HI $_\n";
+ print $sock "set nfoo$_ 0 0 11000 noreply\r\n$value\r\n";
+# print $sock "set nfoo$_ 0 0 11000\r\n$value\r\n";
+# my $res = scalar <$sock>;
+# print STDERR "RES: $res\n";
+}
+
+my $todelete = 0;
+{
+ my $stats = mem_stats($sock);
+ cmp_ok($stats->{curr_items}, '>', 4000, "stored at least 4000 11k items");
+ $todelete = $stats->{curr_items} / 2;
+# for ('evictions', 'reclaimed', 'curr_items', 'cmd_set', 'bytes') {
+# print STDERR "$_: ", $stats->{$_}, "\n";
+# }
+}
+
+for (my $x = 0; $x < 3; $x++) {
+ print $sock "slabs reassign 17 0\r\n";
+ my $res = scalar <$sock>;
+ chomp $res;
+# print STDERR "SLABS REASSIGN RESULT: $res\n";
+ sleep 1;
+}
+
+# Make room in old class so rescues can happen when we switch slab classes.
+#for (1 .. $todelete) {
+# print $sock "delete nfoo$_ noreply\r\n";
+#}
+
+# Give LRU mover some time to reclaim slab chunks.
+#sleep 1;
+
+{
+ my $stats = mem_stats($sock);
+ cmp_ok($stats->{slab_global_page_pool}, '>', 0, 'global page pool > 0');
+ cmp_ok($stats->{slab_reassign_chunk_rescues}, '>', 0, 'some chunk rescues happened');
+}
+
+{
+ my $hits = 0;
+ for (1 .. $keycount) {
+ print $sock "get nfoo$_\r\n";
+ my $body = scalar(<$sock>);
+ my $expected = "VALUE nfoo$_ 0 11000\r\n$value\r\nEND\r\n";
+ if ($body =~ /^END/) {
+ next;
+ } else {
+ $body .= scalar(<$sock>) . scalar(<$sock>);
+ if ($body ne $expected) {
+ die "Something terrible has happened: $expected\nBODY:\n$body\nDONETEST\n";
+ }
+ $hits++;
+ }
+ }
+ cmp_ok($hits, '>', 0, "fetched back $hits values after reassignment");
+}
+
+$value = "A"x3000;
+for (1 .. $keycount) {
+ print $sock "set ifoo$_ 0 0 3000 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 3000\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 reassign evictions happened');
+