This is an automated email from the ASF dual-hosted git repository.
chenyz 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 5ad07424552 Optimize fetch template schema (#11566)
5ad07424552 is described below
commit 5ad07424552d5e8df80f72b763f71f7c155142ae
Author: Chen YZ <[email protected]>
AuthorDate: Sat Nov 18 22:05:07 2023 +0800
Optimize fetch template schema (#11566)
Optimize fetch template schema
---
.../mtree/impl/mem/MTreeBelowSGMemoryImpl.java | 22 ++++----------
.../mnode/iterator/AbstractTraverserIterator.java | 11 ++++++-
.../impl/mem/mnode/iterator/MNodeIterator.java | 5 ++++
.../mtree/impl/pbtree/CachedMTreeStore.java | 5 ++++
.../mtree/impl/pbtree/MTreeBelowSGCachedImpl.java | 22 ++++----------
.../schemaregion/mtree/traverser/Traverser.java | 25 +++++++++++++++-
.../commons/schema/node/utils/IMNodeIterator.java | 2 ++
.../commons/schema/tree/AbstractTreeVisitor.java | 35 ++++++++++++++++++++++
8 files changed, 93 insertions(+), 34 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
index 04e0a5753a4..b561dbf058f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
@@ -704,18 +704,13 @@ public class MTreeBelowSGMemoryImpl {
try (MeasurementCollector<Void, IMemMNode> collector =
new MeasurementCollector<Void, IMemMNode>(
rootNode, pathPattern, store, false,
SchemaConstant.ALL_MATCH_SCOPE) {
- private final Set<PartialPath> visitedTemplateDevice = new
HashSet<>();
-
protected Void collectMeasurement(IMeasurementMNode<IMemMNode> node)
{
IDeviceMNode<IMemMNode> deviceMNode =
getParentOfNextMatchedNode().getAsDeviceMNode();
int templateId = deviceMNode.getSchemaTemplateIdWithState();
- PartialPath devicePath = deviceMNode.getPartialPath();
if (templateId >= 0) {
- if (!visitedTemplateDevice.contains(devicePath)) {
- schemaTree.appendTemplateDevice(
- deviceMNode.getPartialPath(), deviceMNode.isAligned(),
templateId, null);
- visitedTemplateDevice.add(devicePath);
- }
+ schemaTree.appendTemplateDevice(
+ deviceMNode.getPartialPath(), deviceMNode.isAligned(),
templateId, null);
+ skipTemplateChildren(deviceMNode);
} else {
MeasurementPath path = getCurrentMeasurementPathInTraverse(node);
if (nodes[nodes.length - 1].equals(node.getAlias())) {
@@ -744,18 +739,13 @@ public class MTreeBelowSGMemoryImpl {
try (MeasurementCollector<Void, IMemMNode> collector =
new MeasurementCollector<Void, IMemMNode>(
rootNode, patternTree, store, SchemaConstant.ALL_MATCH_SCOPE) {
- private final Set<PartialPath> visitedTemplateDevice = new
HashSet<>();
-
protected Void collectMeasurement(IMeasurementMNode<IMemMNode> node)
{
IDeviceMNode<IMemMNode> deviceMNode =
getParentOfNextMatchedNode().getAsDeviceMNode();
int templateId = deviceMNode.getSchemaTemplateIdWithState();
- PartialPath devicePath = deviceMNode.getPartialPath();
if (templateId >= 0) {
- if (!visitedTemplateDevice.contains(devicePath)) {
- schemaTree.appendTemplateDevice(
- deviceMNode.getPartialPath(), deviceMNode.isAligned(),
templateId, null);
- visitedTemplateDevice.add(devicePath);
- }
+ schemaTree.appendTemplateDevice(
+ deviceMNode.getPartialPath(), deviceMNode.isAligned(),
templateId, null);
+ skipTemplateChildren(deviceMNode);
} else {
MeasurementPath path = getCurrentMeasurementPathInTraverse(node);
path.setMeasurementAlias(node.getAlias());
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
index 024bec82a31..f7f6d7d1ae6 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
@@ -46,6 +46,8 @@ public abstract class AbstractTraverserIterator<N extends
IMNode<N>> implements
// if true, the pre deleted measurement or pre deactivated template won't be
processed
private boolean skipPreDeletedSchema = false;
+ private boolean skipTemplateChildren = false;
+
protected AbstractTraverserIterator(
IMTreeStore<N> store,
IDeviceMNode<N> parent,
@@ -65,6 +67,11 @@ public abstract class AbstractTraverserIterator<N extends
IMNode<N>> implements
this.skipPreDeletedSchema = skipPreDeletedSchema;
}
+ @Override
+ public void skipTemplateChildren() {
+ skipTemplateChildren = true;
+ }
+
private Template getActivatedSchemaTemplate(
IDeviceMNode<N> node, Map<Integer, Template> templateMap) {
// new cluster, the used template is directly recorded as template id in
device mnode
@@ -89,7 +96,9 @@ public abstract class AbstractTraverserIterator<N extends
IMNode<N>> implements
if (directChildrenIterator.hasNext()) {
nextMatchedNode = directChildrenIterator.next();
usingDirectChildrenIterator = true;
- } else if (templateChildrenIterator != null &&
templateChildrenIterator.hasNext()) {
+ } else if (!skipTemplateChildren
+ && templateChildrenIterator != null
+ && templateChildrenIterator.hasNext()) {
nextMatchedNode = templateChildrenIterator.next();
usingDirectChildrenIterator = false;
} else {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MNodeIterator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MNodeIterator.java
index 569580f5cc1..55005d3d024 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MNodeIterator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MNodeIterator.java
@@ -42,6 +42,11 @@ public class MNodeIterator<N extends IMNode<?>> implements
IMNodeIterator<N> {
return iterator.next();
}
+ @Override
+ public void skipTemplateChildren() {
+ // do nothing
+ }
+
@Override
public void close() {
iterator = null;
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
index d557777bfe2..2a0b2de01c5 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
@@ -736,6 +736,11 @@ public class CachedMTreeStore implements
IMTreeStore<ICachedMNode> {
isIteratingDisk = false;
}
+ @Override
+ public void skipTemplateChildren() {
+ // do nothing
+ }
+
@Override
public void close() {
try {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/MTreeBelowSGCachedImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/MTreeBelowSGCachedImpl.java
index 30d650960f4..4347292e3e4 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/MTreeBelowSGCachedImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/MTreeBelowSGCachedImpl.java
@@ -818,19 +818,14 @@ public class MTreeBelowSGCachedImpl {
try (MeasurementCollector<Void, ICachedMNode> collector =
new MeasurementCollector<Void, ICachedMNode>(
rootNode, pathPattern, store, false,
SchemaConstant.ALL_MATCH_SCOPE) {
- private final Set<PartialPath> visitedTemplateDevice = new
HashSet<>();
-
protected Void collectMeasurement(IMeasurementMNode<ICachedMNode>
node) {
IDeviceMNode<ICachedMNode> deviceMNode =
getParentOfNextMatchedNode().getAsDeviceMNode();
int templateId = deviceMNode.getSchemaTemplateIdWithState();
- PartialPath devicePath = deviceMNode.getPartialPath();
if (templateId >= 0) {
- if (!visitedTemplateDevice.contains(devicePath)) {
- schemaTree.appendTemplateDevice(
- deviceMNode.getPartialPath(), deviceMNode.isAligned(),
templateId, null);
- visitedTemplateDevice.add(devicePath);
- }
+ schemaTree.appendTemplateDevice(
+ deviceMNode.getPartialPath(), deviceMNode.isAligned(),
templateId, null);
+ skipTemplateChildren(deviceMNode);
} else {
MeasurementPath path = getCurrentMeasurementPathInTraverse(node);
if (nodes[nodes.length - 1].equals(node.getAlias())) {
@@ -859,19 +854,14 @@ public class MTreeBelowSGCachedImpl {
try (MeasurementCollector<Void, ICachedMNode> collector =
new MeasurementCollector<Void, ICachedMNode>(
rootNode, patternTree, store, SchemaConstant.ALL_MATCH_SCOPE) {
- private final Set<PartialPath> visitedTemplateDevice = new
HashSet<>();
-
protected Void collectMeasurement(IMeasurementMNode<ICachedMNode>
node) {
IDeviceMNode<ICachedMNode> deviceMNode =
getParentOfNextMatchedNode().getAsDeviceMNode();
int templateId = deviceMNode.getSchemaTemplateIdWithState();
- PartialPath devicePath = deviceMNode.getPartialPath();
if (templateId >= 0) {
- if (!visitedTemplateDevice.contains(devicePath)) {
- schemaTree.appendTemplateDevice(
- deviceMNode.getPartialPath(), deviceMNode.isAligned(),
templateId, null);
- visitedTemplateDevice.add(devicePath);
- }
+ schemaTree.appendTemplateDevice(
+ deviceMNode.getPartialPath(), deviceMNode.isAligned(),
templateId, null);
+ skipTemplateChildren(deviceMNode);
} else {
MeasurementPath path = getCurrentMeasurementPathInTraverse(node);
path.setMeasurementAlias(node.getAlias());
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/traverser/Traverser.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/traverser/Traverser.java
index d1a2c5d7b5b..b73624f2a1b 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/traverser/Traverser.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/traverser/Traverser.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.commons.path.PathPatternTree;
import org.apache.iotdb.commons.path.fa.IFAState;
import org.apache.iotdb.commons.path.fa.IFATransition;
import org.apache.iotdb.commons.schema.node.IMNode;
+import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
import org.apache.iotdb.commons.schema.node.utils.IMNodeIterator;
import org.apache.iotdb.commons.schema.tree.AbstractTreeVisitor;
@@ -72,6 +73,7 @@ public abstract class Traverser<R, N extends IMNode<N>>
extends AbstractTreeVisi
// default false means fullPath pattern match
protected boolean isPrefixMatch = false;
+ private IDeviceMNode<N> skipTemplateDevice;
protected Traverser() {}
@@ -137,11 +139,17 @@ public abstract class Traverser<R, N extends IMNode<N>>
extends AbstractTreeVisi
@Override
protected N getChild(N parent, String childName) throws MetadataException {
+ return getChild(parent, childName, parent == skipTemplateDevice);
+ }
+
+ private N getChild(N parent, String childName, boolean skipTemplateChildren)
+ throws MetadataException {
N child = null;
if (parent.isAboveDatabase()) {
child = parent.getChild(childName);
} else {
if (templateMap != null
+ && !skipTemplateChildren
&& !templateMap.isEmpty() // this task will cover some timeseries
represented by template
&& (parent.isDevice()
&& parent.getAsDeviceMNode().getSchemaTemplateId()
@@ -179,13 +187,14 @@ public abstract class Traverser<R, N extends IMNode<N>>
extends AbstractTreeVisi
throws Exception {
return new IMNodeIterator<N>() {
private N next = null;
+ private boolean skipTemplateChildren = false;
@Override
public boolean hasNext() {
if (next == null) {
while (next == null && childrenName.hasNext()) {
try {
- next = getChild(parent, childrenName.next());
+ next = getChild(parent, childrenName.next(),
skipTemplateChildren);
} catch (Throwable e) {
logger.warn(e.getMessage(), e);
throw new RuntimeException(e);
@@ -205,6 +214,11 @@ public abstract class Traverser<R, N extends IMNode<N>>
extends AbstractTreeVisi
return result;
}
+ @Override
+ public void skipTemplateChildren() {
+ skipTemplateChildren = true;
+ }
+
@Override
public void close() {
if (next != null) {
@@ -217,6 +231,7 @@ public abstract class Traverser<R, N extends IMNode<N>>
extends AbstractTreeVisi
@Override
protected Iterator<N> getChildrenIterator(N parent) throws MetadataException
{
+ IMNodeIterator<N> currentChildrenIterator;
if (parent.isAboveDatabase()) {
return new MNodeIterator<>(parent.getChildren().values().iterator());
} else {
@@ -307,4 +322,12 @@ public abstract class Traverser<R, N extends IMNode<N>>
extends AbstractTreeVisi
}
return null;
}
+
+ protected void skipTemplateChildren(IDeviceMNode<N> deviceMNode) {
+ skipTemplateDevice = deviceMNode;
+ Iterator<N> iterator = getCurrentChildrenIterator();
+ if (iterator instanceof IMNodeIterator) {
+ ((IMNodeIterator<N>) iterator).skipTemplateChildren();
+ }
+ }
}
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/utils/IMNodeIterator.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/utils/IMNodeIterator.java
index de1c710b228..75fd9d40c67 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/utils/IMNodeIterator.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/utils/IMNodeIterator.java
@@ -24,5 +24,7 @@ import java.util.Iterator;
public interface IMNodeIterator<N extends IMNode<?>> extends Iterator<N> {
+ void skipTemplateChildren();
+
void close();
}
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/tree/AbstractTreeVisitor.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/tree/AbstractTreeVisitor.java
index 8583a0d5101..caa8019ef87 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/tree/AbstractTreeVisitor.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/tree/AbstractTreeVisitor.java
@@ -400,6 +400,19 @@ public abstract class AbstractTreeVisitor<N extends
ITreeNode, R> implements Sch
protected abstract Iterator<N> getChildrenIterator(N parent,
Iterator<String> childrenName)
throws Exception;
+ /**
+ * Get current children iterator generated by {@link
AbstractTreeVisitor#getChildrenIterator}
+ *
+ * @return null if there is no current children iterator
+ */
+ protected Iterator<N> getCurrentChildrenIterator() {
+ if (visitorStack.isEmpty()) {
+ return null;
+ } else {
+ return visitorStack.peek().iterator.getIterator();
+ }
+ }
+
// Release a child node.
protected void releaseNode(N node) {}
@@ -520,6 +533,8 @@ public abstract class AbstractTreeVisitor<N extends
ITreeNode, R> implements Sch
}
}
+ public abstract Iterator<N> getIterator();
+
protected void close() {
if (nextMatchedChild != null) {
releaseNode(nextMatchedChild);
@@ -560,6 +575,11 @@ public abstract class AbstractTreeVisitor<N extends
ITreeNode, R> implements Sch
return;
}
}
+
+ @Override
+ public Iterator<N> getIterator() {
+ return null;
+ }
}
// only one fuzzy transition which may match batch children, need to iterate
and check all
@@ -599,6 +619,11 @@ public abstract class AbstractTreeVisitor<N extends
ITreeNode, R> implements Sch
}
}
+ @Override
+ public Iterator<N> getIterator() {
+ return childrenIterator;
+ }
+
@Override
protected void close() {
super.close();
@@ -695,6 +720,11 @@ public abstract class AbstractTreeVisitor<N extends
ITreeNode, R> implements Sch
}
}
+ @Override
+ public Iterator<N> getIterator() {
+ return iterator;
+ }
+
@Override
protected void close() {
super.close();
@@ -780,6 +810,11 @@ public abstract class AbstractTreeVisitor<N extends
ITreeNode, R> implements Sch
}
}
+ @Override
+ public Iterator<N> getIterator() {
+ return iterator;
+ }
+
/**
* Try to get next matched state from sourceState and add it into
currentStateMatchInfo
*