#!/usr/bin/perl # # $Id$ use Getopt::Long; use IO::File; use Site::SysUtils (); ($program = __FILE__) =~ s#.*/##; ($revauthor = '$Author$') =~ s/.*: (.*) \$$/$1/; ($revdate = '$Date$') =~ s/.*: (.*) \$$/$1/; GetOptions( "help") || exit(1); usage() if ($opt_help || @ARGV != 1); $| = 1; ($bench_basedir) = @ARGV; print "basedir setup\n"; (system("for i in 0 1 2 3 4 5 6 7 8 9; do for j in 0 1 2 3 4 5 6 7 8 9; do for k in 0 1 2 3 4 5 6 7 8 9; do mkdir -p $bench_basedir/\$i/\$j/\$k || exit 1; done; done; done") == 0) || die("Dir setup") unless -d "$bench_basedir/1/1/1"; $DOMAINS = 25; $USERS = 100; $DOMAIN_USERS = int($USERS/$DOMAINS) || die("Need DOMAIN_USERS"); $RW = 10000; $READ_POTENTIAL = 1170; $WRITE_POTENTIAL = 77130; $WRITE_PCT = 0.8; $ID_START = 10000; $Site::SysUtils::QMAIL_MAILDIR_BASE = $bench_basedir; $Site::Const::QMAIL_MAILDIR_BASE = $bench_basedir; $pc_id = $ID_START; $pcu_id = $ID_START; $all_start = time; print "maildir setup\n"; print "pcu ->$pcu_id"; for ($i=0;$i<$USERS;$i++) { $mbase = Site::SysUtils::hashed_user_maildir($pc_id,$pcu_id); $mbases{$pcu_id} = $mbase; $mdbase = Site::SysUtils::hashed_domain_maildir($pc_id); $pc_id++ if $i && ! ($i % $DOMAIN_USERS); $pcu_id++; next if -d "$mbase/Maildir"; mkdir($mdbase) || die("$!") unless -d $mdbase; mkdir($mbase) || die("$!") unless -d $mbase; mkdir("$mbase/Maildir") || die("$!"); (system("cp -a $bench_basedir/read_src $mbase/Maildir/cur") == 0) || die("$!"); print "\rpcu ->$pcu_id"; } opendir(RD,"$bench_basedir/write_src") || die($!); while ($ent = readdir(RD)) { next if $ent eq '.' || $ent eq '..'; push(@wfiles,$ent); } $rw_start = time; $tot = 0; print "\nI/O tests\n"; print "$tot of $RW"; for ($i=0;$i<$RW;$i++) { write_message($maildir); $tot++; print "\r$tot of $RW"; } $all_end = time; $maildirst = $rw_start - $all_start; $rwst = $all_end - $rw_start; print "\n\nmaildir setup in $maildirst s\n"; print "$wr writes and $rd reads in $rwst s\n"; exit 0; sub rand_maildir { my $pcu_id = int(rand($USERS)) + $ID_START; my $mbase = $mbases{$pcu_id}; my $md = "$mbase/Maildir/cur"; die("No $md!!!") unless -d $md; return $md; } sub write_message { my ($writedir) = @_; my $midx = int(rand($WRITE_POTENTIAL)); my $mnum = 0; my $fname = "$bench_basedir/write_src/" . $wfiles[$midx]; open(IN,$fname) || die($!); while () { } close(IN); } sub read_message { my ($readdir) = @_; my @fnames = (); opendir(RD,$readdir) || die($!); while ($ent = readdir(RD)) { next if $ent eq '.' || $ent eq '..'; push(@fnames,$ent); } closedir(RD); my $midx = int(rand(@fnames)); my $fname = "$readdir/$fnames[$midx]"; open(RD,$fname) || die($!); open(WR,'>/dev/null') || die($!); while () { print WR; } close(RD); close(WR); } sub info { print "$program: @_\n" if (!$opt_quiet); } sub error { info("ERROR: @_"); exit 1; } sub warning { info("WARNING: @_"); } sub usage { print <