Repository: incubator-ratis Updated Branches: refs/heads/master 00f80b446 -> 7a955ef43
RATIS-177. Raft Leader should not return LeaderNotReady Exception for old completed requests. Contributed by Lokesh Jain Project: http://git-wip-us.apache.org/repos/asf/incubator-ratis/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ratis/commit/7a955ef4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ratis/tree/7a955ef4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ratis/diff/7a955ef4 Branch: refs/heads/master Commit: 7a955ef438af44de89f031c49ec1bb763361d06a Parents: 00f80b4 Author: Tsz-Wo Nicholas Sze <[email protected]> Authored: Fri Jan 5 14:31:17 2018 +0800 Committer: Tsz-Wo Nicholas Sze <[email protected]> Committed: Fri Jan 5 14:31:17 2018 +0800 ---------------------------------------------------------------------- .../java/org/apache/ratis/server/impl/RaftServerImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7a955ef4/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java ---------------------------------------------------------------------- diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java index 89ea019..d039e6c 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java @@ -367,10 +367,12 @@ public class RaftServerImpl implements RaftServerProtocol, NotLeaderException exception = generateNotLeaderException(); final RaftClientReply reply = new RaftClientReply(request, exception); return RetryCache.failWithReply(reply, entry); - } else { - if (leaderState == null || !leaderState.isReady()) { - return RetryCache.failWithException(new LeaderNotReadyException(getId()), entry); + } else if (leaderState == null || !leaderState.isReady()) { + RetryCache.CacheEntry cacheEntry = retryCache.get(request.getClientId(), request.getCallId()); + if (cacheEntry != null && cacheEntry.isCompletedNormally()) { + return cacheEntry.getReplyFuture(); } + return RetryCache.failWithException(new LeaderNotReadyException(getId()), entry); } return null; }
