diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/wsrep_sst.cc | 9 | ||||
-rw-r--r-- | sql/wsrep_var.cc | 34 |
2 files changed, 30 insertions, 13 deletions
diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 227cd6b4769..b7a7dadf0dc 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -316,6 +316,9 @@ static bool wsrep_sst_complete (THD* thd, Wsrep_server_state& server_state= Wsrep_server_state::instance(); enum wsrep::server_state::state state= server_state.state(); bool failed= false; + char start_pos_buf[FN_REFLEN]; + ssize_t len= wsrep::print_to_c_str(sst_gtid, start_pos_buf, FN_REFLEN-1); + start_pos_buf[len]='\0'; // Do not call sst_received if we are not in joiner or // initialized state on server. This is because it @@ -323,13 +326,13 @@ static bool wsrep_sst_complete (THD* thd, // in incorrect state. if ((state == Wsrep_server_state::s_joiner || state == Wsrep_server_state::s_initialized)) + { Wsrep_server_state::instance().sst_received(client_service, rcode); + WSREP_INFO("SST succeeded for position %s", start_pos_buf); + } else { - char start_pos_buf[FN_REFLEN]; - ssize_t len= wsrep::print_to_c_str(sst_gtid, start_pos_buf, FN_REFLEN-1); - start_pos_buf[len]='\0'; WSREP_ERROR("SST failed for position %s initialized %d server_state %s", start_pos_buf, server_state.is_initialized(), 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; |