#!/usr/bin/perl ############################################################# ############################################################# ## ## Copyright 2001 Sistina Software Inc. ## ## This is free software released under the GNU General ## Public License. There is no warranty for this ## software. See the file COPYING for details. ## ############################################################# ############################################################# use Getopt::Std; exit(1) unless getopts('s:f:e:hdqr:l:'); if (defined $opt_h) { print << "EndHelp"; Usage: make_panic [OPTION] -e number of iterations, infinite if not defined -f number of processes to fork -h help -s seed for random number generator -d drop seed so you could use it next time -q Don't print out the status updates. (slient) -r Number of directories -l Number of files EndHelp exit(0); } if (defined $opt_f) { $opt_f = 1 if $opt_f <=0; while (--$opt_f) { if ($pid = fork()) { #parent } elsif (defined $pid) { last; } else { die "Fork error $!"; } } } if(defined $opt_s) { $seed = $opt_s; } else { $seed = time ^ $$; } if(defined($opt_d)) { system("echo $seed > /make_panic_seed.$$"); } srand($seed); if (defined $opt_r) { $dirs = $opt_r; } else { $dirs = 50; } if (defined $opt_l) { $files = $opt_l; } else { $files = 1000; } for ($x = 0; $x < $dirs; $x++) { mkdir(sprintf("dir%.10u", $x), 0755); } $last = time(); $ops_at_last_tick = 0; while ( (defined $opt_e)?($opt_e-- > 0):1 ) { $v = int(rand(6)); $x = int(rand($dirs)); $y = int(rand($files)); $file = sprintf("dir%.10u/file%.10u", $x, $y); if ($v == 0) { open(DATAFILE, ">> $file") || die; close(DATAFILE); } elsif ($v == 1 || $v == 2) { $z = int(rand(1000000000)); if (open(DATAFILE, "+< $file")) { seek(DATAFILE, $z, 0); print DATAFILE "$z\n"; close(DATAFILE); } } elsif ($v == 3 || $v == 4) { $z = int(rand(1000000000)); if (open(DATAFILE, "< $file")) { seek(DATAFILE, -100, 2); read(DATAFILE, $tmp, 100) == 100; close(DATAFILE); } } elsif ($v == 5) { unlink "$file"; } $ops++; # if ($ops % 250 == 0) # { # $new = time(); # $last-- if ($new == $last); # $rate = 250 / ($new - $last); # $pretty_rate = sprintf("%.2f", $rate); # $last = $new; # } $new = time(); if ($new != $last) { $rate = ($ops - $ops_at_last_tick) / ($new - $last); $pretty_rate = sprintf("%.2f", $rate); $ops_at_last_tick = $ops; $last = $new; } if( ! defined $opt_q ) { print "$ops:$v: $pretty_rate\n"; } }