osd->recovery_wq.dequeue(this);
}
-void PG::peer(ObjectStore::Transaction& t,
- map< int, map<pg_t,Query> >& query_map,
- map<int, MOSDPGInfo*> *activator_map)
-{
- dout(10) << "peer acting is " << acting << dendl;
-
- if (!is_active())
- state_set(PG_STATE_PEERING);
-
- if (prior_set.empty())
- build_prior();
-
- dout(10) << "peer prior_set is " << prior_set << dendl;
-
+// if false, stop.
+bool PG::recover_master_log(map< int, map<pg_t,Query> >& query_map)
+{
/** GET ALL PG::Info *********/
// -- query info from everyone in prior_set.
dout(10) << " not querying down osd" << *it << dendl;
}
}
- if (missing_info) return;
+ if (missing_info)
+ return false;
// -- ok, we have all (prior_set) info. (and maybe others.)
// try. until then, just get the full backlogs.
if (!log.backlog) {
osd->queue_generate_backlog(this);
- return;
+ return false;
}
if (peer_summary_requested.count(newest_update_osd)) {
peer_summary_requested.insert(newest_update_osd);
}
}
- return;
+ return false;
} else {
dout(10) << " newest_update " << info.last_update << " (me)" << dendl;
}
if (is_down()) {
dout(10) << " down. we wait." << dendl;
- return;
+ return false;
}
have_master_log = true;
<< log.bottom << " > oldest_update " << oldest_update
<< dendl;
osd->queue_generate_backlog(this);
- return;
+ return false;
}
+ return true;
+}
+
+
+void PG::peer(ObjectStore::Transaction& t,
+ map< int, map<pg_t,Query> >& query_map,
+ map<int, MOSDPGInfo*> *activator_map)
+{
+ dout(10) << "peer acting is " << acting << dendl;
+
+ if (!is_active())
+ state_set(PG_STATE_PEERING);
+
+ if (prior_set.empty())
+ build_prior();
+
+ dout(10) << "peer prior_set is " << prior_set << dendl;
+
+
+ if (!have_master_log)
+ if (!recover_master_log(query_map))
+ return;
+
/** COLLECT MISSING+LOG FROM PEERS **********/
/*
map<__u64,eversion_t>::iterator p = ondisklog.block_map.begin();
while (p != ondisklog.block_map.end()) {
- dout(15) << " " << p->first << " -> " << p->second << dendl;
+ //dout(15) << " " << p->first << " -> " << p->second << dendl;
p++;
if (p == ondisklog.block_map.end() ||
p->second > v) { // too far!
break;
}
}
- dout(15) << " * " << p->first << " -> " << p->second << dendl;
+ //dout(15) << " * " << p->first << " -> " << p->second << dendl;
if (p == ondisklog.block_map.begin())
return; // can't trim anything!