MaxScale/maxscale-system-test/mxs1929_start_from_scratch.cpp
Niclas Antti c447e5cf15 Uncrustify maxscale
See script directory for method. The script to run in the top level
MaxScale directory is called maxscale-uncrustify.sh, which uses
another script, list-src, from the same directory (so you need to set
your PATH). The uncrustify version was 0.66.
2018-09-09 22:26:19 +03:00

129 lines
4.6 KiB
C++

/**
* MXS-1929: Create a setup from an empty config and check that it can be
* repeated multiple times
*/
#include "testconnections.h"
#include <atomic>
#include <chrono>
#include <thread>
#include <vector>
int main(int argc, char** argv)
{
TestConnections test(argc, argv);
std::vector<std::thread> threads;
std::atomic<bool> running {true};
std::atomic<int> conns {0};
auto start = std::chrono::steady_clock::now();
// Create some threads so that we have a constant load on the system
for (int i = 0; i < 10; i++)
{
threads.emplace_back([&, i]() {
while (running)
{
Connection c = i % 2 == 0 ? test.maxscales->rwsplit() : test.maxscales->readconn_master();
if (c.connect())
{
c.query("CREATE TABLE IF NOT EXITS test.t1 (id INT)");
c.query("INSERT INTO test.t1 VALUES (" + std::to_string(i) + ")");
c.query("SELECT * FROM test.t1");
c.query("DELETE FROM test.t1 WHERE id = " + std::to_string(i));
++conns;
}
else
{
sleep(1);
}
}
});
}
// Allows the use of operator+ for concatenation
std::string create = "create ";
std::vector<std::string> commands
{
// Start by creating the servers
create + "server server1 " + test.repl->IP[0] + " 3306",
create + "server server2 " + test.repl->IP[1] + " 3306",
create + "server server3 " + test.repl->IP[2] + " 3306",
create + "server server4 " + test.repl->IP[3] + " 3306",
// A monitor for the servers
create
+
"monitor monitor1 mysqlmon monitor_interval=1000 user=skysql password=skysql --servers server1 server2 server3 server4",
// Services, one readwritesplit and one readconnroute
create
+
"service service1 readwritesplit user=skysql password=skysql --servers server1 server2 server3 server4",
create
+
"service service2 readconnroute user=skysql password=skysql router_options=master --servers server1 server2 server3 server4",
// Create listeners for the services
create + "listener service1 listener1 4006",
create + "listener service2 listener2 4008",
// Create the filters
create + "filter filter1 qlafilter filebase=/tmp/qla",
create + "filter filter2 regexfilter match=hello replace=world",
// Take filters into use
"alter service-filters service1 filter1",
"alter service-filters service2 filter2",
// Remove server then filters
"alter service-filters service1",
"unlink service service1 server1 server2 server3 server4",
// Do it the other way around for the second service
"unlink service service2 server1 server2 server3 server4",
"alter service-filters service2",
// Unlink the monitor from the servers
"unlink monitor monitor1 server1 server2 server3 server4",
// Start destroying things
"destroy filter filter1",
"destroy filter filter2",
"destroy listener service1 listener1",
"destroy listener service2 listener2",
// Draining the servers makes sure they aren't used
"drain server server1",
"drain server server2",
"drain server server3",
"drain server server4",
"destroy service service1",
"destroy service service2",
"destroy monitor monitor1",
"destroy server server1",
"destroy server server2",
"destroy server server3",
"destroy server server4"
};
for (int i = 0; i < 3; i++)
{
for (const auto& cmd : commands)
{
test.set_timeout(60);
test.check_maxctrl(cmd);
}
test.tprintf("Completed round %d", i + 1);
}
running = false;
for (auto& a : threads)
{
test.set_timeout(60);
a.join();
}
auto end = std::chrono::steady_clock::now();
test.tprintf("A total of %d connections were created over %d seconds",
conns.load(),
std::chrono::duration_cast<std::chrono::seconds>(end - start).count());
return test.global_result;
}