summaryrefslogtreecommitdiff
path: root/sql/wsrep_server_service.cc
diff options
context:
space:
mode:
authorTeemu Ollakka <teemu.ollakka@galeracluster.com>2019-02-12 15:58:06 +0200
committerJan Lindström <jan.lindstrom@mariadb.com>2019-02-18 08:26:20 +0200
commitb4c75f685b370c9ef6d91e1537bdec74f2bb69a0 (patch)
tree57f5f888a0d7f5ea7638365f7f57945092eed64a /sql/wsrep_server_service.cc
parent9b8fc089bd007d55b0e6b9e587429fe08033a98d (diff)
downloadmariadb-git-b4c75f685b370c9ef6d91e1537bdec74f2bb69a0.tar.gz
MDEV-18480 Backwards compatibility in log_view()
Galera versions below 4.x do not generate unique sequence number for view events. Take this into account when writing the SE checkpoint to avoid debug assertion in InnoDB.
Diffstat (limited to 'sql/wsrep_server_service.cc')
-rw-r--r--sql/wsrep_server_service.cc20
1 files changed, 18 insertions, 2 deletions
diff --git a/sql/wsrep_server_service.cc b/sql/wsrep_server_service.cc
index 7efff35f2b1..14b294c4214 100644
--- a/sql/wsrep_server_service.cc
+++ b/sql/wsrep_server_service.cc
@@ -176,10 +176,12 @@ void Wsrep_server_service::log_view(
{
Wsrep_id id;
Wsrep_view prev_view= wsrep_schema->restore_view(applier->m_thd, id);
+ bool checkpoint_was_reset= false;
if (prev_view.state_id().id() != view.state_id().id())
{
WSREP_DEBUG("New cluster UUID was generated, resetting position info");
wsrep_set_SE_checkpoint(wsrep::gtid::undefined());
+ checkpoint_was_reset= true;
}
if (wsrep_debug)
@@ -188,7 +190,7 @@ void Wsrep_server_service::log_view(
os << "Storing cluster view:\n" << view;
WSREP_INFO("%s", os.str().c_str());
DBUG_ASSERT(prev_view.state_id().id() != view.state_id().id() ||
- view.state_id().seqno() > prev_view.state_id().seqno());
+ view.state_id().seqno().get() >= prev_view.state_id().seqno().get());
}
if (trans_begin(applier->m_thd, MYSQL_START_TRANS_OPT_READ_WRITE))
@@ -216,7 +218,21 @@ void Wsrep_server_service::log_view(
applier->m_thd->mdl_context.release_transactional_locks();
}
- wsrep_set_SE_checkpoint(view.state_id());
+ /*
+ Backwards compatibility: When running in mixed cluster with
+ Galera 3.x, the provider does not generate unique sequence numbers
+ for views. This condition can be checked by inspecting last
+ committed as returned by the provider. If the last_committed
+ matches to view state_id seqno, the cluster runs in backwards
+ compatibility mode and we skip setting the checkpoint for
+ view.
+ */
+ wsrep::seqno last_committed=
+ Wsrep_server_state::instance().provider().last_committed_gtid().seqno();
+ if (checkpoint_was_reset || last_committed != view.state_id().seqno())
+ {
+ wsrep_set_SE_checkpoint(view.state_id());
+ }
DBUG_ASSERT(wsrep_get_SE_checkpoint().id() == view.state_id().id());
}
else