You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by al...@apache.org on 2019/10/17 00:59:25 UTC
[kudu] 02/02: [clock] add exponential backoff in HybridClock::Init()
This is an automated email from the ASF dual-hosted git repository.
alexey pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git
commit 1bb267bd8587473c567ca76426689e33ff4c9b89
Author: Alexey Serbin <al...@apache.org>
AuthorDate: Wed Oct 16 15:18:49 2019 -0700
[clock] add exponential backoff in HybridClock::Init()
This patch introduces exponential back-off when polling the
synchronisation status of the underlying time service (i.e. calling
TimeService::WalltimeWithError()) during HybridClock::Init(). Now,
the polling interval starts with 1 millisecond and exponentially grows
up to 1 second.
Prior to this patch, the polling interval was one second, and in case
if time source synchronized faster than in one second,
HybridClock::Init() would incur extra latency (e.g., in case of tests
running with the built-in NTP client synchronized against MiniChronyd).
I verified that with the new approach ExternalMiniCluster-based tests
run faster:
before
[ OK ] AllTypesItest/9.TestTimestampPadding (6794 ms)
after
[ OK ] AllTypesItest/9.TestTimestampPadding (2730 ms)
Change-Id: I75924f1fdcf6a32684cda29bbfa959b00172b50e
Reviewed-on: http://gerrit.cloudera.org:8080/14472
Reviewed-by: Adar Dembo <ad...@cloudera.com>
Tested-by: Kudu Jenkins
---
src/kudu/clock/hybrid_clock.cc | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/kudu/clock/hybrid_clock.cc b/src/kudu/clock/hybrid_clock.cc
index 07170f6..99ea277 100644
--- a/src/kudu/clock/hybrid_clock.cc
+++ b/src/kudu/clock/hybrid_clock.cc
@@ -151,6 +151,7 @@ Status HybridClock::Init() {
Status s;
uint64_t now_usec;
uint64_t error_usec;
+ int poll_backoff_ms = 1;
do {
s = time_service_->WalltimeWithError(&now_usec, &error_usec);
if (!s.IsServiceUnavailable()) {
@@ -168,7 +169,8 @@ Status HybridClock::Init() {
}
need_log = false;
}
- SleepFor(MonoDelta::FromSeconds(1));
+ SleepFor(MonoDelta::FromMilliseconds(poll_backoff_ms));
+ poll_backoff_ms = std::min(2 * poll_backoff_ms, 1000);
} while (MonoTime::Now() < deadline);
if (!s.ok()) {