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);

Reply via email to