315 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			315 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | #!/usr/bin/perl | ||
|  | # Copyright (c) 2000, 2001, 2003, 2006, 2007 MySQL AB, 2009 Sun Microsystems, Inc. | ||
|  | # Use is subject to license terms. | ||
|  | # | ||
|  | # This library is free software; you can redistribute it and/or | ||
|  | # modify it under the terms of the GNU Library General Public | ||
|  | # License as published by the Free Software Foundation; version 2 | ||
|  | # of the License. | ||
|  | # | ||
|  | # This library is distributed in the hope that it will be useful, | ||
|  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
|  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||
|  | # Library General Public License for more details. | ||
|  | # | ||
|  | # You should have received a copy of the GNU Library General Public | ||
|  | # License along with this library; if not, write to the Free | ||
|  | # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, | ||
|  | # MA 02110-1301, USA | ||
|  | # | ||
|  | # This program runs all test that starts with 'test-' and sums | ||
|  | # the results that the program prints. | ||
|  | # Each time result should be of the form: | ||
|  | # Time for|to KEYWORD (number_of_runs) 'other info': timestr() | ||
|  | # | ||
|  | # All options to this script is passed to all test program. | ||
|  | # useful options: | ||
|  | # --fast --force --lock-tables | ||
|  | # --server   ==> mysql (default) / mSQL / Pg (postgres) / Solid | ||
|  | # --user     ==> the user with permission to create / drop / select | ||
|  | # --pass     ==> password for the user | ||
|  | # --cmp      ==> Compare --server with one of the others (mysql/mSQL/Pg/Solid) | ||
|  | # --comments ==> everything you want to say such as the extra options you | ||
|  | #                gave to the db server. (use --comments="xxx xxx xxx" | ||
|  | # --machine  ==> Give a OS/machine id for your logfiles. | ||
|  | # --log	     ==> puts output in output/RUN-server-machine-cmp-$opt_cmp | ||
|  | 
 | ||
|  | use DBI; | ||
|  | use Cwd; | ||
|  | 
 | ||
|  | $opt_silent=1;			# Don't write header | ||
|  | 
 | ||
|  | @ORG_ARGV=@ARGV; | ||
|  | $pwd = cwd(); $pwd = "." if ($pwd eq ''); | ||
|  | require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n"; | ||
|  | $opt_silent=0; | ||
|  | $perl=$^X; | ||
|  | $machine=machine(); | ||
|  | $redirect= !($machine =~ /windows/i || $machine =~ "^NT\s") ? "2>&1" : ""; | ||
|  | $dir= ($pwd =~ /\\/) ? '\\' : '/';	# directory symbol for shell | ||
|  | 
 | ||
