From e48fc858e8fb390336face9ed577d54ea66b1826 Mon Sep 17 00:00:00 2001 From: mkaruza Date: Thu, 16 Dec 2021 09:39:26 +0100 Subject: MDEV-27263 Cluster bootstrap node shows duplicate wsrep allowlist IP warning messages on each restart. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We should clear `wsrep_allowlist` table on bootstrap before writing to it. Reviewed-by: Jan Lindström --- mysql-test/suite/galera/r/galera_defaults.result | 6 +-- mysql-test/suite/galera/t/galera_defaults.test | 2 + sql/wsrep_mysqld.cc | 3 +- sql/wsrep_schema.cc | 54 +++++++++++++++++++++--- sql/wsrep_schema.h | 6 +++ 5 files changed, 62 insertions(+), 9 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_defaults.result b/mysql-test/suite/galera/r/galera_defaults.result index e32557f578e..ebcae5827c8 100644 --- a/mysql-test/suite/galera/r/galera_defaults.result +++ b/mysql-test/suite/galera/r/galera_defaults.result @@ -1,9 +1,9 @@ connection node_2; connection node_1; # Correct Galera library found -SELECT COUNT(*) `expect 50` FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%'; -expect 50 -50 +SELECT COUNT(*) `expect 51` FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%'; +expect 51 +51 SELECT VARIABLE_NAME, VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%' diff --git a/mysql-test/suite/galera/t/galera_defaults.test b/mysql-test/suite/galera/t/galera_defaults.test index ff08151327a..6cb0cc1c634 100644 --- a/mysql-test/suite/galera/t/galera_defaults.test +++ b/mysql-test/suite/galera/t/galera_defaults.test @@ -16,6 +16,8 @@ --let $galera_version=26.4.11 source ../wsrep/include/check_galera_version.inc; +SELECT COUNT(*) `expect 51` FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%'; + # Global Variables SELECT VARIABLE_NAME, VARIABLE_VALUE diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index d41229bad2b..5fd14e566a6 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -456,9 +456,10 @@ void wsrep_init_schema() unireg_abort(1); } // If we are bootstraping new cluster we should - // populate allowlist from variable + // clear allowlist table and populate it from variable if (wsrep_new_cluster) { + wsrep_schema->clear_allowlist(); std::vector ip_allowlist; if (wsrep_split_allowlist(ip_allowlist)) { diff --git a/sql/wsrep_schema.cc b/sql/wsrep_schema.cc index fbf33a4ca66..765832a48b7 100644 --- a/sql/wsrep_schema.cc +++ b/sql/wsrep_schema.cc @@ -95,7 +95,7 @@ static const std::string create_frag_table_str= static const std::string create_allowlist_table_str= "CREATE TABLE IF NOT EXISTS " + wsrep_schema_str + "." + allowlist_table_str + "(" - "ip CHAR(64) NOT NULL," + "ip CHAR(64) NOT NULL," "PRIMARY KEY (ip)" ") ENGINE=InnoDB STATS_PERSISTENT=0"; @@ -1518,15 +1518,61 @@ out: DBUG_RETURN(ret); } -void Wsrep_schema::store_allowlist(std::vector& ip_allowlist) +void Wsrep_schema::clear_allowlist() { + my_thread_init(); THD* thd= new THD(next_thread_id()); if (!thd) { WSREP_ERROR("Unable to get thd"); return; } + thd->thread_stack= (char*)&thd; + wsrep_init_thd_for_schema(thd); + TABLE* allowlist_table= 0; + int error= 0; + + Wsrep_schema_impl::init_stmt(thd); + + if (Wsrep_schema_impl::open_for_write(thd, allowlist_table_str.c_str(), + &allowlist_table) || + Wsrep_schema_impl::init_for_scan(allowlist_table)) + { + WSREP_ERROR("Failed to open mysql.wsrep_allowlist table"); + goto out; + } + + while (0 == error) + { + if ((error= Wsrep_schema_impl::next_record(allowlist_table)) == 0) + { + Wsrep_schema_impl::delete_row(allowlist_table); + } + else if (error == HA_ERR_END_OF_FILE) + { + continue; + } + else + { + WSREP_ERROR("Allowlist table scan returned error %d", error); + } + } + + Wsrep_schema_impl::end_scan(allowlist_table); + Wsrep_schema_impl::finish_stmt(thd); +out: + delete thd; +} + +void Wsrep_schema::store_allowlist(std::vector& ip_allowlist) +{ my_thread_init(); + THD* thd= new THD(next_thread_id()); + if (!thd) + { + WSREP_ERROR("Unable to get thd"); + return; + } thd->thread_stack= (char*)&thd; wsrep_init_thd_for_schema(thd); TABLE* allowlist_table= 0; @@ -1557,7 +1603,6 @@ void Wsrep_schema::store_allowlist(std::vector& ip_allowlist) Wsrep_schema_impl::finish_stmt(thd); out: delete thd; - my_thread_end(); } bool Wsrep_schema::allowlist_check(Wsrep_allowlist_key key, @@ -1568,13 +1613,13 @@ bool Wsrep_schema::allowlist_check(Wsrep_allowlist_key key, { return true; } + my_thread_init(); THD *thd = new THD(next_thread_id()); if (!thd) { WSREP_ERROR("Unable to get thd"); return false; } - my_thread_init(); thd->thread_stack= (char*)&thd; int error; TABLE *allowlist_table= 0; @@ -1632,6 +1677,5 @@ bool Wsrep_schema::allowlist_check(Wsrep_allowlist_key key, (void)trans_commit(thd); out: delete thd; - my_thread_end(); return match_found_or_empty; } diff --git a/sql/wsrep_schema.h b/sql/wsrep_schema.h index 943fe8759c0..05522e77089 100644 --- a/sql/wsrep_schema.h +++ b/sql/wsrep_schema.h @@ -133,6 +133,12 @@ class Wsrep_schema */ int recover_sr_transactions(THD* orig_thd); + + /** + Delete all rows on bootstrap from `wsrep_allowlist` variable + */ + void clear_allowlist(); + /** Store allowlist ip on bootstrap from `wsrep_allowlist` variable */ -- cgit v1.2.1