]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: wait recovery of all snapshots when reference_chunk is called 45137/head
authormyoungwon oh <ohmyoungwon@gmail.com>
Thu, 24 Feb 2022 02:29:17 +0000 (11:29 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Wed, 23 Mar 2022 06:21:28 +0000 (15:21 +0900)
If a user sends reference_chunk() to the original object
(not manifest object) which has not recovered snapshots,
the OSD triggers assert() because
reference_chunk() try to find adjacent unrecovered clones,
resulting in the assert().
This is because the original object does not wait the recovery
of snapshots.

To avoid this, this commit add a condition to check a base snapshot
is readable whether the object is manifest or not.
If the base snapshot is valid and the snapshot is manifest
, osd try to calculate reference count.

fixes: https://tracker.ceph.com/issues/54509

Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/osd/PrimaryLogPG.cc

index e91213bdee92168004feae70291f62581397b240..b06581041670b3f43b6365b20b4c8c952a708af2 100644 (file)
@@ -3450,6 +3450,12 @@ int PrimaryLogPG::get_manifest_ref_count(ObjectContextRef obc, std::string& fp_o
     if (osdmap->in_removed_snaps_queue(info.pgid.pgid.pool(), *p)) {
       return -EBUSY;
     }
+    if (is_unreadable_object(clone_oid)) {
+      dout(10) << __func__ << ": " << clone_oid
+              << " is unreadable. Need to wait for recovery" << dendl;
+      wait_for_unreadable_object(clone_oid, op);
+      return -EAGAIN;
+    }
     ObjectContextRef clone_obc = get_object_context(clone_oid, false);
     if (!clone_obc) {
       break;