|  | $prog_args=""; | ||
|  | foreach $arg (@ORG_ARGV) | ||
|  | { | ||
|  |   if ($redirect) | ||
|  |   { | ||
|  |     $prog_args.="'" . $arg . "' "; | ||
|  |   } | ||
|  |   else | ||
|  |   { | ||
|  |     # Windows/NT can't handle ' around arguments | ||
|  |     $prog_args.=$arg . " ";     | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | $prog_count=$errors=0; | ||
|  | 
 | ||
|  | if ($opt_cmp) { | ||
|  | 	$filename = "$opt_server$opt_suffix-" . machine_part() . "-cmp-$opt_cmp"; | ||
|  | } else { | ||
|  | 	$filename = "$opt_server$opt_suffix-" . machine_part(); | ||
|  | } | ||
|  | 
 | ||
|  | if (! -d $opt_dir) | ||
|  | { | ||
|  |   if (-e $opt_dir) | ||
|  |   { | ||
|  |     die "$opt_dir isn't a directory\n"; | ||
|  |   } | ||
|  |   mkdir $opt_dir,0777 || die "Can't create directory: $opt_dir\n"; | ||
|  | } | ||
|  | 
 | ||
|  | if ($opt_skip_test) { | ||
|  |   (@skip_tests) = split(/,\s*/, $opt_skip_test); | ||
|  | } | ||
|  | 
 | ||
|  | if ($opt_old_headers) | ||
|  | { | ||
|  |   read_headers("$opt_dir/RUN-$filename"); | ||
|  | } | ||
|  | else | ||
|  | { | ||
|  |   $server_version=$server->version(); | ||
|  | } | ||
|  | 
 | ||
|  | if (!$opt_log) | ||
|  | { | ||
|  |   open(LOG,">&STDOUT"); | ||
|  | } | ||
|  | else | ||
|  | { | ||
|  |   open(LOG, "> $opt_dir/RUN-$filename") || | ||
|  |     die "Can't write to $opt_dir/RUN-$filename: $!\n"; | ||
|  | } | ||
|  | 
 | ||
|  | select(LOG); | ||
|  | $|=1; | ||
|  | 
 | ||
|  | print "Benchmark DBD suite: $benchmark_version\n"; | ||
|  | print "Date of test:        $date\n"; | ||
|  | print "Running tests on:    $machine\n"; | ||
|  | print "Arguments:           $log_prog_args\n"; | ||
|  | print "Comments:            $opt_comments\n"; | ||
|  | print "Limits from:         $opt_cmp\n"; | ||
|  | print "Server version:      $server_version\n"; | ||
|  | print "Optimization:        $opt_optimization\n"; | ||
|  | print "Hardware:            $opt_hw\n\n"; | ||
|  | 
 | ||
|  | $estimated=$warning=$got_warning=0; | ||
|  | while (<test-*>) | ||
|  | { | ||
|  |   next if (/\.sh$/);		# configure script | ||
|  |   next if (/\-fork$/);		# test script | ||
|  |   $prog_count++; | ||
|  |   /test-(.*)$/;			# Remove test from name | ||
|  |   $prog=$1; | ||
|  |   $skip_prog = 0; | ||
|  |   foreach $skip_this (@skip_tests) { | ||
|  |     if ($prog =~ /$skip_this/i) { | ||
|  |       $skip_prog = 1; | ||
|  |       last; | ||
|  |     } | ||
|  |   } | ||
|  |   if ($opt_only_missing_tests && -f "$opt_dir$dir$prog-$filename") | ||
|  |   { | ||
|  |     # Test already run, skip it | ||
|  |     $skip_prog= 1; | ||
|  |   } | ||
|  |   print "$prog: "; | ||
|  |   if ((!$opt_use_old_results) && (!$skip_prog)) | ||
|  |   { | ||
|  |     if (system("$perl ./test-$prog $prog_args > \"$opt_dir$dir$prog-$filename\" $redirect")) | ||
|  |     { | ||
|  |       printf STDERR "Warning: Can't execute $prog.  Check the file '$opt_dir$dir$prog-$filename'\n"; | ||
|  |       die "aborted" if ($opt_die_on_errors); | ||
|  |     } | ||
|  |   } | ||
|  |   open(TEST,"$opt_dir/$prog-$filename"); | ||
|  |   $last_line=""; | ||
|  |   while(<TEST>) | ||
|  |   { | ||
|  |     chomp; | ||
|  |     $last_line=$_ if (!(/^\s*$/));		# Search after last line | ||
|  |   } | ||
|  |   if ($last_line =~ /Total time:/i) | ||
|  |   { | ||
|  |     print $last_line . "\n"; | ||
|  |     open(TEST,"$opt_dir/$prog-$filename"); | ||
|  |     while (<TEST>) | ||
|  |     { | ||
|  |       if (/^(estimated |)time (to|for) ([^\s:]*)\s*\((\d*)(:\d*)*\)[^:]*:\s*([\d.]+) .*secs \(\s*([^\s]*) usr\s*\+*\s*([^\s]*) sys.*=\s+([\d.]*)\s+cpu/i) | ||
|  |       { | ||
|  | 	$arg=$summa{$3}; | ||
|  | 	if (!defined($arg)) | ||
|  | 	{ | ||
|  | 	  $summa{$3}= [ $4,$6,$7,$8,$9,""]; | ||
|  | 	} | ||
|  | 	else | ||
|  | 	{ | ||
|  | 	  $arg->[0]+=$4; | ||
|  | 	  $arg->[1]+=$6; | ||
|  | 	  $arg->[2]+=$7; | ||
|  | 	  $arg->[3]+=$8; | ||
|  | 	  $arg->[4]+=$9; | ||
|  | 	} | ||
|  | 	$prog_sum[0]+=$4; | ||
|  | 	$prog_sum[1]+=$6; | ||
|  | 	$prog_sum[2]+=$7; | ||
|  | 	$prog_sum[3]+=$8; | ||
|  | 	$prog_sum[4]+=$9; | ||
|  | 	if (length($1)) | ||
|  | 	{ | ||
|  | 	  $summa{$3}->[5].="+"; | ||
|  | 	  $estimated=1; | ||
|  | 	} | ||
|  | 	if ($got_warning) | ||
|  | 	{ | ||
|  | 	  $summa{$3}->[5].="?"; | ||
|  | 	  $warning=1; | ||
|  | 	  $got_warning=0; | ||
|  | 	} | ||
|  |       } | ||
|  |       elsif (/^warning/i) | ||
|  |       { | ||
|  | 	$got_warning=1; | ||
|  |       } | ||
|  |       else | ||
|  |       { | ||
|  | 	$got_warning=0; | ||
|  |       } | ||
|  |     } | ||
|  |     if ($opt_debug) | ||
|  |     { | ||
|  |       print "Summary for $prog: ", join(" ",@prog_sum), "\n"; | ||
|  |     } | ||
|  |   } | ||
|  |   elsif ($last_line =~ /^Test skipped/i) | ||
|  |   { | ||
|  |     print "$last_line\n"; | ||
|  |   } | ||
|  |   else | ||
|  |   { | ||
|  |     $errors++; | ||
|  |     print "Failed ($opt_dir/$prog-$filename)\n"; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | print "\n"; | ||
|  | if (!$errors) | ||
|  | { | ||
|  |   print "All $prog_count test executed successfully\n"; | ||
|  | } | ||
|  | else | ||
|  | { | ||
|  |   print "Of $prog_count tests, $errors tests didn't work\n"; | ||
|  | } | ||
|  | if ($estimated) | ||
|  | { | ||
|  |   print "Tests with estimated time have a + at end of line\n" | ||
|  | } | ||
|  | if ($warning) | ||
|  | { | ||
|  |   print "Tests with didn't return the correct result have a ? at end of line\n"; | ||
|  | } | ||
|  | 
 | ||
|  | if (%summa) | ||
|  | { | ||
|  |   @total=(0,0,0,0,0,""); | ||
|  |   print "\nTotals per operation:\n"; | ||
|  |   print "Operation             seconds     usr     sys     cpu   tests\n"; | ||
|  |   foreach $key (sort(keys %summa)) | ||
|  |   { | ||
|  |     $arg=$summa{$key}; | ||
|  |     printf("%-35.35s %7.2f %7.2f %7.2f %7.2f %7d %s\n", | ||
|  | 	   $key,$arg->[1],$arg->[2],$arg->[3],$arg->[4],$arg->[0], | ||
|  | 	   $arg->[5]); | ||
|  | 
 | ||
|  |     for ($i=0 ; $i < 5 ; $i++) | ||
|  |     { | ||
|  |       $total[$i]+=$arg->[$i]; | ||
|  |     } | ||
|  |     $total[5].=$arg->[$i]; | ||
|  |   } | ||
|  |   printf("%-35.35s %7.2f %7.2f %7.2f %7.2f %7d %s\n", | ||
|  | 	 "TOTALS",$total[1],$total[2],$total[3],$total[4],$total[0], | ||
|  | 	 $total[5]); | ||
|  | } | ||
|  | 
 | ||
|  | select(STDOUT); | ||
|  | if ($opt_log) | ||
|  | { | ||
|  |   print "Test finished. You can find the result in:\n$opt_dir/RUN-$filename\n"; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | # | ||
|  | # Read headers from an old benchmark run | ||
|  | # | ||
|  | 
 | ||
|  | sub read_headers | ||
|  | { | ||
|  |   my ($filename)=@_; | ||
|  | 
 | ||
|  |   # Clear current values | ||
|  |   $benchmark_version=$date=$machine=$server_version=""; | ||
|  | 
 | ||
|  |   open(TMP, "<$filename") || die "Can't open $filename\n"; | ||
|  |   while (<TMP>) | ||
|  |   { | ||
|  |     chop; | ||
|  |     if (/^Benchmark DBD.*:\s+(.*)$/) | ||
|  |     { | ||
|  |       $benchmark_version=$1; | ||
|  |     } | ||
|  |     elsif (/^Date of.*:\s+(.*)/) | ||
|  |     { | ||
|  |       $date=$1; | ||
|  |     } | ||
|  |     elsif (/^Running.*:\s+(.*)$/) | ||
|  |     { | ||
|  |       $machine=$1; | ||
|  |     } | ||
|  |     elsif (/^Arguments.*:\s+(.*)$/) | ||
|  |     { | ||
|  |       $log_prog_args=$1; | ||
|  |     } | ||
|  |     elsif (/^Limits.*:\s+(.*)$/) | ||
|  |     { | ||
|  |       $opt_cmp=$1; | ||
|  |     } | ||
|  |     elsif (/^Server ver.*:\s+(.*)$/) | ||
|  |     { | ||
|  |       $server_version=$1; | ||
|  |     } | ||
|  |     elsif (/^Optimiz.*:\s+(.*)$/) | ||
|  |     { | ||
|  |       $opt_optimization=$1; | ||
|  |     } | ||
|  |     elsif (/^Hardwar.*:\s+(.*)$/) | ||
|  |     { | ||
|  |       $opt_hw=$1; | ||
|  |     } | ||
|  |   } | ||
|  |   close(TMP); | ||
|  | } |