summaryrefslogtreecommitdiff
path: root/sql/wsrep_var.cc
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@mariadb.com>2021-01-22 12:12:42 +0200
committerJan Lindström <jan.lindstrom@mariadb.com>2021-01-22 12:12:42 +0200
commitce141d0714207afb70911abce21c2a4055b8a9e9 (patch)
treece8c3d0f5ec990d7177d9cc8cd335ca6c4fbfa41 /sql/wsrep_var.cc
parentbe5fce16a0d4104b216818438ca624bfaa19497a (diff)
downloadmariadb-git-ce141d0714207afb70911abce21c2a4055b8a9e9.tar.gz
MDEV-24463 : galera.galera_sst_mysqldump_with_key MTR failed: 'INSERT failed: 1213: Deadlock found when trying to get lockbb-10.4-MDEV-24463
We need to complete SST if both new and old start positions are not same as initial positions. If they are initial positions just set local uuid and seqno.
Diffstat (limited to 'sql/wsrep_var.cc')
-rw-r--r--sql/wsrep_var.cc34
1 files changed, 24 insertions, 10 deletions
diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc
index 266ff9459ac..dea388d30de 100644
--- a/sql/wsrep_var.cc
+++ b/sql/wsrep_var.cc
@@ -233,12 +233,24 @@ bool wsrep_set_local_position(THD* thd, const char* const value,
size_t const uuid_len= wsrep_uuid_scan(value, length, &uuid);
wsrep_seqno_t const seqno= strtoll(value + uuid_len + 1, NULL, 10);
- if (sst) {
+ char start_pos_buf[FN_REFLEN];
+ memcpy(start_pos_buf, value, length);
+ start_pos_buf[length]='\0';
+
+ // If both are same as WSREP_START_POSITION_ZERO just set local
+ if (!strcmp(start_pos_buf, WSREP_START_POSITION_ZERO) &&
+ !strcmp(wsrep_start_position, WSREP_START_POSITION_ZERO))
+ goto set;
+ else
+ WSREP_INFO("SST setting local position to %s current %s", start_pos_buf, wsrep_start_position);
+
+ if (sst)
return (wsrep_sst_received (thd, uuid, seqno, NULL, 0));
- } else {
- local_uuid= uuid;
- local_seqno= seqno;
- }
+
+set:
+ local_uuid= uuid;
+ local_seqno= seqno;
+
return false;
}
@@ -255,9 +267,14 @@ bool wsrep_start_position_check (sys_var *self, THD* thd, set_var* var)
var->save_result.string_value.length);
start_pos_buf[var->save_result.string_value.length]= 0;
+
+ WSREP_DEBUG("SST wsrep_start_position check for new position %s old %s",
+ start_pos_buf, wsrep_start_position);
+
// Verify the format.
if (wsrep_start_position_verify(start_pos_buf)) return true;
+
// Give error if position is updated when wsrep is not enabled or
// provider is not loaded.
if ((!WSREP_ON || !Wsrep_server_state::instance().is_provider_loaded())
@@ -274,13 +291,10 @@ bool wsrep_start_position_check (sys_var *self, THD* thd, set_var* var)
As part of further verification, we try to update the value and catch
errors (if any) only when value actually has been changed.
*/
- if (strcmp(start_pos_buf, wsrep_start_position))
- {
- if (wsrep_set_local_position(thd, var->save_result.string_value.str,
+ if (wsrep_set_local_position(thd, var->save_result.string_value.str,
var->save_result.string_value.length,
true))
- goto err;
- }
+ goto err;
return false;