diff --git a/dbsim/db_server_state.hpp b/dbsim/db_server_state.hpp index e045751..e4f56e7 100644 --- a/dbsim/db_server_state.hpp +++ b/dbsim/db_server_state.hpp @@ -31,6 +31,7 @@ namespace db server_id, address, working_dir, + 1, wsrep::server_state::rm_async) , mutex_() , cond_() diff --git a/include/wsrep/server_state.hpp b/include/wsrep/server_state.hpp index ba16cc6..a40a096 100644 --- a/include/wsrep/server_state.hpp +++ b/include/wsrep/server_state.hpp @@ -192,6 +192,12 @@ namespace wsrep * @return String containing path to working directory. */ const std::string& working_dir() const { return working_dir_; } + + /** + * Return maximum protocol version. + */ + int max_protocol_version() const { return max_protocol_version_;} + /** * Get the rollback mode which server is operating in. * @@ -254,7 +260,7 @@ namespace wsrep * A method which will be called when the server * has been joined to the cluster */ - void on_connect(); + void on_connect(const wsrep::gtid& gtid); /** * A method which will be called when a view @@ -284,6 +290,12 @@ namespace wsrep wait_until_state(lock, state); } + /** + * Return GTID at the position when server connected to + * the cluster. + */ + wsrep::gtid connected_gtid() const { return connected_gtid_; } + /** * Return current view */ @@ -467,6 +479,7 @@ namespace wsrep const std::string& id, const std::string& address, const std::string& working_dir, + int max_protocol_version, enum rollback_mode rollback_mode) : mutex_(mutex) , cond_(cond) @@ -486,7 +499,9 @@ namespace wsrep , id_(id) , address_(address) , working_dir_(working_dir) + , max_protocol_version_(max_protocol_version) , rollback_mode_(rollback_mode) + , connected_gtid_() , current_view_() , last_committed_gtid_() , debug_log_level_(0) @@ -521,7 +536,9 @@ namespace wsrep std::string id_; std::string address_; std::string working_dir_; + int max_protocol_version_; enum rollback_mode rollback_mode_; + wsrep::gtid connected_gtid_; wsrep::view current_view_; wsrep::gtid last_committed_gtid_; int debug_log_level_; diff --git a/include/wsrep/view.hpp b/include/wsrep/view.hpp index 3e46c94..9e8414b 100644 --- a/include/wsrep/view.hpp +++ b/include/wsrep/view.hpp @@ -84,6 +84,9 @@ namespace wsrep ssize_t own_index() const { return own_index_; } + int protocol_version() const + { return protocol_version_; } + const std::vector& members() const { return members_; } /** diff --git a/src/server_state.cpp b/src/server_state.cpp index 6b7f663..bcaa0b6 100644 --- a/src/server_state.cpp +++ b/src/server_state.cpp @@ -212,10 +212,11 @@ namespace } int wsrep::server_state::load_provider(const std::string& provider_spec, - const std::string& provider_options) + const std::string& provider_options) { wsrep::log_info() << "Loading provider " << provider_spec; - provider_ = wsrep::provider::make_provider(*this, provider_spec, provider_options); + provider_ = wsrep::provider::make_provider( + *this, provider_spec, provider_options); return (provider_ ? 0 : 1); } @@ -418,10 +419,14 @@ wsrep::server_state::causal_read(int timeout) const return provider_->causal_read(timeout); } -void wsrep::server_state::on_connect() +void wsrep::server_state::on_connect(const wsrep::gtid& gtid) { - wsrep::log_info() << "Server " << name_ << " connected to cluster"; + wsrep::log_info() << "Server " + << name_ + << " connected to cluster at position " + << gtid; wsrep::unique_lock lock(mutex_); + connected_gtid_ = gtid; state(lock, s_connected); } @@ -431,6 +436,7 @@ void wsrep::server_state::on_view(const wsrep::view& view) << "================================================\nView:\n" << " id: " << view.state_id() << "\n" << " status: " << view.status() << "\n" + << " prococol_version: " << view.protocol_version() << "\n" << " own_index: " << view.own_index() << "\n" << " final: " << view.final() << "\n" << " members"; @@ -445,6 +451,7 @@ void wsrep::server_state::on_view(const wsrep::view& view) if (view.status() == wsrep::view::primary) { wsrep::unique_lock lock(mutex_); + current_view_ = view; if (state_ == s_connected && view.members().size() == 1) { state(lock, s_joiner); @@ -472,7 +479,6 @@ void wsrep::server_state::on_view(const wsrep::view& view) { state(lock, s_disconnected); } - current_view_ = view; } server_service_.log_view(view); } diff --git a/src/transaction.cpp b/src/transaction.cpp index da69ee8..d6bce79 100644 --- a/src/transaction.cpp +++ b/src/transaction.cpp @@ -967,10 +967,11 @@ void wsrep::transaction::debug_log_state( const char* context) const { WSREP_TC_LOG_DEBUG( - 1, context + 0, context << ": server: " << client_state_.server_state().name() << " client: " << client_state_.id().get() << " trx: " << int64_t(id_.get()) + << " seqno: " << ws_meta_.seqno().get() << " state: " << wsrep::to_string(state_) << " error: " << wsrep::to_string(client_state_.current_error())); diff --git a/src/wsrep_provider_v26.cpp b/src/wsrep_provider_v26.cpp index fdf84a6..59eaf23 100644 --- a/src/wsrep_provider_v26.cpp +++ b/src/wsrep_provider_v26.cpp @@ -286,17 +286,15 @@ namespace wsrep_cb_status_t connected_cb( void* app_ctx, - const wsrep_view_info_t* view __attribute((unused))) + const wsrep_view_info_t* view_info) { assert(app_ctx); + wsrep::view view(view_from_native(*view_info)); wsrep::server_state& server_state( *reinterpret_cast(app_ctx)); - // - // TODO: Fetch server id and group id from view infor - // try { - server_state.on_connect(); + server_state.on_connect(view.state_id()); return WSREP_CB_SUCCESS; } catch (const wsrep::runtime_error& e) @@ -475,7 +473,7 @@ wsrep::wsrep_provider_v26::wsrep_provider_v26( init_args.node_incoming = ""; init_args.data_dir = server_state_.working_dir().c_str(); init_args.options = provider_options.c_str(); - init_args.proto_ver = 1; + init_args.proto_ver = server_state.max_protocol_version(); init_args.state_id = 0; init_args.state = 0; init_args.logger_cb = &logger_cb; diff --git a/test/mock_server_state.hpp b/test/mock_server_state.hpp index 5bf7fdc..8664be0 100644 --- a/test/mock_server_state.hpp +++ b/test/mock_server_state.hpp @@ -22,7 +22,7 @@ namespace wsrep const std::string& id, enum wsrep::server_state::rollback_mode rollback_mode) : wsrep::server_state(mutex_, cond_, *this, - name, id, "", "./", rollback_mode) + name, id, "", "./", 1, rollback_mode) , mutex_() , cond_() , provider_(*this)