1
0
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:
Teemu Ollakka
2019-01-23 19:10:34 +02:00
parent 632f8c3b14
commit f30d9c06ce
8 changed files with 82 additions and 22 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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>(&params.fast_exit), ("fast-exit", po::value<int>(&params.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;
} }

View File

@ -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(

View File

@ -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_;
}; };
} }

View File

@ -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

View File

@ -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());
}
}

View File

@ -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_;
}; };
} }