From 3ccd783c208625f98a862464531344108d6dd417 Mon Sep 17 00:00:00 2001 From: KUAN-HAO HUANG <101171023+rich7420@users.noreply.github.com> Date: Mon, 21 Sep 2026 17:09:47 +0800 Subject: [PATCH] HDDS-16460. Remove recovering entry when deleting container --- .../container/keyvalue/KeyValueHandler.java | 1 + .../keyvalue/TestKeyValueHandler.java | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java index 8dd68427001f..12112f1b0851 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java @@ -2599,6 +2599,7 @@ private void deleteInternal(Container container, boolean force) return; } containerLocked.markContainerForDelete(); + containerSet.removeRecoveringContainer(containerId); containerSet.removeContainer(containerId); ContainerLogger.logDeleted(containerLocked.getContainerData(), force); KeyValueContainerUtil.removeContainer(keyValueContainerData, conf); diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java index b4f9895a3362..47ae3b297d11 100644 --- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java +++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueHandler.java @@ -614,6 +614,32 @@ public void testDeleteContainer() throws IOException { } } + @Test + public void testDeleteRecoveringContainer() throws IOException { + HandlerWithVolumeSet handlerCtx = createKeyValueHandler(tempDir); + KeyValueHandler keyValueHandler = handlerCtx.getHandler(); + ContainerSet containerSet = handlerCtx.getContainerSet(); + try { + ContainerCommandRequestProto.Builder request = createContainerRequest(DATANODE_UUID, DUMMY_CONTAINER_ID) + .toBuilder(); + request.getCreateContainerBuilder().setState(State.RECOVERING); + assertThat(keyValueHandler.handleCreateContainer(request.build(), null).getResult()) + .isEqualTo(ContainerProtos.Result.SUCCESS); + Container container = containerSet.getContainer(DUMMY_CONTAINER_ID); + assertThat(container).isNotNull(); + assertThat(container.getContainerState()).isEqualTo(State.RECOVERING); + assertThat(containerSet.getRecoveringContainerMap()).containsKey(DUMMY_CONTAINER_ID); + + keyValueHandler.deleteContainer(container, true); + + assertThat(containerSet.getContainer(DUMMY_CONTAINER_ID)).isNull(); + assertThat(containerSet.getRecoveringContainerMap()).doesNotContainKey(DUMMY_CONTAINER_ID); + } finally { + keyValueHandler.stop(); + handlerCtx.getVolumeSet().getVolumesList().forEach(StorageVolume::shutdown); + } + } + /** * Tests that deleting a container decrements the cached used space of its volume. */