Blame t/stress-memcached.pl

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