diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java index ddaa066373fa..936ad5a29204 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java @@ -267,8 +267,7 @@ public TransactionContext startTransaction( @Override public TransactionContext preAppendTransaction(TransactionContext trx) throws IOException { - OMRequest request = OMRatisHelper.convertByteStringToOMRequest( - trx.getStateMachineLogEntry().getLogData()); + final OMRequest request = (OMRequest) trx.getStateMachineContext(); OzoneManagerProtocolProtos.Type cmdType = request.getCmdType(); OzoneManagerPrepareState prepareState = ozoneManager.getPrepareState(); @@ -314,7 +313,11 @@ public TransactionContext preAppendTransaction(TransactionContext trx) @Override public CompletableFuture applyTransaction(TransactionContext trx) { try { - OMRequest request = OMRatisHelper.convertByteStringToOMRequest( + // For the Leader, the OMRequest is set in trx in startTransaction. + // For Followers, the OMRequest hast to be converted from the log entry. + final Object context = trx.getStateMachineContext(); + final OMRequest request = context != null ? (OMRequest) context + : OMRatisHelper.convertByteStringToOMRequest( trx.getStateMachineLogEntry().getLogData()); long trxLogIndex = trx.getLogEntry().getIndex(); // In the current approach we have one single global thread executor. @@ -554,6 +557,7 @@ private TransactionContext handleStartTransactionRequests( .setStateMachine(this) .setServerRole(RaftProtos.RaftPeerRole.LEADER) .setLogData(raftClientRequest.getMessage().getContent()) + .setStateMachineContext(omRequest) .build(); } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java index 0cfa9dae9ef5..277a8aae44aa 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java @@ -343,6 +343,7 @@ private TransactionContext mockTransactionContext(OMRequest request) { TransactionContext mockTrx = Mockito.mock(TransactionContext.class); when(mockTrx.getStateMachineLogEntry()).thenReturn(logEntry); + when(mockTrx.getStateMachineContext()).thenReturn(request); return mockTrx; }