Blame t/stress-memcached.pl

Packit 4e8bc4
#!/usr/bin/perl
Packit 4e8bc4
#
Packit 4e8bc4
Packit 4e8bc4
use strict;
Packit 4e8bc4
use lib '../../api/perl/lib';
Packit 4e8bc4
use Cache::Memcached;
Packit 4e8bc4
use Time::HiRes qw(time);
Packit 4e8bc4
Packit 4e8bc4
unless (@ARGV == 2) {
Packit 4e8bc4
    die "Usage: stress-memcached.pl ip:port threads\n";
Packit 4e8bc4
}
Packit 4e8bc4
Packit 4e8bc4
my $host = shift;
Packit 4e8bc4
my $threads = shift;
Packit 4e8bc4
Packit 4e8bc4
my $memc = new Cache::Memcached;
Packit 4e8bc4
$memc->set_servers([$host]);
Packit 4e8bc4
Packit 4e8bc4
unless ($memc->set("foo", "bar") &&
Packit 4e8bc4
        $memc->get("foo") eq "bar") {
Packit 4e8bc4
    die "memcached not running at $host ?\n";
Packit 4e8bc4
}
Packit 4e8bc4
$memc->disconnect_all();
Packit 4e8bc4
Packit 4e8bc4
Packit 4e8bc4
my $running = 0;
Packit 4e8bc4
while (1) {
Packit 4e8bc4
    if ($running < $threads) {
Packit 4e8bc4
        my $cpid = fork();
Packit 4e8bc4
        if ($cpid) {
Packit 4e8bc4
            $running++;
Packit 4e8bc4
            #print "Launched $cpid.  Running $running threads.\n";
Packit 4e8bc4
        } else {
Packit 4e8bc4
            stress();
Packit 4e8bc4
            exit 0;
Packit 4e8bc4
        }
Packit 4e8bc4
    } else {
Packit 4e8bc4
        wait();
Packit 4e8bc4
        $running--;
Packit 4e8bc4
    }
Packit 4e8bc4
}
Packit 4e8bc4
Packit 4e8bc4
sub stress {
Packit 4e8bc4
    undef $memc;
Packit 4e8bc4
    $memc = new Cache::Memcached;
Packit 4e8bc4
    $memc->set_servers([$host]);
Packit 4e8bc4
Packit 4e8bc4
    my ($t1, $t2);
Packit 4e8bc4
    my $start = sub { $t1 = time(); };
Packit 4e8bc4
    my $stop = sub {
Packit 4e8bc4
        my $op = shift;
Packit 4e8bc4
        $t2 = time();
Packit 4e8bc4
        my $td = sprintf("%0.3f", $t2 - $t1);
Packit 4e8bc4
        if ($td > 0.25) { print "Took $td seconds for: $op\n"; }
Packit 4e8bc4
    };
Packit 4e8bc4
Packit 4e8bc4
    my $max = rand(50);
Packit 4e8bc4
    my $sets = 0;
Packit 4e8bc4
Packit 4e8bc4
    for (my $i = 0; $i < $max; $i++) {
Packit 4e8bc4
        my $key = key($i);
Packit 4e8bc4
        my $set = $memc->set($key, $key);
Packit 4e8bc4
        $sets++ if $set;
Packit 4e8bc4
    }
Packit 4e8bc4
Packit 4e8bc4
    for (1..int(rand(500))) {
Packit 4e8bc4
        my $rand = int(rand($max));
Packit 4e8bc4
        my $key = key($rand);
Packit 4e8bc4
        my $meth = int(rand(3));
Packit 4e8bc4
        my $exp = int(rand(3));
Packit 4e8bc4
        undef $exp unless $exp;
Packit 4e8bc4
        $start->();
Packit 4e8bc4
        if ($meth == 0) {
Packit 4e8bc4
            $memc->add($key, $key, $exp);
Packit 4e8bc4
            $stop->("add");
Packit 4e8bc4
        } elsif ($meth == 1) {
Packit 4e8bc4
            $memc->delete($key);
Packit 4e8bc4
            $stop->("delete");
Packit 4e8bc4
        } else {
Packit 4e8bc4
            $memc->set($key, $key, $exp);
Packit 4e8bc4
            $stop->("set");
Packit 4e8bc4
        }
Packit 4e8bc4
        $rand = int(rand($max));
Packit 4e8bc4
        $key = key($rand);
Packit 4e8bc4
        $start->();
Packit 4e8bc4
        my $v = $memc->get($key);
Packit 4e8bc4
        $stop->("get");
Packit 4e8bc4
        if ($v && $v ne $key) { die "Bogus: $v for key $rand\n"; }
Packit 4e8bc4
    }
Packit 4e8bc4
Packit 4e8bc4
    $start->();
Packit 4e8bc4
    my $multi = $memc->get_multi(map { key(int(rand($max))) } (1..$max));
Packit 4e8bc4
    $stop->("get_multi");
Packit 4e8bc4
}
Packit 4e8bc4
Packit 4e8bc4
sub key {
Packit 4e8bc4
    my $n = shift;
Packit 4e8bc4
    $_ = sprintf("%04d", $n);
Packit 4e8bc4
    if ($n % 2) { $_ .= "a"x20; }
Packit 4e8bc4
    $_;
Packit 4e8bc4
}