1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-07-24 10:42:31 +03:00

Protocol version and connected gtid

* Propagate server max protocol version to provider init options
* Store gtid from connected call to make cluster id and the connect
  position available
This commit is contained in:
Teemu Ollakka
2018-06-26 11:34:05 +03:00
parent bd0ba5b01d
commit 2a53198f5c
7 changed files with 40 additions and 14 deletions

View File

@ -31,6 +31,7 @@ namespace db
server_id, server_id,
address, address,
working_dir, working_dir,
1,
wsrep::server_state::rm_async) wsrep::server_state::rm_async)
, mutex_() , mutex_()
, cond_() , cond_()

View File

@ -192,6 +192,12 @@ namespace wsrep
* @return String containing path to working directory. * @return String containing path to working directory.
*/ */
const std::string& working_dir() const { return working_dir_; } 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. * Get the rollback mode which server is operating in.
* *
@ -254,7 +260,7 @@ namespace wsrep
* A method which will be called when the server * A method which will be called when the server
* has been joined to the cluster * 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 * A method which will be called when a view
@ -284,6 +290,12 @@ namespace wsrep
wait_until_state(lock, state); 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 * Return current view
*/ */
@ -467,6 +479,7 @@ namespace wsrep
const std::string& id, const std::string& id,
const std::string& address, const std::string& address,
const std::string& working_dir, const std::string& working_dir,
int max_protocol_version,
enum rollback_mode rollback_mode) enum rollback_mode rollback_mode)
: mutex_(mutex) : mutex_(mutex)
, cond_(cond) , cond_(cond)
@ -486,7 +499,9 @@ namespace wsrep
, id_(id) , id_(id)
, address_(address) , address_(address)
, working_dir_(working_dir) , working_dir_(working_dir)
, max_protocol_version_(max_protocol_version)
, rollback_mode_(rollback_mode) , rollback_mode_(rollback_mode)
, connected_gtid_()
, current_view_() , current_view_()
, last_committed_gtid_() , last_committed_gtid_()
, debug_log_level_(0) , debug_log_level_(0)
@ -521,7 +536,9 @@ namespace wsrep
std::string id_; std::string id_;
std::string address_; std::string address_;
std::string working_dir_; std::string working_dir_;
int max_protocol_version_;
enum rollback_mode rollback_mode_; enum rollback_mode rollback_mode_;
wsrep::gtid connected_gtid_;
wsrep::view current_view_; wsrep::view current_view_;
wsrep::gtid last_committed_gtid_; wsrep::gtid last_committed_gtid_;
int debug_log_level_; int debug_log_level_;

View File

@ -84,6 +84,9 @@ namespace wsrep
ssize_t own_index() const ssize_t own_index() const
{ return own_index_; } { return own_index_; }
int protocol_version() const
{ return protocol_version_; }
const std::vector<member>& members() const { return members_; } const std::vector<member>& members() const { return members_; }
/** /**

View File

@ -212,10 +212,11 @@ namespace
} }
int wsrep::server_state::load_provider(const std::string& provider_spec, 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; 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); return (provider_ ? 0 : 1);
} }
@ -418,10 +419,14 @@ wsrep::server_state::causal_read(int timeout) const
return provider_->causal_read(timeout); 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<wsrep::mutex> lock(mutex_); wsrep::unique_lock<wsrep::mutex> lock(mutex_);
connected_gtid_ = gtid;
state(lock, s_connected); state(lock, s_connected);
} }
@ -431,6 +436,7 @@ void wsrep::server_state::on_view(const wsrep::view& view)
<< "================================================\nView:\n" << "================================================\nView:\n"
<< " id: " << view.state_id() << "\n" << " id: " << view.state_id() << "\n"
<< " status: " << view.status() << "\n" << " status: " << view.status() << "\n"
<< " prococol_version: " << view.protocol_version() << "\n"
<< " own_index: " << view.own_index() << "\n" << " own_index: " << view.own_index() << "\n"
<< " final: " << view.final() << "\n" << " final: " << view.final() << "\n"
<< " members"; << " members";
@ -445,6 +451,7 @@ void wsrep::server_state::on_view(const wsrep::view& view)
if (view.status() == wsrep::view::primary) if (view.status() == wsrep::view::primary)
{ {
wsrep::unique_lock<wsrep::mutex> lock(mutex_); wsrep::unique_lock<wsrep::mutex> lock(mutex_);
current_view_ = view;
if (state_ == s_connected && view.members().size() == 1) if (state_ == s_connected && view.members().size() == 1)
{ {
state(lock, s_joiner); state(lock, s_joiner);
@ -472,7 +479,6 @@ void wsrep::server_state::on_view(const wsrep::view& view)
{ {
state(lock, s_disconnected); state(lock, s_disconnected);
} }
current_view_ = view;
} }
server_service_.log_view(view); server_service_.log_view(view);
} }

View File

@ -967,10 +967,11 @@ void wsrep::transaction::debug_log_state(
const char* context) const const char* context) const
{ {
WSREP_TC_LOG_DEBUG( WSREP_TC_LOG_DEBUG(
1, context 0, context
<< ": server: " << client_state_.server_state().name() << ": server: " << client_state_.server_state().name()
<< " client: " << client_state_.id().get() << " client: " << client_state_.id().get()
<< " trx: " << int64_t(id_.get()) << " trx: " << int64_t(id_.get())
<< " seqno: " << ws_meta_.seqno().get()
<< " state: " << wsrep::to_string(state_) << " state: " << wsrep::to_string(state_)
<< " error: " << " error: "
<< wsrep::to_string(client_state_.current_error())); << wsrep::to_string(client_state_.current_error()));

View File

@ -286,17 +286,15 @@ namespace
wsrep_cb_status_t connected_cb( wsrep_cb_status_t connected_cb(
void* app_ctx, void* app_ctx,
const wsrep_view_info_t* view __attribute((unused))) const wsrep_view_info_t* view_info)
{ {
assert(app_ctx); assert(app_ctx);
wsrep::view view(view_from_native(*view_info));
wsrep::server_state& server_state( wsrep::server_state& server_state(
*reinterpret_cast<wsrep::server_state*>(app_ctx)); *reinterpret_cast<wsrep::server_state*>(app_ctx));
//
// TODO: Fetch server id and group id from view infor
//
try try
{ {
server_state.on_connect(); server_state.on_connect(view.state_id());
return WSREP_CB_SUCCESS; return WSREP_CB_SUCCESS;
} }
catch (const wsrep::runtime_error& e) catch (const wsrep::runtime_error& e)
@ -475,7 +473,7 @@ wsrep::wsrep_provider_v26::wsrep_provider_v26(
init_args.node_incoming = ""; init_args.node_incoming = "";
init_args.data_dir = server_state_.working_dir().c_str(); init_args.data_dir = server_state_.working_dir().c_str();
init_args.options = provider_options.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_id = 0;
init_args.state = 0; init_args.state = 0;
init_args.logger_cb = &logger_cb; init_args.logger_cb = &logger_cb;

View File

@ -22,7 +22,7 @@ namespace wsrep
const std::string& id, const std::string& id,
enum wsrep::server_state::rollback_mode rollback_mode) enum wsrep::server_state::rollback_mode rollback_mode)
: wsrep::server_state(mutex_, cond_, *this, : wsrep::server_state(mutex_, cond_, *this,
name, id, "", "./", rollback_mode) name, id, "", "./", 1, rollback_mode)
, mutex_() , mutex_()
, cond_() , cond_()
, provider_(*this) , provider_(*this)