This is an automated email from the ASF dual-hosted git repository.

williamsong pushed a commit to branch feature/leaderlease
in repository https://gitbox.apache.org/repos/asf/ratis.git

commit 078b11554da1b3c5a4b64815a1f8cd26fa4a5745
Author: William Song <[email protected]>
AuthorDate: Fri Aug 4 00:39:04 2023 +0800

    RATIS-1865. Add leader lease bound ratio configuration (#897)
---
 .../src/main/java/org/apache/ratis/conf/ConfUtils.java       |  9 +++++++++
 ratis-docs/src/site/markdown/configurations.md               |  7 +++++++
 .../java/org/apache/ratis/server/RaftServerConfigKeys.java   | 12 ++++++++++++
 .../org/apache/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 629d5a389..a642ebb9d 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 @@ public interface ConfUtils {
     };
   }
 
+  static BiConsumer<String, Double> requireMin(double min) {
+    return (key, value) -> {
+      if (value < min) {
+        throw new IllegalArgumentException(
+            key + " = " + value + " < min = " + min);
+      }
+    };
+  }
+
   static BiConsumer<String, Double> 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 4e37cfd76..7fa7ddf80 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 a8a7892dc..5551f9cdd 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 @@ public interface RaftServerConfigKeys {
       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 63cbc02ed..b3e8dd94d 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 @@ class DivisionPropertiesImpl implements DivisionProperties {
     return rpcTimeoutMax;
   }
 
+  /** @return the ratio of leader lease timeout */
+  public TimeDuration leaderLeaseTimeout() {
+    return leaderLeaseTimeout;
+  }
+
   @Override
   public TimeDuration rpcSleepTime() {
     return rpcSleepTime;

Reply via email to