You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ratis.apache.org by ru...@apache.org on 2020/12/14 12:45:37 UTC

[incubator-ratis] branch master updated: RATIS-1239. Move the TermIndex implementation to TermIndex. (#354)

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

runzhiwang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-ratis.git


The following commit(s) were added to refs/heads/master by this push:
     new c5eafb9  RATIS-1239. Move the TermIndex implementation to TermIndex. (#354)
c5eafb9 is described below

commit c5eafb923440f3ad4b786bfe8ff64e57a2be08c4
Author: Tsz-Wo Nicholas Sze <sz...@apache.org>
AuthorDate: Mon Dec 14 20:43:05 2020 +0800

    RATIS-1239. Move the TermIndex implementation to TermIndex. (#354)
---
 .../apache/ratis/client/impl/ClientProtoUtils.java |  5 ++
 .../apache/ratis/grpc/server/GrpcLogAppender.java  |  5 +-
 .../ratis/logservice/server/LogStateMachine.java   |  2 +-
 .../apache/ratis/server/impl/RaftServerImpl.java   | 10 ++-
 .../apache/ratis/server/impl/ServerImplUtils.java  | 53 ---------------
 .../apache/ratis/server/impl/ServerProtoUtils.java | 23 ++-----
 .../org/apache/ratis/server/impl/ServerState.java  |  4 +-
 .../ratis/server/leader/LeaderProtoUtils.java      |  4 +-
 .../apache/ratis/server/protocol/TermIndex.java    | 76 +++++++++++++++-------
 .../apache/ratis/server/raftlog/LogProtoUtils.java |  2 +-
 .../ratis/server/raftlog/memory/MemoryRaftLog.java |  3 +-
 .../ratis/server/raftlog/segmented/LogSegment.java |  5 +-
 .../raftlog/segmented/SegmentedRaftLogCache.java   |  5 +-
 .../ratis/statemachine/impl/BaseStateMachine.java  |  4 +-
 .../statemachine/impl/FileListSnapshotInfo.java    |  2 +-
 .../impl/SimpleStateMachineStorage.java            |  2 +-
 16 files changed, 82 insertions(+), 123 deletions(-)

diff --git a/ratis-client/src/main/java/org/apache/ratis/client/impl/ClientProtoUtils.java b/ratis-client/src/main/java/org/apache/ratis/client/impl/ClientProtoUtils.java
index 7ef1290..ae53ab0 100644
--- a/ratis-client/src/main/java/org/apache/ratis/client/impl/ClientProtoUtils.java
+++ b/ratis-client/src/main/java/org/apache/ratis/client/impl/ClientProtoUtils.java
@@ -57,6 +57,11 @@ public interface ClientProtoUtils {
         .setSuccess(success);
   }
 
+  static RaftRpcRequestProto.Builder toRaftRpcRequestProtoBuilder(RaftGroupMemberId requestorId, RaftPeerId replyId) {
+    return toRaftRpcRequestProtoBuilder(requestorId.getPeerId().toByteString(),
+        replyId.toByteString(), requestorId.getGroupId(), null, null);
+  }
+
   static RaftRpcRequestProto.Builder toRaftRpcRequestProtoBuilder(
       ByteString requesterId, ByteString replyId, RaftGroupId groupId, Long callId,
       SlidingWindowEntry slidingWindowEntry) {
diff --git a/ratis-grpc/src/main/java/org/apache/ratis/grpc/server/GrpcLogAppender.java b/ratis-grpc/src/main/java/org/apache/ratis/grpc/server/GrpcLogAppender.java
index de03191..eee13f2 100644
--- a/ratis-grpc/src/main/java/org/apache/ratis/grpc/server/GrpcLogAppender.java
+++ b/ratis-grpc/src/main/java/org/apache/ratis/grpc/server/GrpcLogAppender.java
@@ -26,7 +26,6 @@ import org.apache.ratis.server.RaftServer;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.leader.FollowerInfo;
 import org.apache.ratis.server.leader.LeaderState;
-import org.apache.ratis.server.impl.ServerProtoUtils;
 import org.apache.ratis.server.leader.LogAppenderBase;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.util.ServerStringUtils;
@@ -585,9 +584,9 @@ public class GrpcLogAppender extends LogAppenderBase {
 
     AppendEntriesRequest(AppendEntriesRequestProto proto, RaftPeerId followerId, GrpcServerMetrics grpcServerMetrics) {
       this.callId = proto.getServerRequest().getCallId();
-      this.previousLog = proto.hasPreviousLog()? ServerProtoUtils.toTermIndex(proto.getPreviousLog()): null;
+      this.previousLog = proto.hasPreviousLog()? TermIndex.valueOf(proto.getPreviousLog()): null;
       this.entriesCount = proto.getEntriesCount();
-      this.lastEntry = entriesCount > 0? ServerProtoUtils.toTermIndex(proto.getEntries(entriesCount - 1)): null;
+      this.lastEntry = entriesCount > 0? TermIndex.valueOf(proto.getEntries(entriesCount - 1)): null;
 
       this.timer = grpcServerMetrics.getGrpcLogAppenderLatencyTimer(followerId.toString(), isHeartbeat());
       grpcServerMetrics.onRequestCreate(isHeartbeat());
diff --git a/ratis-logservice/src/main/java/org/apache/ratis/logservice/server/LogStateMachine.java b/ratis-logservice/src/main/java/org/apache/ratis/logservice/server/LogStateMachine.java
index 59db307..92fd7a0 100644
--- a/ratis-logservice/src/main/java/org/apache/ratis/logservice/server/LogStateMachine.java
+++ b/ratis-logservice/src/main/java/org/apache/ratis/logservice/server/LogStateMachine.java
@@ -145,7 +145,7 @@ public class LogStateMachine extends BaseStateMachine {
   void reset() {
     this.length = 0;
     this.dataRecordsSize = 0;
-    setLastAppliedTermIndex(TermIndex.newTermIndex(0, -1));
+    setLastAppliedTermIndex(TermIndex.valueOf(0, -1));
   }
 
   @Override
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 3de558b..c1d2839 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
@@ -949,7 +949,7 @@ class RaftServerImpl implements RaftServer.Division,
     return requestVote(RaftPeerId.valueOf(request.getRequestorId()),
         ProtoUtils.toRaftGroupId(request.getRaftGroupId()),
         r.getCandidateTerm(),
-        ServerProtoUtils.toTermIndex(r.getCandidateLastEntry()));
+        TermIndex.valueOf(r.getCandidateLastEntry()));
   }
 
   private RequestVoteReplyProto requestVote(
@@ -1055,8 +1055,7 @@ class RaftServerImpl implements RaftServer.Division,
     final RaftRpcRequestProto request = r.getServerRequest();
     final LogEntryProto[] entries = r.getEntriesList()
         .toArray(new LogEntryProto[r.getEntriesCount()]);
-    final TermIndex previous = r.hasPreviousLog() ?
-        ServerProtoUtils.toTermIndex(r.getPreviousLog()) : null;
+    final TermIndex previous = r.hasPreviousLog()? TermIndex.valueOf(r.getPreviousLog()) : null;
     final RaftPeerId requestorId = RaftPeerId.valueOf(request.getRequestorId());
 
     preAppendEntriesAsync(requestorId, ProtoUtils.toRaftGroupId(request.getRaftGroupId()), r.getLeaderTerm(),
@@ -1363,8 +1362,7 @@ class RaftServerImpl implements RaftServer.Division,
     final long currentTerm;
     final long leaderTerm = request.getLeaderTerm();
     InstallSnapshotRequestProto.SnapshotChunkProto snapshotChunkRequest = request.getSnapshotChunk();
-    final TermIndex lastTermIndex = ServerProtoUtils.toTermIndex(snapshotChunkRequest.getTermIndex());
-    final long lastIncludedIndex = lastTermIndex.getIndex();
+    final long lastIncludedIndex = snapshotChunkRequest.getTermIndex().getIndex();
     synchronized (this) {
       final boolean recognized = state.recognizeLeader(leaderId, leaderTerm);
       currentTerm = state.getCurrentTerm();
@@ -1410,7 +1408,7 @@ class RaftServerImpl implements RaftServer.Division,
       InstallSnapshotRequestProto request, RaftPeerId leaderId) throws IOException {
     final long currentTerm;
     final long leaderTerm = request.getLeaderTerm();
-    final TermIndex firstAvailableLogTermIndex = ServerProtoUtils.toTermIndex(
+    final TermIndex firstAvailableLogTermIndex = TermIndex.valueOf(
         request.getNotification().getFirstAvailableTermIndex());
     final long firstAvailableLogIndex = firstAvailableLogTermIndex.getIndex();
 
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerImplUtils.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerImplUtils.java
index cf92150..60c516c 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerImplUtils.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerImplUtils.java
@@ -81,57 +81,4 @@ public final class ServerImplUtils {
     final long p = Optional.ofNullable(followerPrevious).map(TermIndex::getIndex).orElse(RaftLog.LEAST_VALID_LOG_INDEX);
     return Math.min(leaderCommitIndex, p + numAppendEntries);
   }
-
-  public static TermIndex newTermIndex(long term, long index) {
-    return new TermIndexImpl(term, index);
-  }
-
-  private static class TermIndexImpl implements TermIndex {
-    private final long term;
-    private final long index; //log index; first index is 1.
-
-    TermIndexImpl(long term, long logIndex) {
-      this.term = term;
-      this.index = logIndex;
-    }
-
-    @Override
-    public long getTerm() {
-      return term;
-    }
-
-    @Override
-    public long getIndex() {
-      return index;
-    }
-
-    @Override
-    public int compareTo(TermIndex that) {
-      final int d = Long.compare(this.getTerm(), that.getTerm());
-      return d != 0 ? d : Long.compare(this.getIndex(), that.getIndex());
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (obj == this) {
-        return true;
-      } else if (obj == null || !(obj instanceof TermIndexImpl)) {
-        return false;
-      }
-
-      final TermIndexImpl that = (TermIndexImpl) obj;
-      return this.getTerm() == that.getTerm()
-          && this.getIndex() == that.getIndex();
-    }
-
-    @Override
-    public int hashCode() {
-      return Long.hashCode(term) ^ Long.hashCode(index);
-    }
-
-    @Override
-    public String toString() {
-      return TermIndex.toString(term, index);
-    }
-  }
 }
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerProtoUtils.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerProtoUtils.java
index 4d72380..f264652 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerProtoUtils.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerProtoUtils.java
@@ -31,17 +31,10 @@ import java.util.List;
 import java.util.Optional;
 
 /** Server proto utilities for internal use. */
-public interface ServerProtoUtils {
-  static TermIndex toTermIndex(TermIndexProto p) {
-    return p == null? null: TermIndex.newTermIndex(p.getTerm(), p.getIndex());
-  }
-
-  static TermIndex toTermIndex(LogEntryProto entry) {
-    return entry == null ? null :
-        TermIndex.newTermIndex(entry.getTerm(), entry.getIndex());
-  }
+final class ServerProtoUtils {
+  private ServerProtoUtils() {}
 
-  static RaftRpcReplyProto.Builder toRaftRpcReplyProtoBuilder(
+  private static RaftRpcReplyProto.Builder toRaftRpcReplyProtoBuilder(
       RaftPeerId requestorId, RaftGroupMemberId replyId, boolean success) {
     return ClientProtoUtils.toRaftRpcReplyProtoBuilder(
         requestorId.toByteString(), replyId.getPeerId().toByteString(), replyId.getGroupId(), null, success);
@@ -56,16 +49,10 @@ public interface ServerProtoUtils {
         .build();
   }
 
-  static RaftRpcRequestProto.Builder toRaftRpcRequestProtoBuilder(
-      RaftGroupMemberId requestorId, RaftPeerId replyId) {
-    return ClientProtoUtils.toRaftRpcRequestProtoBuilder(
-        requestorId.getPeerId().toByteString(), replyId.toByteString(), requestorId.getGroupId(), null, null);
-  }
-
   static RequestVoteRequestProto toRequestVoteRequestProto(
       RaftGroupMemberId requestorId, RaftPeerId replyId, long term, TermIndex lastEntry) {
     final RequestVoteRequestProto.Builder b = RequestVoteRequestProto.newBuilder()
-        .setServerRequest(toRaftRpcRequestProtoBuilder(requestorId, replyId))
+        .setServerRequest(ClientProtoUtils.toRaftRpcRequestProtoBuilder(requestorId, replyId))
         .setCandidateTerm(term);
     Optional.ofNullable(lastEntry).map(TermIndex::toProto).ifPresent(b::setCandidateLastEntry);
     return b.build();
@@ -129,7 +116,7 @@ public interface ServerProtoUtils {
       RaftGroupMemberId requestorId, RaftPeerId replyId, long leaderTerm,
       List<LogEntryProto> entries, long leaderCommit, boolean initializing,
       TermIndex previous, Collection<CommitInfoProto> commitInfos, long callId) {
-    RaftRpcRequestProto.Builder rpcRequest = toRaftRpcRequestProtoBuilder(requestorId, replyId)
+    final RaftRpcRequestProto.Builder rpcRequest = ClientProtoUtils.toRaftRpcRequestProtoBuilder(requestorId, replyId)
         .setCallId(callId);
     final AppendEntriesRequestProto.Builder b = AppendEntriesRequestProto
         .newBuilder()
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
index 396486b..0fd65a8 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
@@ -75,8 +75,6 @@ class ServerState implements Closeable {
   /**
    * Latest term server has seen.
    * Initialized to 0 on first boot, increases monotonically.
-   *
-   * @see TermIndex#isValidTerm(int)
    */
   private final AtomicLong currentTerm = new AtomicLong();
   /**
@@ -420,7 +418,7 @@ class ServerState implements Closeable {
     StateMachine sm = server.getStateMachine();
     sm.pause(); // pause the SM to prepare for install snapshot
     snapshotManager.installSnapshot(sm, request);
-    updateInstalledSnapshotIndex(ServerProtoUtils.toTermIndex(request.getSnapshotChunk().getTermIndex()));
+    updateInstalledSnapshotIndex(TermIndex.valueOf(request.getSnapshotChunk().getTermIndex()));
   }
 
   void updateInstalledSnapshotIndex(TermIndex lastTermIndexInSnapshot) {
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/leader/LeaderProtoUtils.java b/ratis-server/src/main/java/org/apache/ratis/server/leader/LeaderProtoUtils.java
index 8c3fbdf..3afb735 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/leader/LeaderProtoUtils.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/leader/LeaderProtoUtils.java
@@ -17,6 +17,7 @@
  */
 package org.apache.ratis.server.leader;
 
+import org.apache.ratis.client.impl.ClientProtoUtils;
 import org.apache.ratis.proto.RaftProtos.FileChunkProto;
 import org.apache.ratis.proto.RaftProtos.InstallSnapshotRequestProto;
 import org.apache.ratis.proto.RaftProtos.InstallSnapshotRequestProto.NotificationProto;
@@ -25,7 +26,6 @@ import org.apache.ratis.proto.RaftProtos.LogEntryProto;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftConfiguration;
 import org.apache.ratis.server.RaftServer;
-import org.apache.ratis.server.impl.ServerProtoUtils;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.raftlog.LogProtoUtils;
 
@@ -66,7 +66,7 @@ final class LeaderProtoUtils {
     final RaftConfiguration conf = server.getRaftConf();
     final LogEntryProto confLogEntryProto = LogProtoUtils.toLogEntryProto(conf, null, conf.getLogEntryIndex());
     return InstallSnapshotRequestProto.newBuilder()
-        .setServerRequest(ServerProtoUtils.toRaftRpcRequestProtoBuilder(server.getMemberId(), replyId))
+        .setServerRequest(ClientProtoUtils.toRaftRpcRequestProtoBuilder(server.getMemberId(), replyId))
         .setLeaderTerm(server.getInfo().getCurrentTerm())
         .setLastRaftConfigurationLogEntryProto(confLogEntryProto);
   }
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/protocol/TermIndex.java b/ratis-server/src/main/java/org/apache/ratis/server/protocol/TermIndex.java
index 9d92816..c4f90b9 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/protocol/TermIndex.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/protocol/TermIndex.java
@@ -19,22 +19,13 @@ package org.apache.ratis.server.protocol;
 
 import org.apache.ratis.proto.RaftProtos.LogEntryProto;
 import org.apache.ratis.proto.RaftProtos.TermIndexProto;
-import org.apache.ratis.server.impl.ServerImplUtils;
 
+import java.util.Comparator;
 import java.util.Optional;
-import java.util.function.LongFunction;
 
 /** The term and the log index defined in the Raft consensus algorithm. */
 public interface TermIndex extends Comparable<TermIndex> {
-  static TermIndex valueOf(TermIndexProto proto) {
-    return Optional.ofNullable(proto).map(p -> newTermIndex(p.getTerm(), p.getIndex())).orElse(null);
-  }
-
-  static TermIndex valueOf(LogEntryProto proto) {
-    return Optional.ofNullable(proto).map(p -> newTermIndex(p.getTerm(), p.getIndex())).orElse(null);
-  }
-
-  TermIndex[] EMPTY_TERMINDEX_ARRAY = {};
+  TermIndex[] EMPTY_ARRAY = {};
 
   /** @return the term. */
   long getTerm();
@@ -50,23 +41,60 @@ public interface TermIndex extends Comparable<TermIndex> {
         .build();
   }
 
-  /** A term number is valid iff it is greater than zero. */
-  static boolean isValidTerm(int term) {
-    return term > 0;
+  /** @return a {@link TermIndex} object from the given proto. */
+  static TermIndex valueOf(TermIndexProto proto) {
+    return Optional.ofNullable(proto).map(p -> valueOf(p.getTerm(), p.getIndex())).orElse(null);
   }
 
-  /** Create a new {@link TermIndex} instance. */
-  static TermIndex newTermIndex(long term, long index) {
-    return ServerImplUtils.newTermIndex(term, index);
+  /** @return a {@link TermIndex} object from the given proto. */
+  static TermIndex valueOf(LogEntryProto proto) {
+    return Optional.ofNullable(proto).map(p -> valueOf(p.getTerm(), p.getIndex())).orElse(null);
   }
 
-  LongFunction<String> LONG_TO_STRING = n -> n >= 0L? String.valueOf(n): "~";
+  /** @return a {@link TermIndex} object. */
+  static TermIndex valueOf(long term, long index) {
+    return new TermIndex() {
+      @Override
+      public long getTerm() {
+        return term;
+      }
 
-  /** @return a string representing the given term and index. */
-  static String toString(long term, long index) {
-    return String.format("(t:%s, i:%s)",
-        LONG_TO_STRING.apply(term), LONG_TO_STRING.apply(index));
-  }
-}
+      @Override
+      public long getIndex() {
+        return index;
+      }
+
+      @Override
+      public int compareTo(TermIndex that) {
+        return Comparator.comparingLong(TermIndex::getTerm).thenComparingLong(TermIndex::getIndex).compare(this, that);
+      }
+
+      @Override
+      public boolean equals(Object obj) {
+        if (obj == this) {
+          return true;
+        } else if (!(obj instanceof TermIndex)) {
+          return false;
+        }
 
+        final TermIndex that = (TermIndex) obj;
+        return this.getTerm() == that.getTerm()
+            && this.getIndex() == that.getIndex();
+      }
 
+      @Override
+      public int hashCode() {
+        return Long.hashCode(term) ^ Long.hashCode(index);
+      }
+
+      private String longToString(long n) {
+        return n >= 0L? String.valueOf(n) : "~";
+      }
+
+      @Override
+      public String toString() {
+        return String.format("(t:%s, i:%s)", longToString(term), longToString(index));
+      }
+    };
+  }
+}
\ No newline at end of file
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/LogProtoUtils.java b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/LogProtoUtils.java
index 7bcc47b..73b3667 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/LogProtoUtils.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/LogProtoUtils.java
@@ -59,7 +59,7 @@ public final class LogProtoUtils {
     } else {
       s = "";
     }
-    return TermIndex.toString(entry.getTerm(), entry.getIndex()) + ", " + entry.getLogEntryBodyCase() + s;
+    return TermIndex.valueOf(entry) + ", " + entry.getLogEntryBodyCase() + s;
   }
 
   public static String toLogEntryString(LogEntryProto entry) {
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/memory/MemoryRaftLog.java b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/memory/MemoryRaftLog.java
index 69004c4..3f19f5b 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/memory/MemoryRaftLog.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/memory/MemoryRaftLog.java
@@ -20,7 +20,6 @@ package org.apache.ratis.server.raftlog.memory;
 import org.apache.ratis.conf.RaftProperties;
 import org.apache.ratis.protocol.RaftGroupMemberId;
 import org.apache.ratis.protocol.RaftPeerId;
-import org.apache.ratis.server.impl.ServerProtoUtils;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.proto.RaftProtos.LogEntryProto;
 import org.apache.ratis.server.raftlog.RaftLog;
@@ -46,7 +45,7 @@ public class MemoryRaftLog extends RaftLog {
     }
 
     TermIndex getTermIndex(int i) {
-      return ServerProtoUtils.toTermIndex(get(i));
+      return TermIndex.valueOf(get(i));
     }
 
     int size() {
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/LogSegment.java b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/LogSegment.java
index 30249bb..01ffe44 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/LogSegment.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/LogSegment.java
@@ -19,7 +19,6 @@ package org.apache.ratis.server.raftlog.segmented;
 
 import org.apache.ratis.proto.RaftProtos.LogEntryProto;
 import org.apache.ratis.server.RaftServerConfigKeys.Log.CorruptionPolicy;
-import org.apache.ratis.server.impl.ServerProtoUtils;
 import org.apache.ratis.server.metrics.RaftLogMetrics;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.raftlog.LogProtoUtils;
@@ -93,7 +92,7 @@ public class LogSegment implements Comparable<Long> {
 
     LogRecord(long offset, LogEntryProto entry) {
       this.offset = offset;
-      this.termIndex = ServerProtoUtils.toTermIndex(entry);
+      this.termIndex = TermIndex.valueOf(entry);
     }
 
     TermIndex getTermIndex() {
@@ -233,7 +232,7 @@ public class LogSegment implements Comparable<Long> {
       // the on-disk log file should be truncated but has not been done yet.
       final AtomicReference<LogEntryProto> toReturn = new AtomicReference<>();
       readSegmentFile(file, startIndex, endIndex, isOpen, getLogCorruptionPolicy(), raftLogMetrics, entry -> {
-        final TermIndex ti = ServerProtoUtils.toTermIndex(entry);
+        final TermIndex ti = TermIndex.valueOf(entry);
         putEntryCache(ti, entry, Op.LOAD_SEGMENT_FILE);
         if (ti.equals(key.getTermIndex())) {
           toReturn.set(entry);
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
index 7624232..ea04f3c 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
@@ -20,7 +20,6 @@ package org.apache.ratis.server.raftlog.segmented;
 import org.apache.ratis.conf.RaftProperties;
 import org.apache.ratis.proto.RaftProtos.LogEntryProto;
 import org.apache.ratis.server.RaftServerConfigKeys;
-import org.apache.ratis.server.impl.ServerProtoUtils;
 import org.apache.ratis.server.metrics.RaftLogMetrics;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.raftlog.LogProtoUtils;
@@ -491,7 +490,7 @@ public class SegmentedRaftLogCache {
     }
     final long realEnd = Math.min(getEndIndex() + 1, endIndex);
     if (startIndex >= realEnd) {
-      return TermIndex.EMPTY_TERMINDEX_ARRAY;
+      return TermIndex.EMPTY_ARRAY;
     }
     return closedSegments.getTermIndex(startIndex, realEnd, openSegment);
   }
@@ -597,7 +596,7 @@ public class SegmentedRaftLogCache {
           if (LOG.isTraceEnabled()) {
             LOG.trace("{}: truncate to {}, arrayIndex={}, ti={}, storedEntry={}, entries={}",
                 name, truncateIndex, arrayIndex,
-                ServerProtoUtils.toTermIndex(entries[arrayIndex]), storedEntry,
+                TermIndex.valueOf(entries[arrayIndex]), storedEntry,
                 LogProtoUtils.toLogEntriesString(entries));
           }
 
diff --git a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
index b327d94..e27fb5b 100644
--- a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
+++ b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
@@ -57,7 +57,7 @@ public class BaseStateMachine implements StateMachine, StateMachine.DataApi,
   private final SortedMap<Long, CompletableFuture<Void>> transactionFutures = new TreeMap<>();
 
   public BaseStateMachine() {
-    setLastAppliedTermIndex(TermIndex.newTermIndex(0, -1));
+    setLastAppliedTermIndex(TermIndex.valueOf(0, -1));
   }
 
   public RaftPeerId getId() {
@@ -130,7 +130,7 @@ public class BaseStateMachine implements StateMachine, StateMachine.DataApi,
   }
 
   protected boolean updateLastAppliedTermIndex(long term, long index) {
-    final TermIndex newTI = TermIndex.newTermIndex(term, index);
+    final TermIndex newTI = TermIndex.valueOf(term, index);
     final TermIndex oldTI = lastAppliedTermIndex.getAndSet(newTI);
     if (!newTI.equals(oldTI)) {
       LOG.trace("{}: update lastAppliedTermIndex from {} to {}", getId(), oldTI, newTI);
diff --git a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/FileListSnapshotInfo.java b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/FileListSnapshotInfo.java
index 265523b..540c5bf 100644
--- a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/FileListSnapshotInfo.java
+++ b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/FileListSnapshotInfo.java
@@ -36,7 +36,7 @@ public class FileListSnapshotInfo implements SnapshotInfo {
   private final List<FileInfo> files;
 
   public FileListSnapshotInfo(List<FileInfo> files, long term, long index) {
-    this.termIndex = TermIndex.newTermIndex(term, index);
+    this.termIndex = TermIndex.valueOf(term, index);
     this.files = Collections.unmodifiableList(new ArrayList<>(files));
   }
 
diff --git a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/SimpleStateMachineStorage.java b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/SimpleStateMachineStorage.java
index 93e5470..f253728 100644
--- a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/SimpleStateMachineStorage.java
+++ b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/SimpleStateMachineStorage.java
@@ -113,7 +113,7 @@ public class SimpleStateMachineStorage implements StateMachineStorage {
     }
     final long term = Long.parseLong(m.group(1));
     final long index = Long.parseLong(m.group(2));
-    return TermIndex.newTermIndex(term, index);
+    return TermIndex.valueOf(term, index);
   }
 
   protected static String getTmpSnapshotFileName(long term, long endIndex) {