RATIS-2004. Fix EQ_COMPARETO_USE_OBJECT_EQUALS in LogSegment (#1020)
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 1e0ef66..0750d2c 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
@@ -17,7 +17,6 @@
*/
package org.apache.ratis.server.raftlog.segmented;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.ratis.proto.RaftProtos.LogEntryProto;
import org.apache.ratis.server.RaftServerConfigKeys.Log.CorruptionPolicy;
import org.apache.ratis.server.metrics.SegmentedRaftLogMetrics;
@@ -39,6 +38,7 @@
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -56,7 +56,8 @@
*
* This class will be protected by the {@link SegmentedRaftLog}'s read-write lock.
*/
-public final class LogSegment implements Comparable<Long> {
+public final class LogSegment {
+
static final Logger LOG = LoggerFactory.getLogger(LogSegment.class);
enum Op {
@@ -452,9 +453,17 @@
"log-" + startIndex + "_" + endIndex;
}
- @Override
- @SuppressFBWarnings("EQ_COMPARETO_USE_OBJECT_EQUALS")
- public int compareTo(Long l) {
+ /** Comparator to find <code>index</code> in list of <code>LogSegment</code>s. */
+ static final Comparator<Object> SEGMENT_TO_INDEX_COMPARATOR = (o1, o2) -> {
+ if (o1 instanceof LogSegment && o2 instanceof Long) {
+ return ((LogSegment) o1).compareTo((Long) o2);
+ } else if (o1 instanceof Long && o2 instanceof LogSegment) {
+ return Integer.compare(0, ((LogSegment) o2).compareTo((Long) o1));
+ }
+ throw new IllegalStateException("Unexpected objects to compare(" + o1 + "," + o2 + ")");
+ };
+
+ private int compareTo(Long l) {
return (l >= getStartIndex() && l <= getEndIndex()) ? 0 :
(this.getEndIndex() < l ? -1 : 1);
}
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 81f4677..1d08316 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
@@ -244,13 +244,13 @@
int binarySearch(long index) {
try(AutoCloseableLock readLock = readLock()) {
- return Collections.binarySearch(segments, index);
+ return Collections.binarySearch(segments, index, LogSegment.SEGMENT_TO_INDEX_COMPARATOR);
}
}
LogSegment search(long index) {
try(AutoCloseableLock readLock = readLock()) {
- final int i = Collections.binarySearch(segments, index);
+ final int i = Collections.binarySearch(segments, index, LogSegment.SEGMENT_TO_INDEX_COMPARATOR);
return i < 0? null: segments.get(i);
}
}
@@ -261,7 +261,7 @@
long index = startIndex;
try(AutoCloseableLock readLock = readLock()) {
- searchIndex = Collections.binarySearch(segments, startIndex);
+ searchIndex = Collections.binarySearch(segments, startIndex, LogSegment.SEGMENT_TO_INDEX_COMPARATOR);
if (searchIndex >= 0) {
for(int i = searchIndex; i < segments.size() && index < realEnd; i++) {
final LogSegment s = segments.get(i);