]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Better recovery/backfill restart for mark_unfound_lost delete/revert
authorDavid Zafman <dzafman@redhat.com>
Mon, 9 Oct 2017 21:03:23 +0000 (14:03 -0700)
committerDavid Zafman <dzafman@redhat.com>
Wed, 24 Jan 2018 02:49:10 +0000 (18:49 -0800)
Signed-off-by: David Zafman <dzafman@redhat.com>
(cherry picked from commit 689bff354a6bfa1cf47b0d0a04fa9f1b2ef68f75)

src/osd/PrimaryLogPG.cc

index df828787fdafb95debc24be0b25ea92a6c0718cd..0e6ab6777a7370c23be85836d85d08808fbe4e46 100644 (file)
@@ -721,7 +721,7 @@ void PrimaryLogPG::wait_for_blocked_object(const hobject_t& soid, OpRequestRef o
 
 void PrimaryLogPG::maybe_force_recovery()
 {
-  // no force if not in degraded/recovery/backfill stats
+  // no force if not in degraded/recovery/backfill states
   if (!is_degraded() &&
       !state_test(PG_STATE_RECOVERING |
                   PG_STATE_RECOVERY_WAIT |
@@ -2349,6 +2349,7 @@ void PrimaryLogPG::do_op(OpRequestRef& op)
   // force recovery of the oldest missing object if too many logs
   maybe_force_recovery();
 }
+
 PrimaryLogPG::cache_result_t PrimaryLogPG::maybe_handle_manifest_detail(
   OpRequestRef op,
   bool write_ordered,
@@ -10815,7 +10816,23 @@ void PrimaryLogPG::mark_all_unfound_lost(
          release_backoffs(p.first);
        }
        requeue_object_waiters(waiting_for_unreadable_object);
-       queue_recovery();
+       if (is_recovery_unfound()) {
+         queue_peering_event(
+           CephPeeringEvtRef(
+             std::make_shared<CephPeeringEvt>(
+             get_osdmap()->get_epoch(),
+             get_osdmap()->get_epoch(),
+             DoRecovery())));
+       } else if (is_backfill_unfound()) {
+         queue_peering_event(
+           CephPeeringEvtRef(
+             std::make_shared<CephPeeringEvt>(
+             get_osdmap()->get_epoch(),
+             get_osdmap()->get_epoch(),
+             RequestBackfill())));
+       } else {
+         queue_recovery();
+       }
 
        stringstream ss;
        ss << "pg has " << num_unfound