You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by um...@apache.org on 2022/07/11 06:07:53 UTC
[ozone] branch master updated: HDDS-6978. EC: Cleanup RECOVERING container on DN restarts (#3585)
This is an automated email from the ASF dual-hosted git repository.
umamahesh 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 7471d38f0a HDDS-6978. EC: Cleanup RECOVERING container on DN restarts (#3585)
7471d38f0a is described below
commit 7471d38f0a3cfed3f7429fa736889dee6d709d0e
Author: Jie Yao <ja...@tencent.com>
AuthorDate: Mon Jul 11 14:07:46 2022 +0800
HDDS-6978. EC: Cleanup RECOVERING container on DN restarts (#3585)
---
.../ozone/container/ozoneimpl/ContainerReader.java | 15 +++++++++++++--
.../ozone/container/ozoneimpl/OzoneContainer.java | 2 +-
.../container/ozoneimpl/TestContainerReader.java | 22 ++++++++++++++++++----
.../ozone/debug/container/ContainerCommands.java | 2 +-
4 files changed, 33 insertions(+), 8 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 2a88a2fe74..573cee9bf5 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
@@ -34,6 +34,8 @@ import org.apache.hadoop.ozone.container.common.volume.HddsVolume;
import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
import org.apache.hadoop.ozone.container.keyvalue.KeyValueContainer;
import org.apache.hadoop.ozone.container.keyvalue.KeyValueContainerData;
+import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos
+ .ContainerDataProto.State.RECOVERING;
import org.apache.hadoop.ozone.container.keyvalue.helpers.KeyValueContainerUtil;
import org.slf4j.Logger;
@@ -73,17 +75,18 @@ public class ContainerReader implements Runnable {
private final ConfigurationSource config;
private final File hddsVolumeDir;
private final MutableVolumeSet volumeSet;
+ private final boolean shouldDeleteRecovering;
public ContainerReader(
MutableVolumeSet volSet, HddsVolume volume, ContainerSet cset,
- ConfigurationSource conf
- ) {
+ ConfigurationSource conf, boolean shouldDeleteRecovering) {
Preconditions.checkNotNull(volume);
this.hddsVolume = volume;
this.hddsVolumeDir = hddsVolume.getHddsRootDir();
this.containerSet = cset;
this.config = conf;
this.volumeSet = volSet;
+ this.shouldDeleteRecovering = shouldDeleteRecovering;
}
@Override
@@ -207,6 +210,14 @@ public class ContainerReader implements Runnable {
KeyValueContainerUtil.parseKVContainerData(kvContainerData, config);
KeyValueContainer kvContainer = new KeyValueContainer(kvContainerData,
config);
+ if (kvContainer.getContainerState() == RECOVERING) {
+ if (shouldDeleteRecovering) {
+ kvContainer.delete();
+ LOG.info("Delete recovering container {}.",
+ kvContainer.getContainerData().getContainerID());
+ }
+ return;
+ }
containerSet.addContainer(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 df61cac960..1db2961ba9 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
@@ -245,7 +245,7 @@ public class OzoneContainer {
while (volumeSetIterator.hasNext()) {
StorageVolume volume = volumeSetIterator.next();
Thread thread = new Thread(new ContainerReader(volumeSet,
- (HddsVolume) volume, containerSet, config));
+ (HddsVolume) volume, containerSet, config, true));
thread.start();
volumeThreads.add(thread);
}
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 2ab6f95cf6..4f633b1d4e 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
@@ -22,8 +22,8 @@ import org.apache.hadoop.conf.StorageUnit;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
-import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
+import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.ozone.OzoneConfigKeys;
import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.container.common.helpers.BlockData;
@@ -57,6 +57,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
+import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State.RECOVERING;
import static org.apache.hadoop.ozone.container.common.ContainerTestUtils.createDbInstancesForTestIfNeeded;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.ArgumentMatchers.anyLong;
@@ -216,13 +217,26 @@ public class TestContainerReader {
@Test
public void testContainerReader() throws Exception {
+ KeyValueContainerData recoveringContainerData = new KeyValueContainerData(
+ 10, layout, (long) StorageUnit.GB.toBytes(5),
+ UUID.randomUUID().toString(), datanodeId.toString());
+ //create a container with recovering state
+ recoveringContainerData.setState(RECOVERING);
+
+ KeyValueContainer recoveringKeyValueContainer =
+ new KeyValueContainer(recoveringContainerData,
+ conf);
+ recoveringKeyValueContainer.create(
+ volumeSet, volumeChoosingPolicy, clusterId);
+
ContainerReader containerReader = new ContainerReader(volumeSet,
- hddsVolume, containerSet, conf);
+ hddsVolume, containerSet, conf, true);
Thread thread = new Thread(containerReader);
thread.start();
thread.join();
+ //recovering container should be deleted, so the count should be 2
Assert.assertEquals(2, containerSet.containerCount());
for (int i = 0; i < 2; i++) {
@@ -284,7 +298,7 @@ public class TestContainerReader {
ContainerCache.getInstance(conf).shutdownCache();
ContainerReader containerReader = new ContainerReader(volumeSet1,
- hddsVolume1, containerSet1, conf);
+ hddsVolume1, containerSet1, conf, true);
containerReader.readVolume(hddsVolume1.getHddsRootDir());
Assert.assertEquals(containerCount - 1, containerSet1.containerCount());
}
@@ -346,7 +360,7 @@ public class TestContainerReader {
Thread[] threads = new Thread[volumeNum];
for (int i = 0; i < volumeNum; i++) {
containerReaders[i] = new ContainerReader(volumeSets,
- (HddsVolume) volumes.get(i), containerSet, conf);
+ (HddsVolume) volumes.get(i), containerSet, conf, true);
threads[i] = new Thread(containerReaders[i]);
}
long startTime = System.currentTimeMillis();
diff --git a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/container/ContainerCommands.java b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/container/ContainerCommands.java
index c5b21d604f..453370ed07 100644
--- a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/container/ContainerCommands.java
+++ b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/debug/container/ContainerCommands.java
@@ -151,7 +151,7 @@ public class ContainerCommands implements Callable<Void>, SubcommandWithParent {
HddsVolume volume = volumeSetIterator.next();
LOG.info("Loading container metadata from volume " + volume.toString());
final ContainerReader reader =
- new ContainerReader(volumeSet, volume, containerSet, conf);
+ new ContainerReader(volumeSet, volume, containerSet, conf, false);
reader.run();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org