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:
@ -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_()
|
||||||
|
@ -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_;
|
||||||
|
@ -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_; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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()));
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
Reference in New Issue
Block a user