]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: add has_manifest_chunk() to check chunks in snapshot
authormyoungwon oh <ohmyoungwon@gmail.com>
Tue, 5 Jan 2021 12:40:36 +0000 (21:40 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Thu, 21 Jan 2021 06:12:46 +0000 (15:12 +0900)
cls_has_chunk does not cover snapshotted manifest object.
This leads to unexpected behavior during chunk scrub.

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

index 663b8fb011d5b011d8645cb596aaf435a1745b9e..4b065f9508168048378aa2895361525c772b3d2c 100644 (file)
@@ -3328,6 +3328,34 @@ void PrimaryLogPG::cancel_manifest_ops(bool requeue, vector<ceph_tid_t> *tids)
   }
 }
 
+bool PrimaryLogPG::has_manifest_chunk(ObjectContextRef obc, std::string& fp_oid) 
+{
+  // head
+  for (auto &p : obc->obs.oi.manifest.chunk_map) {
+    if (p.second.oid.oid.name == fp_oid) {
+      return true;
+    }
+  }
+  // snap
+  SnapSet& ss = obc->ssc->snapset;
+  for (vector<snapid_t>::const_iterator p = ss.clones.begin();
+      p != ss.clones.end();
+      ++p) {
+    hobject_t clone_oid = obc->obs.oi.soid;
+    clone_oid.snap = *p;
+    ObjectContextRef clone_obc = get_object_context(clone_oid, false);
+    if (clone_obc && clone_obc->obs.oi.has_manifest()) {
+      for (auto &p : clone_obc->obs.oi.manifest.chunk_map) {
+       if (p.second.oid.oid.name == fp_oid) {
+         return true;
+       }
+      }
+    }
+  }
+
+  return false;
+}
+
 ObjectContextRef PrimaryLogPG::get_prev_clone_obc(ObjectContextRef obc)
 {
   auto s = std::find(obc->ssc->snapset.clones.begin(), obc->ssc->snapset.clones.end(),
index 432a7f9c33668416f1abe1405639a3a847fb75f5..189c61a4da966172c7f7f64b3dad6fdac5eb641a 100644 (file)
@@ -1848,6 +1848,8 @@ public:
   void maybe_kick_recovery(const hobject_t &soid);
   void wait_for_unreadable_object(const hobject_t& oid, OpRequestRef op);
 
+  bool has_manifest_chunk(ObjectContextRef obc, std::string& fp_oid);
+
   bool check_laggy(OpRequestRef& op);
   bool check_laggy_requeue(OpRequestRef& op);
   void recheck_readable() override;
index 73c5406856a56d68f5c453377b599b1e2eb83f0d..7507a55d1c90922529f2c6fc6236eb42b92ed6ac 100644 (file)
@@ -685,17 +685,7 @@ int cls_cxx_chunk_write_and_set(cls_method_context_t hctx, int ofs, int len,
 bool cls_has_chunk(cls_method_context_t hctx, string fp_oid)
 {
   PrimaryLogPG::OpContext *ctx = *(PrimaryLogPG::OpContext **)hctx;
-  if (!ctx->obc->obs.oi.has_manifest()) {
-    return false;
-  }
-
-  for (auto &p : ctx->obc->obs.oi.manifest.chunk_map) {
-    if (p.second.oid.oid.name == fp_oid) {
-      return true;
-    }
-  }
-
-  return false;
+  return ctx->pg->has_manifest_chunk(ctx->obc, fp_oid);
 }
 
 uint64_t cls_get_osd_min_alloc_size(cls_method_context_t hctx) {