]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/object_metadata_helper: take clone objects' clean regions
authorXuehan Xu <xuxuehan@qianxin.com>
Thu, 25 Jul 2024 07:37:29 +0000 (15:37 +0800)
committerMatan Breizman <mbreizma@redhat.com>
Wed, 4 Sep 2024 09:48:34 +0000 (09:48 +0000)
into account when recovering them

There are cases in which clone objects' omaps/xattrs are modified, we
want to avoid recover the data contents when recovering those clone
objects

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/osd/object_metadata_helper.cc
src/test/crimson/test_calc_subsets.cc

index 3016b0ae406bd50e6b4eae2a6d648683bf3038d9..12bf855afbe783bd3cb658b97626990284426b76 100644 (file)
@@ -1,3 +1,6 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*-
+// vim: ts=8 sw=2 smarttab expandtab
+
 #include "crimson/osd/object_metadata_helper.h"
 
 namespace {
@@ -23,12 +26,26 @@ subsets_t calc_clone_subsets(
   subsets_t subsets;
   logger().debug("{}: {} clone_overlap {} ",
                  __func__, soid, snapset.clone_overlap);
-
+  assert(missing.get_items().contains(soid));
+  const pg_missing_item &missing_item = missing.get_items().at(soid);
+  auto dirty_regions = missing_item.clean_regions.get_dirty_regions();
+  if (dirty_regions.empty()) {
+    logger().debug(
+      "{} {} not touched, no need to recover, skipping",
+      __func__,
+      soid);
+    return subsets;
+  }
   uint64_t size = snapset.clone_size[soid.snap];
   if (size) {
     subsets.data_subset.insert(0, size);
   }
 
+  // let data_subset store only the modified content of the object.
+  subsets.data_subset.intersection_of(dirty_regions);
+  logger().debug("{} {} data_subset {}",
+                 __func__, soid, subsets.data_subset);
+
   // TODO: make sure CEPH_FEATURE_OSD_CACHEPOOL is not supported in Crimson
   // Skips clone subsets if caching was enabled (allow_incomplete_clones).
 
@@ -140,7 +157,7 @@ subsets_t calc_head_subsets(
     subsets.data_subset.insert(0, obj_size);
   }
   assert(missing.get_items().contains(head));
-  const pg_missing_item missing_item = missing.get_items().at(head);
+  const pg_missing_item &missing_item = missing.get_items().at(head);
   // let data_subset store only the modified content of the object.
   subsets.data_subset.intersection_of(missing_item.clean_regions.get_dirty_regions());
   logger().debug("{} {} data_subset {}",
index 7d23810c2e60e489671ca61bf044a49a23cc2d0e..dae3cab84fecfbf9de222cea2ea33fc6ec533691 100644 (file)
@@ -190,6 +190,7 @@ TEST(clone_subsets, overlap)
   ss.clones.push_back(snapid_t(2));
   pg_missing_t missing;
   pg_missing_item item;
+  item.clean_regions.mark_fully_dirty();
   missing.add(clone, std::move(item));
   hobject_t last_backfill{object_t{"foo1"}, "foo1", CEPH_NOSNAP, 42, 0, "nspace"};