This is an automated email from the ASF dual-hosted git repository.
ljain pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ratis.git
The following commit(s) were added to refs/heads/master by this push:
new 0838be8e RATIS-1563. Better error message when
stateMachine.data().read(entry) fails. (#631)
0838be8e is described below
commit 0838be8e6715f59bd86967c53902fc1abb6bbd11
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Thu Apr 28 18:15:36 2022 +0800
RATIS-1563. Better error message when stateMachine.data().read(entry)
fails. (#631)
---
.../main/java/org/apache/ratis/statemachine/StateMachine.java | 3 +--
.../main/java/org/apache/ratis/server/raftlog/RaftLogBase.java | 9 ++++++++-
.../apache/ratis/server/raftlog/segmented/SegmentedRaftLog.java | 3 ++-
3 files changed, 11 insertions(+), 4 deletions(-)
diff --git
a/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java
b/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java
index 3eae3410..0fba2e69 100644
---
a/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java
+++
b/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java
@@ -74,9 +74,8 @@ public interface StateMachine extends Closeable {
*
* @return a future for the read task.
*/
- @SuppressFBWarnings("NP_NULL_PARAM_DEREF")
default CompletableFuture<ByteString> read(LogEntryProto entry) {
- return CompletableFuture.completedFuture(null);
+ throw new UnsupportedOperationException("This method is NOT supported.");
}
/**
diff --git
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/RaftLogBase.java
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/RaftLogBase.java
index f0757575..0cce06f1 100644
---
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/RaftLogBase.java
+++
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/RaftLogBase.java
@@ -375,7 +375,14 @@ public abstract class RaftLogBase implements RaftLog {
EntryWithDataImpl(LogEntryProto logEntry, CompletableFuture<ByteString>
future) {
this.logEntry = logEntry;
- this.future = future;
+ this.future = future == null? null:
future.thenApply(this::checkStateMachineData);
+ }
+
+ private ByteString checkStateMachineData(ByteString data) {
+ if (data == null) {
+ throw new IllegalStateException("State machine data is null for log
entry " + logEntry);
+ }
+ return data;
}
@Override
diff --git
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLog.java
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLog.java
index b8709870..f03095ca 100644
---
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLog.java
+++
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLog.java
@@ -46,6 +46,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
import java.util.function.Consumer;
import java.util.function.LongSupplier;
@@ -295,7 +296,7 @@ public class SegmentedRaftLog extends RaftLogBase {
if (stateMachine != null) {
future = stateMachine.data().read(entry).exceptionally(ex -> {
stateMachine.event().notifyLogFailed(ex, entry);
- return null;
+ throw new CompletionException("Failed to read state machine data for
log entry " + entry, ex);
});
}
return newEntryWithData(entry, future);