if (changed) {
write_info(t);
write_log(t);
-
- // init complete pointer
- if (missing.num_missing() == 0 &&
- info.last_complete != info.last_update) {
- dout(10) << "merge_log - no missing, moving last_complete " << info.last_complete
- << " -> " << info.last_update << dendl;
- info.last_complete = info.last_update;
- }
-
- if (info.last_complete == info.last_update) {
- dout(10) << "merge_log - complete" << dendl;
- log.complete_to = log.log.end();
- log.requested_to = log.log.end();
- } else {
- dout(10) << "merge_log - not complete, " << missing << dendl;
-
- log.complete_to = log.log.begin();
- while (log.complete_to->version < info.last_complete) {
- log.complete_to++;
- assert(log.complete_to != log.log.end());
- }
- log.requested_to = log.complete_to;
- }
}
}
finish_sync_event = 0; // so that _finish_recvoery doesn't go off in another thread
missing_loc.clear();
- log.reset_recovery();
+ log.reset_recovery_pointers();
stat_object_temp_rd.clear();
}
if (!info.dead_snaps.empty())
queue_snap_trim();
+ // init complete pointer
+ if (missing.num_missing() == 0 &&
+ info.last_complete != info.last_update) {
+ dout(10) << "activate - no missing, moving last_complete " << info.last_complete
+ << " -> " << info.last_update << dendl;
+ info.last_complete = info.last_update;
+ }
+
if (info.last_complete == info.last_update) {
dout(10) << "activate - complete" << dendl;
- log.complete_to = log.log.end();
- log.requested_to = log.log.end();
+ log.reset_recovery_pointers();
} else {
dout(10) << "activate - not complete, " << missing << dendl;
- assert(log.complete_to->version >= info.last_complete);
-
+
+ log.complete_to = log.log.begin();
+ while (log.complete_to->version < info.last_complete)
+ log.complete_to++;
+ assert(log.complete_to != log.log.end());
+ dout(10) << "activate - complete_to = " << log.complete_to->version << dendl;
+
if (is_primary()) {
// start recovery
- dout(10) << "activate - starting recovery" << dendl;
- assert(log.requested_to == log.complete_to);
+ dout(10) << "activate - starting recovery" << dendl;
+ log.requested_to = log.complete_to;
osd->queue_for_recovery(this);
}
}
state_set(PG_STATE_CLEAN);
assert(info.last_complete == info.last_update);
- log.reset_recovery();
+ log.reset_recovery_pointers();
/*
* sync all this before purging strays. but don't block!
if (r >= 0) {
bufferlist::iterator p = bl.begin();
::decode(snapset, p);
- } else {
- dout(10) << " no \"snapset\" attr, r = " << r << " " << strerror(-r) << dendl;
}
} else
assert(poid.oid.snap == 0); // no snapshotting.
void ReplicatedPG::cancel_recovery()
{
+ dout(10) << "cancel_recovery" << dendl;
+
// forget about where missing items are, or anything we're pulling
missing_loc.clear();
osd->num_pulling -= pulling.size();
pulling.clear();
pushing.clear();
- log.reset_recovery();
+ log.reset_recovery_pointers();
osd->finish_recovery_op(this, recovery_ops_active, true);
}