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

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

commit 88aed54250d717db3e945ecd475e9f0af0aef614
Author: HTHou <[email protected]>
AuthorDate: Mon May 15 09:06:20 2023 +0800

    measurementIdCache
---
 .../metadata/cache/DataNodeMeasurementIdCache.java | 57 ++++++++++++++++++++++
 .../service/thrift/impl/ClientRPCServiceImpl.java  | 25 +++++++++-
 .../apache/iotdb/db/wal/utils/WALWriteUtils.java   |  3 +-
 3 files changed, 82 insertions(+), 3 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeMeasurementIdCache.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeMeasurementIdCache.java
new file mode 100644
index 0000000000..571fbb7a82
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeMeasurementIdCache.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.metadata.cache;
+
+import org.apache.iotdb.db.conf.IoTDBConfig;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+
+public class DataNodeMeasurementIdCache {
+
+  private static final IoTDBConfig config = 
IoTDBDescriptor.getInstance().getConfig();
+
+  private final Cache<String, byte[]> measurementIdCache;
+
+  private DataNodeMeasurementIdCache() {
+    measurementIdCache = 
Caffeine.newBuilder().maximumSize(config.getDevicePathCacheSize()).build();
+  }
+
+  public static DataNodeMeasurementIdCache getInstance() {
+    return 
DataNodeMeasurementIdCache.DataNodeMeasurementIdCacheHolder.INSTANCE;
+  }
+
+  /** singleton pattern. */
+  private static class DataNodeMeasurementIdCacheHolder {
+    private static final DataNodeMeasurementIdCache INSTANCE = new 
DataNodeMeasurementIdCache();
+  }
+
+  public boolean contains(String measurementId) {
+    return null != measurementIdCache.getIfPresent(measurementId);
+  }
+
+  public byte[] getBytes(String measurementId) {
+    return measurementIdCache.get(measurementId, String::getBytes);
+  }
+
+  public void cleanUp() {
+    measurementIdCache.cleanUp();
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java
index 5d1456935b..5e6f344def 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.db.auth.AuthorityChecker;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.conf.OperationType;
+import org.apache.iotdb.db.metadata.cache.DataNodeMeasurementIdCache;
 import org.apache.iotdb.db.metadata.template.TemplateQueryType;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
 import org.apache.iotdb.db.mpp.plan.Coordinator;
@@ -1146,8 +1147,28 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
       }
 
       // check whether measurement is legal according to syntax convention
-      req.setMeasurementsList(
-          
PathUtils.checkIsLegalSingleMeasurementListsAndUpdate(req.getMeasurementsList()));
+
+      List<List<String>> measurementLists = req.getMeasurementsList();
+      List<List<String>> res = new ArrayList<>();
+      for (List<String> measurements : measurementLists) {
+        List<String> checkedList = new ArrayList<>();
+        for (String measurement : measurements) {
+          if (measurement == null) {
+            checkedList.add(null);
+          } else {
+            if 
(DataNodeMeasurementIdCache.getInstance().contains(measurement)) {
+              checkedList.add(measurement);
+            } else {
+              String checked = 
PathUtils.checkAndReturnSingleMeasurement(measurement);
+              DataNodeMeasurementIdCache.getInstance().getBytes(checked);
+              checkedList.add(measurement);
+            }
+          }
+        }
+        res.add(checkedList);
+      }
+
+      req.setMeasurementsList(res);
 
       // Step 1:  transfer from TSInsertRecordsReq to Statement
       InsertRowsStatement statement = StatementGenerator.createStatement(req);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/wal/utils/WALWriteUtils.java 
b/server/src/main/java/org/apache/iotdb/db/wal/utils/WALWriteUtils.java
index 5eb016ced7..ccf23765db 100644
--- a/server/src/main/java/org/apache/iotdb/db/wal/utils/WALWriteUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/wal/utils/WALWriteUtils.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.wal.utils;
 
+import org.apache.iotdb.db.metadata.cache.DataNodeMeasurementIdCache;
 import org.apache.iotdb.db.wal.buffer.IWALByteBufferView;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -124,7 +125,7 @@ public class WALWriteUtils {
       return write(NO_BYTE_TO_READ, buffer);
     }
     int len = 0;
-    byte[] bytes = s.getBytes();
+    byte[] bytes = DataNodeMeasurementIdCache.getInstance().getBytes(s);
     len += write(bytes.length, buffer);
     buffer.put(bytes);
     len += bytes.length;

Reply via email to