This is an automated email from the ASF dual-hosted git repository.
adoroszlai 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 702a385b81 HDDS-10061. NPE when container is loaded with missing
container DB (#5921)
702a385b81 is described below
commit 702a385b810aa526f9ead3ba5f373ebecd0f811a
Author: Sumit Agrawal <[email protected]>
AuthorDate: Sat Jan 6 13:49:53 2024 +0530
HDDS-10061. NPE when container is loaded with missing container DB (#5921)
---
.../keyvalue/helpers/KeyValueContainerUtil.java | 3 +-
.../container/ozoneimpl/TestContainerReader.java | 53 ++++++++++++++++++++++
2 files changed, 55 insertions(+), 1 deletion(-)
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerUtil.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerUtil.java
index f47d17d738..16847d1157 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerUtil.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerUtil.java
@@ -232,7 +232,8 @@ public final class KeyValueContainerUtil {
LOG.error("Container DB file is missing for ContainerID {}. " +
"Skipping loading of this container.", containerID);
// Don't further process this container, as it is missing db file.
- return;
+ throw new IOException("Container DB file is missing for containerID "
+ + containerID);
}
kvContainerData.setDbFile(dbFile);
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 3535e6e3c7..d48f0d3314 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
@@ -45,6 +45,8 @@ import
org.apache.hadoop.ozone.container.keyvalue.KeyValueContainer;
import org.apache.hadoop.ozone.container.keyvalue.KeyValueContainerData;
import org.apache.hadoop.ozone.container.keyvalue.helpers.BlockUtils;
import org.apache.hadoop.ozone.container.metadata.DatanodeStoreSchemaThreeImpl;
+import org.apache.ozone.test.GenericTestUtils;
+import org.apache.ratis.util.FileUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.io.TempDir;
@@ -56,6 +58,7 @@ import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
+import org.slf4j.LoggerFactory;
import static
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State.DELETED;
import static
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State.RECOVERING;
@@ -308,6 +311,56 @@ public class TestContainerReader {
assertEquals(containerCount - 1, containerSet1.containerCount());
}
+ @ContainerTestVersionInfo.ContainerTest
+ public void testContainerReaderWithInvalidDbPath(
+ ContainerTestVersionInfo versionInfo) throws Exception {
+ setLayoutAndSchemaVersion(versionInfo);
+ setup(versionInfo);
+ MutableVolumeSet volumeSet1;
+ HddsVolume hddsVolume1;
+ ContainerSet containerSet1 = new ContainerSet(1000);
+ File volumeDir1 =
+ Files.createDirectory(tempDir.resolve("volumeDirDbDelete")).toFile();
+ RoundRobinVolumeChoosingPolicy volumeChoosingPolicy1;
+
+ volumeSet1 = mock(MutableVolumeSet.class);
+ UUID datanode = UUID.randomUUID();
+ hddsVolume1 = new HddsVolume.Builder(volumeDir1
+ .getAbsolutePath()).conf(conf).datanodeUuid(datanode
+ .toString()).clusterID(clusterId).build();
+ StorageVolumeUtil.checkVolume(hddsVolume1, clusterId, clusterId, conf,
+ null, null);
+ volumeChoosingPolicy1 = mock(RoundRobinVolumeChoosingPolicy.class);
+ when(volumeChoosingPolicy1.chooseVolume(anyList(), anyLong()))
+ .thenReturn(hddsVolume1);
+
+ List<File> dbPathList = new ArrayList<>();
+ int containerCount = 3;
+ for (int i = 0; i < containerCount; i++) {
+ KeyValueContainerData keyValueContainerData = new
KeyValueContainerData(i,
+ layout,
+ (long) StorageUnit.GB.toBytes(5), UUID.randomUUID().toString(),
+ datanodeId.toString());
+ KeyValueContainer keyValueContainer =
+ new KeyValueContainer(keyValueContainerData, conf);
+ keyValueContainer.create(volumeSet1, volumeChoosingPolicy1, clusterId);
+ dbPathList.add(keyValueContainerData.getDbFile());
+ }
+ ContainerCache.getInstance(conf).shutdownCache();
+ for (File dbPath : dbPathList) {
+ FileUtils.deleteFully(dbPath.toPath());
+ }
+
+ GenericTestUtils.LogCapturer dnLogs =
GenericTestUtils.LogCapturer.captureLogs(
+ LoggerFactory.getLogger(ContainerReader.class));
+ dnLogs.clearOutput();
+ ContainerReader containerReader = new ContainerReader(volumeSet1,
+ hddsVolume1, containerSet1, conf, true);
+ containerReader.readVolume(hddsVolume1.getHddsRootDir());
+ assertEquals(0, containerSet1.containerCount());
+ assertTrue(dnLogs.getOutput().contains("Container DB file is missing"));
+ }
+
@ContainerTestVersionInfo.ContainerTest
public void testMultipleContainerReader(ContainerTestVersionInfo versionInfo)
throws Exception {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]