You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by sa...@apache.org on 2021/04/01 06:42:59 UTC
[ozone] branch master updated: HDDS-4987. Import container should
not delete container contents if container already exists (#2077)
This is an automated email from the ASF dual-hosted git repository.
sammichen 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 67c4c13 HDDS-4987. Import container should not delete container contents if container already exists (#2077)
67c4c13 is described below
commit 67c4c13137aa9a43beb16e642e6f9338e61d482b
Author: Sammi Chen <sa...@apache.org>
AuthorDate: Thu Apr 1 14:42:32 2021 +0800
HDDS-4987. Import container should not delete container contents if container already exists (#2077)
---
.../container/keyvalue/KeyValueContainer.java | 11 ++++++++--
.../container/keyvalue/TestKeyValueContainer.java | 25 ++++++++++++++++++++++
2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainer.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainer.java
index 6760a27..20c5885 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainer.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueContainer.java
@@ -466,7 +466,8 @@ public class KeyValueContainer implements Container<KeyValueContainerData> {
+ " as the container descriptor (%s) has already been exist.",
getContainerData().getContainerID(),
getContainerFile().getAbsolutePath());
- throw new IOException(errorMessage);
+ throw new StorageContainerException(errorMessage,
+ CONTAINER_ALREADY_EXISTS);
}
//copy the values from the input stream to the final destination
// directory.
@@ -496,11 +497,17 @@ public class KeyValueContainer implements Container<KeyValueContainerData> {
KeyValueContainerUtil.parseKVContainerData(containerData, config);
} catch (Exception ex) {
+ if (ex instanceof StorageContainerException &&
+ ((StorageContainerException) ex).getResult() ==
+ CONTAINER_ALREADY_EXISTS) {
+ throw ex;
+ }
//delete all the temporary data in case of any exception.
try {
FileUtils.deleteDirectory(new File(containerData.getMetadataPath()));
FileUtils.deleteDirectory(new File(containerData.getChunksPath()));
- FileUtils.deleteDirectory(getContainerFile());
+ FileUtils.deleteDirectory(
+ new File(getContainerData().getContainerPath()));
} catch (Exception deleteex) {
LOG.error(
"Can not cleanup destination directories after a container import"
diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainer.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainer.java
index d50e240..8989c3e 100644
--- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainer.java
+++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainer.java
@@ -206,8 +206,33 @@ public class TestKeyValueContainer {
fail("Container is imported twice. Previous files are overwritten");
} catch (IOException ex) {
//all good
+ assertTrue(container.getContainerFile().exists());
}
+ //Import failure should cleanup the container directory
+ containerData =
+ new KeyValueContainerData(containerId + 1,
+ keyValueContainerData.getLayOutVersion(),
+ keyValueContainerData.getMaxSize(), UUID.randomUUID().toString(),
+ datanodeId.toString());
+ container = new KeyValueContainer(containerData, CONF);
+
+ containerVolume = volumeChoosingPolicy.chooseVolume(volumeSet
+ .getVolumesList(), 1);
+ hddsVolumeDir = containerVolume.getHddsRootDir().toString();
+ container.populatePathFields(scmId, containerVolume, hddsVolumeDir);
+ try {
+ FileInputStream fis = new FileInputStream(folderToExport);
+ fis.close();
+ container.importContainerData(fis, packer);
+ fail("Container import should fail");
+ } catch (Exception ex) {
+ assertTrue(ex instanceof IOException);
+ } finally {
+ File directory =
+ new File(container.getContainerData().getContainerPath());
+ assertFalse(directory.exists());
+ }
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org