]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: wire-up pg scanning on replicas.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 11 May 2020 20:03:54 +0000 (22:03 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 13 Jul 2020 14:25:28 +0000 (16:25 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/backfill_state.h
src/crimson/osd/pg.h
src/crimson/osd/pg_recovery.cc
src/crimson/osd/pg_recovery_listener.h
src/crimson/osd/recovery_backend.cc

index fea0f4ba93052fe7835da3565e5375db0020c249..58b307b32fb686543f93835c6df4e96ddeede404 100644 (file)
@@ -36,6 +36,10 @@ struct BackfillState {
   struct ReplicaScanned : sc::event<ReplicaScanned> {
     pg_shard_t from;
     BackfillInterval result;
+    ReplicaScanned(pg_shard_t from, BackfillInterval&& result)
+      : from(std::move(from)),
+        result(std::move(result)) {
+    }
   };
 
   struct ObjectPushed : sc::event<ObjectPushed> {
index 647f989bc2da315a157072ae28ca113a55fd8824..30b025d35d7bc525d5834373f7c9f36441536a44 100644 (file)
@@ -592,7 +592,7 @@ public:
   const pg_missing_tracker_t& get_local_missing() const {
     return peering_state.get_pg_log().get_missing();
   }
-  epoch_t get_last_peering_reset() const {
+  epoch_t get_last_peering_reset() const final {
     return peering_state.get_last_peering_reset();
   }
   const set<pg_shard_t> &get_acting_recovery_backfill() const {
index c5670ed35371920813daa81ce8839ee7f1a8e413..d9328c5a4ca68bec9899d3eccb9b7bc3f966f1ab 100644 (file)
@@ -417,7 +417,19 @@ void PGRecovery::request_replica_scan(
   const hobject_t& begin,
   const hobject_t& end)
 {
-  ceph_abort_msg("Not implemented");
+  logger().debug("{}: target.osd={}", __func__, target.osd);
+  auto msg = make_message<MOSDPGScan>(
+    MOSDPGScan::OP_SCAN_GET_DIGEST,
+    pg->get_pg_whoami(),
+    pg->get_osdmap_epoch(),
+    pg->get_last_peering_reset(),
+    spg_t(pg->get_pgid().pgid, target.shard),
+    begin,
+    end);
+  std::ignore = pg->get_shard_services().send_to_osd(
+    target.osd,
+    std::move(msg),
+    pg->get_osdmap_epoch());
 }
 
 void PGRecovery::request_primary_scan(
index f9df92a4aafb4ed6f84930b187ba7c82afb2fb90..3c8d3b66a852841dcee5461f2b1177e66fdac6c5 100644 (file)
@@ -32,5 +32,6 @@ public:
   virtual bool is_unreadable_object(const hobject_t&, eversion_t* v = 0) const = 0;
   virtual bool has_reset_since(epoch_t) const = 0;
   virtual std::vector<pg_shard_t> get_replica_recovery_order() const = 0;
+  virtual epoch_t get_last_peering_reset() const = 0;
   virtual seastar::future<> stop() = 0;
 };
index 64f0c735c34960ff73441e7a15572a1f7f13a104..e81e38668ccfffcad037589a921f0a49a58c56a5 100644 (file)
@@ -156,7 +156,23 @@ seastar::future<> RecoveryBackend::handle_scan_digest(
   MOSDPGScan& m)
 {
   logger().debug("{}", __func__);
-  ceph_assert("Not implemented" == nullptr);
+  // Check that from is in backfill_targets vector
+  ceph_assert(pg.get_peering_state().is_backfill_target(m.from));
+
+  BackfillInterval bi;
+  bi.begin = m.begin;
+  bi.end = m.end;
+  {
+    auto p = m.get_data().cbegin();
+    // take care to preserve ordering!
+    bi.clear_objects();
+    ::decode_noclear(bi.objects, p);
+  }
+  shard_services.start_operation<crimson::osd::BackfillRecovery>(
+    static_cast<crimson::osd::PG*>(&pg),
+    shard_services,
+    pg.get_osdmap_epoch(),
+    crimson::osd::BackfillState::ReplicaScanned{ m.from, std::move(bi) });
   return seastar::now();
 }