diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java index c9412c5be3d0..e1e2fdace25c 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java @@ -559,6 +559,7 @@ public void startDaemon() { ExitUtils.terminate(1, message, ex, LOG); }) .build().newThread(startStateMachineTask); + stateMachineThread.setPriority(Thread.MAX_PRIORITY); stateMachineThread.start(); } @@ -682,6 +683,7 @@ private void initCommandHandlerThread(ConfigurationSource config) { // We will have only one thread for command processing in a datanode. cmdProcessThread = getCommandHandlerThread(processCommandQueue); + cmdProcessThread.setPriority(Thread.NORM_PRIORITY); cmdProcessThread.start(); } @@ -751,6 +753,14 @@ public ReconfigurationHandler getReconfigurationHandler() { return reconfigurationHandler; } + public Thread getStateMachineThread() { + return stateMachineThread; + } + + public Thread getCmdProcessThread() { + return cmdProcessThread; + } + public VolumeChoosingPolicy getVolumeChoosingPolicy() { return volumeChoosingPolicy; } diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestDatanodeStateMachine.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestDatanodeStateMachine.java index 1a3893990956..2192fc7c3c75 100644 --- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestDatanodeStateMachine.java +++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestDatanodeStateMachine.java @@ -408,6 +408,26 @@ public void testDatanodeStateMachineWithInvalidConfiguration() }); } + @Test + public void testStateMachineThreadPriority() throws Exception { + DatanodeDetails datanodeDetails = getNewDatanodeDetails(); + DatanodeDetails.Port port = DatanodeDetails.newStandalonePort( + OzoneConfigKeys.HDDS_CONTAINER_IPC_PORT_DEFAULT); + datanodeDetails.setPort(port); + try (DatanodeStateMachine stateMachine = + new DatanodeStateMachine(datanodeDetails, conf)) { + stateMachine.startDaemon(); + + // Wait for CmdProcessThread to initialize + GenericTestUtils.waitFor(() + -> stateMachine.getCmdProcessThread() != null, 100, 3000); + Thread stateMachineThread = stateMachine.getStateMachineThread(); + Thread cmdProcessThread = stateMachine.getCmdProcessThread(); + // stateMachineThread priority is higher than cmdProcessThread + assertTrue(stateMachineThread.getPriority() > cmdProcessThread.getPriority()); + } + } + private DatanodeDetails getNewDatanodeDetails() { DatanodeDetails.Port containerPort = DatanodeDetails.newStandalonePort(0); DatanodeDetails.Port ratisPort = DatanodeDetails.newRatisPort(0);