This is an automated email from the ASF dual-hosted git repository.

jt2594838 pushed a commit to branch add_measurement_cache
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit c6706b77976e0e744c34f16d9cbde41a22c6795e
Author: Tian Jiang <[email protected]>
AuthorDate: Thu Jun 4 16:29:05 2026 +0800

    Add cache
---
 .../conf/iotdb-system.properties.template          |  6 +++
 .../apache/iotdb/commons/conf/CommonConfig.java    | 10 ++++
 .../iotdb/commons/conf/CommonDescriptor.java       |  9 ++++
 .../org/apache/iotdb/commons/utils/PathUtils.java  | 56 ++++++++++++++++++++--
 4 files changed, 77 insertions(+), 4 deletions(-)

diff --git 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
index 531cbac91a8..9910dace7d8 100644
--- 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
+++ 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
@@ -909,6 +909,12 @@ tag_attribute_flush_interval=1000
 # Datatype: int
 tag_attribute_total_size=700
 
+# The maximum number of single measurement check results cached by PathUtils.
+# Set to 0 to disable this cache.
+# effectiveMode: restart
+# Datatype: int
+single_measurement_check_cache_size=10000
+
 # max measurement num of internal request
 # When creating timeseries with Session.createMultiTimeseries, the user input 
plan, the timeseries num of
 # which exceeds this num, will be split to several plans with timeseries no 
more than this num.
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
index 6a8956e423b..830659f7e17 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
@@ -407,6 +407,8 @@ public class CommonConfig {
   // Max size for tag and attribute of one time series
   private int tagAttributeTotalSize = 700;
 
+  private int singleMeasurementCheckCacheSize = 10_000;
+
   // maximum number of Cluster Databases allowed
   private int databaseLimitThreshold = -1;
 
@@ -2611,6 +2613,14 @@ public class CommonConfig {
     this.tagAttributeTotalSize = tagAttributeTotalSize;
   }
 
+  public int getSingleMeasurementCheckCacheSize() {
+    return singleMeasurementCheckCacheSize;
+  }
+
+  public void setSingleMeasurementCheckCacheSize(int 
singleMeasurementCheckCacheSize) {
+    this.singleMeasurementCheckCacheSize = singleMeasurementCheckCacheSize;
+  }
+
   public int getDatabaseLimitThreshold() {
     return databaseLimitThreshold;
   }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
index 5cd954a09f7..3215d29843f 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
@@ -276,6 +276,15 @@ public class CommonDescriptor {
             properties.getProperty(
                 "tag_attribute_total_size", 
String.valueOf(config.getTagAttributeTotalSize()))));
 
+    int singleMeasurementCheckCacheSize =
+        Integer.parseInt(
+            properties.getProperty(
+                "single_measurement_check_cache_size",
+                String.valueOf(config.getSingleMeasurementCheckCacheSize())));
+    if (singleMeasurementCheckCacheSize >= 0) {
+      
config.setSingleMeasurementCheckCacheSize(singleMeasurementCheckCacheSize);
+    }
+
     config.setTimePartitionOrigin(
         Long.parseLong(
             properties.getProperty(
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/PathUtils.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/PathUtils.java
index 615bd62453f..1803ebb68ca 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/PathUtils.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/PathUtils.java
@@ -18,10 +18,13 @@
  */
 package org.apache.iotdb.commons.utils;
 
+import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
 
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
 import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.exception.PathParseException;
 import org.apache.tsfile.file.metadata.IDeviceID;
@@ -35,6 +38,12 @@ import java.util.Map;
 
 public class PathUtils {
 
+  private static final Cache<String, SingleMeasurementCheckResult> 
SINGLE_MEASUREMENT_CHECK_CACHE =
+      Caffeine.newBuilder()
+          .maximumSize(
+              
CommonDescriptor.getInstance().getConfig().getSingleMeasurementCheckCacheSize())
+          .build();
+
   /**
    * @param path the path will split. ex, root.ln.
    * @return string array. ex, [root, ln]
@@ -162,20 +171,29 @@ public class PathUtils {
     if (measurement == null) {
       return null;
     }
+    SingleMeasurementCheckResult result =
+        SINGLE_MEASUREMENT_CHECK_CACHE.get(measurement, 
PathUtils::checkSingleMeasurement);
+    if (result.isLegal()) {
+      return result.getMeasurement();
+    }
+    throw new IllegalPathException(measurement);
+  }
+
+  private static SingleMeasurementCheckResult checkSingleMeasurement(String 
measurement) {
     if (measurement.startsWith(TsFileConstant.BACK_QUOTE_STRING)
         && measurement.endsWith(TsFileConstant.BACK_QUOTE_STRING)) {
       if (checkBackQuotes(measurement.substring(1, measurement.length() - 1))) 
{
-        return removeBackQuotesIfNecessary(measurement);
+        return 
SingleMeasurementCheckResult.legal(removeBackQuotesIfNecessary(measurement));
       } else {
-        throw new IllegalPathException(measurement);
+        return SingleMeasurementCheckResult.illegal();
       }
     }
     if (IoTDBConstant.reservedWords.contains(measurement.toUpperCase())
         || isRealNumber(measurement)
         || !TsFileConstant.NODE_NAME_PATTERN.matcher(measurement).matches()) {
-      throw new IllegalPathException(measurement);
+      return SingleMeasurementCheckResult.illegal();
     }
-    return measurement;
+    return SingleMeasurementCheckResult.legal(measurement);
   }
 
   /** Return true if the str is a real number. Examples: 1.0; +1.0; -1.0; 
0011; 011e3; +23e-3 */
@@ -225,4 +243,34 @@ public class PathUtils {
   public static boolean isTableModelDatabase(final String databaseName) {
     return !databaseName.startsWith("root.");
   }
+
+  private static class SingleMeasurementCheckResult {
+
+    private static final SingleMeasurementCheckResult ILLEGAL =
+        new SingleMeasurementCheckResult(false, null);
+
+    private final boolean legal;
+    private final String measurement;
+
+    private SingleMeasurementCheckResult(boolean legal, String measurement) {
+      this.legal = legal;
+      this.measurement = measurement;
+    }
+
+    private static SingleMeasurementCheckResult legal(String measurement) {
+      return new SingleMeasurementCheckResult(true, measurement);
+    }
+
+    private static SingleMeasurementCheckResult illegal() {
+      return ILLEGAL;
+    }
+
+    private boolean isLegal() {
+      return legal;
+    }
+
+    private String getMeasurement() {
+      return measurement;
+    }
+  }
 }

Reply via email to