diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/DeleteBlocksCommandHandler.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/DeleteBlocksCommandHandler.java index dbc6b72968f..419b27b5654 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/DeleteBlocksCommandHandler.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/DeleteBlocksCommandHandler.java @@ -480,8 +480,10 @@ public void handleTasksResults( try { DeleteBlockTransactionExecutionResult result = f.get(); handler.accept(result); - } catch (InterruptedException | ExecutionException e) { + } catch (ExecutionException e) { LOG.error("task failed.", e); + } catch (InterruptedException e) { + LOG.error("task interrupted.", e); Thread.currentThread().interrupt(); } }); diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestDeleteBlocksCommandHandler.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestDeleteBlocksCommandHandler.java index bc9c33197a0..85d20f509af 100644 --- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestDeleteBlocksCommandHandler.java +++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestDeleteBlocksCommandHandler.java @@ -40,13 +40,16 @@ import java.io.IOException; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.apache.hadoop.hdds.HddsConfigKeys; @@ -271,6 +274,28 @@ public List> answer( blockDeleteMetrics.getTotalLockTimeoutTransactionCount()); } + @Test + public void testDeleteBlocksCommandHandlerExceptionShouldNotInterrupt() throws Exception { + setup(); + // future task will throw first execution exception, and next one will succeed + doAnswer((Answer>>) invocationOnMock -> { + List> result = new ArrayList<>(); + CompletableFuture future = + new CompletableFuture<>(); + future.completeExceptionally(new ExecutionException("Simulated Exception", new IOException())); + result.add(future); + future = new CompletableFuture<>(); + future.complete(new DeleteBlockTransactionExecutionResult(null, false)); + result.add(future); + return result; + }).when(handler).submitTasks(any()); + + // last task as success should be returned as result, ignoring the first failed task + List deleteBlockTransactionResults = + handler.executeCmdWithRetry(Collections.emptyList()); + assertEquals(1, deleteBlockTransactionResults.size()); + } + @ContainerTestVersionInfo.ContainerTest public void testDeleteCmdWorkerInterval( ContainerTestVersionInfo versionInfo) throws Exception {