You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by zy...@apache.org on 2023/03/23 15:39:16 UTC
[iotdb] branch master updated: [IOTDB-5688] ShcemaFile mode lost template schema after reboot in SimpleConsensus (#9432)
This is an automated email from the ASF dual-hosted git repository.
zyk 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 3264fdcf6a [IOTDB-5688] ShcemaFile mode lost template schema after reboot in SimpleConsensus (#9432)
3264fdcf6a is described below
commit 3264fdcf6a19981441d5fa63ae261d5f34e3cf8d
Author: Chen YZ <43...@users.noreply.github.com>
AuthorDate: Thu Mar 23 23:39:08 2023 +0800
[IOTDB-5688] ShcemaFile mode lost template schema after reboot in SimpleConsensus (#9432)
---
.../db/metadata/mtree/MTreeBelowSGCachedImpl.java | 41 +++++++++++
.../schemaregion/SchemaRegionSchemaFileImpl.java | 85 ++++++++++++++++++++++
2 files changed, 126 insertions(+)
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
index 3df1436432..f279497c94 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
@@ -69,6 +69,9 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.utils.Pair;
import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
@@ -103,6 +106,8 @@ import java.util.function.Function;
*/
public class MTreeBelowSGCachedImpl {
+ private static final Logger logger = LoggerFactory.getLogger(MTreeBelowSGCachedImpl.class);
+
private final CachedMTreeStore store;
private volatile ICachedMNode storageGroupMNode;
private final ICachedMNode rootNode;
@@ -850,6 +855,42 @@ public class MTreeBelowSGCachedImpl {
}
}
+ public void activateTemplateWithoutCheck(
+ PartialPath activatePath, int templateId, boolean isAligned) throws MetadataException {
+ String[] nodes = activatePath.getNodes();
+ ICachedMNode cur = storageGroupMNode;
+ ICachedMNode child;
+ IDeviceMNode<ICachedMNode> entityMNode;
+
+ try {
+ for (int i = levelOfSG + 1; i < nodes.length; i++) {
+ child = store.getChild(cur, nodes[i]);
+ if (child == null) {
+ throw new PathNotExistException(activatePath.getFullPath());
+ }
+ cur = child;
+ }
+ if (cur.isDevice()) {
+ entityMNode = cur.getAsDeviceMNode();
+ } else {
+ entityMNode = store.setToEntity(cur);
+ if (entityMNode.isDatabase()) {
+ replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
+ }
+ }
+
+ if (!entityMNode.isAligned()) {
+ entityMNode.setAligned(isAligned);
+ }
+ entityMNode.setUseTemplate(true);
+ entityMNode.setSchemaTemplateId(templateId);
+
+ store.updateMNode(entityMNode.getAsMNode());
+ } finally {
+ unPinPath(cur);
+ }
+ }
+
public Map<PartialPath, List<Integer>> constructSchemaBlackListWithTemplate(
Map<PartialPath, List<Integer>> templateSetInfo) throws MetadataException {
Map<PartialPath, List<Integer>> resultTemplateSetInfo = new HashMap<>();
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
index 8e16a02eca..897e733e15 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
@@ -65,7 +65,9 @@ import org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateTimeSeriesPla
import org.apache.iotdb.db.metadata.plan.schemaregion.write.IDeactivateTemplatePlan;
import org.apache.iotdb.db.metadata.plan.schemaregion.write.IDeleteTimeSeriesPlan;
import org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTemplatePlan;
+import org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
import org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
+import org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
import org.apache.iotdb.db.metadata.query.info.IDeviceSchemaInfo;
import org.apache.iotdb.db.metadata.query.info.INodeSchemaInfo;
import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
@@ -848,6 +850,10 @@ public class SchemaRegionSchemaFileImpl implements ISchemaRegion {
return preDeletedNum;
}
+ private void recoverPreDeleteTimeseries(PartialPath path) throws MetadataException {
+ mtree.constructSchemaBlackList(path);
+ }
+
@Override
public void rollbackSchemaBlackList(PathPatternTree patternTree) throws MetadataException {
for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
@@ -901,6 +907,10 @@ public class SchemaRegionSchemaFileImpl implements ISchemaRegion {
}
}
+ private void recoverRollbackPreDeleteTimeseries(PartialPath path) throws MetadataException {
+ mtree.rollbackSchemaBlackList(path);
+ }
+
/** @param path full path from root to leaf node */
private void deleteOneTimeseriesUpdateStatistics(PartialPath path)
throws MetadataException, IOException {
@@ -1228,6 +1238,12 @@ public class SchemaRegionSchemaFileImpl implements ISchemaRegion {
}
}
+ private void recoverActivatingSchemaTemplate(IActivateTemplateInClusterPlan plan)
+ throws MetadataException {
+ mtree.activateTemplateWithoutCheck(
+ plan.getActivatePath(), plan.getTemplateId(), plan.isAligned());
+ }
+
@Override
public long constructSchemaBlackListWithTemplate(IPreDeactivateTemplatePlan plan)
throws MetadataException {
@@ -1405,5 +1421,74 @@ public class SchemaRegionSchemaFileImpl implements ISchemaRegion {
return new RecoverOperationResult(e);
}
}
+
+ @Override
+ public RecoverOperationResult visitActivateTemplateInCluster(
+ IActivateTemplateInClusterPlan activateTemplateInClusterPlan,
+ SchemaRegionSchemaFileImpl context) {
+ try {
+ recoverActivatingSchemaTemplate(activateTemplateInClusterPlan);
+ return RecoverOperationResult.SUCCESS;
+ } catch (MetadataException e) {
+ return new RecoverOperationResult(e);
+ }
+ }
+
+ @Override
+ public RecoverOperationResult visitPreDeleteTimeSeries(
+ IPreDeleteTimeSeriesPlan preDeleteTimeSeriesPlan, SchemaRegionSchemaFileImpl context) {
+ try {
+ recoverPreDeleteTimeseries(preDeleteTimeSeriesPlan.getPath());
+ return RecoverOperationResult.SUCCESS;
+ } catch (MetadataException e) {
+ return new RecoverOperationResult(e);
+ }
+ }
+
+ @Override
+ public RecoverOperationResult visitRollbackPreDeleteTimeSeries(
+ IRollbackPreDeleteTimeSeriesPlan rollbackPreDeleteTimeSeriesPlan,
+ SchemaRegionSchemaFileImpl context) {
+ try {
+ recoverRollbackPreDeleteTimeseries(rollbackPreDeleteTimeSeriesPlan.getPath());
+ return RecoverOperationResult.SUCCESS;
+ } catch (MetadataException e) {
+ return new RecoverOperationResult(e);
+ }
+ }
+
+ @Override
+ public RecoverOperationResult visitPreDeactivateTemplate(
+ IPreDeactivateTemplatePlan preDeactivateTemplatePlan, SchemaRegionSchemaFileImpl context) {
+ try {
+ constructSchemaBlackListWithTemplate(preDeactivateTemplatePlan);
+ return RecoverOperationResult.SUCCESS;
+ } catch (MetadataException e) {
+ return new RecoverOperationResult(e);
+ }
+ }
+
+ @Override
+ public RecoverOperationResult visitRollbackPreDeactivateTemplate(
+ IRollbackPreDeactivateTemplatePlan rollbackPreDeactivateTemplatePlan,
+ SchemaRegionSchemaFileImpl context) {
+ try {
+ rollbackSchemaBlackListWithTemplate(rollbackPreDeactivateTemplatePlan);
+ return RecoverOperationResult.SUCCESS;
+ } catch (MetadataException e) {
+ return new RecoverOperationResult(e);
+ }
+ }
+
+ @Override
+ public RecoverOperationResult visitDeactivateTemplate(
+ IDeactivateTemplatePlan deactivateTemplatePlan, SchemaRegionSchemaFileImpl context) {
+ try {
+ deactivateTemplateInBlackList(deactivateTemplatePlan);
+ return RecoverOperationResult.SUCCESS;
+ } catch (MetadataException e) {
+ return new RecoverOperationResult(e);
+ }
+ }
}
}