From e73fba401159f4f619cb96dcb346b6f97ab74fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 30 Aug 2015 07:55:22 +0000 Subject: [PATCH] Improved copying configuration between disk and memory and viceversa (issue #367) Closes #367 --- include/proxysql_admin.h | 2 ++ lib/ProxySQL_Admin.cpp | 66 +++++++++++++++++++++++++++++----------- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/include/proxysql_admin.h b/include/proxysql_admin.h index 3ddf98d14..e748b6003 100644 --- a/include/proxysql_admin.h +++ b/include/proxysql_admin.h @@ -103,6 +103,8 @@ class ProxySQL_Admin { int load_debug_to_runtime() { return flush_debug_levels_database_to_runtime(admindb); } void save_debug_from_runtime() { return flush_debug_levels_runtime_to_database(admindb, true); } #endif /* DEBUG */ + void flush_mysql_users__from_memory_to_disk(); + void flush_mysql_users__from_disk_to_memory(); void flush_mysql_servers__from_memory_to_disk(); void flush_mysql_servers__from_disk_to_memory(); void flush_mysql_query_rules__from_memory_to_disk(); diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 9fa6240df..118aa8286 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -489,10 +489,11 @@ bool admin_handler_command_load_or_save(char *query_no_space, unsigned int query (query_no_space_length==strlen("LOAD MYSQL USERS FROM DISK") && !strncasecmp("LOAD MYSQL USERS FROM DISK",query_no_space, query_no_space_length)) ) { proxy_info("Received %s command\n", query_no_space); - l_free(*ql,*q); - *q=l_strdup("INSERT OR REPLACE INTO main.mysql_users SELECT * FROM disk.mysql_users"); - *ql=strlen(*q)+1; - return true; + ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; + SPA->flush_mysql_users__from_disk_to_memory(); + proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loading mysql users to MEMORY\n"); + SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); + return false; } if ( @@ -503,10 +504,11 @@ bool admin_handler_command_load_or_save(char *query_no_space, unsigned int query (query_no_space_length==strlen("SAVE MYSQL USERS TO DISK") && !strncasecmp("SAVE MYSQL USERS TO DISK",query_no_space, query_no_space_length)) ) { proxy_info("Received %s command\n", query_no_space); - l_free(*ql,*q); - *q=l_strdup("INSERT OR REPLACE INTO disk.mysql_users SELECT * FROM main.mysql_users"); - *ql=strlen(*q)+1; - return true; + ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; + SPA->flush_mysql_users__from_memory_to_disk(); + proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saving mysql users to DISK\n"); + SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); + return false; } if ( @@ -2512,30 +2514,58 @@ void ProxySQL_Admin::__insert_or_replace_disktable_select_maintable() { } +void ProxySQL_Admin::flush_mysql_users__from_disk_to_memory() { + admindb->wrlock(); + admindb->execute("PRAGMA foreign_keys = OFF"); + admindb->execute("DELETE FROM main.mysql_users"); + admindb->execute("INSERT INTO main.mysql_users SELECT * FROM disk.mysql_users"); + admindb->execute("PRAGMA foreign_keys = ON"); + admindb->wrunlock(); +} + +void ProxySQL_Admin::flush_mysql_users__from_memory_to_disk() { + admindb->wrlock(); + admindb->execute("PRAGMA foreign_keys = OFF"); + admindb->execute("DELETE FROM disk.mysql_userss"); + admindb->execute("INSERT INTO disk.mysql_users SELECT * FROM main.mysql_users"); + admindb->execute("PRAGMA foreign_keys = ON"); + admindb->wrunlock(); +} + void ProxySQL_Admin::flush_mysql_servers__from_disk_to_memory() { - // FIXME : low-priority , this should be transactional - admindb->execute("PRAGMA foreign_keys = OFF"); - admindb->execute("INSERT OR REPLACE INTO main.mysql_servers SELECT * FROM disk.mysql_servers"); - admindb->execute("PRAGMA foreign_keys = ON"); + admindb->wrlock(); + admindb->execute("PRAGMA foreign_keys = OFF"); + admindb->execute("DELETE FROM main.mysql_servers"); + admindb->execute("INSERT INTO main.mysql_servers SELECT * FROM disk.mysql_servers"); + admindb->execute("PRAGMA foreign_keys = ON"); + admindb->wrunlock(); } void ProxySQL_Admin::flush_mysql_servers__from_memory_to_disk() { - // FIXME : low-priority , this should be transactional - admindb->execute("PRAGMA foreign_keys = OFF"); - admindb->execute("INSERT OR REPLACE INTO disk.mysql_servers SELECT * FROM main.mysql_servers"); - admindb->execute("PRAGMA foreign_keys = ON"); + admindb->wrlock(); + admindb->execute("PRAGMA foreign_keys = OFF"); + admindb->execute("DELETE FROM disk.mysql_servers"); + admindb->execute("INSERT INTO disk.mysql_servers SELECT * FROM main.mysql_servers"); + admindb->execute("PRAGMA foreign_keys = ON"); + admindb->wrunlock(); } void ProxySQL_Admin::flush_mysql_query_rules__from_disk_to_memory() { + admindb->wrlock(); admindb->execute("PRAGMA foreign_keys = OFF"); - admindb->execute("INSERT OR REPLACE INTO main.mysql_query_rules SELECT * FROM disk.mysql_query_rules"); + admindb->execute("DELETE FROM main.mysql_query_rules"); + admindb->execute("INSERT INTO main.mysql_query_rules SELECT * FROM disk.mysql_query_rules"); admindb->execute("PRAGMA foreign_keys = ON"); + admindb->wrunlock(); } void ProxySQL_Admin::flush_mysql_query_rules__from_memory_to_disk() { + admindb->wrlock(); admindb->execute("PRAGMA foreign_keys = OFF"); - admindb->execute("INSERT OR REPLACE INTO disk.mysql_query_rules SELECT * FROM main.mysql_query_rules"); + admindb->execute("DELETE FROM disk.mysql_query_rules"); + admindb->execute("INSERT INTO disk.mysql_query_rules SELECT * FROM main.mysql_query_rules"); admindb->execute("PRAGMA foreign_keys = ON"); + admindb->wrunlock(); } void ProxySQL_Admin::__attach_db(SQLite3DB *db1, SQLite3DB *db2, char *alias) {