From 79d9f635063fb4613ceeaeabaf50b176c69e77d3 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 19 Nov 2008 16:38:27 -0800 Subject: [PATCH] osd: adjust missing in merge_old_entry Our "old" entry may have been newer, and missing.. remove from missing, and re-add "new" entry to ensure missing reflects the correct object version. --- src/osd/PG.cc | 17 +++++++++++++---- src/osd/PG.h | 3 +-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index b9a9bdb404682..bfca59a643a71 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -239,6 +239,12 @@ void PG::proc_replica_log(ObjectStore::Transaction& t, Log &olog, Missing& omiss } +/* + * merge an old (possibly divergent) log entry into the new log. this + * happens _after_ new log items have been assimilated. thus, we assume + * the index already references newer entries (if present), and missing + * has been updated accordingly. + */ void PG::merge_old_entry(ObjectStore::Transaction& t, Log::Entry& oe) { if (log.objects.count(oe.oid)) { @@ -247,7 +253,7 @@ void PG::merge_old_entry(ObjectStore::Transaction& t, Log::Entry& oe) if (ne.version >= oe.version) { dout(20) << "merge_entry had " << oe << " new " << ne << " : same or older, missing" << dendl; - assert(missing.is_missing(oe.oid)); + assert(missing.is_missing(ne.oid)); return; } @@ -263,11 +269,13 @@ void PG::merge_old_entry(ObjectStore::Transaction& t, Log::Entry& oe) } else { if (ne.is_delete()) { // old update, new delete - dout(20) << "merge_entry had " << oe << " new " << ne << " : newer supercedes" << dendl; + dout(20) << "merge_entry had " << oe << " new " << ne << " : new delete supercedes" << dendl; + missing.rm(oe.oid, oe.version); } else { // old update, new update - dout(20) << "merge_entry had " << oe << " new " << ne << " : adding to missing" << dendl; - missing.add_event(oe); + dout(20) << "merge_entry had " << oe << " new " << ne << " : new item supercedes" << dendl; + missing.rm(oe.oid, oe.version); // re-add older "new" entry to missing + missing.add_event(ne); } } } else { @@ -276,6 +284,7 @@ void PG::merge_old_entry(ObjectStore::Transaction& t, Log::Entry& oe) } else { dout(20) << "merge_entry had " << oe << " new dne : deleting" << dendl; t.remove(info.pgid.to_coll(), pobject_t(info.pgid.pool(), 0, oe.oid)); + missing.rm(oe.oid, oe.version); } } } diff --git a/src/osd/PG.h b/src/osd/PG.h index 9b9021fd9342b..37550b12303c2 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -394,8 +394,7 @@ public: * kept in memory, as a supplement to Log. * also used to pass missing info in messages. */ - class Missing { - public: + struct Missing { struct item { eversion_t need, have; item() {} -- 2.39.5