From: Sage Weil Date: Thu, 31 Jul 2014 22:39:40 +0000 (-0700) Subject: use llrintl when converting double to micro X-Git-Tag: v0.84~34^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=80911736bd61b6b88eac0974d24f21c15c5385a4;p=ceph.git use llrintl when converting double to micro This avoids rounding error (noticeable on i386). Backport: firefly Signed-off-by: Sage Weil --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index a8c2c64c6b45..0cec4101e4af 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3481,6 +3481,7 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, string interr, floaterr; int64_t n = 0; double f = 0; + int64_t uf = 0; // micro-f if (!cmd_getval(g_ceph_context, cmdmap, "val", val)) { // wasn't a string; maybe an older mon forwarded json with an int? if (!cmd_getval(g_ceph_context, cmdmap, "val", n)) @@ -3490,6 +3491,7 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, n = strict_strtoll(val.c_str(), 10, &interr); // or a float f = strict_strtod(val.c_str(), &floaterr); + uf = llrintl(f * (double)1000000.0); } if (!p.is_tier() && @@ -3684,7 +3686,7 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, ss << "value must be in the range 0..1"; return -ERANGE; } - p.cache_target_dirty_ratio_micro = f * (double)1000000.0; + p.cache_target_dirty_ratio_micro = uf; } else if (var == "cache_target_full_ratio") { if (floaterr.length()) { ss << "error parsing float '" << val << "': " << floaterr; @@ -3694,7 +3696,7 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, ss << "value must be in the range 0..1"; return -ERANGE; } - p.cache_target_full_ratio_micro = f * (double)1000000.0; + p.cache_target_full_ratio_micro = uf; } else if (var == "cache_min_flush_age") { if (interr.length()) { ss << "error parsing int '" << val << "': " << interr; diff --git a/src/osd/HitSet.h b/src/osd/HitSet.h index dd83e6dd8e5e..b1f49c09cb13 100644 --- a/src/osd/HitSet.h +++ b/src/osd/HitSet.h @@ -369,7 +369,7 @@ public: return (double)fpp_micro / 1000000.0; } void set_fpp(double f) { - fpp_micro = (unsigned)(f * 1000000.0); + fpp_micro = (unsigned)(llrintl(f * (double)1000000.0)); } void encode(bufferlist& bl) const {