Merge branch '2.3' into 2.4
This commit is contained in:
119
system-test/rwsplit_readonly_stress.cpp
Normal file
119
system-test/rwsplit_readonly_stress.cpp
Normal file
@ -0,0 +1,119 @@
|
||||
/**
|
||||
* @file rwsplit_readonly.cpp Test of the read-only mode for readwritesplit when master fails with load
|
||||
* - start query threads which does SELECTs in the loop
|
||||
* - every 10 seconds block Master and then after another 10 seconds unblock master
|
||||
*/
|
||||
|
||||
|
||||
#include <iostream>
|
||||
#include <unistd.h>
|
||||
#include <cstdlib>
|
||||
#include <string>
|
||||
#include <maxtest/testconnections.hh>
|
||||
#include <maxtest/maxadmin_operations.hh>
|
||||
|
||||
#define THREADS 16
|
||||
|
||||
static int running = 0;
|
||||
|
||||
void* query_thread(void* data)
|
||||
{
|
||||
TestConnections* Test = (TestConnections*)data;
|
||||
int iter = 0;
|
||||
|
||||
while (!running)
|
||||
{
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
while (running && Test->global_result == 0)
|
||||
{
|
||||
MYSQL* mysql;
|
||||
const char* type;
|
||||
|
||||
if (iter % 2 == 0)
|
||||
{
|
||||
mysql = Test->maxscales->open_readconn_slave_connection(0);
|
||||
type = "master_failure_mode=error_on_write";
|
||||
}
|
||||
else
|
||||
{
|
||||
mysql = Test->maxscales->open_readconn_master_connection(0);
|
||||
type = "master_failure_mode=fail_on_write";
|
||||
}
|
||||
|
||||
if (!mysql)
|
||||
{
|
||||
Test->tprintf("Failed to connect to MaxScale.\n");
|
||||
}
|
||||
|
||||
for (int i = 0; i < 100 && Test->global_result == 0; i++)
|
||||
{
|
||||
if (execute_query_silent(mysql, "select repeat('a', 1000)"))
|
||||
{
|
||||
Test->add_result(1,
|
||||
"Query number %d, iteration %d for '%s' failed: %s\n",
|
||||
i,
|
||||
iter,
|
||||
type,
|
||||
mysql_error(mysql));
|
||||
}
|
||||
}
|
||||
mysql_close(mysql);
|
||||
iter++;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
|
||||
TestConnections* Test = new TestConnections(argc, argv);
|
||||
pthread_t threads[THREADS];
|
||||
|
||||
for (int i = 0; i < THREADS; i++)
|
||||
{
|
||||
pthread_create(&threads[i], NULL, query_thread, Test);
|
||||
}
|
||||
|
||||
running = 1;
|
||||
|
||||
int iterations = (Test->smoke ? 5 : 25);
|
||||
|
||||
for (int i = 0; i < iterations && Test->global_result == 0; i++)
|
||||
{
|
||||
|
||||
Test->tprintf("Blocking master");
|
||||
Test->repl->block_node(0);
|
||||
|
||||
if (Test->global_result == 0)
|
||||
{
|
||||
sleep(10);
|
||||
}
|
||||
|
||||
Test->tprintf("Unblocking master");
|
||||
Test->repl->unblock_node(0);
|
||||
|
||||
if (Test->global_result == 0)
|
||||
{
|
||||
sleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
Test->tprintf("Waiting for all threads to finish\n");
|
||||
Test->set_timeout(60);
|
||||
running = 0;
|
||||
|
||||
for (int i = 0; i < THREADS; i++)
|
||||
{
|
||||
void* val;
|
||||
pthread_join(threads[i], &val);
|
||||
}
|
||||
|
||||
/** Clean up test environment */
|
||||
Test->repl->flush_hosts();
|
||||
int rval = Test->global_result;
|
||||
delete Test;
|
||||
return rval;
|
||||
}
|
||||
Reference in New Issue
Block a user