]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PG: wait for scan_snaps() mapper repair
authorSage Weil <sage@redhat.com>
Mon, 22 Jan 2018 14:29:22 +0000 (08:29 -0600)
committerNathan Cutler <ncutler@suse.com>
Thu, 29 Mar 2018 09:53:28 +0000 (11:53 +0200)
Wait for our repair to apply before continuing to avoid reading the
broken state again.

Signed-off-by: Sage Weil <sage@redhat.com>
(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

index e9549539055a6d3e014c44c288e36101f92b0beb..7e309249eef6f074dce5b1be4e95af9b14e7d22b 100644 (file)
@@ -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();
+         }
        }
       }
     }