]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: pause/unpause recovery based on NORECOVER osdmap flag
authorSage Weil <sage@inktank.com>
Fri, 24 Aug 2012 01:16:58 +0000 (18:16 -0700)
committerSage Weil <sage@inktank.com>
Fri, 31 Aug 2012 22:12:38 +0000 (15:12 -0700)
Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/OSD.cc
src/osd/OSD.h

index 90291a2d4e3a1291d450a8e95634b854a0cdaf6b..444b359e4420ae29a29ae743d96576de45ddc01f 100644 (file)
@@ -690,6 +690,7 @@ OSD::OSD(int id, Messenger *internal_messenger, Messenger *external_messenger,
   recovery_tp(external_messenger->cct, "OSD::recovery_tp", g_conf->osd_recovery_threads),
   disk_tp(external_messenger->cct, "OSD::disk_tp", g_conf->osd_disk_threads),
   command_tp(external_messenger->cct, "OSD::command_tp", 1),
+  paused_recovery(false),
   heartbeat_lock("OSD::heartbeat_lock"),
   heartbeat_stop(false), heartbeat_need_update(true), heartbeat_epoch(0),
   hbclient_messenger(hbclientm),
@@ -3902,6 +3903,21 @@ void OSD::activate_map()
     monc->renew_subs();
   }
 
+  // norecover?
+  if (osdmap->test_flag(CEPH_OSDMAP_NORECOVER)) {
+    if (!paused_recovery) {
+      dout(1) << "pausing recovery (NORECOVER flag set)" << dendl;
+      paused_recovery = true;
+      recovery_tp.pause_new();
+    }
+  } else {
+    if (paused_recovery) {
+      dout(1) << "resuming recovery (NORECOVER flag cleared)" << dendl;
+      paused_recovery = false;
+      recovery_tp.unpause();
+    }
+  }
+
   // process waiters
   take_waiters(waiting_for_osdmap);
 }
index fe0fcea9dfcc1a67a09332f0dc8b60fbbba35567..9727463826b1a512de13254ac294c1d94131dad5 100644 (file)
@@ -422,6 +422,8 @@ private:
   ThreadPool disk_tp;
   ThreadPool command_tp;
 
+  bool paused_recovery;
+
   // -- sessions --
 public:
   struct Session : public RefCountedObject {