From 4438227a475b5bc807e51ccec490bd23fb2bcaa0 Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Fri, 29 Sep 2023 09:01:16 -0700 Subject: [PATCH 1/3] HDDS-9369. Avoid deserializing OMRequest multiple times in OzoneManagerStateMachine. --- .../hadoop/ozone/om/ratis/OzoneManagerStateMachine.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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..83507a7d8684 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,8 +313,7 @@ public TransactionContext preAppendTransaction(TransactionContext trx) @Override public CompletableFuture applyTransaction(TransactionContext trx) { try { - OMRequest request = OMRatisHelper.convertByteStringToOMRequest( - trx.getStateMachineLogEntry().getLogData()); + final OMRequest request = (OMRequest) trx.getStateMachineContext(); long trxLogIndex = trx.getLogEntry().getIndex(); // In the current approach we have one single global thread executor. // with single thread. Right now this is being done for correctness, as @@ -554,6 +552,7 @@ private TransactionContext handleStartTransactionRequests( .setStateMachine(this) .setServerRole(RaftProtos.RaftPeerRole.LEADER) .setLogData(raftClientRequest.getMessage().getContent()) + .setStateMachineContext(omRequest) .build(); } From 447fe7c93b25dec602b01100818153b8434c2f07 Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Fri, 29 Sep 2023 10:57:40 -0700 Subject: [PATCH 2/3] Fix NPE and added a comment. --- .../hadoop/ozone/om/ratis/OzoneManagerStateMachine.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 83507a7d8684..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 @@ -313,7 +313,12 @@ public TransactionContext preAppendTransaction(TransactionContext trx) @Override public CompletableFuture applyTransaction(TransactionContext trx) { try { - final OMRequest request = (OMRequest) trx.getStateMachineContext(); + // 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. // with single thread. Right now this is being done for correctness, as From 679b6b7dad9dcb1afd76414f1a61131c7d4f74f3 Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Fri, 29 Sep 2023 13:16:12 -0700 Subject: [PATCH 3/3] Update TestOzoneManagerStateMachine. --- .../hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java | 1 + 1 file changed, 1 insertion(+) 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; }