]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: settle snap_trimq in PG and wire it up
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 24 Nov 2022 22:50:17 +0000 (22:50 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 28 Feb 2023 16:22:04 +0000 (16:22 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/pg.cc
src/crimson/osd/pg.h

index fdba4d49a5a15f61906733ef3e1c6277cc9ca1af..c8ddbd00122a831d328be69f7ed1bfff0f09ad3c 100644 (file)
@@ -38,6 +38,7 @@
 #include "crimson/osd/osd_operations/osdop_params.h"
 #include "crimson/osd/osd_operations/peering_event.h"
 #include "crimson/osd/osd_operations/background_recovery.h"
+#include "crimson/osd/osd_operations/snaptrim_event.h"
 #include "crimson/osd/pg_recovery.h"
 #include "crimson/osd/replicated_recovery_backend.h"
 #include "crimson/osd/watch.h"
@@ -310,8 +311,10 @@ void PG::on_removal(ceph::os::Transaction &t) {
   }));
 }
 
-void PG::on_activate(interval_set<snapid_t>)
+void PG::on_activate(interval_set<snapid_t> snaps)
 {
+  logger().debug("{}: {} snaps={}", *this, __func__, snaps);
+  snap_trimq = std::move(snaps);
   projected_last_update = peering_state.get_info().last_update;
 }
 
@@ -448,12 +451,48 @@ Context *PG::on_clean()
 
 void PG::on_active_actmap()
 {
-  // Not needed yet
+  logger().debug("{}: {} snap_trimq={}", *this, __func__, snap_trimq);
+  std::ignore = seastar::do_until(
+    [this] { return snap_trimq.empty(); },
+    [this] {
+      const auto to_trim = snap_trimq.range_start();
+      snap_trimq.erase(to_trim);
+      return seastar::repeat([to_trim, this] {
+        logger().debug("{}: going to start SnapTrimEvent, to_trim={}",
+                       *this, to_trim);
+        return shard_services.start_operation<SnapTrimEvent>(
+          this,
+          snap_mapper,
+          to_trim).second;
+      }).then([this, trimmed=to_trim] {
+        logger().debug("{}: trimmed snap={}", *this, trimmed);
+      });
+    });
 }
 
 void PG::on_active_advmap(const OSDMapRef &osdmap)
 {
-  // Not needed yet
+  const auto new_removed_snaps = osdmap->get_new_removed_snaps();
+  if (auto it = new_removed_snaps.find(get_pgid().pool());
+      it != new_removed_snaps.end()) {
+    bool bad = false;
+    for (auto j : it->second) {
+      if (snap_trimq.intersects(j.first, j.second)) {
+       decltype(snap_trimq) added, overlap;
+       added.insert(j.first, j.second);
+       overlap.intersection_of(snap_trimq, added);
+        logger().error("{}: {} removed_snaps already contains {}",
+                       *this, __func__, overlap);
+       bad = true;
+       snap_trimq.union_of(added);
+      } else {
+       snap_trimq.insert(j.first, j.second);
+      }
+    }
+    logger().info("{}: {} new removed snaps {}, snap_trimq now{}",
+                  *this, __func__, it->second, snap_trimq);
+    assert(!bad || local_conf().get_val<bool>("osd_debug_verify_cached_snaps"));
+  }
 }
 
 void PG::scrub_requested(scrub_level_t scrub_level, scrub_type_t scrub_type)
@@ -770,7 +809,10 @@ PG::do_osd_ops_execute(
             crimson::ct_error::eagain::make()));
       }
     }
-    return std::move(*ox).flush_changes_n_do_ops_effects(ops,
+    return std::move(*ox).flush_changes_n_do_ops_effects(
+      ops,
+      snap_mapper,
+      osdriver,
       [this] (auto&& txn,
               auto&& obc,
               auto&& osd_op_p,
index dfbb8acace8178ae4b987859ed2ebd00360c6fb9..911fb49c6cfaef86d527c2eedaf71b6d2bc8671d 100644 (file)
@@ -10,6 +10,7 @@
 #include <seastar/core/shared_future.hh>
 
 #include "common/dout.h"
+#include "include/interval_set.h"
 #include "crimson/net/Fwd.h"
 #include "messages/MOSDRepOpReply.h"
 #include "messages/MOSDOpReply.h"
@@ -172,7 +173,7 @@ public:
   void scrub_requested(scrub_level_t scrub_level, scrub_type_t scrub_type) final;
 
   uint64_t get_snap_trimq_size() const final {
-    return 0;
+    return std::size(snap_trimq);
   }
 
   void send_cluster_message(
@@ -755,7 +756,10 @@ private:
     std::set<pg_shard_t> waiting_on;
     seastar::shared_promise<> all_committed;
   };
+
   std::map<ceph_tid_t, log_update_t> log_entry_update_waiting_on;
+  // snap trimming
+  interval_set<snapid_t> snap_trimq;
 };
 
 struct PG::do_osd_ops_params_t {