polardbxengine/mysql-test/suite/xengine_stress/rqg/pb2combinations.pl

227 lines
7.9 KiB
Perl

# Copyright (C) 2008-2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program 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
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
# USA
use strict;
use Cwd;
use File::Basename;
use POSIX;
use Sys::Hostname;
my ($basedir, $vardir, $tree, $test) = @ARGV;
print("==================== Starting $0 ====================\n");
# Print MTR-style output saying which test suite/mode this is for PB2 reporting.
# So far we only support running one test at a time.
print("##############################################################################\n");
print("# $test\n");
print("##############################################################################\n");
# Autoflush output buffers (needed when using POSIX::_exit())
$| = 1;
# Working dir.
chdir('randgen');
my $cwd = cwd();
#
# Check OS, for later convenience. Windows and Unix/Linux are too different.
#
my $windowsOS; # undefined if not Windows
if (
($^O eq 'MSWin32') ||
($^O eq 'MSWin64')
) {
$windowsOS = 'true';
}
# Location of grammars and other test configuration files.
# Will use env variable RQG_CONF if set.
# Default is currently "conf" while using legacy setup.
# If not absolute path, it is relative to cwd at run time, which is the randgen directory.
my $conf = $ENV{RQG_CONF};
$conf = 'conf' if not defined $conf;
print("***** Information on the host system: *****\n");
print(" - Local time : ".localtime()."\n");
print(" - Hostname : ".hostname()."\n");
print(" - PID : $$\n");
print(" - Working dir : ".cwd()."\n");
print(" - PATH : ".$ENV{PATH}."\n");
print(" - Script arguments:\n");
print(" basedir = $basedir\n");
print(" vardir = $vardir\n");
print(" tree = $tree\n");
print(" test = $test\n");
print("\n");
print("***** Information on Random Query Generator version (bzr): *****\n");
system("bzr info");
system("bzr version-info");
print("\n");
mkdir($vardir);
my $command;
# setting number of trials to 1 until we have more stable runs and proper output handling.
if ($test =~ m{falcon_combinations_simple}io ) {
$command = '
--grammar='.$conf.'/combinations.yy
--gendata='.$conf.'/combinations.zz
--config='.$conf.'/falcon_simple.cc
--duration=900
--trials=1
--seed=time
';
} elsif ($test =~ m{falcon_combinations_transactions}io ) {
$command = '
--grammar='.$conf.'/transactions-flat.yy
--gendata='.$conf.'/transactions.zz
--config='.$conf.'/falcon_simple.cc
--duration=900
--trials=1
--seed=time
';
} elsif ($test =~ m{innodb_combinations_simple}io ) {
$command = '
--grammar='.$conf.'/combinations.yy
--gendata='.$conf.'/combinations.zz
--config='.$conf.'/innodb_simple.cc
--mysqld=--innodb
--duration=1800
--trials=1
--seed=time
';
} elsif ($test =~ m{innodb_combinations_stress}io ) {
$command = '
--grammar='.$conf.'/engine_stress.yy
--gendata='.$conf.'/engine_stress.zz
--config='.$conf.'/innodb_simple.cc
--mysqld=--innodb
--duration=600
--trials=1
--seed=time
';
} elsif ($test =~ m{falcon_combinations_varchar}io ) {
$command = '
--grammar='.$conf.'/varchar.yy
--gendata='.$conf.'/varchar.zz
--config='.$conf.'/falcon_varchar.cc
--duration=900
--trials=1
--seed=time
';
} else {
die("unknown combinations test $test");
}
# Assuming Unix for now (using tail).
$command = "perl combinations.pl --basedir=\"$basedir\" --vardir=\"$vardir\" ".$command;
# redirect output to log file to avoid sending huge amount of output to PB2
my $log_file = $vardir.'/pb2comb_'.$test.'.out';
$command = $command." > $log_file 2>&1";
$command =~ s{[\r\n\t]}{ }sgio;
print localtime()." [$$] Executing command: $command\n";
my $command_result = system($command);
# shift result code to the right to obtain the code returned from the called script
my $command_result_shifted = ($command_result >> 8);
print localtime()." [$$] combinations.pl exited with exit status ".$command_result_shifted."\n";
# Report test result in an MTR fashion so that PB2 will see it and add to
# xref database etc.
# Format: TESTSUITE.TESTCASE 'TESTMODE' [ RESULT ]
# Example: ndb.ndb_dd_alter 'InnoDB plugin' [ fail ]
# Not using TESTMODE for now.
my $test_suite_name = 'serverqa';
my $full_test_name = $test_suite_name.'.'.$test;
# keep test statuses more or less vertically aligned (if more than one)
while (length $full_test_name < 40)
{
$full_test_name = $full_test_name.' ';
}
if ($command_result_shifted > 0) {
# test failed
print("------------------------------------------------------------------------\n");
print($full_test_name." [ fail ]\n");
print("-----> See below for failure details...\n");
} else {
print($full_test_name." [ pass ]\n");
}
# Print only parts of the output if it is "too large" for PB2.
# This is hopefully just a temporary hack solution...
# Caveats: If the file is shorter than 201 lines, all the output will be sent to std out.
# If the file is longer than 200 lines, only the first and last parts of the output
# will be sent to std out.
# Using 'wc', 'head' and 'tail', so probably won't work on windows (unless required gnu utils are installed)
# Hanged proceses not especially handled.
# etc.
my $log_lines = `wc -l < $log_file`; # number of lines in the log file
if ($log_lines <= 200) {
# log has 200 lines or less. Display the entire log.
print("-----> Test log will now be displayed...\n\n");
open LOGFILE, $log_file or warn "***Failed to open log file [$log_file]";
print while(<LOGFILE>);
close LOGFILE;
} elsif ($log_lines > 200) {
# the log has more than 200 lines. Display the first and last 100 lines.
my $lines = 100;
print("-----> Printing first $lines and last $lines lines from test output of $log_lines lines...\n");
print('-----> See log file '.basename($log_file)." for full output.\n\n");
system("head -$lines $log_file");
print("\n.\n.\n.\n.\n.\n(...)\n.\n.\n.\n.\n.\n\n"); # something to visually separate the head and the tail
system("tail -$lines $log_file");
} else {
# something went wrong. wc did not work?
warn("***ERROR during log processing. wc -l did not work? (\$log_lines=$log_lines)\n");
}
# Kill remaining mysqld processes.
# Assuming only one test run going on at the same time, and that all mysqld
# processes are ours.
print("Checking for remaining mysqld processes...\n");
if ($windowsOS) {
# assumes MS Sysinternals PsTools is installed in C:\bin
# If you need to run pslist or pskill as non-Admin user, some permission
# adjustments may be needed. See:
# http://blogs.technet.com/markrussinovich/archive/2007/07/09/1449341.aspx
if (system('C:\bin\pslist mysqld') == 0) {
print(" ^--- Found running mysqld process(es), to be killed if possible.\n");
system('C:\bin\pskill mysqld > '.$vardir.'/pskill_mysqld.out 2>&1');
system('C:\bin\pskill mysqld-nt > '.$vardir.'/pskill_mysqld-nt.out 2>&1');
} else { print(" None found.\n"); }
} else {
# Unix/Linux.
# Avoid "bad argument count" messages from kill by checking if process exists first.
if (system("pgrep mysqld") == 0) {
print(" ^--- Found running mysqld process(es), to be killed if possible.\n");
system("pgrep mysqld | xargs kill -15"); # "soft" kill
sleep(5);
if (system("pgrep mysqld > /dev/null") == 0) {
# process is still around...
system("pgrep mysqld | xargs kill -9"); # "hard" kill
}
} else { print(" None found.\n"); }
}
print localtime()." [$$] $0 will exit with exit status ".$command_result_shifted."\n";
POSIX::_exit ($command_result_shifted);