This is an automated email from the ASF dual-hosted git repository. zyk pushed a commit to branch rc/1.1.0 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit b82b9d9eed767ff1dc86af22cc96e7cf742ab30f Author: Chen YZ <[email protected]> AuthorDate: Thu Mar 16 22:06:55 2023 +0800 [To rel/1.1][IOTDB-5688] ShcemaFile mode lost template schema after reboot in SimpleConsensus (#9351) --- .../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 a0644e00cb..d70d235512 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 implements IMTreeBelowSG { + private static final Logger logger = LoggerFactory.getLogger(MTreeBelowSGCachedImpl.class); + private final CachedMTreeStore store; private volatile IStorageGroupMNode storageGroupMNode; private final IMNode rootNode; @@ -855,6 +860,42 @@ public class MTreeBelowSGCachedImpl implements IMTreeBelowSG { } } + public void activateTemplateWithoutCheck( + PartialPath activatePath, int templateId, boolean isAligned) throws MetadataException { + String[] nodes = activatePath.getNodes(); + IMNode cur = storageGroupMNode; + IMNode child; + IEntityMNode 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.isEntity()) { + entityMNode = cur.getAsEntityMNode(); + } else { + entityMNode = store.setToEntity(cur); + if (entityMNode.isStorageGroup()) { + replaceStorageGroupMNode(entityMNode.getAsStorageGroupMNode()); + } + } + + if (!entityMNode.isAligned()) { + entityMNode.setAligned(isAligned); + } + entityMNode.setUseTemplate(true); + entityMNode.setSchemaTemplateId(templateId); + + store.updateMNode(entityMNode); + } finally { + unPinPath(cur); + } + } + @Override public Map<PartialPath, List<Integer>> constructSchemaBlackListWithTemplate( Map<PartialPath, List<Integer>> templateSetInfo) throws MetadataException { 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 7968407c14..2c91340ad3 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 @@ -64,7 +64,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; @@ -847,6 +849,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()) { @@ -900,6 +906,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 { @@ -1224,6 +1234,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 { @@ -1401,5 +1417,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); + } + } } }
