From d1aa392446f0657620e7ef26e00ea3a694bb7c8d Mon Sep 17 00:00:00 2001 From: Yan Jun Date: Mon, 27 Jun 2016 12:28:25 +0800 Subject: [PATCH] rados/client: fix waiting on the condition variable more efficient. Maybe we can simply use "cond.Wait" if timeout is zero, so that it wait and sleep forever until being waked up by cond.Signal, which seems to be more efficient. Signed-off-by: Yan Jun --- src/librados/RadosClient.cc | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index b731c80f0f11..97639fb60c9a 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -516,7 +516,7 @@ int librados::RadosClient::wait_for_osdmap() bool need_map = false; objecter->with_osdmap([&](const OSDMap& o) { if (o.get_epoch() == 0) { - need_map = true; + need_map = true; } }); @@ -527,25 +527,21 @@ int librados::RadosClient::wait_for_osdmap() if (cct->_conf->rados_mon_op_timeout > 0) timeout.set_from_double(cct->_conf->rados_mon_op_timeout); - bool wait_forever = false; - if (timeout.is_zero()) { - // we'll going to wait forever, but wake up every 1 seconds, - // e.g., to avoid cpu burning. - wait_forever = true; - timeout = utime_t(1, 0); - } - if (objecter->with_osdmap(std::mem_fn(&OSDMap::get_epoch)) == 0) { ldout(cct, 10) << __func__ << " waiting" << dendl; utime_t start = ceph_clock_now(cct); while (objecter->with_osdmap(std::mem_fn(&OSDMap::get_epoch)) == 0) { - cond.WaitInterval(cct, lock, timeout); - utime_t elapsed = ceph_clock_now(cct) - start; - if (!wait_forever && elapsed > timeout) { - lderr(cct) << "timed out waiting for first osdmap from monitors" - << dendl; - return -ETIMEDOUT; - } + if (timeout.is_zero()) { + cond.Wait(lock); + } else { + cond.WaitInterval(cct, lock, timeout); + utime_t elapsed = ceph_clock_now(cct) - start; + if (elapsed > timeout) { + lderr(cct) << "timed out waiting for first osdmap from monitors" + << dendl; + return -ETIMEDOUT; + } + } } ldout(cct, 10) << __func__ << " done waiting" << dendl; } -- 2.47.3