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.80.6~113 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7ae15549a795ffd9ffcd34ea1d5c101b90eee26d;p=ceph.git use llrintl when converting double to micro This avoids rounding error (noticeable on i386). Backport: firefly Signed-off-by: Sage Weil (cherry picked from commit 80911736bd61b6b88eac0974d24f21c15c5385a4) Conflicts: src/mon/OSDMonitor.cc --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index eab5122cc1f..40cf6ccc604 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3336,6 +3336,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)) @@ -3345,6 +3346,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 (var == "size") { @@ -3528,7 +3530,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 * 1000000; + p.cache_target_dirty_ratio_micro = uf; } else if (var == "cache_target_full_ratio") { if (floaterr.length()) { ss << "error parsing float '" << val << "': " << floaterr; @@ -3538,7 +3540,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 * 1000000; + 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 391dd63ee8f..476678efe68 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 {