From d0f6991eb6ac32da09b40e652b666c0aaded60ff Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 19 Aug 2010 09:52:33 -0700 Subject: [PATCH] osd: carry ondisk write lock for cloned objects This fixes a race when reading and deleting objects, as evidenced by cp bigfile a mkdir .snap/foo rmdir a diff bigfile .snap/foo/a <-- reads cloned object before it hits disk Reproduced by snaptest-snap-rm-cmp.sh. Signed-off-by: Sage Weil --- src/osd/ReplicatedPG.cc | 5 ++++- src/osd/ReplicatedPG.h | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 0bde57af26c3b..e10e2254f810a 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -2083,10 +2083,13 @@ void ReplicatedPG::apply_repop(RepGather *repop) repop->tls.push_back(&repop->ctx->local_t); repop->obc->ondisk_write_lock(); + if (repop->ctx->clone_obc) + repop->ctx->clone_obc->ondisk_write_lock(); Context *oncommit = new C_OSD_OpCommit(this, repop); Context *onapplied = new C_OSD_OpApplied(this, repop); - Context *onapplied_sync = new C_OSD_OndiskWriteUnlock(repop->obc); + Context *onapplied_sync = new C_OSD_OndiskWriteUnlock(repop->obc, + repop->ctx->clone_obc); int r = osd->store->queue_transactions(&osr, repop->tls, onapplied, oncommit, onapplied_sync); if (r) { dout(-10) << "apply_repop queue_transactions returned " << r << " on " << *repop << dendl; diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 9cbf57e61d712..d482322e06bb6 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -543,10 +543,12 @@ protected: } }; struct C_OSD_OndiskWriteUnlock : public Context { - ObjectContext *obc; - C_OSD_OndiskWriteUnlock(ObjectContext *o) : obc(o) {} + ObjectContext *obc, *obc2; + C_OSD_OndiskWriteUnlock(ObjectContext *o, ObjectContext *o2=0) : obc(o), obc2(o2) {} void finish(int r) { obc->ondisk_write_unlock(); + if (obc2) + obc2->ondisk_write_unlock(); } }; struct C_OSD_WrotePushedObject : public Context { -- 2.39.5