pending_auth.push_back(inc);
}
-void AuthMonitor::update_from_paxos()
+void AuthMonitor::update_from_paxos(bool *need_bootstrap)
{
dout(10) << __func__ << dendl;
version_t version = get_version();
void on_active();
bool should_propose(double& delay);
void create_initial();
- void update_from_paxos();
+ void update_from_paxos(bool *need_bootstrap);
void create_pending(); // prepare a new pending
bool prepare_global_id(MMonGlobalID *m);
void increase_max_global_id();
pending_log.insert(pair<utime_t,LogEntry>(e.stamp, e));
}
-void LogMonitor::update_from_paxos()
+void LogMonitor::update_from_paxos(bool *need_bootstrap)
{
dout(10) << __func__ << dendl;
version_t version = get_version();
LogSummary pending_summary, summary;
void create_initial();
- void update_from_paxos();
+ void update_from_paxos(bool *need_bootstrap);
void create_pending(); // prepare a new pending
// propose pending update to peers
void encode_pending(MonitorDBStore::Transaction *t);
}
-void MDSMonitor::update_from_paxos()
+void MDSMonitor::update_from_paxos(bool *need_bootstrap)
{
version_t version = get_version();
if (version == mdsmap.epoch)
// service methods
void create_initial();
- void update_from_paxos();
+ void update_from_paxos(bool *need_bootstrap);
void create_pending();
void encode_pending(MonitorDBStore::Transaction *t);
// we don't require full versions; don't encode any.
// update paxos
if (paxos->is_consistent())
- refresh_from_paxos();
+ refresh_from_paxos(NULL);
// init services
for (int i = 0; i < PAXOS_NUM; ++i) {
}
}
-void Monitor::refresh_from_paxos()
+void Monitor::refresh_from_paxos(bool *need_bootstrap)
{
dout(10) << __func__ << dendl;
for (int i = 0; i < PAXOS_NUM; ++i) {
- paxos_service[i]->refresh();
+ paxos_service[i]->refresh(need_bootstrap);
}
}
int preinit();
int init();
void init_paxos();
- void refresh_from_paxos();
+ void refresh_from_paxos(bool *need_bootstrap);
void shutdown();
void tick();
pending_map.epoch = 1;
}
-void MonmapMonitor::update_from_paxos()
+void MonmapMonitor::update_from_paxos(bool *need_bootstrap)
{
version_t version = get_version();
if (version <= mon->monmap->get_epoch())
mon->monmap->decode(latest_bl);
}
*/
- bool need_restart = version != mon->monmap->get_epoch();
+ if (need_bootstrap && version != mon->monmap->get_epoch()) {
+ dout(10) << " signaling that we need a bootstrap" << dendl;
+ *need_bootstrap = true;
+ }
// read and decode
monmap_bl.clear();
erase_mkfs(&t);
mon->store->apply_transaction(t);
}
-
- if (need_restart) {
- mon->bootstrap();
- }
}
void MonmapMonitor::create_pending()
void create_initial();
- void update_from_paxos();
+ void update_from_paxos(bool *need_bootstrap);
void create_pending();
newmap.encode(pending_inc.fullmap);
}
-void OSDMonitor::update_from_paxos()
+void OSDMonitor::update_from_paxos(bool *need_bootstrap)
{
version_t version = get_version();
if (version == osdmap.epoch)
public:
void create_initial();
private:
- void update_from_paxos();
+ void update_from_paxos(bool *need_bootstrap);
void create_pending(); // prepare a new pending
void encode_pending(MonitorDBStore::Transaction *t);
virtual void encode_full(MonitorDBStore::Transaction *t);
dout(10) << "create_initial -- creating initial map" << dendl;
}
-void PGMonitor::update_from_paxos()
+void PGMonitor::update_from_paxos(bool *need_bootstrap)
{
version_t version = get_version();
if (version == pg_map.version)
PGMap::Incremental pending_inc;
void create_initial();
- void update_from_paxos();
+ void update_from_paxos(bool *need_bootstrap);
void init();
void handle_osd_timeouts();
void create_pending(); // prepare a new pending
commit->put();
- mon->refresh_from_paxos();
+ mon->refresh_from_paxos(NULL);
finish_contexts(g_ceph_context, waiting_for_commit);
}
assert(mon->is_leader());
// make sure we have the latest state loaded up
- mon->refresh_from_paxos();
+ bool need_bootstrap = false;
+ mon->refresh_from_paxos(&need_bootstrap);
// finish off the last proposal
if (!proposals.empty()) {
first_committed = get_store()->get(get_name(), "first_committed");
last_committed = get_store()->get(get_name(), "last_committed");
+ if (need_bootstrap) {
+ dout(10) << " doing requested bootstrap" << dendl;
+ mon->bootstrap();
+ return;
+ }
+
if (should_trim()) {
trim();
}
return true;
}
-void PaxosService::refresh()
+void PaxosService::refresh(bool *need_bootstrap)
{
// update cached versions
cached_first_committed = mon->store->get(get_service_name(), first_committed_name);
dout(10) << __func__ << dendl;
- update_from_paxos();
+ update_from_paxos(need_bootstrap);
}
*/
bool dispatch(PaxosServiceMessage *m);
- void refresh();
+ void refresh(bool *need_bootstrap);
/**
* @defgroup PaxosService_h_override_funcs Functions that should be
*
* @returns 'true' on success; 'false' otherwise.
*/
- virtual void update_from_paxos() = 0;
+ virtual void update_from_paxos(bool *need_bootstrap) = 0;
/**
* Init on startup