In all three cases, we know the authoritative log does not contain an entry for oe.soid, therefore: If oe.prior_version > log.tail, we must already have processed an earlier entry for that object resulting in the object being correctly marked missing (or not) (specifically, the entry for oe.prior_version). If log.tail >= oe.prior_version > eversion_t(), the missing entry should have need set at oe.prior_version (revise_need). oe.prior_version cannot be divergent because all divergent entries must fall within the log (otherwise, we would have backfilled). If oe.prior_version == eversion_t(), the object no longer exists, and the object should be removed from the missing set. Hope that helps. -Sam On Sun, Jun 2, 2013 at 4:09 AM, Loic Dachary <loic@xxxxxxxxxxx> wrote: > Hi Sam, > > TL;DR: > > When there no new entry, what is the rationale for merge_old_entry to remove the object from missing only if the tail is eversion_t() and the object prior_version is also eversion_t() ? > https://github.com/dachary/ceph/blob/f58299db098d5f18c817b516fa6ffaa76245e57d/src/osd/PGLog.cc#L330 > > Long version: > > The conditions are created with: > > info.log_tail = eversion_t(); > oe.soid.hash = 1; > oe.op = pg_log_entry_t::DELETE; > oe.prior_version = eversion_t(); > > missing.add(oe.soid, eversion_t(1,1), eversion_t()); > > as shown in > https://github.com/dachary/ceph/blob/f58299db098d5f18c817b516fa6ffaa76245e57d/src/test/osd/TestPGLog.cc#L467 > I double checked with gdb and when called with > > EXPECT_FALSE(merge_old_entry(t, oe, info, remove_snap, dirty_log)); > https://github.com/dachary/ceph/blob/f58299db098d5f18c817b516fa6ffaa76245e57d/src/test/osd/TestPGLog.cc#L481 > > it reaches > > missing.rm(oe.soid, missing.missing[oe.soid].need); > https://github.com/dachary/ceph/blob/f58299db098d5f18c817b516fa6ffaa76245e57d/src/osd/PGLog.cc#L330 > > and the expected side effects are observed: > > EXPECT_FALSE(dirty_log); > EXPECT_TRUE(remove_snap.empty()); > EXPECT_TRUE(t.empty()); > EXPECT_FALSE(missing.have_missing()); > EXPECT_TRUE(log.empty()); > EXPECT_EQ(0U, ondisklog.length()); > https://github.com/dachary/ceph/blob/f58299db098d5f18c817b516fa6ffaa76245e57d/src/test/osd/TestPGLog.cc#L483 > > Cheers > > -- > Loïc Dachary, Artisan Logiciel Libre > All that is necessary for the triumph of evil is that good people do nothing. > -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html