|
|
|
|
@ -17,6 +17,7 @@ inline unsigned long long monotonic_time() {
|
|
|
|
|
return (((unsigned long long) ts.tv_sec) * 1000000) + (ts.tv_nsec / 1000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using std::string;
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) {
|
|
|
|
|
CommandLine cl;
|
|
|
|
|
@ -31,11 +32,44 @@ int main(int argc, char** argv) {
|
|
|
|
|
return exit_status();
|
|
|
|
|
|
|
|
|
|
if (!mysql_real_connect(mysql, cl.host, cl.username, cl.password, NULL, cl.port, NULL, 0)) {
|
|
|
|
|
fprintf(stderr, "Failed to connect to database: Error: %s\n",
|
|
|
|
|
mysql_error(mysql));
|
|
|
|
|
fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(mysql));
|
|
|
|
|
return exit_status();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MYSQL* admin = mysql_init(NULL);
|
|
|
|
|
if (!admin) {
|
|
|
|
|
fprintf(stderr, "Failed 'mysql_init'\n");
|
|
|
|
|
return exit_status();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mysql_real_connect(admin, cl.host, cl.admin_username, cl.admin_password, NULL, cl.admin_port, NULL, 0)) {
|
|
|
|
|
fprintf(stderr, "Failed to connect to Admin: Error: %s\n", mysql_error(admin));
|
|
|
|
|
return exit_status();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const string poll_query { "SELECT variable_value FROM global_variables WHERE variable_name='mysql-poll_timeout'" };
|
|
|
|
|
MYSQL_RES* res = nullptr;
|
|
|
|
|
MYSQL_ROW row = nullptr;
|
|
|
|
|
int poll_timeout = 0;
|
|
|
|
|
|
|
|
|
|
int q_res = mysql_query(admin, poll_query.c_str());
|
|
|
|
|
if (q_res) {
|
|
|
|
|
fprintf(stderr, "Query '%s' failed with error '%s'\n", poll_query.c_str(), mysql_error(admin));
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res = mysql_store_result(admin);
|
|
|
|
|
row = mysql_fetch_row(res);
|
|
|
|
|
|
|
|
|
|
if (row == nullptr || row[0] == nullptr) {
|
|
|
|
|
fprintf(stderr, "Query '%s' failed to retrive 'mysql-poll_timeout' value. Empty row received.\n", poll_query.c_str());
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
poll_timeout = std::strtol(row[0], NULL, 10);
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
const char *q = "SELECT /* query_timeout=3300 */ SLEEP(20)";
|
|
|
|
|
diag("Running query; %s", q);
|
|
|
|
|
unsigned long long begin = monotonic_time();
|
|
|
|
|
@ -45,9 +79,20 @@ int main(int argc, char** argv) {
|
|
|
|
|
unsigned long long end = monotonic_time();
|
|
|
|
|
|
|
|
|
|
unsigned long time_diff_ms = (end-begin)/1000;
|
|
|
|
|
// NOTE: We give a grace period of 150 extra ms. This value could be much lower.
|
|
|
|
|
unsigned long max_poll_to_ms = (3300 + poll_timeout + 150);
|
|
|
|
|
|
|
|
|
|
ok(
|
|
|
|
|
time_diff_ms > 3100 && time_diff_ms < max_poll_to_ms,
|
|
|
|
|
"Query should be interrupted at around 3300ms with a failure timeout at '%lu'ms. Exact time: %lums",
|
|
|
|
|
max_poll_to_ms, time_diff_ms
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ok(time_diff_ms>3100 && time_diff_ms<5000 , "Query should be interrupted at around 3300ms . Exact time: %llums", time_diff_ms);
|
|
|
|
|
cleanup:
|
|
|
|
|
|
|
|
|
|
mysql_close(admin);
|
|
|
|
|
mysql_close(mysql);
|
|
|
|
|
|
|
|
|
|
return exit_status();
|
|
|
|
|
|