forked from memcached/memcached
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconn-limits.t
71 lines (63 loc) · 2.11 KB
/
conn-limits.t
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
#!/usr/bin/env perl
# Test connection memory limits.
use strict;
use warnings;
use Test::More;
use FindBin qw($Bin);
use lib "$Bin/lib";
use MemcachedTest;
my $server = new_memcached('-o read_buf_mem_limit=1 -t 32 -R 500');
my $sock = $server->sock;
# The minimum limit is 1 megabyte. This is then split between each of the
# worker threads, which ends up being a lot of memory for a quick test.
# So we use a high worker thread count to split them down more.
{
# easiest method is an ascii multiget.
my $key = 'foo';
my @keys = ();
for (1 .. 500) {
push(@keys, $key);
}
my $keylist = join(' ', @keys);
chop($keylist);
print $sock "get ", $keylist, "\r\n";
like(<$sock>, qr/SERVER_ERROR out of memory writing/, "OOM'ed multiget");
my $stats = mem_stats($sock);
isnt(0, $stats->{'response_obj_oom'}, 'non zero response object OOM counter: ' . $stats->{'response_obj_oom'});
}
{
# stacked ascii responses, which should cause a connection close.
my $s = $server->new_sock;
my @keys = ();
for (1 .. 500) {
push(@keys, "mg foo v\r\n");
}
my $cmd = join('', @keys);
print $s $cmd;
ok(!defined <$s>, 'sock disconnected after overflow');
my $stats = mem_stats($sock);
cmp_ok($stats->{'response_obj_oom'}, '>', 1, 'another OOM recorded');
}
SKIP: {
skip "read_buf test borks on travis CI. don't have patience to fix.", 1;
# test read buffer limits.
# spam connections with a partial command.. a set in this case is easy.
my @conns = ();
for (1 .. 128) {
my $s = $server->new_sock;
#if (!defined($s)) {
# Don't need the spam of every individual conn made.
#}
ok(defined($s), 'new conn made');
# Partial set command, should attach a read buffer but not release it.
print $s "set foo 0 0 2\r\n";
push(@conns, $s);
}
# Close everything so we have a red buffer available to get stats.
for my $s (@conns) {
$s->close();
}
my $stats = mem_stats($sock);
cmp_ok($stats->{'read_buf_oom'}, '>', 1, 'read buffer based OOM recorded');
}
done_testing();