This is an automated email from the ASF dual-hosted git repository. jianyun pushed a commit to branch rocksdb/dev in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit a63cc7df3782a5931e98f66c3417ec94d3682ad7 Author: lisijia <[email protected]> AuthorDate: Fri Mar 4 10:40:46 2022 +0800 traverser changed to concurrency --- .../iotdb/db/metadata/rocksdb/MRocksDBManager.java | 43 +++------------------- .../iotdb/db/metadata/rocksdb/RocksDBUtils.java | 35 ++++++++++++++++++ 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/rocksdb/MRocksDBManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/rocksdb/MRocksDBManager.java index fc7a066..603c07f 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/rocksdb/MRocksDBManager.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/rocksdb/MRocksDBManager.java @@ -129,9 +129,6 @@ import static org.apache.iotdb.db.metadata.rocksdb.RockDBConstants.NODE_TYPE_MEA import static org.apache.iotdb.db.metadata.rocksdb.RockDBConstants.NODE_TYPE_SG; import static org.apache.iotdb.db.metadata.rocksdb.RockDBConstants.TABLE_NAME_TAGS; import static org.apache.iotdb.db.metadata.rocksdb.RockDBConstants.ZERO; -import static org.apache.iotdb.db.metadata.rocksdb.RocksDBUtils.getAllCompoundMode; -import static org.apache.iotdb.db.metadata.rocksdb.RocksDBUtils.newStringArray; -import static org.apache.iotdb.db.metadata.rocksdb.RocksDBUtils.replaceWildcard; import static org.apache.iotdb.tsfile.common.constant.TsFileConstant.PATH_SEPARATOR; /** @@ -960,38 +957,10 @@ public class MRocksDBManager implements IMetaManager { return getCountByNodeType(new Character[] {NODE_TYPE_MEASUREMENT}, pathPattern.getNodes()); } - // eg. root.a.*.**.b.**.c - public void replaceMultiWildcard( - String[] nodes, int maxLevel, Consumer<String> consumer, Character[] nodeTypeArray) - throws IllegalPathException { - List<Integer> multiWildcardPosition = new ArrayList<>(); - for (int i = 0; i < nodes.length; i++) { - if (MULTI_LEVEL_PATH_WILDCARD.equals(nodes[i])) { - multiWildcardPosition.add(i); - } - } - if (multiWildcardPosition.isEmpty()) { - traverseByPatternPath(nodes, consumer, nodeTypeArray); - } else if (multiWildcardPosition.size() == 1) { - for (int i = 1; i <= maxLevel - nodes.length + 2; i++) { - String[] clone = nodes.clone(); - clone[multiWildcardPosition.get(0)] = replaceWildcard(i); - traverseByPatternPath(newStringArray(clone), consumer, nodeTypeArray); - } - } else { - for (int sum = multiWildcardPosition.size(); - sum <= maxLevel - (nodes.length - multiWildcardPosition.size() - 1); - sum++) { - List<int[]> result = getAllCompoundMode(sum, multiWildcardPosition.size()); - for (int[] value : result) { - String[] clone = nodes.clone(); - for (int i = 0; i < value.length; i++) { - clone[multiWildcardPosition.get(i)] = replaceWildcard(value[i]); - } - traverseByPatternPath(newStringArray(clone), consumer, nodeTypeArray); - } - } - } + public void traverseOutcomeBasins( + String[] nodes, int maxLevel, Consumer<String> consumer, Character[] nodeTypeArray) { + List<String[]> allNodesArray = RocksDBUtils.replaceMultiWildcardToSingle(nodes, maxLevel); + allNodesArray.parallelStream().forEach(x -> traverseByPatternPath(x, consumer, nodeTypeArray)); } public void traverseByPatternPath( @@ -1184,7 +1153,7 @@ public class MRocksDBManager implements IMetaManager { AtomicInteger atomicInteger = new AtomicInteger(0); Consumer<String> consumer = s -> atomicInteger.incrementAndGet(); - replaceMultiWildcard(nodes, MAX_PATH_DEPTH, consumer, nodetype); + traverseOutcomeBasins(nodes, MAX_PATH_DEPTH, consumer, nodetype); return atomicInteger.get(); } @@ -1440,7 +1409,7 @@ public class MRocksDBManager implements IMetaManager { List<String> allResult = Collections.synchronizedList(new ArrayList<>()); Consumer<String> consumer = allResult::add; - replaceMultiWildcard(nodes, MAX_PATH_DEPTH, consumer, nodetype); + traverseOutcomeBasins(nodes, MAX_PATH_DEPTH, consumer, nodetype); for (String path : allResult) { collection.add(new PartialPath(path)); diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/rocksdb/RocksDBUtils.java b/server/src/main/java/org/apache/iotdb/db/metadata/rocksdb/RocksDBUtils.java index 7cf4b76..1e9e365 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/rocksdb/RocksDBUtils.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/rocksdb/RocksDBUtils.java @@ -43,6 +43,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static org.apache.iotdb.db.conf.IoTDBConstant.MULTI_LEVEL_PATH_WILDCARD; import static org.apache.iotdb.db.conf.IoTDBConstant.ONE_LEVEL_PATH_WILDCARD; import static org.apache.iotdb.db.conf.IoTDBConstant.PATH_ROOT; import static org.apache.iotdb.db.metadata.rocksdb.RockDBConstants.DATA_BLOCK_TYPE_ALIAS; @@ -507,4 +508,38 @@ public class RocksDBUtils { } return allResult; } + + // eg. root.a.*.**.b.**.c + public static List<String[]> replaceMultiWildcardToSingle(String[] nodes, int maxLevel) { + List<String[]> allNodesArray = new ArrayList<>(); + List<Integer> multiWildcardPosition = new ArrayList<>(); + for (int i = 0; i < nodes.length; i++) { + if (MULTI_LEVEL_PATH_WILDCARD.equals(nodes[i])) { + multiWildcardPosition.add(i); + } + } + if (multiWildcardPosition.isEmpty()) { + allNodesArray.add(nodes); + } else if (multiWildcardPosition.size() == 1) { + for (int i = 1; i <= maxLevel - nodes.length + 2; i++) { + String[] clone = nodes.clone(); + clone[multiWildcardPosition.get(0)] = replaceWildcard(i); + allNodesArray.add(clone); + } + } else { + for (int sum = multiWildcardPosition.size(); + sum <= maxLevel - (nodes.length - multiWildcardPosition.size() - 1); + sum++) { + List<int[]> result = getAllCompoundMode(sum, multiWildcardPosition.size()); + for (int[] value : result) { + String[] clone = nodes.clone(); + for (int i = 0; i < value.length; i++) { + clone[multiWildcardPosition.get(i)] = replaceWildcard(value[i]); + } + allNodesArray.add(clone); + } + } + } + return allNodesArray; + } }
