summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmake/wsrep.cmake26
-rw-r--r--include/mysql_version.h.in4
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_wsrep.result14
-rw-r--r--scripts/mysqld_safe.sh32
-rw-r--r--sql/mysqld.cc30
-rw-r--r--sql/sys_vars.cc6
-rw-r--r--sql/wsrep_mysqld.cc52
-rw-r--r--sql/wsrep_mysqld.h8
-rw-r--r--sql/wsrep_var.cc5
9 files changed, 117 insertions, 60 deletions
diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake
index c37cf746e62..475125a9e4c 100644
--- a/cmake/wsrep.cmake
+++ b/cmake/wsrep.cmake
@@ -28,29 +28,17 @@ OPTION(WITH_WSREP "WSREP replication API (to use, e.g. Galera Replication librar
# Set the patch version
SET(WSREP_PATCH_VERSION "10")
-# MariaDB addition: Revision number of the last revision merged from
-# codership branch visible in @@version_comment.
-# Branch : codership-mysql/5.6
-SET(WSREP_PATCH_REVNO "4144") # Should be updated on every merge.
-
-# MariaDB addition: Revision number of the last revision merged from
-# Branch : lp:maria/maria-10.0-galera
-SET(WSREP_PATCH_REVNO2 "3919") # Should be updated on every merge.
-
-# MariaDB: Obtain patch revision number:
-# Update WSREP_PATCH_REVNO if WSREP_REV environment variable is set.
-IF (DEFINED ENV{WSREP_REV})
- SET(WSREP_PATCH_REVNO $ENV{WSREP_REV})
-ENDIF()
-
-SET(WSREP_INTERFACE_VERSION 25)
+# Obtain wsrep API version
+FILE(STRINGS "${MySQL_SOURCE_DIR}/wsrep/wsrep_api.h" WSREP_API_VERSION
+ LIMIT_COUNT 1 REGEX "WSREP_INTERFACE_VERSION")
+STRING(REGEX MATCH "([0-9]+)" WSREP_API_VERSION "${WSREP_API_VERSION}")
-SET(WSREP_VERSION
- "${WSREP_INTERFACE_VERSION}.${WSREP_PATCH_VERSION}.r${WSREP_PATCH_REVNO}")
+SET(WSREP_VERSION "${WSREP_API_VERSION}.${WSREP_PATCH_VERSION}"
+ CACHE INTERNAL "WSREP version")
SET(WSREP_PROC_INFO ${WITH_WSREP})
IF(WITH_WSREP)
- SET(COMPILATION_COMMENT "${COMPILATION_COMMENT}, wsrep_${WSREP_VERSION}")
+ SET(WSREP_PATCH_VERSION "wsrep_${WSREP_VERSION}")
ENDIF()
diff --git a/include/mysql_version.h.in b/include/mysql_version.h.in
index cceb4e984c7..f22e00dabb9 100644
--- a/include/mysql_version.h.in
+++ b/include/mysql_version.h.in
@@ -23,6 +23,10 @@
#define MYSQL_CONFIG_NAME "my"
#define MYSQL_COMPILATION_COMMENT "@COMPILATION_COMMENT@"
+#ifdef WITH_WSREP
+#define WSREP_PATCH_VERSION "@WSREP_PATCH_VERSION@"
+#endif
+
/* mysqld compile time options */
#endif /* _CUSTOMCONFIG_ */
diff --git a/mysql-test/suite/sys_vars/r/sysvars_wsrep.result b/mysql-test/suite/sys_vars/r/sysvars_wsrep.result
index 9c392b17f27..1763078e2d7 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_wsrep.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_wsrep.result
@@ -365,6 +365,20 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST TOI,RSU
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
+VARIABLE_NAME WSREP_PATCH_VERSION
+SESSION_VALUE NULL
+GLOBAL_VALUE wsrep_25.10
+GLOBAL_VALUE_ORIGIN COMPILE-TIME
+DEFAULT_VALUE NULL
+VARIABLE_SCOPE GLOBAL
+VARIABLE_TYPE VARCHAR
+VARIABLE_COMMENT wsrep patch version
+NUMERIC_MIN_VALUE NULL
+NUMERIC_MAX_VALUE NULL
+NUMERIC_BLOCK_SIZE NULL
+ENUM_VALUE_LIST NULL
+READ_ONLY YES
+COMMAND_LINE_ARGUMENT NULL
VARIABLE_NAME WSREP_PROVIDER
SESSION_VALUE NULL
GLOBAL_VALUE none
diff --git a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh
index 6424edc43c0..d5a5cbe979d 100644
--- a/scripts/mysqld_safe.sh
+++ b/scripts/mysqld_safe.sh
@@ -20,6 +20,7 @@ mysqld_ld_preload=
mysqld_ld_library_path=
flush_caches=0
numa_interleave=0
+wsrep_on=0
# Initial logging status: error log is not open, and not using syslog
logging=init
@@ -319,6 +320,15 @@ parse_arguments() {
--timezone=*) TZ="$val"; export TZ; ;;
--flush[-_]caches) flush_caches=1 ;;
--numa[-_]interleave) numa_interleave=1 ;;
+ --wsrep[-_]on) wsrep_on=1 ;;
+ --skip[-_]wsrep[-_]on) wsrep_on=0 ;;
+ --wsrep[-_]on=*)
+ if echo $val | grep -iq '\(ON\|1\)'; then
+ wsrep_on=1
+ else
+ wsrep_on=0
+ fi
+ ;;
--wsrep[-_]urls=*) wsrep_urls="$val"; ;;
--wsrep[-_]provider=*)
if test -n "$val" && test "$val" != "none"
@@ -968,18 +978,24 @@ do
start_time=`date +%M%S`
- # this sets wsrep_start_position_opt
- wsrep_recover_position "$cmd"
+ # Perform wsrep position recovery if wsrep_on=1, skip otherwise.
+ if test $wsrep_on -eq 1
+ then
+ # this sets wsrep_start_position_opt
+ wsrep_recover_position "$cmd"
- [ $? -ne 0 ] && exit 1 #
+ [ $? -ne 0 ] && exit 1 #
- [ -n "$wsrep_urls" ] && url=`wsrep_pick_url $wsrep_urls` # check connect address
+ [ -n "$wsrep_urls" ] && url=`wsrep_pick_url $wsrep_urls` # check connect address
- if [ -z "$url" ]
- then
- eval_log_error "$cmd $wsrep_start_position_opt"
+ if [ -z "$url" ]
+ then
+ eval_log_error "$cmd $wsrep_start_position_opt"
+ else
+ eval_log_error "$cmd $wsrep_start_position_opt --wsrep_cluster_address=$url"
+ fi
else
- eval_log_error "$cmd $wsrep_start_position_opt --wsrep_cluster_address=$url"
+ eval_log_error "$cmd"
fi
if [ $want_syslog -eq 0 -a ! -f "$err_log" ]; then
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 6602726c2ca..63d34218172 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1900,14 +1900,16 @@ static void __cdecl kill_server(int sig_ptr)
}
#endif
- if (WSREP_ON)
- wsrep_stop_replication(NULL);
+ /* Stop wsrep threads in case they are running. */
+ wsrep_stop_replication(NULL);
close_connections();
if (wsrep_inited == 1)
wsrep_deinit(true);
+ wsrep_thr_deinit();
+
if (sig != MYSQL_KILL_SIGNAL &&
sig != 0)
unireg_abort(1); /* purecov: inspected */
@@ -4974,13 +4976,20 @@ a file name for --log-bin-index option", opt_binlog_index_name);
opt_bin_logname= my_once_strdup(buf, MYF(MY_WME));
}
- /*
- Wsrep initialization must happen at this point, because:
- - opt_bin_logname must be known when starting replication
- since SST may need it
- - SST may modify binlog index file, so it must be opened
- after SST has happened
- */
+ /*
+ Wsrep initialization must happen at this point, because:
+ - opt_bin_logname must be known when starting replication
+ since SST may need it
+ - SST may modify binlog index file, so it must be opened
+ after SST has happened
+
+ We also (unconditionally) initialize wsrep LOCKs and CONDs.
+ It is because they are used while accessing wsrep system
+ variables even when a wsrep provider is not loaded.
+ */
+
+ wsrep_thr_init();
+
if (WSREP_ON && !wsrep_recovery && !opt_abort) /* WSREP BEFORE SE */
{
if (opt_bootstrap) // bootsrap option given - disable wsrep functionality
@@ -9425,9 +9434,6 @@ void set_server_version(void)
#ifdef EMBEDDED_LIBRARY
end= strmov(end, "-embedded");
#endif
-#ifdef WITH_WSREP
- end= strmov(end, "-wsrep");
-#endif
#ifndef DBUG_OFF
if (!strstr(MYSQL_SERVER_SUFFIX_STR, "-debug"))
end= strmov(end, "-debug");
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 4d8d5a9223b..6d339eeb8bd 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -4857,6 +4857,12 @@ static Sys_var_mybool Sys_wsrep_gtid_mode(
"ignored (backward compatibility).",
GLOBAL_VAR(wsrep_gtid_mode), CMD_LINE(OPT_ARG), DEFAULT(FALSE));
+static char *wsrep_patch_version_ptr;
+static Sys_var_charptr Sys_wsrep_patch_version(
+ "wsrep_patch_version", "wsrep patch version",
+ READ_ONLY GLOBAL_VAR(wsrep_patch_version_ptr), CMD_LINE_HELP_ONLY,
+ IN_SYSTEM_CHARSET, DEFAULT(WSREP_PATCH_VERSION));
+
#endif /* WITH_WSREP */
static bool fix_host_cache_size(sys_var *, THD *, enum_var_type)
diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc
index d8c3605b394..33d1d2a0966 100644
--- a/sql/wsrep_mysqld.cc
+++ b/sql/wsrep_mysqld.cc
@@ -617,25 +617,6 @@ int wsrep_init()
wsrep_causal_reads_update(&global_system_variables);
- mysql_mutex_register("sql", wsrep_mutexes, array_elements(wsrep_mutexes));
- mysql_cond_register("sql", wsrep_conds, array_elements(wsrep_conds));
-
- mysql_mutex_init(key_LOCK_wsrep_ready, &LOCK_wsrep_ready, MY_MUTEX_INIT_FAST);
- mysql_cond_init(key_COND_wsrep_ready, &COND_wsrep_ready, NULL);
- mysql_mutex_init(key_LOCK_wsrep_sst, &LOCK_wsrep_sst, MY_MUTEX_INIT_FAST);
- mysql_cond_init(key_COND_wsrep_sst, &COND_wsrep_sst, NULL);
- mysql_mutex_init(key_LOCK_wsrep_sst_init, &LOCK_wsrep_sst_init, MY_MUTEX_INIT_FAST);
- mysql_cond_init(key_COND_wsrep_sst_init, &COND_wsrep_sst_init, NULL);
- mysql_mutex_init(key_LOCK_wsrep_rollback, &LOCK_wsrep_rollback, MY_MUTEX_INIT_FAST);
- mysql_cond_init(key_COND_wsrep_rollback, &COND_wsrep_rollback, NULL);
- mysql_mutex_init(key_LOCK_wsrep_replaying, &LOCK_wsrep_replaying, MY_MUTEX_INIT_FAST);
- mysql_cond_init(key_COND_wsrep_replaying, &COND_wsrep_replaying, NULL);
- mysql_mutex_init(key_LOCK_wsrep_slave_threads, &LOCK_wsrep_slave_threads, MY_MUTEX_INIT_FAST);
- mysql_mutex_init(key_LOCK_wsrep_desync, &LOCK_wsrep_desync, MY_MUTEX_INIT_FAST);
- mysql_mutex_init(key_LOCK_wsrep_config_state, &LOCK_wsrep_config_state, MY_MUTEX_INIT_FAST);
-
- mysql_file_register("sql", wsrep_files, array_elements(wsrep_files));
-
wsrep_ready_set(FALSE);
assert(wsrep_provider);
@@ -826,6 +807,31 @@ int wsrep_init()
return rcode;
}
+
+/* Initialize wsrep thread LOCKs and CONDs */
+void wsrep_thr_init()
+{
+ mysql_mutex_register("sql", wsrep_mutexes, array_elements(wsrep_mutexes));
+ mysql_cond_register("sql", wsrep_conds, array_elements(wsrep_conds));
+
+ mysql_mutex_init(key_LOCK_wsrep_ready, &LOCK_wsrep_ready, MY_MUTEX_INIT_FAST);
+ mysql_cond_init(key_COND_wsrep_ready, &COND_wsrep_ready, NULL);
+ mysql_mutex_init(key_LOCK_wsrep_sst, &LOCK_wsrep_sst, MY_MUTEX_INIT_FAST);
+ mysql_cond_init(key_COND_wsrep_sst, &COND_wsrep_sst, NULL);
+ mysql_mutex_init(key_LOCK_wsrep_sst_init, &LOCK_wsrep_sst_init, MY_MUTEX_INIT_FAST);
+ mysql_cond_init(key_COND_wsrep_sst_init, &COND_wsrep_sst_init, NULL);
+ mysql_mutex_init(key_LOCK_wsrep_rollback, &LOCK_wsrep_rollback, MY_MUTEX_INIT_FAST);
+ mysql_cond_init(key_COND_wsrep_rollback, &COND_wsrep_rollback, NULL);
+ mysql_mutex_init(key_LOCK_wsrep_replaying, &LOCK_wsrep_replaying, MY_MUTEX_INIT_FAST);
+ mysql_cond_init(key_COND_wsrep_replaying, &COND_wsrep_replaying, NULL);
+ mysql_mutex_init(key_LOCK_wsrep_slave_threads, &LOCK_wsrep_slave_threads, MY_MUTEX_INIT_FAST);
+ mysql_mutex_init(key_LOCK_wsrep_desync, &LOCK_wsrep_desync, MY_MUTEX_INIT_FAST);
+ mysql_mutex_init(key_LOCK_wsrep_config_state, &LOCK_wsrep_config_state, MY_MUTEX_INIT_FAST);
+
+ mysql_file_register("sql", wsrep_files, array_elements(wsrep_files));
+}
+
+
void wsrep_init_startup (bool first)
{
if (wsrep_init()) unireg_abort(1);
@@ -864,7 +870,11 @@ void wsrep_deinit(bool free_options)
{
wsrep_sst_auth_free();
}
+}
+/* Destroy wsrep thread LOCKs and CONDs */
+void wsrep_thr_deinit()
+{
mysql_mutex_destroy(&LOCK_wsrep_ready);
mysql_cond_destroy(&COND_wsrep_ready);
mysql_mutex_destroy(&LOCK_wsrep_sst);
@@ -882,10 +892,11 @@ void wsrep_deinit(bool free_options)
void wsrep_recover()
{
+ char uuid_str[40];
+
if (!memcmp(&local_uuid, &WSREP_UUID_UNDEFINED, sizeof(wsrep_uuid_t)) &&
local_seqno == -2)
{
- char uuid_str[40];
wsrep_uuid_print(&local_uuid, uuid_str, sizeof(uuid_str));
WSREP_INFO("Position %s:%lld given at startup, skipping position recovery",
uuid_str, (long long)local_seqno);
@@ -895,7 +906,6 @@ void wsrep_recover()
memset(&xid, 0, sizeof(xid));
xid.formatID= -1;
wsrep_get_SE_checkpoint(&xid);
- char uuid_str[40];
wsrep_uuid_print(wsrep_xid_uuid(&xid), uuid_str, sizeof(uuid_str));
WSREP_INFO("Recovered position: %s:%lld", uuid_str,
(long long)wsrep_xid_seqno(&xid));
diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h
index b704295171e..f68b89e7994 100644
--- a/sql/wsrep_mysqld.h
+++ b/sql/wsrep_mysqld.h
@@ -118,6 +118,12 @@ int wsrep_show_status(THD *thd, SHOW_VAR *var, char *buff,
enum enum_var_type scope);
int wsrep_init();
void wsrep_deinit(bool free_options);
+
+/* Initialize wsrep thread LOCKs and CONDs */
+void wsrep_thr_init();
+/* Destroy wsrep thread LOCKs and CONDs */
+void wsrep_thr_deinit();
+
void wsrep_recover();
bool wsrep_before_SE(); // initialize wsrep before storage
// engines (true) or after (false)
@@ -338,6 +344,8 @@ int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len);
#define wsrep_recover() do { } while(0)
#define wsrep_slave_threads (1)
#define wsrep_replicate_myisam (0)
+#define wsrep_thr_init() do {} while(0)
+#define wsrep_thr_deinit() do {} while(0)
#endif /* WITH_WSREP */
#endif /* WSREP_MYSQLD_H */
diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc
index ca921b7ef18..a6c2bafef13 100644
--- a/sql/wsrep_var.cc
+++ b/sql/wsrep_var.cc
@@ -295,6 +295,8 @@ bool wsrep_provider_options_check(sys_var *self, THD* thd, set_var* var)
bool wsrep_provider_options_update(sys_var *self, THD* thd, enum_var_type type)
{
+ DBUG_ASSERT(wsrep != NULL);
+
wsrep_status_t ret= wsrep->options_set(wsrep, wsrep_provider_options);
if (ret != WSREP_OK)
{
@@ -495,6 +497,8 @@ bool wsrep_desync_check (sys_var *self, THD* thd, set_var* var)
bool wsrep_desync_update (sys_var *self, THD* thd, enum_var_type type)
{
+ DBUG_ASSERT(wsrep != NULL);
+
wsrep_status_t ret(WSREP_WARNING);
if (wsrep_desync) {
ret = wsrep->desync (wsrep);
@@ -548,6 +552,7 @@ int wsrep_show_status (THD *thd, SHOW_VAR *var, char *buff,
*v++= wsrep_status_vars[i];
DBUG_ASSERT(i < maxi);
+ DBUG_ASSERT(wsrep != NULL);
wsrep_stats_var* stats= wsrep->stats_get(wsrep);
for (wsrep_stats_var *sv= stats; i < maxi && sv && sv->name; i++, sv++, v++)