mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-07-28 20:02:00 +03:00
Recover current view from state after SST.
When member joins the group and needs to receive an SST it won't receive the corresponding menbership view event because the SST happens after the event and will already include the effects of all events ordered before it. The view then must be recovered from the received state. Minor renames and cleanups. References codership/wsrep-lib#18
This commit is contained in:
@ -59,6 +59,7 @@ namespace db
|
||||
{ }
|
||||
void start();
|
||||
wsrep::client_state& client_state() { return client_state_; }
|
||||
wsrep::client_service& client_service() { return client_service_; }
|
||||
bool do_2pc() const { return false; }
|
||||
private:
|
||||
friend class db::server_state;
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
db::server_service::server_service(db::server& server)
|
||||
: server_(server)
|
||||
, logged_view_()
|
||||
{ }
|
||||
|
||||
wsrep::storage_service* db::server_service::storage_service(
|
||||
@ -106,9 +107,25 @@ void db::server_service::log_dummy_write_set(
|
||||
}
|
||||
|
||||
void db::server_service::log_view(wsrep::high_priority_service*,
|
||||
const wsrep::view&)
|
||||
const wsrep::view& v)
|
||||
{
|
||||
wsrep::log_info() << "View";
|
||||
wsrep::log_info() << "View:\n" << v;
|
||||
logged_view_ = v;
|
||||
}
|
||||
wsrep::view db::server_service::get_view(wsrep::client_service&,
|
||||
const wsrep::id& own_id)
|
||||
{
|
||||
int const my_idx(logged_view_.member_index(own_id));
|
||||
wsrep::view my_view(
|
||||
logged_view_.state_id(),
|
||||
logged_view_.view_seqno(),
|
||||
logged_view_.status(),
|
||||
logged_view_.capabilities(),
|
||||
my_idx,
|
||||
logged_view_.protocol_version(),
|
||||
logged_view_.members()
|
||||
);
|
||||
return my_view;
|
||||
}
|
||||
|
||||
void db::server_service::log_state_change(
|
||||
|
@ -48,12 +48,15 @@ namespace db
|
||||
override;
|
||||
void log_view(wsrep::high_priority_service*,
|
||||
const wsrep::view&) override;
|
||||
wsrep::view get_view(wsrep::client_service&, const wsrep::id&)
|
||||
override;
|
||||
void log_state_change(enum wsrep::server_state::state,
|
||||
enum wsrep::server_state::state) override;
|
||||
int wait_committing_transactions(int) override;
|
||||
void debug_sync(const char*) override;
|
||||
private:
|
||||
db::server& server_;
|
||||
wsrep::view logged_view_;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include "db_simulator.hpp"
|
||||
#include "db_client.hpp"
|
||||
|
||||
#include "wsrep/logger.hpp"
|
||||
|
||||
@ -62,7 +63,11 @@ void db::simulator::sst(db::server& server,
|
||||
<< server.server_state().name()
|
||||
<< " -> " << request;
|
||||
}
|
||||
i->second->server_state().sst_received(gtid, 0);
|
||||
|
||||
db::client dummy(*(i->second), wsrep::client_id(-1),
|
||||
wsrep::client_state::m_local, params());
|
||||
|
||||
i->second->server_state().sst_received(dummy.client_service(), gtid, 0);
|
||||
server.server_state().sst_sent(gtid, 0);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user