]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Prevent divide by zero in agent_choose_mode() 1735/head
authorSage Weil <sage@inktank.com>
Thu, 1 May 2014 23:53:17 +0000 (16:53 -0700)
committerDavid Zafman <david.zafman@inktank.com>
Fri, 2 May 2014 23:35:49 +0000 (16:35 -0700)
Fixes: #8175
Backport: firefly

Signed-off-by: David Zafman <david.zafman@inktank.com>
Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/ReplicatedPG.cc

index 6cc5e560a6d9a14abf81ee98a765f0cb25dfe366..6935b93f28039145c496e277718a3e0b6b4b80d2 100644 (file)
@@ -11341,6 +11341,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;
 
@@ -11389,19 +11390,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;
   }
@@ -11445,7 +11447,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));