From 9b3fffdf4971373b0b3e5abfb9b361c62b5c951d Mon Sep 17 00:00:00 2001 From: pondix Date: Thu, 25 Jan 2018 15:29:12 +0200 Subject: [PATCH] Removing SQLLite lock assertion --- lib/ClickHouse_Server.cpp | 9 ++++++ lib/MySQL_HostGroups_Manager.cpp | 25 +++++++++++------ lib/MySQL_Monitor.cpp | 30 ++++++++++++-------- lib/ProxySQL_Admin.cpp | 47 +++++++++++++++++++------------- lib/ProxySQL_Cluster.cpp | 13 +++++++-- lib/SQLite3_Server.cpp | 9 ++++++ 6 files changed, 92 insertions(+), 41 deletions(-) diff --git a/lib/ClickHouse_Server.cpp b/lib/ClickHouse_Server.cpp index e243d74e7..9ea6370ac 100644 --- a/lib/ClickHouse_Server.cpp +++ b/lib/ClickHouse_Server.cpp @@ -51,6 +51,15 @@ } while (rc!=SQLITE_DONE);\ } while (0) +#define SAFE_SQLITE3_STEP2(_stmt) do {\ + do {\ + rc=sqlite3_step(_stmt);\ + if (rc==SQLITE_LOCKED || rc==SQLITE_BUSY) {\ + usleep(100);\ + }\ + } while (rc==SQLITE_LOCKED || rc==SQLITE_BUSY);\ +} while (0) + #include "clickhouse/client.h" using namespace clickhouse; diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 644ded540..ba89ea29c 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -18,6 +18,15 @@ } while (rc!=SQLITE_DONE);\ } while (0) +#define SAFE_SQLITE3_STEP2(_stmt) do {\ + do {\ + rc=sqlite3_step(_stmt);\ + if (rc==SQLITE_LOCKED || rc==SQLITE_BUSY) {\ + usleep(100);\ + }\ + } while (rc==SQLITE_LOCKED || rc==SQLITE_BUSY);\ +} while (0) + extern ProxySQL_Admin *GloAdmin; extern MySQL_Threads_Handler *GloMTH; @@ -459,7 +468,7 @@ bool MySQL_HostGroups_Manager::server_add(unsigned int hid, char *add, uint16_t rc=sqlite3_bind_int64(statement, 10, _max_latency_ms); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement, 11, comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); sqlite3_finalize(statement); @@ -515,7 +524,7 @@ int MySQL_HostGroups_Manager::servers_add(SQLite3_result *resultset) { rc=sqlite3_bind_int64(statement32, (idx*11)+10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement32, (idx*11)+11, r1->fields[10], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); if (idx==31) { - SAFE_SQLITE3_STEP(statement32); + SAFE_SQLITE3_STEP2(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement32); assert(rc==SQLITE_OK); } @@ -531,7 +540,7 @@ int MySQL_HostGroups_Manager::servers_add(SQLite3_result *resultset) { rc=sqlite3_bind_int64(statement1, 9, atoi(r1->fields[8])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 11, r1->fields[10], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -644,7 +653,7 @@ bool MySQL_HostGroups_Manager::commit() { rc=sqlite3_bind_int64(statement1, 2, atoi(r->fields[0])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 3, r->fields[1], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 4, atoi(r->fields[2])); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } else { @@ -700,7 +709,7 @@ bool MySQL_HostGroups_Manager::commit() { rc=sqlite3_bind_int64(statement2, 9, mysrvc->myhgc->hid); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement2, 10, mysrvc->address, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement2, 11, mysrvc->port); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement2); + SAFE_SQLITE3_STEP2(statement2); rc=sqlite3_clear_bindings(statement2); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement2); assert(rc==SQLITE_OK); } @@ -961,7 +970,7 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table(int *_onlyhg) { rc=sqlite3_bind_text(statement32, (i*12)+11, mysrvc->comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement32, (i*12)+12, ptr); assert(rc==SQLITE_OK); } - SAFE_SQLITE3_STEP(statement32); + SAFE_SQLITE3_STEP2(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement32); assert(rc==SQLITE_OK); } @@ -983,7 +992,7 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table(int *_onlyhg) { rc=sqlite3_bind_text(statement1, 11, mysrvc->comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 12, ptr); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -1078,7 +1087,7 @@ void MySQL_HostGroups_Manager::generate_mysql_group_replication_hostgroups_table rc=sqlite3_bind_int64(statement, 8, max_transactions_behind); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement, 9, r->fields[8], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); std::map::iterator it2; diff --git a/lib/MySQL_Monitor.cpp b/lib/MySQL_Monitor.cpp index 912b97c10..a40f91667 100644 --- a/lib/MySQL_Monitor.cpp +++ b/lib/MySQL_Monitor.cpp @@ -42,6 +42,14 @@ static MySQL_Monitor *GloMyMon; } while (rc!=SQLITE_DONE);\ } while (0) +#define SAFE_SQLITE3_STEP2(_stmt) do {\ + do {\ + rc=sqlite3_step(_stmt);\ + if (rc==SQLITE_LOCKED || rc==SQLITE_BUSY) {\ + usleep(100);\ + }\ + } while (rc==SQLITE_LOCKED || rc==SQLITE_BUSY);\ +} while (0) class ConsumerThread : public Thread { wqueue& m_queue; @@ -387,7 +395,7 @@ void * monitor_connect_thread(void *arg) { rc=sqlite3_bind_int64(statement, 3, time_now); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement, 4, (mmsd->mysql_error_msg ? 0 : mmsd->t2-mmsd->t1)); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement, 5, mmsd->mysql_error_msg, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); sqlite3_finalize(statement); @@ -466,7 +474,7 @@ __exit_monitor_ping_thread: rc=sqlite3_bind_int64(statement, 3, time_now); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement, 4, (mmsd->mysql_error_msg ? 0 : mmsd->t2-mmsd->t1)); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement, 5, mmsd->mysql_error_msg, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); sqlite3_finalize(statement); @@ -675,7 +683,7 @@ __exit_monitor_read_only_thread: rc=sqlite3_bind_null(statement, 5); assert(rc==SQLITE_OK); } rc=sqlite3_bind_text(statement, 6, mmsd->mysql_error_msg, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); @@ -916,7 +924,7 @@ __end_process_group_replication_result: rc=sqlite3_bind_null(statement, 5); assert(rc==SQLITE_OK); } rc=sqlite3_bind_text(statement, 6, mmsd->mysql_error_msg, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); @@ -1089,7 +1097,7 @@ __exit_monitor_replication_lag_thread: rc=sqlite3_bind_null(statement, 5); assert(rc==SQLITE_OK); } rc=sqlite3_bind_text(statement, 6, mmsd->mysql_error_msg, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); MyHGM->replication_lag_action(mmsd->hostgroup_id, mmsd->hostname, mmsd->port, repl_lag); @@ -1207,7 +1215,7 @@ __end_monitor_connect_loop: } unsigned long long time_now=realtime_time(); rc=sqlite3_bind_int64(statement, 1, time_now-(unsigned long long)mysql_thread___monitor_history*1000); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); sqlite3_finalize(statement); @@ -1315,7 +1323,7 @@ __end_monitor_ping_loop: } unsigned long long time_now=realtime_time(); rc=sqlite3_bind_int64(statement, 1, time_now-(unsigned long long)mysql_thread___monitor_history*1000); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); sqlite3_finalize(statement); @@ -1533,7 +1541,7 @@ __end_monitor_read_only_loop: } unsigned long long time_now=realtime_time(); rc=sqlite3_bind_int64(statement, 1, time_now-(unsigned long long)mysql_thread___monitor_history*1000); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); sqlite3_finalize(statement); @@ -1658,7 +1666,7 @@ __end_monitor_group_replication_loop: } unsigned long long time_now=realtime_time(); rc=sqlite3_bind_int64(statement, 1, time_now-(unsigned long long)mysql_thread___monitor_history*1000); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); sqlite3_finalize(statement); @@ -1769,7 +1777,7 @@ __end_monitor_replication_lag_loop: } unsigned long long time_now=realtime_time(); rc=sqlite3_bind_int64(statement, 1, time_now-(unsigned long long)mysql_thread___monitor_history*1000); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); sqlite3_finalize(statement); @@ -1997,7 +2005,7 @@ void MySQL_Monitor::populate_monitor_mysql_server_group_replication_log() { rc=sqlite3_bind_text(statement1, 6, ( node->last_entries[i].read_only ? (char *)"YES" : (char *)"NO" ) , -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 7, node->last_entries[i].transactions_behind ); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 8, node->last_entries[i].error , -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 21b604044..c4e4689d4 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -61,6 +61,15 @@ extern ProxySQL_Statistics *GloProxyStats; } while (rc!=SQLITE_DONE);\ } while (0) +#define SAFE_SQLITE3_STEP2(_stmt) do {\ + do {\ + rc=sqlite3_step(_stmt);\ + if (rc==SQLITE_LOCKED || rc==SQLITE_BUSY) {\ + usleep(100);\ + }\ + } while (rc==SQLITE_LOCKED || rc==SQLITE_BUSY);\ +} while (0) + void StringToHex(unsigned char *string, unsigned char *hexstring, size_t l) { unsigned char ch; size_t i, j; @@ -5245,7 +5254,7 @@ void ProxySQL_Admin::stats___proxysql_servers_checksums() { rc=sqlite3_bind_int64(statement1, 7, atoi(r1->fields[6])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 8, atoi(r1->fields[7])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 9, atoi(r1->fields[8])); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -5282,7 +5291,7 @@ void ProxySQL_Admin::stats___proxysql_servers_metrics() { rc=sqlite3_bind_int64(statement1, 8, atoi(r1->fields[7])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 9, atoi(r1->fields[8])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -5352,7 +5361,7 @@ void ProxySQL_Admin::stats___mysql_query_digests(bool reset) { rc=sqlite3_bind_int64(statement32, (idx*11)+10, atoll(r1->fields[8])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement32, (idx*11)+11, atoll(r1->fields[9])); assert(rc==SQLITE_OK); if (idx==31) { - SAFE_SQLITE3_STEP(statement32); + SAFE_SQLITE3_STEP2(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement32); assert(rc==SQLITE_OK); } @@ -5368,7 +5377,7 @@ void ProxySQL_Admin::stats___mysql_query_digests(bool reset) { rc=sqlite3_bind_int64(statement1, 9, atoll(r1->fields[7])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 10, atoll(r1->fields[8])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 11, atoll(r1->fields[9])); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -6199,7 +6208,7 @@ void ProxySQL_Admin::dump_checksums_values_table() { rc=sqlite3_bind_int64(statement1, 2, GloVars.checksums_values.admin_variables.version); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 3, GloVars.checksums_values.admin_variables.epoch); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 4, GloVars.checksums_values.admin_variables.checksum, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); @@ -6207,7 +6216,7 @@ void ProxySQL_Admin::dump_checksums_values_table() { rc=sqlite3_bind_int64(statement1, 2, GloVars.checksums_values.mysql_query_rules.version); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 3, GloVars.checksums_values.mysql_query_rules.epoch); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 4, GloVars.checksums_values.mysql_query_rules.checksum, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); @@ -6215,7 +6224,7 @@ void ProxySQL_Admin::dump_checksums_values_table() { rc=sqlite3_bind_int64(statement1, 2, GloVars.checksums_values.mysql_servers.version); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 3, GloVars.checksums_values.mysql_servers.epoch); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 4, GloVars.checksums_values.mysql_servers.checksum, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); @@ -6223,7 +6232,7 @@ void ProxySQL_Admin::dump_checksums_values_table() { rc=sqlite3_bind_int64(statement1, 2, GloVars.checksums_values.mysql_users.version); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 3, GloVars.checksums_values.mysql_users.epoch); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 4, GloVars.checksums_values.mysql_users.checksum, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); @@ -6231,7 +6240,7 @@ void ProxySQL_Admin::dump_checksums_values_table() { rc=sqlite3_bind_int64(statement1, 2, GloVars.checksums_values.mysql_variables.version); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 3, GloVars.checksums_values.mysql_variables.epoch); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 4, GloVars.checksums_values.mysql_variables.checksum, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); @@ -6239,7 +6248,7 @@ void ProxySQL_Admin::dump_checksums_values_table() { rc=sqlite3_bind_int64(statement1, 2, GloVars.checksums_values.proxysql_servers.version); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 3, GloVars.checksums_values.proxysql_servers.epoch); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 4, GloVars.checksums_values.proxysql_servers.checksum, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); @@ -6322,7 +6331,7 @@ void ProxySQL_Admin::save_mysql_users_runtime_to_database(bool _runtime) { rc=sqlite3_bind_int64(statement1, 8, ad->fast_forward); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 9, ad->username, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 10, ad->max_connections); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -6426,7 +6435,7 @@ void ProxySQL_Admin::save_clickhouse_users_runtime_to_database(bool _runtime) { rc=sqlite3_bind_text(statement1, 9, ad->username, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 10, ad->max_connections); assert(rc==SQLITE_OK); */ - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -6608,7 +6617,7 @@ void ProxySQL_Admin::save_mysql_servers_runtime_to_database(bool _runtime) { rc=sqlite3_bind_int64(statement32, (idx*11)+10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement32, (idx*11)+11, r1->fields[10], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); if (idx==31) { - SAFE_SQLITE3_STEP(statement32); + SAFE_SQLITE3_STEP2(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement32); assert(rc==SQLITE_OK); } @@ -6624,7 +6633,7 @@ void ProxySQL_Admin::save_mysql_servers_runtime_to_database(bool _runtime) { rc=sqlite3_bind_int64(statement1, 9, atoi(r1->fields[8])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 11, r1->fields[10], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -6716,7 +6725,7 @@ void ProxySQL_Admin::save_mysql_servers_runtime_to_database(bool _runtime) { rc=sqlite3_bind_int64(statement, 8, atoi(r->fields[7])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement, 9, r->fields[8], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); } @@ -8069,7 +8078,7 @@ void ProxySQL_Admin::save_proxysql_servers_runtime_to_database(bool _runtime) { rc=sqlite3_bind_int64(statement32, (idx*4)+3, atoi(r1->fields[2])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement32, (idx*4)+4, r1->fields[3], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); if (idx==31) { - SAFE_SQLITE3_STEP(statement32); + SAFE_SQLITE3_STEP2(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement32); assert(rc==SQLITE_OK); } @@ -8078,7 +8087,7 @@ void ProxySQL_Admin::save_proxysql_servers_runtime_to_database(bool _runtime) { rc=sqlite3_bind_int64(statement1, 2, atoi(r1->fields[1])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 3, atoi(r1->fields[2])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 4, r1->fields[3], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -8127,7 +8136,7 @@ void ProxySQL_Admin::stats___mysql_prepared_statements_info() { rc=sqlite3_bind_int64(statement32, (idx*8)+7, atoll(r1->fields[7])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement32, (idx*8)+8, r1->fields[5], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); if (idx==31) { - SAFE_SQLITE3_STEP(statement32); + SAFE_SQLITE3_STEP2(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement32); assert(rc==SQLITE_OK); } @@ -8140,7 +8149,7 @@ void ProxySQL_Admin::stats___mysql_prepared_statements_info() { rc=sqlite3_bind_int64(statement1, 6, atoll(r1->fields[6])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 7, atoll(r1->fields[7])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 8, r1->fields[5], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } diff --git a/lib/ProxySQL_Cluster.cpp b/lib/ProxySQL_Cluster.cpp index 1bb58276b..f6347cee8 100644 --- a/lib/ProxySQL_Cluster.cpp +++ b/lib/ProxySQL_Cluster.cpp @@ -20,7 +20,14 @@ } while (rc!=SQLITE_DONE);\ } while (0) - +#define SAFE_SQLITE3_STEP2(_stmt) do {\ + do {\ + rc=sqlite3_step(_stmt);\ + if (rc==SQLITE_LOCKED || rc==SQLITE_BUSY) {\ + usleep(100);\ + }\ + } while (rc==SQLITE_LOCKED || rc==SQLITE_BUSY);\ +} while (0) static char *NODE_COMPUTE_DELIMITER=(char *)"-gtyw23a-"; // a random string used for hashing @@ -616,7 +623,7 @@ void ProxySQL_Cluster::pull_mysql_query_rules_from_peer() { rc=sqlite3_bind_text(statement1, 29, row[27], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // log rc=sqlite3_bind_text(statement1, 30, row[28], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // apply rc=sqlite3_bind_text(statement1, 31, row[29], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // comment - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -697,7 +704,7 @@ void ProxySQL_Cluster::pull_mysql_users_from_peer() { rc=sqlite3_bind_int64(statement1, 11, atoll(row[10])); assert(rc==SQLITE_OK); // frontend rc=sqlite3_bind_int64(statement1, 12, atoll(row[11])); assert(rc==SQLITE_OK); // max_connection - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } diff --git a/lib/SQLite3_Server.cpp b/lib/SQLite3_Server.cpp index 693706d4b..e0142be76 100644 --- a/lib/SQLite3_Server.cpp +++ b/lib/SQLite3_Server.cpp @@ -50,6 +50,15 @@ } while (rc!=SQLITE_DONE);\ } while (0) +#define SAFE_SQLITE3_STEP2(_stmt) do {\ + do {\ + rc=sqlite3_step(_stmt);\ + if (rc==SQLITE_LOCKED || rc==SQLITE_BUSY) {\ + usleep(100);\ + }\ + } while (rc==SQLITE_LOCKED || rc==SQLITE_BUSY);\ +} while (0) + /* static void StringToHex(unsigned char *string, unsigned char *hexstring, size_t l) { unsigned char ch;