diff --git a/dbsim/db_simulator.cpp b/dbsim/db_simulator.cpp index 2fe7562..4b67095 100644 --- a/dbsim/db_simulator.cpp +++ b/dbsim/db_simulator.cpp @@ -36,9 +36,7 @@ void db::simulator::sst(db::server& server, { wsrep::log_info() << "SST " << server.server_state().id() << " -> " << id; } - i->second->server_state().sst_transferred(gtid); - // i->second->server_state().initialized(); - // i->second->server_state().sst_received(gtid, 0); + i->second->server_state().sst_received(gtid, 0); server.server_state().sst_sent(gtid, 0); } diff --git a/include/wsrep/server_service.hpp b/include/wsrep/server_service.hpp index c5deb3b..ec589f5 100644 --- a/include/wsrep/server_service.hpp +++ b/include/wsrep/server_service.hpp @@ -65,8 +65,6 @@ namespace wsrep * new cluster is bootstrapped and the server has reached * initialized state. From this call the DBMS should initialize * environment for the new cluster. - * - * @param gtid Gtid of the bootstrap position. */ virtual void bootstrap() = 0; diff --git a/include/wsrep/server_state.hpp b/include/wsrep/server_state.hpp index 7a7036b..d839d95 100644 --- a/include/wsrep/server_state.hpp +++ b/include/wsrep/server_state.hpp @@ -396,18 +396,11 @@ namespace wsrep */ void sst_sent(const wsrep::gtid& gtid, int error); - /** - * This method should be called on joiner after the - * SST has been transferred but before DBMS has been - * initialized. - */ - void sst_transferred(const wsrep::gtid& gtid); - /** * This method must be called by the joiner after the SST - * transfer has been received and DBMS state has been completely - * initialized. This will signal the provider that it can - * start applying write sets. + * transfer has been received. If the DBMS state has not been + * initialized, the call will shift the state to initializing + * and will wait until the initialization is complete. * * @param gtid GTID provided by the SST transfer */ diff --git a/src/server_state.cpp b/src/server_state.cpp index ed43e6c..b54a871 100644 --- a/src/server_state.cpp +++ b/src/server_state.cpp @@ -349,19 +349,22 @@ void wsrep::server_state::sst_sent(const wsrep::gtid& gtid, int error) } } -void wsrep::server_state::sst_transferred(const wsrep::gtid& gtid) +void wsrep::server_state::sst_received(const wsrep::gtid& gtid, int error) { - wsrep::log_info() << "SST transferred: " << gtid; + wsrep::log_info() << "SST received: " << gtid; wsrep::unique_lock lock(mutex_); - sst_gtid_ = gtid; + assert(state_ == s_joiner || state_ == s_initialized); if (server_service_.sst_before_init()) { - state(lock, s_initializing); - wait_until_state(lock, s_initialized); - assert(init_initialized_); + if (init_initialized_ == false) + { + state(lock, s_initializing); + wait_until_state(lock, s_initialized); + assert(init_initialized_); + } state(lock, s_joined); lock.unlock(); - if (provider().sst_received(sst_gtid_, 0)) + if (provider().sst_received(gtid, error)) { throw wsrep::runtime_error("SST received failed"); } @@ -369,19 +372,10 @@ void wsrep::server_state::sst_transferred(const wsrep::gtid& gtid) else { state(lock, s_joined); - } -} - -void wsrep::server_state::sst_received(const wsrep::gtid& gtid, int error) -{ - assert(0); - wsrep::log_info() << "SST received: " << gtid << ": " << error; - wsrep::unique_lock lock(mutex_); - state(lock, s_joined); - lock.unlock(); - if (provider_->sst_received(gtid, error)) - { - throw wsrep::runtime_error("SST received failed"); + if (provider().sst_received(gtid, error)) + { + throw wsrep::runtime_error("SST received failed"); + } } }