]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: consider pending_inc in {up,in}_ratio for can_mark_{out,down}()
authorSage Weil <sage@newdream.net>
Thu, 26 Apr 2012 23:45:56 +0000 (16:45 -0700)
committerSage Weil <sage@newdream.net>
Thu, 26 Apr 2012 23:50:38 +0000 (16:50 -0700)
Consider pending changes when calculating the current up/in ratios.  Among
other things, this will make the marking of osds down->out stop once it
hits the min in ratio.

Signed-off-by: Sage Weil <sage@newdream.net>
src/mon/OSDMonitor.cc
src/osd/OSDMap.cc
src/osd/OSDMap.h

index 2841880bffe3eeaf5fdc4baedeab6f4d7eeff505..d49082f829c58e81230190f3d87472907171a693 100644 (file)
@@ -577,7 +577,8 @@ bool OSDMonitor::can_mark_down(int i)
     dout(5) << "can_mark_down NODOWN flag set, will not mark osd." << i << " down" << dendl;
     return false;
   }
-  float up_ratio = (float)osdmap.get_num_up_osds() / (float)osdmap.get_num_osds();
+  int up = osdmap.get_num_up_osds() - pending_inc.get_net_marked_down(&osdmap);
+  float up_ratio = (float)up / (float)osdmap.get_num_osds();
   if (up_ratio < g_conf->mon_osd_min_up_ratio) {
     dout(5) << "can_mark_down current up_ratio " << up_ratio << " < min "
            << g_conf->mon_osd_min_up_ratio
@@ -602,7 +603,8 @@ bool OSDMonitor::can_mark_out(int i)
     dout(5) << "can_mark_out NOOUT flag set, will not mark osds out" << dendl;
     return false;
   }
-  float in_ratio = (float)osdmap.get_num_in_osds() / (float)osdmap.get_num_osds();
+  int in = osdmap.get_num_in_osds() - pending_inc.get_net_marked_out(&osdmap);
+  float in_ratio = (float)in / (float)osdmap.get_num_osds();
   if (in_ratio < g_conf->mon_osd_min_in_ratio) {
     if (i >= 0)
       dout(5) << "can_mark_down current in_ratio " << in_ratio << " < min "
index 445f85fa4f943d6e858b5549d23d12c9128262ed..967f482eba86cd0efbf3bda9552a4827ed6ed83f 100644 (file)
@@ -86,6 +86,36 @@ ostream& operator<<(ostream& out, const osd_info_t& info)
 // ----------------------------------
 // OSDMap::Incremental
 
+int OSDMap::Incremental::get_net_marked_out(const OSDMap *previous) const
+{
+  int n = 0;
+  for (map<int32_t,uint32_t>::const_iterator p = new_weight.begin();
+       p != new_weight.end();
+       ++p) {
+    if (p->second == CEPH_OSD_OUT && !previous->is_out(p->first))
+      n++;  // marked out
+    if (p->second != CEPH_OSD_OUT && previous->is_out(p->first))
+      n--;  // marked in
+  }
+  return n;
+}
+
+int OSDMap::Incremental::get_net_marked_down(const OSDMap *previous) const
+{
+  int n = 0;
+  for (map<int32_t,uint8_t>::const_iterator p = new_state.begin();
+       p != new_state.end();
+       ++p) {
+    if (p->second & CEPH_OSD_UP) {
+      if (previous->is_up(p->first))
+       n++;  // marked down
+      else
+       n--;  // marked up
+    }
+  }
+  return n;
+}
+
 void OSDMap::Incremental::encode_client_old(bufferlist& bl) const
 {
   __u16 v = 5;
index 4ac784acdfb3425c250e7e0ea7922416e2eefa21..54fd38e2fcbf0b3ad8bb19ae09aa3480334ffd56 100644 (file)
@@ -137,6 +137,9 @@ public:
 
     string cluster_snapshot;
 
+    int get_net_marked_out(const OSDMap *previous) const;
+    int get_net_marked_down(const OSDMap *previous) const;
+
     void encode_client_old(bufferlist& bl) const;
     void encode(bufferlist& bl, uint64_t features=-1) const;
     void decode(bufferlist::iterator &p);