From 1856c5e5a3bcfe4f55e44ceb2e26ad4f9a27f8db Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 25 Nov 2008 11:22:14 -0800 Subject: [PATCH] osd: fix up recovery pointers a bit --- src/osd/PG.cc | 51 ++++++++++++++++------------------------- src/osd/PG.h | 4 ++-- src/osd/ReplicatedPG.cc | 6 ++--- 3 files changed, 25 insertions(+), 36 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 42c063f29b9b5..8dfbe2cc18132 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -470,29 +470,6 @@ void PG::merge_log(ObjectStore::Transaction& t, Log &olog, Missing &omissing, in 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; - } } } @@ -908,7 +885,7 @@ void PG::clear_primary_state() 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(); } @@ -1177,18 +1154,30 @@ void PG::activate(ObjectStore::Transaction& t, 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); } } @@ -1334,7 +1323,7 @@ void PG::finish_recovery() 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! diff --git a/src/osd/PG.h b/src/osd/PG.h index c146f10a925a0..a44d886a5b640 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -298,9 +298,9 @@ public: assert(0); unindex(); Log::clear(); - reset_recovery(); + reset_recovery_pointers(); } - void reset_recovery() { + void reset_recovery_pointers() { requested_to = log.end(); complete_to = log.end(); } diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index bdd4534e8a5cf..5d5da023406b6 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -1530,8 +1530,6 @@ void ReplicatedPG::op_modify(MOSDOp *op) 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. @@ -2503,12 +2501,14 @@ void ReplicatedPG::on_role_change() 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); } -- 2.39.5