Mxs 2236 own longtest (#189)

MXS-2236 Add own long test and possibility to run tests under Valgrind

Long test executes INSERT queries, transactions, prepared statements in parallel to create weird load on Maxscale to catch crashes and leaks

Test is not included into ctest scope. Test should be executed manually. For BuildBot (and also for run_test.sh) 'test_set' should be set 'NAME# ./long_test'

Time to run test is defined by 'long_test_time' variable (in seconds)

Possibility to run Maxscale under Valgrind is also added. To run Maxscale under Vaslgrind 'use_valgrind=yes' variable have to be defined
This commit is contained in:
Timofey Turenko
2019-02-22 16:12:57 +02:00
committed by GitHub
parent 79fd01d4dd
commit 2440b48ccc
10 changed files with 515 additions and 63 deletions

View File

@ -87,7 +87,8 @@ TestConnections::TestConnections(int argc, char *argv[]):
no_galera(false),
no_vm_revert(true),
threads(4),
use_ipv6(false)
use_ipv6(false),
use_valgrind(false)
{
signal_set(SIGSEGV, sigfatal_handler);
signal_set(SIGABRT, sigfatal_handler);
@ -239,7 +240,7 @@ TestConnections::TestConnections(int argc, char *argv[]):
repl->take_snapshot_command = take_snapshot_command;
repl->revert_snapshot_command = revert_snapshot_command;
maxscales = new Maxscales("maxscale", test_dir, verbose);
maxscales = new Maxscales("maxscale", test_dir, verbose, use_valgrind);
maxscales->use_ipv6 = use_ipv6;
maxscales->ssl = ssl;
@ -347,6 +348,16 @@ TestConnections::~TestConnections()
//galera->disable_ssl();
}
if (use_valgrind)
{
// stop all Maxscales to get proper Valgrind logs
for (int i = 0; i < maxscales->N; i++)
{
stop_maxscale(i);
}
sleep(15); // sleep to let logs be written do disks
}
copy_all_logs();
/* Temporary disable snapshot revert due to Galera failures
@ -420,7 +431,6 @@ void TestConnections::expect(bool result, const char *format, ...)
void TestConnections::read_env()
{
char *env;
if (verbose)
@ -428,7 +438,6 @@ void TestConnections::read_env()
printf("Reading test setup configuration from environmental variables\n");
}
//env = getenv("get_logs_command"); if (env != NULL) {sprintf(get_logs_command, "%s", env);}
//env = getenv("test_dir"); if (env != NULL) {sprintf(test_dir, "%s", env);}
@ -531,6 +540,12 @@ void TestConnections::read_env()
{
no_vm_revert = false;
}
env = getenv("use_valgrind");
if ((env != NULL) && ((strcasecmp(env, "yes") == 0) || (strcasecmp(env, "true") == 0) ))
{
use_valgrind = true;
}
}
void TestConnections::print_env()
@ -683,22 +698,18 @@ void TestConnections::init_maxscale(int m)
"chmod a+x %s;"
"%s"
"iptables -F INPUT;"
"rm -f %s/maxscale.log;"
"rm -f %s/maxscale1.log;"
"rm -rf /tmp/core* /dev/shm/* /var/lib/maxscale/maxscale.cnf.d/ /var/lib/maxscale/*;"
"%s",
"rm -f %s/*;"
"rm -rf /tmp/core* /dev/shm/* /var/lib/maxscale/maxscale.cnf.d/ /var/lib/maxscale/*",
maxscales->access_homedir[m],
maxscales->access_homedir[m],
maxscales->access_homedir[m],
maxscale::start ? "killall -9 maxscale;" : "",
maxscales->maxscale_log_dir[m],
maxscales->maxscale_log_dir[m],
maxscale::start ? "service maxscale restart" : "");
maxscales->maxscale_log_dir[m]);
fflush(stdout);
if (maxscale::start)
{
maxscales->restart_maxscale(m);
fflush(stdout);
int waits;
for (waits = 0; waits < 15; waits++)
@ -723,10 +734,17 @@ int TestConnections::copy_mariadb_logs(Mariadb_nodes * repl, char * prefix)
int local_result = 0;
char * mariadb_log;
FILE * f;
int i;
int i, j;
int exit_code;
char str[4096];
const int log_retrive_command_num = 3;
const char * log_retrive_command[log_retrive_command_num] = {
"cat /var/lib/mysql/*.err",
"cat /var/log/syslog | grep mysql",
"cat /var/log/messages | grep mysql"
};
if (repl == NULL) return local_result;
sprintf(str, "mkdir -p LOGS/%s", test_name);
@ -735,20 +753,23 @@ int TestConnections::copy_mariadb_logs(Mariadb_nodes * repl, char * prefix)
{
if (strcmp(repl->IP[i], "127.0.0.1") != 0) // Do not copy MariaDB logs in case of local backend
{
mariadb_log = repl->ssh_node_output(i, (char *) "cat /var/lib/mysql/*.err", true, &exit_code);
sprintf(str, "LOGS/%s/%s%d_mariadb_log", test_name, prefix, i);
f = fopen(str, "w");
if (f != NULL)
for (j = 0; j < log_retrive_command_num; j++)
{
fwrite(mariadb_log, sizeof(char), strlen(mariadb_log), f);
fclose(f);
mariadb_log = repl->ssh_node_output(i, log_retrive_command[j], true, &exit_code);
sprintf(str, "LOGS/%s/%s%d_mariadb_log_%d", test_name, prefix, i, j);
f = fopen(str, "w");
if (f != NULL)
{
fwrite(mariadb_log, sizeof(char), strlen(mariadb_log), f);
fclose(f);
}
else
{
printf("Error writing MariaDB log");
local_result = 1;
}
free(mariadb_log);
}
else
{
printf("Error writing MariaDB log");
local_result = 1;
}
free(mariadb_log);
}
}
return local_result;
@ -1054,9 +1075,9 @@ bool TestConnections::replicate_from_master(int m)
repl->execute_query_all_nodes("STOP SLAVE");
/** Clean up MaxScale directories */
maxscales->ssh_node(m, "service maxscale stop", true);
maxscales->stop_maxscale(m);
prepare_binlog(m);
maxscales->ssh_node(m, "service maxscale start", true);
maxscales->start_maxscale(m);
char log_file[256] = "";
char log_pos[256] = "4";
@ -1308,7 +1329,16 @@ int TestConnections::find_connected_slave1(int m)
int TestConnections::check_maxscale_processes(int m, int expected)
{
int exit_code;
char* maxscale_num = maxscales->ssh_node_output(m, "ps -C maxscale | grep maxscale | wc -l", false,
const char * ps_cmd;
if (use_valgrind)
{
ps_cmd = "ps ax | grep valgrind | grep maxscale | grep -v grep | wc -l";
}
else
{
ps_cmd = "ps -C maxscale | grep maxscale | wc -l";
}
char* maxscale_num = maxscales->ssh_node_output(m, ps_cmd, false,
&exit_code);
if ((maxscale_num == NULL) || (exit_code != 0))
{
@ -1322,9 +1352,9 @@ int TestConnections::check_maxscale_processes(int m, int expected)
if (atoi(maxscale_num) != expected)
{
tprintf("%s maxscale processes detected, trying agin in 5 seconds\n", maxscale_num);
tprintf("%s maxscale processes detected, trying again in 5 seconds\n", maxscale_num);
sleep(5);
maxscale_num = maxscales->ssh_node_output(m, "ps -C maxscale | grep maxscale | wc -l", false, &exit_code);
maxscale_num = maxscales->ssh_node_output(m, ps_cmd, false, &exit_code);
if (atoi(maxscale_num) != expected)
{
add_result(1, "Number of MaxScale processes is not %d, it is %s\n", expected, maxscale_num);
@ -1336,7 +1366,7 @@ int TestConnections::check_maxscale_processes(int m, int expected)
int TestConnections::stop_maxscale(int m)
{
int res = maxscales->ssh_node(m, "service maxscale stop", true);
int res = maxscales->stop_maxscale(m);
check_maxscale_processes(m, 0);
fflush(stdout);
return res;
@ -1344,7 +1374,7 @@ int TestConnections::stop_maxscale(int m)
int TestConnections::start_maxscale(int m)
{
int res = maxscales->ssh_node(m, "service maxscale start", true);
int res = maxscales->start_maxscale(m);
check_maxscale_processes(m, 1);
fflush(stdout);
return res;
@ -1370,7 +1400,6 @@ int TestConnections::check_maxscale_alive(int m)
maxscales->close_maxscale_connections(m);
add_result(global_result - gr, "Maxscale is not alive\n");
stop_timeout();
check_maxscale_processes(m, 1);
return global_result - gr;