From f491f02c364e65ec8e41f4ac2b1ed496caf304ff Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 22 Jan 2018 08:29:22 -0600 Subject: [PATCH] osd/PG: wait for scan_snaps() mapper repair Wait for our repair to apply before continuing to avoid reading the broken state again. Signed-off-by: Sage Weil (cherry picked from commit ea531df216c65a3773a55b5f6c42af20e5004263) Conflicts: src/osd/PG.cc (luminous uses osd->store->apply_transaction() where master has osd->store->queue_transaction()) --- src/osd/PG.cc | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index e9549539055..7e309249eef 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -4159,10 +4159,25 @@ void PG::_scan_snaps(ScrubMap &smap) << "...repaired"; } snap_mapper.add_oid(hoid, obj_snaps, &_t); - r = osd->store->apply_transaction(osr.get(), std::move(t)); - if (r != 0) { - derr << __func__ << ": apply_transaction got " << cpp_strerror(r) - << dendl; + + // wait for repair to apply to avoid confusing other bits of the system. + { + Cond my_cond; + Mutex my_lock("PG::_scan_snaps my_lock"); + int r = 0; + bool done; + t.register_on_applied_sync( + new C_SafeCond(&my_lock, &my_cond, &done, &r)); + r = osd->store->apply_transaction(osr.get(), std::move(t)); + if (r != 0) { + derr << __func__ << ": apply_transaction got " << cpp_strerror(r) + << dendl; + } else { + my_lock.Lock(); + while (!done) + my_cond.Wait(my_lock); + my_lock.Unlock(); + } } } } -- 2.47.3