From ac65d11efba3b38e08477e824018727b31224819 Mon Sep 17 00:00:00 2001 From: Ivan Andika Date: Fri, 2 Jan 2026 11:44:09 +0800 Subject: [PATCH 1/8] RATIS-2379. Support returning applied index for ReadIndex --- ratis-docs/src/site/markdown/configurations.md | 8 ++++++++ .../ratis/server/RaftServerConfigKeys.java | 11 +++++++++++ .../ratis/server/impl/LeaderStateImpl.java | 17 +++++++++++------ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/ratis-docs/src/site/markdown/configurations.md b/ratis-docs/src/site/markdown/configurations.md index 4caf11b30e..dfe1076999 100644 --- a/ratis-docs/src/site/markdown/configurations.md +++ b/ratis-docs/src/site/markdown/configurations.md @@ -209,6 +209,14 @@ if it fails to receive any RPC responses from this peer within this specified ti | **Type** | double, ranging from (0.0,1.0) | | **Default** | 0.9 | +-------------------------------------------------------------------------------- + +| **Property** | `raft.server.read-index.use.applied-index.enabled` | +|:----------------|:--------------------------------------------------------------------------| +| **Description** | whether leader return applied index instead of commit index for ReadIndex | +| **Type** | boolean | +| **Default** | false | + ### Read After Write - Configurations related to read-after-write-consistency 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 002286c4ca..3b61a1a70a 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 @@ -265,6 +265,17 @@ static void setWriteIndexCacheExpiryTime(RaftProperties properties, TimeDuration setTimeDuration(properties::setTimeDuration, WRITE_INDEX_CACHE_EXPIRY_TIME_KEY, expiryTime); } } + + interface ReadIndex { + String PREFIX = Read.PREFIX + ".read-index"; + + String READ_INDEX_USE_APPLIED_INDEX_ENABLED_KEY = PREFIX + ".use.applied-index.enabled"; + boolean READ_INDEX_USE_APPLIED_INDEX_ENABLED_DEFAULT = false; + static boolean readIndexUseAppliedIndexEnabled(RaftProperties properties) { + return getBoolean(properties::getBoolean, READ_INDEX_USE_APPLIED_INDEX_ENABLED_KEY, + READ_INDEX_USE_APPLIED_INDEX_ENABLED_DEFAULT, getDefaultLog()); + } + } } interface Write { diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java index 836b15bcdb..8c77fe18a6 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java @@ -353,6 +353,7 @@ boolean isApplied() { private final PendingStepDown pendingStepDown; private final ReadIndexHeartbeats readIndexHeartbeats; + private final boolean readIndexUseAppliedIndexEnabled; private final LeaderLease lease; LeaderStateImpl(RaftServerImpl server) { @@ -389,6 +390,8 @@ boolean isApplied() { } else { this.followerMaxGapThreshold = (long) (followerGapRatioMax * maxPendingRequests); } + this.readIndexUseAppliedIndexEnabled = RaftServerConfigKeys.Read.ReadIndex + .readIndexUseAppliedIndexEnabled(properties); final RaftConfigurationImpl conf = state.getRaftConf(); Collection others = conf.getOtherPeers(server.getId()); @@ -1134,21 +1137,23 @@ public boolean checkLeadership() { /** * Obtain the current readIndex for read only requests. See Raft paper section 6.4. * 1. Leader makes sure at least one log from current term is committed. - * 2. Leader record last committed index as readIndex. + * 2. Leader record last committed index or applied index (depending on configuration) as readIndex. * 3. Leader broadcast heartbeats to followers and waits for acknowledgements. * 4. If majority respond success, returns readIndex. * @return current readIndex. */ CompletableFuture getReadIndex(Long readAfterWriteConsistentIndex) { - final long commitIndex = server.getRaftLog().getLastCommittedIndex(); + final long lastAppliedOrCommitIndex = readIndexUseAppliedIndexEnabled ? + server.getState().getLastAppliedIndex() : server.getRaftLog().getLastCommittedIndex(); final long readIndex; - if (readAfterWriteConsistentIndex != null && readAfterWriteConsistentIndex > commitIndex) { + if (readAfterWriteConsistentIndex != null && readAfterWriteConsistentIndex > lastAppliedOrCommitIndex) { readIndex = readAfterWriteConsistentIndex; } else { - readIndex = commitIndex; + readIndex = lastAppliedOrCommitIndex; } - LOG.debug("readIndex={} (commitIndex={}, readAfterWriteConsistentIndex={})", - readIndex, commitIndex, readAfterWriteConsistentIndex); + LOG.debug("readIndex={} ({}Index={}, readAfterWriteConsistentIndex={})", + readIndex, readIndexUseAppliedIndexEnabled ? "applied" : "commit", + lastAppliedOrCommitIndex, readAfterWriteConsistentIndex); // if group contains only one member, fast path if (server.getRaftConf().isSingleton()) { From 1e061e95903b6c60e9aa757392786a18d692c4e8 Mon Sep 17 00:00:00 2001 From: Ivan Andika Date: Tue, 6 Jan 2026 23:26:04 +0800 Subject: [PATCH 2/8] Add test --- .../java/org/apache/ratis/LinearizableReadTests.java | 2 ++ .../grpc/TestLinearizableLeaderLeaseReadWithGrpc.java | 5 +++++ ...rizableReadAppliedIndexLeaderLeaseReadWithGrpc.java | 10 ++++++++++ .../grpc/TestLinearizableReadAppliedIndexWithGrpc.java | 10 ++++++++++ .../ratis/grpc/TestLinearizableReadWithGrpc.java | 5 +++++ 5 files changed, 32 insertions(+) create mode 100644 ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java create mode 100644 ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java diff --git a/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java b/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java index 91bd2f28d6..fbbd90df49 100644 --- a/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java +++ b/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java @@ -60,6 +60,8 @@ public abstract class LinearizableReadTests public abstract boolean isLeaderLeaseEnabled(); + public abstract boolean readIndexUseAppliedIndex(); + public abstract void assertRaftProperties(RaftProperties properties); void runWithNewCluster(CheckedConsumer testCase) throws Exception { diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableLeaderLeaseReadWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableLeaderLeaseReadWithGrpc.java index e45d8f4ff4..df251843e8 100644 --- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableLeaderLeaseReadWithGrpc.java +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableLeaderLeaseReadWithGrpc.java @@ -34,6 +34,11 @@ public boolean isLeaderLeaseEnabled() { return true; } + @Override + public boolean readIndexUseAppliedIndex() { + return false; + } + @Override public void assertRaftProperties(RaftProperties p) { assertOption(LINEARIZABLE, p); diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java new file mode 100644 index 0000000000..94fbdfa5bb --- /dev/null +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java @@ -0,0 +1,10 @@ +package org.apache.ratis.grpc; + +public class TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc + extends TestLinearizableLeaderLeaseReadWithGrpc { + + @Override + public boolean readIndexUseAppliedIndex() { + return true; + } +} diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java new file mode 100644 index 0000000000..e5d9ce7549 --- /dev/null +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java @@ -0,0 +1,10 @@ +package org.apache.ratis.grpc; + +public class TestLinearizableReadAppliedIndexWithGrpc + extends TestLinearizableReadWithGrpc { + + @Override + public boolean readIndexUseAppliedIndex() { + return true; + } +} diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadWithGrpc.java index a434fe0003..cd608483c2 100644 --- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadWithGrpc.java +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadWithGrpc.java @@ -34,6 +34,11 @@ public boolean isLeaderLeaseEnabled() { return false; } + @Override + public boolean readIndexUseAppliedIndex() { + return false; + } + @Override public void assertRaftProperties(RaftProperties p) { assertOption(LINEARIZABLE, p); From f64c85562f85bf4223e95adafe8cf6c20507da2a Mon Sep 17 00:00:00 2001 From: Ivan Andika Date: Tue, 6 Jan 2026 23:27:55 +0800 Subject: [PATCH 3/8] Fix rat --- ...ReadAppliedIndexLeaderLeaseReadWithGrpc.java | 17 +++++++++++++++++ ...estLinearizableReadAppliedIndexWithGrpc.java | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java index 94fbdfa5bb..06bcb1948b 100644 --- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.ratis.grpc; public class TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java index e5d9ce7549..9c5bda6720 100644 --- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.ratis.grpc; public class TestLinearizableReadAppliedIndexWithGrpc From 76be5c5828a47707f159af4dbcf90b49fe2dc10d Mon Sep 17 00:00:00 2001 From: Ivan Andika Date: Wed, 7 Jan 2026 09:19:05 +0800 Subject: [PATCH 4/8] Add setter --- .../java/org/apache/ratis/server/RaftServerConfigKeys.java | 4 ++++ 1 file changed, 4 insertions(+) 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 3b61a1a70a..2fb1bf32a6 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 @@ -275,6 +275,10 @@ static boolean readIndexUseAppliedIndexEnabled(RaftProperties properties) { return getBoolean(properties::getBoolean, READ_INDEX_USE_APPLIED_INDEX_ENABLED_KEY, READ_INDEX_USE_APPLIED_INDEX_ENABLED_DEFAULT, getDefaultLog()); } + + static void setReadIndexUseAppliedIndexEnabled(RaftProperties properties, boolean enabled) { + setBoolean(properties::setBoolean, READ_INDEX_USE_APPLIED_INDEX_ENABLED_KEY, enabled); + } } } From bdd321b9b0f2118da78b61f796ffd64834e68ab1 Mon Sep 17 00:00:00 2001 From: Ivan Andika Date: Wed, 7 Jan 2026 09:41:08 +0800 Subject: [PATCH 5/8] Fix configuration doc --- ratis-docs/src/site/markdown/configurations.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ratis-docs/src/site/markdown/configurations.md b/ratis-docs/src/site/markdown/configurations.md index dfe1076999..b9378f1c0d 100644 --- a/ratis-docs/src/site/markdown/configurations.md +++ b/ratis-docs/src/site/markdown/configurations.md @@ -209,14 +209,6 @@ if it fails to receive any RPC responses from this peer within this specified ti | **Type** | double, ranging from (0.0,1.0) | | **Default** | 0.9 | --------------------------------------------------------------------------------- - -| **Property** | `raft.server.read-index.use.applied-index.enabled` | -|:----------------|:--------------------------------------------------------------------------| -| **Description** | whether leader return applied index instead of commit index for ReadIndex | -| **Type** | boolean | -| **Default** | false | - ### Read After Write - Configurations related to read-after-write-consistency @@ -226,6 +218,13 @@ if it fails to receive any RPC responses from this peer within this specified ti | **Type** | TimeDuration | | **Default** | 60s | +### Read Index - Configurations related to ReadIndex used in linearizable read + +| **Property** | `raft.server.read.read-index.use.applied-index.enabled` | +|:----------------|:--------------------------------------------------------------------------| +| **Description** | whether leader return applied index instead of commit index for ReadIndex | +| **Type** | boolean | +| **Default** | false | ### Write - Configurations related to write requests. From 1be149ebe8398bb477f47e0218b0150770cd778a Mon Sep 17 00:00:00 2001 From: Ivan Andika Date: Thu, 8 Jan 2026 12:03:44 +0800 Subject: [PATCH 6/8] Address comments --- ratis-docs/src/site/markdown/configurations.md | 10 +++++----- .../ratis/server/RaftServerConfigKeys.java | 14 +++++++------- .../ratis/server/impl/LeaderStateImpl.java | 16 ++++++++-------- .../org/apache/ratis/LinearizableReadTests.java | 2 +- .../TestLinearizableLeaderLeaseReadWithGrpc.java | 2 +- ...eReadAppliedIndexLeaderLeaseReadWithGrpc.java | 2 +- ...TestLinearizableReadAppliedIndexWithGrpc.java | 2 +- .../ratis/grpc/TestLinearizableReadWithGrpc.java | 2 +- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/ratis-docs/src/site/markdown/configurations.md b/ratis-docs/src/site/markdown/configurations.md index b9378f1c0d..acd1cb9f9e 100644 --- a/ratis-docs/src/site/markdown/configurations.md +++ b/ratis-docs/src/site/markdown/configurations.md @@ -220,11 +220,11 @@ if it fails to receive any RPC responses from this peer within this specified ti ### Read Index - Configurations related to ReadIndex used in linearizable read -| **Property** | `raft.server.read.read-index.use.applied-index.enabled` | -|:----------------|:--------------------------------------------------------------------------| -| **Description** | whether leader return applied index instead of commit index for ReadIndex | -| **Type** | boolean | -| **Default** | false | +| **Property** | `raft.server.read.read-index.applied-index.enabled` | +|:----------------|:----------------------------------------------------------------------| +| **Description** | whether applied index (instead of commit index) is used for ReadIndex | +| **Type** | boolean | +| **Default** | false | ### Write - Configurations related to 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 2fb1bf32a6..59a96b4c56 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 @@ -269,15 +269,15 @@ static void setWriteIndexCacheExpiryTime(RaftProperties properties, TimeDuration interface ReadIndex { String PREFIX = Read.PREFIX + ".read-index"; - String READ_INDEX_USE_APPLIED_INDEX_ENABLED_KEY = PREFIX + ".use.applied-index.enabled"; - boolean READ_INDEX_USE_APPLIED_INDEX_ENABLED_DEFAULT = false; - static boolean readIndexUseAppliedIndexEnabled(RaftProperties properties) { - return getBoolean(properties::getBoolean, READ_INDEX_USE_APPLIED_INDEX_ENABLED_KEY, - READ_INDEX_USE_APPLIED_INDEX_ENABLED_DEFAULT, getDefaultLog()); + String READ_INDEX_APPLIED_INDEX_ENABLED_KEY = PREFIX + ".applied-index.enabled"; + boolean READ_INDEX_APPLIED_INDEX_ENABLED_DEFAULT = false; + static boolean readIndexAppliedIndexEnabled(RaftProperties properties) { + return getBoolean(properties::getBoolean, READ_INDEX_APPLIED_INDEX_ENABLED_KEY, + READ_INDEX_APPLIED_INDEX_ENABLED_DEFAULT, getDefaultLog()); } - static void setReadIndexUseAppliedIndexEnabled(RaftProperties properties, boolean enabled) { - setBoolean(properties::setBoolean, READ_INDEX_USE_APPLIED_INDEX_ENABLED_KEY, enabled); + static void setReadIndexAppliedIndexEnabled(RaftProperties properties, boolean enabled) { + setBoolean(properties::setBoolean, READ_INDEX_APPLIED_INDEX_ENABLED_KEY, enabled); } } } diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java index 8c77fe18a6..c1def56c96 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java @@ -353,7 +353,7 @@ boolean isApplied() { private final PendingStepDown pendingStepDown; private final ReadIndexHeartbeats readIndexHeartbeats; - private final boolean readIndexUseAppliedIndexEnabled; + private final boolean readIndexAppliedIndexEnabled; private final LeaderLease lease; LeaderStateImpl(RaftServerImpl server) { @@ -390,8 +390,8 @@ boolean isApplied() { } else { this.followerMaxGapThreshold = (long) (followerGapRatioMax * maxPendingRequests); } - this.readIndexUseAppliedIndexEnabled = RaftServerConfigKeys.Read.ReadIndex - .readIndexUseAppliedIndexEnabled(properties); + this.readIndexAppliedIndexEnabled = RaftServerConfigKeys.Read.ReadIndex + .readIndexAppliedIndexEnabled(properties); final RaftConfigurationImpl conf = state.getRaftConf(); Collection others = conf.getOtherPeers(server.getId()); @@ -1143,17 +1143,17 @@ public boolean checkLeadership() { * @return current readIndex. */ CompletableFuture getReadIndex(Long readAfterWriteConsistentIndex) { - final long lastAppliedOrCommitIndex = readIndexUseAppliedIndexEnabled ? + final long index = readIndexAppliedIndexEnabled ? server.getState().getLastAppliedIndex() : server.getRaftLog().getLastCommittedIndex(); final long readIndex; - if (readAfterWriteConsistentIndex != null && readAfterWriteConsistentIndex > lastAppliedOrCommitIndex) { + if (readAfterWriteConsistentIndex != null && readAfterWriteConsistentIndex > index) { readIndex = readAfterWriteConsistentIndex; } else { - readIndex = lastAppliedOrCommitIndex; + readIndex = index; } LOG.debug("readIndex={} ({}Index={}, readAfterWriteConsistentIndex={})", - readIndex, readIndexUseAppliedIndexEnabled ? "applied" : "commit", - lastAppliedOrCommitIndex, readAfterWriteConsistentIndex); + readIndex, readIndexAppliedIndexEnabled ? "applied" : "commit", + index, readAfterWriteConsistentIndex); // if group contains only one member, fast path if (server.getRaftConf().isSingleton()) { diff --git a/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java b/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java index fbbd90df49..c8e995d606 100644 --- a/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java +++ b/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java @@ -60,7 +60,7 @@ public abstract class LinearizableReadTests public abstract boolean isLeaderLeaseEnabled(); - public abstract boolean readIndexUseAppliedIndex(); + public abstract boolean readIndexAppliedIndexEnabled(); public abstract void assertRaftProperties(RaftProperties properties); diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableLeaderLeaseReadWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableLeaderLeaseReadWithGrpc.java index df251843e8..d637498d73 100644 --- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableLeaderLeaseReadWithGrpc.java +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableLeaderLeaseReadWithGrpc.java @@ -35,7 +35,7 @@ public boolean isLeaderLeaseEnabled() { } @Override - public boolean readIndexUseAppliedIndex() { + public boolean readIndexAppliedIndexEnabled() { return false; } diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java index 06bcb1948b..9bf3e307be 100644 --- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc.java @@ -21,7 +21,7 @@ public class TestLinearizableReadAppliedIndexLeaderLeaseReadWithGrpc extends TestLinearizableLeaderLeaseReadWithGrpc { @Override - public boolean readIndexUseAppliedIndex() { + public boolean readIndexAppliedIndexEnabled() { return true; } } diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java index 9c5bda6720..c019aac166 100644 --- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadAppliedIndexWithGrpc.java @@ -21,7 +21,7 @@ public class TestLinearizableReadAppliedIndexWithGrpc extends TestLinearizableReadWithGrpc { @Override - public boolean readIndexUseAppliedIndex() { + public boolean readIndexAppliedIndexEnabled() { return true; } } diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadWithGrpc.java index cd608483c2..3e8860dd19 100644 --- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadWithGrpc.java +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestLinearizableReadWithGrpc.java @@ -35,7 +35,7 @@ public boolean isLeaderLeaseEnabled() { } @Override - public boolean readIndexUseAppliedIndex() { + public boolean readIndexAppliedIndexEnabled() { return false; } From 55025d8d3f55e7da9757fb6d874c4ae6b20077be Mon Sep 17 00:00:00 2001 From: Ivan Andika Date: Thu, 8 Jan 2026 12:06:58 +0800 Subject: [PATCH 7/8] Fix test --- .../src/test/java/org/apache/ratis/LinearizableReadTests.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java b/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java index c8e995d606..2bbb1989c8 100644 --- a/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java +++ b/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java @@ -77,6 +77,7 @@ public void setup() { CounterStateMachine.setProperties(p); RaftServerConfigKeys.Read.setOption(p, LINEARIZABLE); RaftServerConfigKeys.Read.setLeaderLeaseEnabled(p, isLeaderLeaseEnabled()); + RaftServerConfigKeys.Read.ReadIndex.setReadIndexAppliedIndexEnabled(p, readIndexAppliedIndexEnabled()); } @Test From 037db7d4f9f6d86ea34164877458071a3a3c5a8b Mon Sep 17 00:00:00 2001 From: Ivan Andika Date: Fri, 9 Jan 2026 10:29:09 +0800 Subject: [PATCH 8/8] Remove readIndex prefix --- .../apache/ratis/server/RaftServerConfigKeys.java | 14 +++++++------- .../apache/ratis/server/impl/LeaderStateImpl.java | 2 +- .../org/apache/ratis/LinearizableReadTests.java | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) 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 59a96b4c56..2538a472a8 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 @@ -269,15 +269,15 @@ static void setWriteIndexCacheExpiryTime(RaftProperties properties, TimeDuration interface ReadIndex { String PREFIX = Read.PREFIX + ".read-index"; - String READ_INDEX_APPLIED_INDEX_ENABLED_KEY = PREFIX + ".applied-index.enabled"; - boolean READ_INDEX_APPLIED_INDEX_ENABLED_DEFAULT = false; - static boolean readIndexAppliedIndexEnabled(RaftProperties properties) { - return getBoolean(properties::getBoolean, READ_INDEX_APPLIED_INDEX_ENABLED_KEY, - READ_INDEX_APPLIED_INDEX_ENABLED_DEFAULT, getDefaultLog()); + String APPLIED_INDEX_ENABLED_KEY = PREFIX + ".applied-index.enabled"; + boolean APPLIED_INDEX_ENABLED_DEFAULT = false; + static boolean appliedIndexEnabled(RaftProperties properties) { + return getBoolean(properties::getBoolean, APPLIED_INDEX_ENABLED_KEY, + APPLIED_INDEX_ENABLED_DEFAULT, getDefaultLog()); } - static void setReadIndexAppliedIndexEnabled(RaftProperties properties, boolean enabled) { - setBoolean(properties::setBoolean, READ_INDEX_APPLIED_INDEX_ENABLED_KEY, enabled); + static void setAppliedIndexEnabled(RaftProperties properties, boolean enabled) { + setBoolean(properties::setBoolean, APPLIED_INDEX_ENABLED_KEY, enabled); } } } diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java index c1def56c96..90d0b76df5 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java @@ -391,7 +391,7 @@ boolean isApplied() { this.followerMaxGapThreshold = (long) (followerGapRatioMax * maxPendingRequests); } this.readIndexAppliedIndexEnabled = RaftServerConfigKeys.Read.ReadIndex - .readIndexAppliedIndexEnabled(properties); + .appliedIndexEnabled(properties); final RaftConfigurationImpl conf = state.getRaftConf(); Collection others = conf.getOtherPeers(server.getId()); diff --git a/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java b/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java index 2bbb1989c8..b15ae3067f 100644 --- a/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java +++ b/ratis-server/src/test/java/org/apache/ratis/LinearizableReadTests.java @@ -77,7 +77,7 @@ public void setup() { CounterStateMachine.setProperties(p); RaftServerConfigKeys.Read.setOption(p, LINEARIZABLE); RaftServerConfigKeys.Read.setLeaderLeaseEnabled(p, isLeaderLeaseEnabled()); - RaftServerConfigKeys.Read.ReadIndex.setReadIndexAppliedIndexEnabled(p, readIndexAppliedIndexEnabled()); + RaftServerConfigKeys.Read.ReadIndex.setAppliedIndexEnabled(p, readIndexAppliedIndexEnabled()); } @Test