From ee2e835ccee9d3acde5f8ee4f150cc77b3737156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E5=85=B6=E9=AA=8F?= Date: Wed, 29 Sep 2021 21:09:28 +0800 Subject: [PATCH] [IOTDB-1759]Use totalSeriesNumber in MManger to accelerate count timeseries --- .../java/org/apache/iotdb/db/metadata/MManager.java | 5 +++-- .../main/java/org/apache/iotdb/db/metadata/MTree.java | 11 ++++++++--- .../java/org/apache/iotdb/db/metadata/MTreeTest.java | 8 ++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java index 8767af7a99d3a..65167c8ea6f9e 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java @@ -712,7 +712,8 @@ public void setStorageGroup(PartialPath storageGroup) throws MetadataException { public void deleteStorageGroups(List storageGroups) throws MetadataException { try { for (PartialPath storageGroup : storageGroups) { - totalSeriesNumber.addAndGet(-mtree.getAllTimeseriesCount(storageGroup)); + totalSeriesNumber.addAndGet( + -mtree.getAllTimeseriesCount(storageGroup, (int) totalSeriesNumber.get())); // clear cached MNode if (!allowToCreateNewSeries && totalSeriesNumber.get() * ESTIMATED_SERIES_SIZE < MTREE_SIZE_THRESHOLD) { @@ -884,7 +885,7 @@ public Pair, Integer> getAllTimeseriesPathWithAlias( /** To calculate the count of timeseries for given prefix path. */ public int getAllTimeseriesCount(PartialPath prefixPath) throws MetadataException { - return mtree.getAllTimeseriesCount(prefixPath); + return mtree.getAllTimeseriesCount(prefixPath, (int) totalSeriesNumber.get()); } /** To calculate the count of devices for given prefix path. */ diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java index 5852108491051..97fde33546542 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java @@ -88,8 +88,7 @@ import java.util.stream.Stream; import static java.util.stream.Collectors.toList; -import static org.apache.iotdb.db.conf.IoTDBConstant.PATH_SEPARATOR; -import static org.apache.iotdb.db.conf.IoTDBConstant.PATH_WILDCARD; +import static org.apache.iotdb.db.conf.IoTDBConstant.*; /** The hierarchical struct of the Metadata Tree is implemented in this class. */ public class MTree implements Serializable { @@ -981,11 +980,17 @@ Pair, Integer> getAllTimeseriesPathWithAlias( * throw PathNotExistException() * * @param prefixPath a prefix path or a full path, may contain '*'. + * @param totalSeriesNumber MManger generated total series number under the root path , if MManger + * don't generated, can transmission - 1 */ - int getAllTimeseriesCount(PartialPath prefixPath) throws MetadataException { + int getAllTimeseriesCount(PartialPath prefixPath, int totalSeriesNumber) + throws MetadataException { String[] nodes = prefixPath.getNodes(); if (nodes.length == 0 || !nodes[0].equals(root.getName())) { throw new IllegalPathException(prefixPath.getFullPath()); + } else if (totalSeriesNumber >= 0 + && (nodes.length == 1 || (nodes.length == 2 && nodes[1].equals(PATH_WILDCARD)))) { + return totalSeriesNumber; } try { return getCount(root, nodes, 1, false); diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java index 2070c693b9638..d08581362269b 100644 --- a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java +++ b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java @@ -677,11 +677,11 @@ public void testGetAllTimeseriesCount() { null, null); - assertEquals(4, root.getAllTimeseriesCount(new PartialPath("root.laptop"))); - assertEquals(2, root.getAllTimeseriesCount(new PartialPath("root.laptop.*.s1"))); + assertEquals(4, root.getAllTimeseriesCount(new PartialPath("root.laptop"), -1)); + assertEquals(2, root.getAllTimeseriesCount(new PartialPath("root.laptop.*.s1"), -1)); PartialPath partialPath = new PartialPath("root.laptop.d1.s3"); try { - root.getAllTimeseriesCount(partialPath); + root.getAllTimeseriesCount(partialPath, -1); fail("Expected exception"); } catch (MetadataException e) { assertEquals("Path [root.laptop.d1.s3] does not exist", e.getMessage()); @@ -719,7 +719,7 @@ public void testAddSubDevice() throws MetadataException { null); assertEquals(2, root.getDevices(new PartialPath("root")).size()); - assertEquals(2, root.getAllTimeseriesCount(new PartialPath("root"))); + assertEquals(2, root.getAllTimeseriesCount(new PartialPath("root"), -1)); assertEquals(2, root.getAllTimeseriesPath(new PartialPath("root")).size()); assertEquals(2, root.getAllTimeseriesPathWithAlias(new PartialPath("root"), 0, 0).left.size()); }