From 078b11554da1b3c5a4b64815a1f8cd26fa4a5745 Mon Sep 17 00:00:00 2001 From: William Song <48054931+SzyWilliam@users.noreply.github.com> Date: Fri, 4 Aug 2023 00:39:04 +0800 Subject: [PATCH] RATIS-1865. Add leader lease bound ratio configuration (#897) --- .../main/java/org/apache/ratis/conf/ConfUtils.java | 9 +++++++++ ratis-docs/src/site/markdown/configurations.md | 7 +++++++ .../apache/ratis/server/RaftServerConfigKeys.java | 12 ++++++++++++ .../ratis/server/impl/DivisionPropertiesImpl.java | 11 +++++++++++ 4 files changed, 39 insertions(+) diff --git a/ratis-common/src/main/java/org/apache/ratis/conf/ConfUtils.java b/ratis-common/src/main/java/org/apache/ratis/conf/ConfUtils.java index 629d5a3899..a642ebb9d2 100644 --- a/ratis-common/src/main/java/org/apache/ratis/conf/ConfUtils.java +++ b/ratis-common/src/main/java/org/apache/ratis/conf/ConfUtils.java @@ -76,6 +76,15 @@ static BiConsumer requireMax(int max) { }; } + static BiConsumer requireMin(double min) { + return (key, value) -> { + if (value < min) { + throw new IllegalArgumentException( + key + " = " + value + " < min = " + min); + } + }; + } + static BiConsumer requireMax(double max) { return (key, value) -> { if (value > max) { diff --git a/ratis-docs/src/site/markdown/configurations.md b/ratis-docs/src/site/markdown/configurations.md index 4e37cfd766..7fa7ddf80d 100644 --- a/ratis-docs/src/site/markdown/configurations.md +++ b/ratis-docs/src/site/markdown/configurations.md @@ -185,6 +185,13 @@ treat the peer as caught-up. Increase this number when write throughput is high. -------------------------------------------------------------------------------- +| **Property** | `raft.server.read.leader.lease.timeout.ratio` | +|:----------------|:----------------------------------------------| +| **Description** | maximum timeout ratio of leader lease | +| **Type** | double, ranging from (0.0,1.0) | +| **Default** | 0.9 | + + ### Write - Configurations related to write requests. * Limits on pending write requests diff --git a/ratis-server-api/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java b/ratis-server-api/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java index a8a7892dcf..5551f9cdde 100644 --- a/ratis-server-api/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java +++ b/ratis-server-api/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java @@ -192,6 +192,18 @@ static void setOption(RaftProperties properties, Option option) { set(properties::setEnum, OPTION_KEY, option); } + String LEADER_LEASE_TIMEOUT_RATIO_KEY = PREFIX + ".leader.lease.timeout.ratio"; + double LEADER_LEASE_TIMEOUT_RATIO_DEFAULT = 0.9; + static double leaderLeaseTimeoutRatio(RaftProperties properties) { + return getDouble(properties::getDouble, LEADER_LEASE_TIMEOUT_RATIO_KEY, + LEADER_LEASE_TIMEOUT_RATIO_DEFAULT, getDefaultLog(), + requireMin(0.0), requireMax(1.0)); + } + + static void setLeaderLeaseTimeoutRatio(RaftProperties properties, double ratio) { + setDouble(properties::setDouble, LEADER_LEASE_TIMEOUT_RATIO_KEY, ratio); + } + interface ReadAfterWriteConsistent { String PREFIX = RaftServerConfigKeys.PREFIX + ".read-after-write-consistent"; diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/DivisionPropertiesImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/DivisionPropertiesImpl.java index 63cbc02ed6..b3e8dd94d0 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/impl/DivisionPropertiesImpl.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/DivisionPropertiesImpl.java @@ -28,6 +28,7 @@ class DivisionPropertiesImpl implements DivisionProperties { private final TimeDuration rpcTimeoutMax; private final TimeDuration rpcSleepTime; private final TimeDuration rpcSlownessTimeout; + private final TimeDuration leaderLeaseTimeout; DivisionPropertiesImpl(RaftProperties properties) { this.rpcTimeoutMin = RaftServerConfigKeys.Rpc.timeoutMin(properties); @@ -35,6 +36,11 @@ class DivisionPropertiesImpl implements DivisionProperties { Preconditions.assertTrue(rpcTimeoutMax.compareTo(rpcTimeoutMin) >= 0, "rpcTimeoutMax = %s < rpcTimeoutMin = %s", rpcTimeoutMax, rpcTimeoutMin); + final double leaderLeaseTimeoutRatio = RaftServerConfigKeys.Read.leaderLeaseTimeoutRatio(properties); + this.leaderLeaseTimeout = this.rpcTimeoutMin.multiply(leaderLeaseTimeoutRatio); + Preconditions.assertTrue(rpcTimeoutMin.compareTo(leaderLeaseTimeout) >= 0, + "rpcTimeoutMin = %s < leaderLeaseTimeout = %s", rpcTimeoutMin, leaderLeaseTimeout); + this.rpcSleepTime = RaftServerConfigKeys.Rpc.sleepTime(properties); this.rpcSlownessTimeout = RaftServerConfigKeys.Rpc.slownessTimeout(properties); } @@ -49,6 +55,11 @@ public TimeDuration maxRpcTimeout() { return rpcTimeoutMax; } + /** @return the ratio of leader lease timeout */ + public TimeDuration leaderLeaseTimeout() { + return leaderLeaseTimeout; + } + @Override public TimeDuration rpcSleepTime() { return rpcSleepTime;