update_logger();
}
+void MDSMonitor::init()
+{
+ (void)load_metadata(pending_metadata);
+}
+
void MDSMonitor::create_pending()
{
pending_mdsmap = mdsmap;
if (metadata.empty()) {
return;
}
- bufferlist bl;
- int err = mon->store->get(MDS_METADATA_PREFIX, "last_metadata", bl);
- map<mds_gid_t, Metadata> last_metadata;
- if (!err) {
- bufferlist::iterator iter = bl.begin();
- ::decode(last_metadata, iter);
- bl.clear();
- }
- last_metadata[gid] = metadata;
+ pending_metadata[gid] = metadata;
MonitorDBStore::TransactionRef t = paxos->get_pending_transaction();
- ::encode(last_metadata, bl);
+ bufferlist bl;
+ ::encode(pending_metadata, bl);
t->put(MDS_METADATA_PREFIX, "last_metadata", bl);
paxos->trigger_propose();
}
void MDSMonitor::remove_from_metadata(MonitorDBStore::TransactionRef t)
{
- bufferlist bl;
- int err = mon->store->get(MDS_METADATA_PREFIX, "last_metadata", bl);
- map<mds_gid_t, Metadata> last_metadata;
- if (err) {
- return;
- }
- bufferlist::iterator iter = bl.begin();
- ::decode(last_metadata, iter);
- bl.clear();
-
bool update = false;
- for (map<mds_gid_t, Metadata>::iterator i = last_metadata.begin();
- i != last_metadata.end(); ) {
+ for (map<mds_gid_t, Metadata>::iterator i = pending_metadata.begin();
+ i != pending_metadata.end(); ) {
if (pending_mdsmap.get_state_gid(i->first) == MDSMap::STATE_NULL) {
- last_metadata.erase(i++);
+ pending_metadata.erase(i++);
update = true;
} else {
++i;
}
if (!update)
return;
- ::encode(last_metadata, bl);
+ bufferlist bl;
+ ::encode(pending_metadata, bl);
t->put(MDS_METADATA_PREFIX, "last_metadata", bl);
}
continue;
}
const mds_gid_t gid = it->first;
- assert(mdsmap.get_state_gid(gid) != MDSMap::STATE_NULL);
+ if (mdsmap.get_state_gid(gid) == MDSMap::STATE_NULL) {
+ dout(5) << __func__ << ": GID " << gid << " not existent" << dendl;
+ continue;
+ }
const MDSMap::mds_info_t& mds_info = mdsmap.get_info_gid(gid);
mdses[hostname->second].push_back(mds_info.rank);
}
// service methods
void create_initial();
void update_from_paxos(bool *need_bootstrap);
+ void init();
void create_pending();
void encode_pending(MonitorDBStore::TransactionRef t);
// we don't require full versions; don't encode any.
std::map<uint64_t, MDSHealth> pending_daemon_health;
std::set<uint64_t> pending_daemon_health_rm;
+ map<mds_gid_t, Metadata> pending_metadata;
+
int _check_pool(const int64_t pool_id, std::stringstream *ss) const;
mds_gid_t gid_from_arg(const std::string& arg, std::ostream& err);
};