mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-18 22:54:00 +00:00
121 lines
4.5 KiB
Diff
121 lines
4.5 KiB
Diff
commit e73060b6c9b3655cadcd34c66fc7811d214c1673
|
|
Author: Jan Lindström <jan.lindstrom@mariadb.com>
|
|
Date: Tue Mar 12 15:44:10 2019 +0200
|
|
|
|
MDEV-18577: Indexes problem on import dump SQL
|
|
|
|
Problem was that we skipped background persistent statistics calculation
|
|
on applier nodes if thread is marked as high priority (a.k.a BF).
|
|
However, on applier nodes all DDL which is replicate will be executed
|
|
as high priority i.e BF.
|
|
|
|
Fixed by allowing background persistent statistics calculation on
|
|
applier nodes even when thread is marked as BF. This could lead
|
|
BF lock waits but for queries on that node needs that statistics.
|
|
|
|
diff --git a/include/mysql/service_wsrep.h b/include/mysql/service_wsrep.h
|
|
index 267c8cb4e90..ee28856ac73 100644
|
|
--- a/include/mysql/service_wsrep.h
|
|
+++ b/include/mysql/service_wsrep.h
|
|
@@ -112,6 +112,7 @@ extern struct wsrep_service_st {
|
|
int (*wsrep_trx_order_before_func)(MYSQL_THD, MYSQL_THD);
|
|
void (*wsrep_unlock_rollback_func)();
|
|
void (*wsrep_set_data_home_dir_func)(const char *data_dir);
|
|
+ my_bool (*wsrep_thd_is_applier_func)(MYSQL_THD);
|
|
} *wsrep_service;
|
|
|
|
#ifdef MYSQL_DYNAMIC_PLUGIN
|
|
@@ -155,6 +156,7 @@ extern struct wsrep_service_st {
|
|
#define wsrep_trx_order_before(T1,T2) wsrep_service->wsrep_trx_order_before_func(T1,T2)
|
|
#define wsrep_unlock_rollback() wsrep_service->wsrep_unlock_rollback_func()
|
|
#define wsrep_set_data_home_dir(A) wsrep_service->wsrep_set_data_home_dir_func(A)
|
|
+#define wsrep_thd_is_applier(T) wsrep_service->wsrep_thd_is_applier(T)
|
|
|
|
#define wsrep_debug get_wsrep_debug()
|
|
#define wsrep_log_conflicts get_wsrep_log_conflicts()
|
|
@@ -214,7 +216,7 @@ void wsrep_thd_set_conflict_state(THD *thd, enum wsrep_conflict_state state);
|
|
bool wsrep_thd_ignore_table(THD *thd);
|
|
void wsrep_unlock_rollback();
|
|
void wsrep_set_data_home_dir(const char *data_dir);
|
|
-
|
|
+my_bool wsrep_thd_is_applier(MYSQL_THD thd);
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
diff --git a/sql/sql_plugin_services.ic b/sql/sql_plugin_services.ic
|
|
index 7fb5524016a..3d6cf0a0723 100644
|
|
--- a/sql/sql_plugin_services.ic
|
|
+++ b/sql/sql_plugin_services.ic
|
|
@@ -181,7 +181,8 @@ static struct wsrep_service_st wsrep_handler = {
|
|
wsrep_trx_is_aborting,
|
|
wsrep_trx_order_before,
|
|
wsrep_unlock_rollback,
|
|
- wsrep_set_data_home_dir
|
|
+ wsrep_set_data_home_dir,
|
|
+ wsrep_thd_is_applier
|
|
};
|
|
|
|
static struct thd_specifics_service_st thd_specifics_handler=
|
|
diff --git a/sql/wsrep_dummy.cc b/sql/wsrep_dummy.cc
|
|
index 795e2d19252..7297dbfe0fd 100644
|
|
--- a/sql/wsrep_dummy.cc
|
|
+++ b/sql/wsrep_dummy.cc
|
|
@@ -141,3 +141,6 @@ void wsrep_unlock_rollback()
|
|
|
|
void wsrep_set_data_home_dir(const char *)
|
|
{ }
|
|
+
|
|
+my_bool wsrep_thd_is_applier(MYSQL_THD thd)
|
|
+{ return false; }
|
|
diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc
|
|
index a3d1961ade2..dab9f91b381 100644
|
|
--- a/sql/wsrep_thd.cc
|
|
+++ b/sql/wsrep_thd.cc
|
|
@@ -698,3 +698,13 @@ void wsrep_thd_auto_increment_variables(THD* thd,
|
|
*increment= thd->variables.auto_increment_increment;
|
|
}
|
|
}
|
|
+
|
|
+my_bool wsrep_thd_is_applier(MYSQL_THD thd)
|
|
+{
|
|
+ my_bool is_applier= false;
|
|
+
|
|
+ if (thd && thd->wsrep_applier)
|
|
+ is_applier= true;
|
|
+
|
|
+ return (is_applier);
|
|
+}
|
|
diff --git a/storage/innobase/dict/dict0stats_bg.cc b/storage/innobase/dict/dict0stats_bg.cc
|
|
index 55bcafddc70..7d30555748c 100644
|
|
--- a/storage/innobase/dict/dict0stats_bg.cc
|
|
+++ b/storage/innobase/dict/dict0stats_bg.cc
|
|
@@ -164,10 +164,26 @@ void dict_stats_update_if_needed_func(dict_table_t* table)
|
|
&& dict_stats_auto_recalc_is_enabled(table)) {
|
|
|
|
#ifdef WITH_WSREP
|
|
- if (thd && wsrep_on(thd) && wsrep_thd_is_BF(thd, 0)) {
|
|
+ /* Do not add table to background
|
|
+ statistic calculation if this thread is not a
|
|
+ applier (as all DDL, which is replicated (i.e
|
|
+ is binlogged in master node), will be executed
|
|
+ with high priority (a.k.a BF) in slave nodes)
|
|
+ and is BF. This could again lead BF lock
|
|
+ waits in applier node but it is better than
|
|
+ no persistent index/table statistics at
|
|
+ applier nodes. TODO: allow BF threads
|
|
+ wait for these InnoDB internal SQL-parser
|
|
+ generated row locks and allow BF thread
|
|
+ lock waits to be enqueued at head of waiting
|
|
+ queue. */
|
|
+ if (thd
|
|
+ && !wsrep_thd_is_applier(thd)
|
|
+ && wsrep_on(thd)
|
|
+ && wsrep_thd_is_BF(thd, 0)) {
|
|
WSREP_DEBUG("Avoiding background statistics"
|
|
- " calculation for table %s",
|
|
- table->name.m_name);
|
|
+ " calculation for table %s.",
|
|
+ table->name.m_name);
|
|
return;
|
|
}
|
|
#endif /* WITH_WSREP */
|