]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: return ENOENT if pool information is invalid during tier-flush 46748/head
authormyoungwon oh <ohmyoungwon@gmail.com>
Tue, 28 Jun 2022 04:42:21 +0000 (13:42 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Thu, 21 Jul 2022 00:56:46 +0000 (09:56 +0900)
During tier-flush, OSD sends reference increase message to target OSD.
At this point, sending message with invalid pool information (e.g., deleted pool)
causes unexpected behavior.

Therefore, this commit return ENOENT early before sending the message

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

Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
(cherry picked from 3de27b25cb6104d810f7af81809a0813df6c46a4)

src/osd/PrimaryLogPG.cc
src/osd/PrimaryLogPG.h
src/test/librados/tier_cxx.cc

index c0f3f748ddcaa634fca91dc08c63159266c62819..497f280746c8840200d82ee4768a372198e8a6fd 100644 (file)
@@ -6972,7 +6972,11 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
          goto fail;
        }
        pg_t raw_pg;
-       get_osdmap()->object_locator_to_pg(target_name, target_oloc, raw_pg);
+       result = get_osdmap()->object_locator_to_pg(target_name, target_oloc, raw_pg);
+       if (result < 0) {
+         dout(5) << " pool information is invalid: " << result << dendl;
+         break;
+       }
        hobject_t target(target_name, target_oloc.key, target_snapid,
                raw_pg.ps(), raw_pg.pool(),
                target_oloc.nspace);
@@ -7119,7 +7123,11 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
 
        pg_t raw_pg;
        chunk_info_t chunk_info;
-       get_osdmap()->object_locator_to_pg(tgt_name, tgt_oloc, raw_pg);
+       result = get_osdmap()->object_locator_to_pg(tgt_name, tgt_oloc, raw_pg);
+       if (result < 0) {
+         dout(5) << " pool information is invalid: " << result << dendl;
+         break;
+       }
        hobject_t target(tgt_name, tgt_oloc.key, snapid_t(),
                         raw_pg.ps(), raw_pg.pool(),
                         tgt_oloc.nspace);
@@ -10315,19 +10323,23 @@ int PrimaryLogPG::do_cdc(const object_info_t& oi,
   for (auto p : cdc_chunks) {
     bufferlist chunk;
     chunk.substr_of(bl, p.first, p.second);
-    hobject_t target = get_fpoid_from_chunk(oi.soid, chunk);
-    chunks[p.first] = move(chunk);
+    auto [ret, target] = get_fpoid_from_chunk(oi.soid, chunk);
+    if (ret < 0) {
+      return ret;
+    }
+    chunks[p.first] = std::move(chunk);
     chunk_map[p.first] = chunk_info_t(0, p.second, target);
     total_length += p.second;
   }
   return total_length;
 }
 
-hobject_t PrimaryLogPG::get_fpoid_from_chunk(const hobject_t soid, bufferlist& chunk)
+std::pair<int, hobject_t> PrimaryLogPG::get_fpoid_from_chunk(
+  const hobject_t soid, bufferlist& chunk)
 {
   pg_pool_t::fingerprint_t fp_algo = pool.info.get_fingerprint_type();
   if (fp_algo == pg_pool_t::TYPE_FINGERPRINT_NONE) {
-    return hobject_t();
+    return make_pair(-EINVAL, hobject_t());
   }
   object_t fp_oid = [&fp_algo, &chunk]() -> string {
     switch (fp_algo) {
@@ -10348,11 +10360,14 @@ hobject_t PrimaryLogPG::get_fpoid_from_chunk(const hobject_t soid, bufferlist& c
   oloc.pool = pool.info.get_dedup_tier();
   // check if dedup_tier isn't set
   ceph_assert(oloc.pool > 0);
-  get_osdmap()->object_locator_to_pg(fp_oid, oloc, raw_pg);
+  int ret = get_osdmap()->object_locator_to_pg(fp_oid, oloc, raw_pg);
+  if (ret < 0) {
+    return make_pair(ret, hobject_t());
+  }
   hobject_t target(fp_oid, oloc.key, snapid_t(),
                    raw_pg.ps(), raw_pg.pool(),
                    oloc.nspace);
-  return target;
+  return make_pair(0, target);
 }
 
 int PrimaryLogPG::finish_set_dedup(hobject_t oid, int r, ceph_tid_t tid, uint64_t offset)
index 9b6c017f3647937aa86ca250cf0852eb3627fbd6..358061acbe1c2965fe5ec8cebb45bb6e5e123cdb 100644 (file)
@@ -1475,7 +1475,7 @@ protected:
   int do_cdc(const object_info_t& oi, std::map<uint64_t, chunk_info_t>& chunk_map,
             std::map<uint64_t, bufferlist>& chunks);
   int start_dedup(OpRequestRef op, ObjectContextRef obc);
-  hobject_t get_fpoid_from_chunk(const hobject_t soid, bufferlist& chunk);
+  std::pair<int, hobject_t> get_fpoid_from_chunk(const hobject_t soid, bufferlist& chunk);
   int finish_set_dedup(hobject_t oid, int r, ceph_tid_t tid, uint64_t offset);
 
   friend struct C_ProxyChunkRead;
index 2091e911c0a51fb25d86c8c147b63e03bd00f3cb..08ccb608213bd43694768df664f0d787c7b704e3 100644 (file)
@@ -5473,6 +5473,9 @@ TEST_F(LibRadosTwoPoolsPP, TierFlushDuringFlush) {
   // delete temp pool, so flushing chunk will fail
   ASSERT_EQ(0, s_cluster.pool_delete(temp_pool_name.c_str()));
 
+  // wait for maps to settle
+  cluster.wait_for_latest_osdmap();
+
   // flush to check if proper error is returned
   {
     ObjectReadOperation op;