This is an automated email from the ASF dual-hosted git repository.
agupta pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new e89fee375e HDDS-9658. NPE while cleanup deleted container data (#5964)
e89fee375e is described below
commit e89fee375efb1aaeb59978c1c708b6808e38b267
Author: Sumit Agrawal <[email protected]>
AuthorDate: Wed Jan 31 20:34:45 2024 +0530
HDDS-9658. NPE while cleanup deleted container data (#5964)
---
.../ozone/container/ozoneimpl/ContainerReader.java | 20 ++++++++++++--------
.../ozone/container/ozoneimpl/OzoneContainer.java | 8 +++++---
.../container/ozoneimpl/TestContainerReader.java | 4 +++-
.../container/ozoneimpl/TestOzoneContainer.java | 1 +
.../rpc/TestContainerStateMachineFailures.java | 2 +-
5 files changed, 22 insertions(+), 13 deletions(-)
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerReader.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerReader.java
index edbff14aca..1685d1c5fe 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerReader.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/ContainerReader.java
@@ -78,18 +78,18 @@ public class ContainerReader implements Runnable {
private final ConfigurationSource config;
private final File hddsVolumeDir;
private final MutableVolumeSet volumeSet;
- private final boolean shouldDeleteRecovering;
+ private final boolean shouldDelete;
public ContainerReader(
MutableVolumeSet volSet, HddsVolume volume, ContainerSet cset,
- ConfigurationSource conf, boolean shouldDeleteRecovering) {
+ ConfigurationSource conf, boolean shouldDelete) {
Preconditions.checkNotNull(volume);
this.hddsVolume = volume;
this.hddsVolumeDir = hddsVolume.getHddsRootDir();
this.containerSet = cset;
this.config = conf;
this.volumeSet = volSet;
- this.shouldDeleteRecovering = shouldDeleteRecovering;
+ this.shouldDelete = shouldDelete;
}
@Override
@@ -148,7 +148,7 @@ public class ContainerReader implements Runnable {
LOG.info("Start to verify containers on volume {}", hddsVolumeRootDir);
File currentDir = new File(idDir, Storage.STORAGE_DIR_CURRENT);
File[] containerTopDirs = currentDir.listFiles();
- if (containerTopDirs != null) {
+ if (containerTopDirs != null && containerTopDirs.length > 0) {
for (File containerTopDir : containerTopDirs) {
if (containerTopDir.isDirectory()) {
File[] containerDirs = containerTopDir.listFiles();
@@ -214,7 +214,7 @@ public class ContainerReader implements Runnable {
KeyValueContainer kvContainer = new KeyValueContainer(kvContainerData,
config);
if (kvContainer.getContainerState() == RECOVERING) {
- if (shouldDeleteRecovering) {
+ if (shouldDelete) {
kvContainer.markContainerUnhealthy();
LOG.info("Stale recovering container {} marked UNHEALTHY",
kvContainerData.getContainerID());
@@ -223,7 +223,9 @@ public class ContainerReader implements Runnable {
return;
}
if (kvContainer.getContainerState() == DELETED) {
- cleanupContainer(hddsVolume, kvContainer);
+ if (shouldDelete) {
+ cleanupContainer(hddsVolume, kvContainer);
+ }
return;
}
try {
@@ -232,8 +234,10 @@ public class ContainerReader implements Runnable {
if (e.getResult() != ContainerProtos.Result.CONTAINER_EXISTS) {
throw e;
}
- resolveDuplicate((KeyValueContainer) containerSet.getContainer(
- kvContainer.getContainerData().getContainerID()), kvContainer);
+ if (shouldDelete) {
+ resolveDuplicate((KeyValueContainer) containerSet.getContainer(
+ kvContainer.getContainerData().getContainerID()), kvContainer);
+ }
}
} else {
throw new StorageContainerException("Container File is corrupted. " +
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
index d4425f75a5..aef3965dcd 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
@@ -169,7 +169,6 @@ public class OzoneContainer {
containerSet = new ContainerSet(recoveringContainerTimeout);
metadataScanner = null;
- buildContainerSet();
metrics = ContainerMetrics.create(conf);
handlers = Maps.newHashMap();
@@ -286,9 +285,10 @@ public class OzoneContainer {
}
/**
- * Build's container map.
+ * Build's container map after volume format.
*/
- private void buildContainerSet() {
+ @VisibleForTesting
+ public void buildContainerSet() {
Iterator<StorageVolume> volumeSetIterator = volumeSet.getVolumesList()
.iterator();
ArrayList<Thread> volumeThreads = new ArrayList<>();
@@ -442,6 +442,8 @@ public class OzoneContainer {
return;
}
+ buildContainerSet();
+
// Start background volume checks, which will begin after the configured
// delay.
volumeChecker.start();
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
index 3f5adef35d..7f38eab785 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestContainerReader.java
@@ -558,8 +558,10 @@ public class TestContainerReader {
// add db entry for the container ID 101 for V3
baseCount = addDbEntry(containerData);
}
+
+ // verify container data and perform cleanup
ContainerReader containerReader = new ContainerReader(volumeSet,
- hddsVolume, containerSet, conf, false);
+ hddsVolume, containerSet, conf, true);
containerReader.run();
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
index af6bd5d17f..497418dcdc 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainer.java
@@ -153,6 +153,7 @@ public class TestOzoneContainer {
OzoneContainer ozoneContainer = ContainerTestUtils
.getOzoneContainer(datanodeDetails, conf);
+ ozoneContainer.buildContainerSet();
ContainerSet containerset = ozoneContainer.getContainerSet();
assertEquals(numTestContainers, containerset.containerCount());
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFailures.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFailures.java
index 5a2d67960f..2a316cdedd 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFailures.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachineFailures.java
@@ -376,7 +376,7 @@ public class TestContainerStateMachineFailures {
int index = cluster.getHddsDatanodeIndex(dn.getDatanodeDetails());
// restart the hdds datanode and see if the container is listed in the
// in the missing container set and not in the regular set
- cluster.restartHddsDatanode(dn.getDatanodeDetails(), false);
+ cluster.restartHddsDatanode(dn.getDatanodeDetails(), true);
// make sure the container state is still marked unhealthy after restart
keyValueContainerData = (KeyValueContainerData) ContainerDataYaml
.readContainerFile(containerFile);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]