]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Prevent divide by zero in agent_choose_mode()
authorSage Weil <sage@inktank.com>
Thu, 1 May 2014 23:53:17 +0000 (16:53 -0700)
committerDavid Zafman <david.zafman@inktank.com>
Tue, 6 May 2014 21:00:38 +0000 (14:00 -0700)
Fixes: #8175
Backport: firefly

Signed-off-by: David Zafman <david.zafman@inktank.com>
Signed-off-by: Sage Weil <sage@inktank.com>
(cherry picked from commit f47f867952e6b2a16a296c82bb9b585b21cde6c8)

src/osd/ReplicatedPG.cc

index 2f5966355cf87cc03ff8c2282e4d119d2e8ac862..8578c2b6cf97274fb6d4a965370cd4ec669c9a43 100644 (file)
@@ -11374,6 +11374,7 @@ void ReplicatedPG::agent_choose_mode(bool restart)
   }
 
   uint64_t divisor = pool.info.get_pg_num_divisor(info.pgid.pgid);
+  assert(divisor > 0);
 
   uint64_t num_user_objects = info.stats.stats.sum.num_objects;
 
@@ -11422,19 +11423,20 @@ void ReplicatedPG::agent_choose_mode(bool restart)
       info.stats.stats.sum.num_objects;
     dirty_micro =
       num_dirty * avg_size * 1000000 /
-      (pool.info.target_max_bytes / divisor);
+      MAX(pool.info.target_max_bytes / divisor, 1);
     full_micro =
       num_user_objects * avg_size * 1000000 /
-      (pool.info.target_max_bytes / divisor);
+      MAX(pool.info.target_max_bytes / divisor, 1);
   }
   if (pool.info.target_max_objects) {
     uint64_t dirty_objects_micro =
       num_dirty * 1000000 /
-      (pool.info.target_max_objects / divisor);
+      MAX(pool.info.target_max_objects / divisor, 1);
     if (dirty_objects_micro > dirty_micro)
       dirty_micro = dirty_objects_micro;
     uint64_t full_objects_micro =
-      num_user_objects * 1000000 / (pool.info.target_max_objects / divisor);
+      num_user_objects * 1000000 /
+      MAX(pool.info.target_max_objects / divisor, 1);
     if (full_objects_micro > full_micro)
       full_micro = full_objects_micro;
   }
@@ -11478,7 +11480,11 @@ void ReplicatedPG::agent_choose_mode(bool restart)
     // set effort in [0..1] range based on where we are between
     evict_mode = TierAgentState::EVICT_MODE_SOME;
     uint64_t over = full_micro - evict_target;
-    uint64_t span = 1000000 - evict_target;
+    uint64_t span;
+    if (evict_target >= 1000000)
+      span = 1;
+    else
+      span = 1000000 - evict_target;
     evict_effort = MAX(over * 1000000 / span,
                       (unsigned)(1000000.0 * g_conf->osd_agent_min_evict_effort));