#!/usr/bin/perl -w

use strict;

my $bindir = "/usr10/magus/nasd/obj/current/tests";
my $fastrw = "$bindir/fastreadwrite";

my ($drive, $part, $pass);

my @size_list = map { 2**($_+9); } (1 .. 11);

#srand(time^$$^unpack"%L*",`ps axww|gzip`); # not really necessary but cute

###################################################

sub usage {
  print STDERR "usage: $0 <drive> <partition> <password>\n";
  exit(1);
}

sub get_part_size {
  my $pinfo = `$bindir/pinfo -D $drive $pass`;

  $pinfo =~ m|Partition contains ([0-9]+) blocks|;
  if (defined $1) { return $1; }
  else { die "Can't figure out how many free blocks exist!\n"; }
}


sub g_rand {
  my ($stddev, $mean, $range) = @_;
  my ($u1, $u2, $w, $g);

  do {
    do {
      $u1 = 2 * rand() - 1;
      $u2 = 2 * rand() - 1;
      $w = $u1*$u1 + $u2*$u2;
    } while ($w >= 1);
    
    $g = ($u1 * sqrt( (-2 * log($w)) / $w ) * $stddev) + $mean;
  } while ( ($g < ($mean - $range)) ||
	    ($g > ($mean + $range)));

  return $g;
}

sub get_size_pair {
  my ($psize) = @_;

  my $index = int( g_rand(.25,.5,.5) * scalar(@size_list) );

  my $bs = $size_list[$index];
  my $iter = $psize/$bs;

  return ($bs, $iter);
}


#########################

usage if (@ARGV < 3);
($drive, $part, $pass) = @ARGV;

my $psize_raw = get_part_size;
my $psize = int($psize_raw / 131072) * 1073741824; # round to the nearest GB

print "Partition has $psize_raw blocks. This is roughly " .
  ($psize/1073741824) . " gigs.\n";

my $attempts = 0;

while (1) {
  my ($bs, $iter) = get_size_pair($psize);
  
  $attempts++;

  print "attempt $attempts, blocksize $bs, num iter $iter\n";
  system($fastrw, '-r', '-R', '-b', $bs, '-n', $iter,
	 '-p', $part, $drive, $pass);
  exit($?) if ($?);
}
