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;
