This is an automated email from the ASF dual-hosted git repository.
tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 9d73c8445c5 Clear storage engine snapshot after region migration
(#12975)
9d73c8445c5 is described below
commit 9d73c8445c5b22dbe3c556ce4b3ceaa970b98d30
Author: Li Yu Heng <[email protected]>
AuthorDate: Fri Jul 19 16:24:03 2024 +0800
Clear storage engine snapshot after region migration (#12975)
* gg
* add comment
---
.../org/apache/iotdb/consensus/IStateMachine.java | 9 ++++++++
.../consensus/iot/IoTConsensusServerImpl.java | 1 +
.../dataregion/DataRegionStateMachine.java | 9 +++++++-
.../dataregion/snapshot/SnapshotTaker.java | 25 ++++++++++++++++++++++
4 files changed, 43 insertions(+), 1 deletion(-)
diff --git
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/IStateMachine.java
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/IStateMachine.java
index 7f9666078a5..d1f59d7a7b7 100644
---
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/IStateMachine.java
+++
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/IStateMachine.java
@@ -90,6 +90,15 @@ public interface IStateMachine {
return takeSnapshot(snapshotDir);
}
+ /**
+ * Clear snapshot of current statemachine.
+ *
+ * @return true if all snapshot dir delete successfully
+ */
+ default boolean clearSnapshot() {
+ throw new UnsupportedOperationException("not implemented yet");
+ }
+
/**
* Load the latest snapshot from given dir.
*
diff --git
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java
index 4ac574d282a..1f5dbc41010 100644
---
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java
+++
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/iot/IoTConsensusServerImpl.java
@@ -890,6 +890,7 @@ public class IoTConsensusServerImpl {
public void cleanupLocalSnapshot() {
try {
cleanupSnapshot(newSnapshotDirName);
+ stateMachine.clearSnapshot();
} catch (ConsensusGroupModifyPeerException e) {
logger.warn(
"Cleanup local snapshot fail. You may manually delete {}.",
newSnapshotDirName, e);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/dataregion/DataRegionStateMachine.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/dataregion/DataRegionStateMachine.java
index 2cc420e1f86..e60ee576a8e 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/dataregion/DataRegionStateMachine.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/dataregion/DataRegionStateMachine.java
@@ -92,7 +92,9 @@ public class DataRegionStateMachine extends BaseStateMachine {
@Override
public boolean takeSnapshot(File snapshotDir) {
try {
- return new
SnapshotTaker(region).takeFullSnapshot(snapshotDir.getAbsolutePath(), true);
+ SnapshotTaker snapshotTaker = new SnapshotTaker(region);
+ snapshotTaker.cleanSnapshot();
+ return snapshotTaker.takeFullSnapshot(snapshotDir.getAbsolutePath(),
true);
} catch (Exception e) {
logger.error(
"Exception occurs when taking snapshot for {}-{} in {}",
@@ -120,6 +122,11 @@ public class DataRegionStateMachine extends
BaseStateMachine {
}
}
+ @Override
+ public boolean clearSnapshot() {
+ return SnapshotTaker.clearSnapshotOfDataRegion(region);
+ }
+
@Override
public void loadSnapshot(File latestSnapshotRootDir) {
DataRegion newRegion =
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/snapshot/SnapshotTaker.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/snapshot/SnapshotTaker.java
index 5fcbe60e9f6..5712e989a77 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/snapshot/SnapshotTaker.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/snapshot/SnapshotTaker.java
@@ -134,6 +134,31 @@ public class SnapshotTaker {
}
}
+ public boolean cleanSnapshot() {
+ return clearSnapshotOfDataRegion(this.dataRegion);
+ }
+
+ public static boolean clearSnapshotOfDataRegion(DataRegion dataRegion) {
+ String[] dataDirs =
IoTDBDescriptor.getInstance().getConfig().getDataDirs();
+ boolean allSuccess = true;
+ for (String dataDir : dataDirs) {
+ StringBuilder pathBuilder = new StringBuilder(dataDir);
+
pathBuilder.append(File.separator).append(IoTDBConstant.SNAPSHOT_FOLDER_NAME);
+ pathBuilder.append(File.separator).append(dataRegion.getDatabaseName());
+
pathBuilder.append(IoTDBConstant.FILE_NAME_SEPARATOR).append(dataRegion.getDataRegionId());
+ try {
+ FileUtils.recursivelyDeleteFolder(pathBuilder.toString());
+ } catch (IOException e) {
+ allSuccess = false;
+ LOGGER.warn(
+ "Clear snapshot dir fail, you should manually delete this dir
before do region migration again: {}",
+ pathBuilder,
+ e);
+ }
+ }
+ return allSuccess;
+ }
+
private void readLockTheFile() {
TsFileManager manager = dataRegion.getTsFileManager();
manager.readLock();