mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-07-05 03:41:13 +03:00
Enhanced dbsim to store view and position in storage engine
Mimic real DBMS implementation by storing view and position into storage engine.
This commit is contained in:
@ -135,7 +135,7 @@ void db::client::run_one_transaction()
|
|||||||
err = err || client_state_.after_prepare();
|
err = err || client_state_.after_prepare();
|
||||||
}
|
}
|
||||||
err = err || client_state_.before_commit();
|
err = err || client_state_.before_commit();
|
||||||
if (err == 0) se_trx_.commit();
|
if (err == 0) se_trx_.commit(transaction.ws_meta().gtid());
|
||||||
err = err || client_state_.ordered_commit();
|
err = err || client_state_.ordered_commit();
|
||||||
err = err || client_state_.after_commit();
|
err = err || client_state_.after_commit();
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -66,7 +66,7 @@ int db::high_priority_service::commit(const wsrep::ws_handle& ws_handle,
|
|||||||
{
|
{
|
||||||
client_.client_state_.prepare_for_ordering(ws_handle, ws_meta, true);
|
client_.client_state_.prepare_for_ordering(ws_handle, ws_meta, true);
|
||||||
int ret(client_.client_state_.before_commit());
|
int ret(client_.client_state_.before_commit());
|
||||||
if (ret == 0) client_.se_trx_.commit();
|
if (ret == 0) client_.se_trx_.commit(ws_meta.gtid());
|
||||||
ret = ret || client_.client_state_.ordered_commit();
|
ret = ret || client_.client_state_.ordered_commit();
|
||||||
ret = ret || client_.client_state_.after_commit();
|
ret = ret || client_.client_state_.after_commit();
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -73,15 +73,23 @@ db::params db::parse_args(int argc, char** argv)
|
|||||||
"debug logging level: 0 - none, 1 - verbose")
|
"debug logging level: 0 - none, 1 - verbose")
|
||||||
("fast-exit", po::value<int>(¶ms.fast_exit),
|
("fast-exit", po::value<int>(¶ms.fast_exit),
|
||||||
"exit from simulation without graceful shutdown");
|
"exit from simulation without graceful shutdown");
|
||||||
po::variables_map vm;
|
try
|
||||||
po::store(po::parse_command_line(argc, argv, desc), vm);
|
{
|
||||||
po::notify(vm);
|
po::variables_map vm;
|
||||||
if (vm.count("help"))
|
po::store(po::parse_command_line(argc, argv, desc), vm);
|
||||||
|
po::notify(vm);
|
||||||
|
if (vm.count("help"))
|
||||||
|
{
|
||||||
|
std::cerr << desc << "\n";
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_params(params);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
{
|
{
|
||||||
std::cerr << desc << "\n";
|
std::cerr << desc << "\n";
|
||||||
exit(0);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
validate_params(params);
|
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
db::server_service::server_service(db::server& server)
|
db::server_service::server_service(db::server& server)
|
||||||
: server_(server)
|
: server_(server)
|
||||||
, logged_view_()
|
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
wsrep::storage_service* db::server_service::storage_service(
|
wsrep::storage_service* db::server_service::storage_service(
|
||||||
@ -110,7 +109,7 @@ void db::server_service::log_view(wsrep::high_priority_service*,
|
|||||||
const wsrep::view& v)
|
const wsrep::view& v)
|
||||||
{
|
{
|
||||||
wsrep::log_info() << "View:\n" << v;
|
wsrep::log_info() << "View:\n" << v;
|
||||||
logged_view_ = v;
|
server_.storage_engine().store_view(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
void db::server_service::recover_streaming_appliers(
|
void db::server_service::recover_streaming_appliers(
|
||||||
@ -126,22 +125,23 @@ void db::server_service::recover_streaming_appliers(
|
|||||||
wsrep::view db::server_service::get_view(wsrep::client_service&,
|
wsrep::view db::server_service::get_view(wsrep::client_service&,
|
||||||
const wsrep::id& own_id)
|
const wsrep::id& own_id)
|
||||||
{
|
{
|
||||||
int const my_idx(logged_view_.member_index(own_id));
|
wsrep::view stored_view(server_.storage_engine().get_view());
|
||||||
|
int const my_idx(stored_view.member_index(own_id));
|
||||||
wsrep::view my_view(
|
wsrep::view my_view(
|
||||||
logged_view_.state_id(),
|
stored_view.state_id(),
|
||||||
logged_view_.view_seqno(),
|
stored_view.view_seqno(),
|
||||||
logged_view_.status(),
|
stored_view.status(),
|
||||||
logged_view_.capabilities(),
|
stored_view.capabilities(),
|
||||||
my_idx,
|
my_idx,
|
||||||
logged_view_.protocol_version(),
|
stored_view.protocol_version(),
|
||||||
logged_view_.members()
|
stored_view.members()
|
||||||
);
|
);
|
||||||
return my_view;
|
return my_view;
|
||||||
}
|
}
|
||||||
|
|
||||||
wsrep::gtid db::server_service::get_position(wsrep::client_service&)
|
wsrep::gtid db::server_service::get_position(wsrep::client_service&)
|
||||||
{
|
{
|
||||||
throw wsrep::not_implemented_error();
|
return server_.storage_engine().get_position();
|
||||||
}
|
}
|
||||||
|
|
||||||
void db::server_service::log_state_change(
|
void db::server_service::log_state_change(
|
||||||
|
@ -59,7 +59,6 @@ namespace db
|
|||||||
void debug_sync(const char*) override;
|
void debug_sync(const char*) override;
|
||||||
private:
|
private:
|
||||||
db::server& server_;
|
db::server& server_;
|
||||||
wsrep::view logged_view_;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,6 +62,9 @@ void db::simulator::sst(db::server& server,
|
|||||||
wsrep::log_info() << "SST "
|
wsrep::log_info() << "SST "
|
||||||
<< server.server_state().name()
|
<< server.server_state().name()
|
||||||
<< " -> " << request;
|
<< " -> " << request;
|
||||||
|
i->second->storage_engine().store_position(gtid);
|
||||||
|
i->second->storage_engine().store_view(
|
||||||
|
server.storage_engine().get_view());
|
||||||
}
|
}
|
||||||
|
|
||||||
db::client dummy(*(i->second), wsrep::client_id(-1),
|
db::client dummy(*(i->second), wsrep::client_id(-1),
|
||||||
@ -146,11 +149,16 @@ void db::simulator::start()
|
|||||||
{
|
{
|
||||||
throw wsrep::runtime_error("Failed to connect");
|
throw wsrep::runtime_error("Failed to connect");
|
||||||
}
|
}
|
||||||
|
wsrep::log_debug() << "main: Starting applier";
|
||||||
server.start_applier();
|
server.start_applier();
|
||||||
|
wsrep::log_debug() << "main: Waiting initializing state";
|
||||||
server.server_state().wait_until_state(wsrep::server_state::s_initializing);
|
server.server_state().wait_until_state(wsrep::server_state::s_initializing);
|
||||||
|
wsrep::log_debug() << "main: Calling initialized";
|
||||||
server.server_state().initialized();
|
server.server_state().initialized();
|
||||||
|
wsrep::log_debug() << "main: Waiting for synced state";
|
||||||
server.server_state().wait_until_state(
|
server.server_state().wait_until_state(
|
||||||
wsrep::server_state::s_synced);
|
wsrep::server_state::s_synced);
|
||||||
|
wsrep::log_debug() << "main: Server synced";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start client threads
|
// Start client threads
|
||||||
|
@ -37,12 +37,13 @@ void db::storage_engine::transaction::apply(
|
|||||||
se_.bf_abort_some(transaction);
|
se_.bf_abort_some(transaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
void db::storage_engine::transaction::commit()
|
void db::storage_engine::transaction::commit(const wsrep::gtid& gtid)
|
||||||
{
|
{
|
||||||
if (cc_)
|
if (cc_)
|
||||||
{
|
{
|
||||||
wsrep::unique_lock<wsrep::mutex> lock(se_.mutex_);
|
wsrep::unique_lock<wsrep::mutex> lock(se_.mutex_);
|
||||||
se_.transactions_.erase(cc_);
|
se_.transactions_.erase(cc_);
|
||||||
|
se_.store_position(gtid);
|
||||||
}
|
}
|
||||||
cc_ = nullptr;
|
cc_ = nullptr;
|
||||||
}
|
}
|
||||||
@ -80,3 +81,38 @@ void db::storage_engine::bf_abort_some(const wsrep::transaction& txc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void db::storage_engine::store_position(const wsrep::gtid& gtid)
|
||||||
|
{
|
||||||
|
validate_position(gtid);
|
||||||
|
position_ = gtid;
|
||||||
|
}
|
||||||
|
|
||||||
|
wsrep::gtid db::storage_engine::get_position() const
|
||||||
|
{
|
||||||
|
return position_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void db::storage_engine::store_view(const wsrep::view& view)
|
||||||
|
{
|
||||||
|
view_ = view;
|
||||||
|
}
|
||||||
|
|
||||||
|
wsrep::view db::storage_engine::get_view() const
|
||||||
|
{
|
||||||
|
return view_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void db::storage_engine::validate_position(const wsrep::gtid& gtid) const
|
||||||
|
{
|
||||||
|
using std::rel_ops::operator<=;
|
||||||
|
if (position_.id() == gtid.id() && gtid.seqno() <= position_.seqno())
|
||||||
|
{
|
||||||
|
std::ostringstream os;
|
||||||
|
os << "Invalid position submitted, position seqno "
|
||||||
|
<< position_.seqno()
|
||||||
|
<< " is greater than submitted seqno "
|
||||||
|
<< gtid.seqno();
|
||||||
|
throw wsrep::runtime_error(os.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -39,6 +39,8 @@ namespace db
|
|||||||
, transactions_()
|
, transactions_()
|
||||||
, alg_freq_(params.alg_freq)
|
, alg_freq_(params.alg_freq)
|
||||||
, bf_aborts_()
|
, bf_aborts_()
|
||||||
|
, position_()
|
||||||
|
, view_()
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
class transaction
|
class transaction
|
||||||
@ -55,7 +57,7 @@ namespace db
|
|||||||
bool active() const { return cc_ != nullptr; }
|
bool active() const { return cc_ != nullptr; }
|
||||||
void start(client* cc);
|
void start(client* cc);
|
||||||
void apply(const wsrep::transaction&);
|
void apply(const wsrep::transaction&);
|
||||||
void commit();
|
void commit(const wsrep::gtid&);
|
||||||
void rollback();
|
void rollback();
|
||||||
db::client* client() { return cc_; }
|
db::client* client() { return cc_; }
|
||||||
transaction(const transaction&) = delete;
|
transaction(const transaction&) = delete;
|
||||||
@ -66,11 +68,18 @@ namespace db
|
|||||||
};
|
};
|
||||||
void bf_abort_some(const wsrep::transaction& tc);
|
void bf_abort_some(const wsrep::transaction& tc);
|
||||||
long long bf_aborts() const { return bf_aborts_; }
|
long long bf_aborts() const { return bf_aborts_; }
|
||||||
|
void store_position(const wsrep::gtid& gtid);
|
||||||
|
wsrep::gtid get_position() const;
|
||||||
|
void store_view(const wsrep::view& view);
|
||||||
|
wsrep::view get_view() const;
|
||||||
private:
|
private:
|
||||||
|
void validate_position(const wsrep::gtid& gtid) const;
|
||||||
wsrep::default_mutex mutex_;
|
wsrep::default_mutex mutex_;
|
||||||
std::unordered_set<db::client*> transactions_;
|
std::unordered_set<db::client*> transactions_;
|
||||||
size_t alg_freq_;
|
size_t alg_freq_;
|
||||||
std::atomic<long long> bf_aborts_;
|
std::atomic<long long> bf_aborts_;
|
||||||
|
wsrep::gtid position_;
|
||||||
|
wsrep::view view_;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user