You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2021/06/04 10:44:26 UTC
[iotdb] branch master updated: Try to fix sg dead lock (#3340)
This is an automated email from the ASF dual-hosted git repository.
haonan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new d55a204 Try to fix sg dead lock (#3340)
d55a204 is described below
commit d55a2041d4ad8e42a8b677a65611c0c86f31e148
Author: Jackie Tien <Ja...@foxmail.com>
AuthorDate: Fri Jun 4 18:43:54 2021 +0800
Try to fix sg dead lock (#3340)
---
.../antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 | 5 ++
.../org/apache/iotdb/db/conf/IoTDBConstant.java | 1 +
.../org/apache/iotdb/db/engine/StorageEngine.java | 20 ++++++
.../engine/storagegroup/StorageGroupProcessor.java | 72 ++++++++++++----------
.../virtualSg/VirtualStorageGroupManager.java | 14 ++---
.../apache/iotdb/db/qp/constant/SQLConstant.java | 2 +
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 36 +++++++++++
.../db/qp/logical/sys/ShowLockInfoOperator.java | 36 +++++++++++
.../iotdb/db/qp/physical/sys/ShowLockInfoPlan.java | 36 +++++++++++
.../apache/iotdb/db/qp/physical/sys/ShowPlan.java | 3 +-
.../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 12 ++++
.../iotdb/db/qp/strategy/PhysicalGenerator.java | 5 ++
12 files changed, 202 insertions(+), 40 deletions(-)
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
index 18539c7..9d05e7a 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
@@ -76,6 +76,7 @@ statement
| SHOW VERSION #showVersion
| SHOW LATEST? TIMESERIES prefixPath? showWhereClause? limitClause? #showTimeseries
| SHOW STORAGE GROUP prefixPath? #showStorageGroup
+ | SHOW LOCK INFO prefixPath? #showLockInfo
| SHOW CHILD PATHS prefixPath? #showChildPaths
| SHOW CHILD NODES prefixPath? #showChildNodes
| SHOW DEVICES prefixPath? (WITH STORAGE GROUP)? limitClause? #showDevices
@@ -1235,6 +1236,10 @@ ANY
: A N Y
;
+LOCK
+ : L O C K
+ ;
+
//============================
// End of the keywords list
//============================
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
index a497437..29f7dd5 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
@@ -80,6 +80,7 @@ public class IoTDBConstant {
public static final String COLUMN_PRIVILEGE = "privilege";
public static final String COLUMN_STORAGE_GROUP = "storage group";
+ public static final String COLUMN_LOCK_INFO = "lock holder";
public static final String COLUMN_TTL = "ttl";
public static final String COLUMN_TASK_NAME = "task name";
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
index 96e288a..93e6fcb 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
@@ -408,6 +408,26 @@ public class StorageEngine implements IService {
}
/**
+ * get lock holder for each sg
+ *
+ * @return storage group processor
+ */
+ public List<String> getLockInfo(List<PartialPath> pathList) throws StorageEngineException {
+ try {
+ List<String> lockHolderList = new ArrayList<>(pathList.size());
+ for (PartialPath path : pathList) {
+ StorageGroupMNode storageGroupMNode = IoTDB.metaManager.getStorageGroupNodeByPath(path);
+ StorageGroupProcessor storageGroupProcessor =
+ getStorageGroupProcessorByPath(path, storageGroupMNode);
+ lockHolderList.add(storageGroupProcessor.getInsertWriteLockHolder());
+ }
+ return lockHolderList;
+ } catch (StorageGroupProcessorException | MetadataException e) {
+ throw new StorageEngineException(e);
+ }
+ }
+
+ /**
* get storage group processor by device path
*
* @param devicePath path of the device
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
index 26261df..1e75eea 100755
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
@@ -272,6 +272,8 @@ public class StorageGroupProcessor {
// DEFAULT_POOL_TRIM_INTERVAL_MILLIS
private long timeWhenPoolNotEmpty = Long.MAX_VALUE;
+ private String insertWriteLockHolder = "";
+
/** get the direct byte buffer from pool, each fetch contains two ByteBuffer */
public ByteBuffer[] getWalDirectByteBuffer() {
ByteBuffer[] res = new ByteBuffer[2];
@@ -798,7 +800,7 @@ public class StorageGroupProcessor {
if (!isAlive(insertRowPlan.getTime())) {
throw new OutOfTTLException(insertRowPlan.getTime(), (System.currentTimeMillis() - dataTTL));
}
- writeLock();
+ writeLock("InsertRow");
try {
// init map
long timePartitionId = StorageEngine.getTimePartition(insertRowPlan.getTime());
@@ -840,7 +842,7 @@ public class StorageGroupProcessor {
public void insertTablet(InsertTabletPlan insertTabletPlan)
throws BatchProcessException, TriggerExecutionException {
- writeLock();
+ writeLock("insertTablet");
try {
TSStatus[] results = new TSStatus[insertTabletPlan.getRowCount()];
Arrays.fill(results, RpcUtils.SUCCESS_STATUS);
@@ -1122,7 +1124,7 @@ public class StorageGroupProcessor {
}
public void submitAFlushTaskWhenShouldFlush(TsFileProcessor tsFileProcessor) {
- writeLock();
+ writeLock("submitAFlushTaskWhenShouldFlush");
try {
// check memtable size and may asyncTryToFlush the work memtable
if (tsFileProcessor.shouldFlush()) {
@@ -1342,9 +1344,9 @@ public class StorageGroupProcessor {
"{} will close all files for deleting data folder {}",
logicalStorageGroupName + "-" + virtualStorageGroupId,
systemDir);
- writeLock();
- syncCloseAllWorkingTsFileProcessors();
+ writeLock("deleteFolder");
try {
+ syncCloseAllWorkingTsFileProcessors();
File storageGroupFolder =
SystemFileFactory.INSTANCE.getFile(systemDir, virtualStorageGroupId);
if (storageGroupFolder.exists()) {
@@ -1385,21 +1387,16 @@ public class StorageGroupProcessor {
logger.info(
"{} will close all files for deleting data files",
logicalStorageGroupName + "-" + virtualStorageGroupId);
- writeLock();
- syncCloseAllWorkingTsFileProcessors();
- // normally, mergingModification is just need to be closed by after a merge task is finished.
- // we close it here just for IT test.
- if (this.tsFileManagement.mergingModification != null) {
- try {
+ writeLock("syncDeleteDataFiles");
+ try {
+
+ syncCloseAllWorkingTsFileProcessors();
+ // normally, mergingModification is just need to be closed by after a merge task is finished.
+ // we close it here just for IT test.
+ if (this.tsFileManagement.mergingModification != null) {
this.tsFileManagement.mergingModification.close();
- } catch (IOException e) {
- logger.error(
- "Cannot close the mergingMod file {}",
- this.tsFileManagement.mergingModification.getFilePath(),
- e);
}
- }
- try {
+
closeAllResources();
List<String> folder = DirectoryManager.getInstance().getAllSequenceFileFolders();
folder.addAll(DirectoryManager.getInstance().getAllUnSequenceFileFolders());
@@ -1411,6 +1408,11 @@ public class StorageGroupProcessor {
this.partitionLatestFlushedTimeForEachDevice.clear();
this.globalLatestFlushedTimeForEachDevice.clear();
this.latestTimeForEachDevice.clear();
+ } catch (IOException e) {
+ logger.error(
+ "Cannot close the mergingMod file {}",
+ this.tsFileManagement.mergingModification.getFilePath(),
+ e);
} finally {
writeUnlock();
}
@@ -1462,7 +1464,7 @@ public class StorageGroupProcessor {
return;
}
- writeLock();
+ writeLock("checkFileTTL");
try {
// prevent new merges and queries from choosing this file
resource.setDeleted(true);
@@ -1522,7 +1524,7 @@ public class StorageGroupProcessor {
}
public void asyncCloseAllWorkingTsFileProcessors() {
- writeLock();
+ writeLock("asyncCloseAllWorkingTsFileProcessors");
try {
logger.info(
"async force close all files in storage group: {}",
@@ -1543,7 +1545,7 @@ public class StorageGroupProcessor {
}
public void forceCloseAllWorkingTsFileProcessors() throws TsFileProcessorException {
- writeLock();
+ writeLock("forceCloseAllWorkingTsFileProcessors");
try {
logger.info(
"force close all processors in storage group: {}",
@@ -1612,11 +1614,13 @@ public class StorageGroupProcessor {
insertLock.readLock().unlock();
}
- public void writeLock() {
+ public void writeLock(String holder) {
insertLock.writeLock().lock();
+ insertWriteLockHolder = holder;
}
public void writeUnlock() {
+ insertWriteLockHolder = "";
insertLock.writeLock().unlock();
}
@@ -1705,7 +1709,7 @@ public class StorageGroupProcessor {
// TODO: how to avoid partial deletion?
// FIXME: notice that if we may remove a SGProcessor out of memory, we need to close all opened
// mod files in mergingModification, sequenceFileList, and unsequenceFileList
- writeLock();
+ writeLock("delete");
// record files which are updated so that we can roll back them in case of exception
List<ModificationFile> updatedModFiles = new ArrayList<>();
@@ -2049,7 +2053,7 @@ public class StorageGroupProcessor {
upgradeFileCount.getAndAdd(-1);
// load all upgraded resources in this sg to tsFileManagement
if (upgradeFileCount.get() == 0) {
- writeLock();
+ writeLock("upgradeTsFileResourceCallBack");
try {
loadUpgradedResources(upgradeSeqFileList, true);
loadUpgradedResources(upgradeUnseqFileList, false);
@@ -2111,7 +2115,7 @@ public class StorageGroupProcessor {
}
public void merge(boolean isFullMerge) {
- writeLock();
+ writeLock("merge");
try {
for (long timePartitionId : partitionLatestFlushedTimeForEachDevice.keySet()) {
executeCompaction(timePartitionId, isFullMerge);
@@ -2135,7 +2139,7 @@ public class StorageGroupProcessor {
public void loadNewTsFileForSync(TsFileResource newTsFileResource) throws LoadFileException {
File tsfileToBeInserted = newTsFileResource.getTsFile();
long newFilePartitionId = newTsFileResource.getTimePartitionWithCheck();
- writeLock();
+ writeLock("loadNewTsFileForSync");
try {
if (loadTsFileByType(
LoadTsFileType.LOAD_SEQUENCE,
@@ -2205,7 +2209,7 @@ public class StorageGroupProcessor {
public void loadNewTsFile(TsFileResource newTsFileResource) throws LoadFileException {
File tsfileToBeInserted = newTsFileResource.getTsFile();
long newFilePartitionId = newTsFileResource.getTimePartitionWithCheck();
- writeLock();
+ writeLock("loadNewTsFile");
try {
List<TsFileResource> sequenceList = tsFileManagement.getTsFileList(true);
@@ -2381,7 +2385,7 @@ public class StorageGroupProcessor {
*/
@SuppressWarnings("unused")
public void removeFullyOverlapFiles(TsFileResource resource) {
- writeLock();
+ writeLock("removeFullyOverlapFiles");
try {
Iterator<TsFileResource> iterator = tsFileManagement.getIterator(true);
removeFullyOverlapFiles(resource, iterator, true);
@@ -2654,7 +2658,7 @@ public class StorageGroupProcessor {
* module.
*/
public boolean deleteTsfile(File tsfieToBeDeleted) {
- writeLock();
+ writeLock("deleteTsfile");
TsFileResource tsFileResourceToBeDeleted = null;
try {
Iterator<TsFileResource> sequenceIterator = tsFileManagement.getIterator(true);
@@ -2708,7 +2712,7 @@ public class StorageGroupProcessor {
* @return whether the file to be moved exists. @UsedBy load external tsfile module.
*/
public boolean moveTsfile(File fileToBeMoved, File targetDir) {
- writeLock();
+ writeLock("moveTsfile");
TsFileResource tsFileResourceToBeMoved = null;
try {
Iterator<TsFileResource> sequenceIterator = tsFileManagement.getIterator(true);
@@ -2839,7 +2843,7 @@ public class StorageGroupProcessor {
/** remove all partitions that satisfy a filter. */
public void removePartitions(TimePartitionFilter filter) {
// this requires blocking all other activities
- writeLock();
+ writeLock("removePartitions");
try {
// abort ongoing comapctions and merges
CompactionMergeTaskPoolManager.getInstance().abortCompaction(logicalStorageGroupName);
@@ -2896,7 +2900,7 @@ public class StorageGroupProcessor {
public void insert(InsertRowsOfOneDevicePlan insertRowsOfOneDevicePlan)
throws WriteProcessException, TriggerExecutionException {
- writeLock();
+ writeLock("InsertRowsOfOneDevice");
try {
boolean isSequence = false;
InsertRowPlan[] rowPlans = insertRowsOfOneDevicePlan.getRowPlans();
@@ -2989,4 +2993,8 @@ public class StorageGroupProcessor {
boolean satisfy(String storageGroupName, long timePartitionId);
}
+
+ public String getInsertWriteLockHolder() {
+ return insertWriteLockHolder;
+ }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/virtualSg/VirtualStorageGroupManager.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/virtualSg/VirtualStorageGroupManager.java
index e8d1f77..b7c86b1 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/virtualSg/VirtualStorageGroupManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/virtualSg/VirtualStorageGroupManager.java
@@ -201,7 +201,7 @@ public class VirtualStorageGroupManager {
isSeq);
}
- processor.writeLock();
+ processor.writeLock("VirtualCloseStorageGroupProcessor-204");
try {
if (isSeq) {
// to avoid concurrent modification problem, we need a new array list
@@ -239,13 +239,13 @@ public class VirtualStorageGroupManager {
processor.getVirtualStorageGroupId() + "-" + processor.getLogicalStorageGroupName(),
isSeq,
partitionId);
- processor.writeLock();
- // to avoid concurrent modification problem, we need a new array list
- List<TsFileProcessor> processors =
- isSeq
- ? new ArrayList<>(processor.getWorkSequenceTsFileProcessors())
- : new ArrayList<>(processor.getWorkUnsequenceTsFileProcessors());
+ processor.writeLock("VirtualCloseStorageGroupProcessor-242");
try {
+ // to avoid concurrent modification problem, we need a new array list
+ List<TsFileProcessor> processors =
+ isSeq
+ ? new ArrayList<>(processor.getWorkSequenceTsFileProcessors())
+ : new ArrayList<>(processor.getWorkUnsequenceTsFileProcessors());
for (TsFileProcessor tsfileProcessor : processors) {
if (tsfileProcessor.getTimeRangeId() == partitionId) {
if (isSync) {
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java b/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
index eb3cd40..2cdbc5f 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
@@ -189,6 +189,8 @@ public class SQLConstant {
public static final int TOK_TRIGGER_STOP = 103;
public static final int TOK_SHOW_TRIGGERS = 104;
+ public static final int TOK_LOCK_INFO = 105;
+
public static final Map<Integer, String> tokenSymbol = new HashMap<>();
public static final Map<Integer, String> tokenNames = new HashMap<>();
public static final Map<Integer, Integer> reverseWords = new HashMap<>();
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index 8918a2b..7d1ced7 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -102,6 +102,7 @@ import org.apache.iotdb.db.qp.physical.sys.ShowChildNodesPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowChildPathsPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowDevicesPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowFunctionsPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowLockInfoPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowStorageGroupPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
@@ -177,6 +178,7 @@ import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_FUNCTION_CLASS;
import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_FUNCTION_NAME;
import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_FUNCTION_TYPE;
import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_ITEM;
+import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_LOCK_INFO;
import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_PRIVILEGE;
import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_PROGRESS;
import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_ROLE;
@@ -565,6 +567,8 @@ public class PlanExecutor implements IPlanExecutor {
return processShowTimeseries((ShowTimeSeriesPlan) showPlan, context);
case STORAGE_GROUP:
return processShowStorageGroup((ShowStorageGroupPlan) showPlan);
+ case LOCK_INFO:
+ return processShowLockInfo((ShowLockInfoPlan) showPlan);
case DEVICES:
return processShowDevices((ShowDevicesPlan) showPlan);
case CHILD_PATH:
@@ -772,6 +776,38 @@ public class PlanExecutor implements IPlanExecutor {
}
}
+ private QueryDataSet processShowLockInfo(ShowLockInfoPlan showLockInfoPlan)
+ throws MetadataException {
+ ListDataSet listDataSet =
+ new ListDataSet(
+ Arrays.asList(
+ new PartialPath(COLUMN_STORAGE_GROUP, false),
+ new PartialPath(COLUMN_LOCK_INFO, false)),
+ Arrays.asList(TSDataType.TEXT, TSDataType.TEXT));
+ try {
+ List<PartialPath> storageGroupList = getStorageGroupNames(showLockInfoPlan.getPath());
+ List<String> lockHolderList = StorageEngine.getInstance().getLockInfo(storageGroupList);
+ addLockInfoToDataSet(storageGroupList, lockHolderList, listDataSet);
+ } catch (StorageEngineException e) {
+ throw new MetadataException(e);
+ }
+ return listDataSet;
+ }
+
+ private void addLockInfoToDataSet(
+ List<PartialPath> paths, List<String> lockHolderList, ListDataSet dataSet) {
+ for (int i = 0; i < paths.size(); i++) {
+ RowRecord record = new RowRecord(0);
+ Field field = new Field(TSDataType.TEXT);
+ field.setBinaryV(new Binary(paths.get(i).getFullPath()));
+ record.addField(field);
+ field = new Field(TSDataType.TEXT);
+ field.setBinaryV(new Binary(lockHolderList.get(i)));
+ record.addField(field);
+ dataSet.putRecord(record);
+ }
+ }
+
private QueryDataSet processShowTimeseries(
ShowTimeSeriesPlan showTimeSeriesPlan, QueryContext context) throws MetadataException {
return new ShowTimeseriesDataSet(showTimeSeriesPlan, context);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowLockInfoOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowLockInfoOperator.java
new file mode 100644
index 0000000..aa2a8d0
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowLockInfoOperator.java
@@ -0,0 +1,36 @@
+/*
+ * 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.qp.logical.sys;
+
+import org.apache.iotdb.db.metadata.PartialPath;
+
+public class ShowLockInfoOperator extends ShowOperator {
+
+ private final PartialPath path;
+
+ public ShowLockInfoOperator(int tokenIntType, PartialPath path) {
+ super(tokenIntType);
+ this.path = path;
+ }
+
+ public PartialPath getPath() {
+ return path;
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowLockInfoPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowLockInfoPlan.java
new file mode 100644
index 0000000..e69bbd2
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowLockInfoPlan.java
@@ -0,0 +1,36 @@
+/*
+ * 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.qp.physical.sys;
+
+import org.apache.iotdb.db.metadata.PartialPath;
+
+public class ShowLockInfoPlan extends ShowPlan {
+
+ private final PartialPath path;
+
+ public ShowLockInfoPlan(ShowContentType showContentType, PartialPath path) {
+ super(showContentType);
+ this.path = path;
+ }
+
+ @Override
+ public PartialPath getPath() {
+ return this.path;
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
index 5e7284d..9342e10 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
@@ -116,6 +116,7 @@ public class ShowPlan extends PhysicalPlan {
COUNT_DEVICES,
COUNT_STORAGE_GROUP,
QUERY_PROCESSLIST,
- TRIGGERS
+ TRIGGERS,
+ LOCK_INFO
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
index 9d110f7..6dba215 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
@@ -68,6 +68,7 @@ import org.apache.iotdb.db.qp.logical.sys.ShowChildNodesOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowChildPathsOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowDevicesOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowFunctionsOperator;
+import org.apache.iotdb.db.qp.logical.sys.ShowLockInfoOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowMergeStatusOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowStorageGroupOperator;
@@ -182,6 +183,7 @@ import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowChildPathsContext;
import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowDevicesContext;
import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowFlushTaskInfoContext;
import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowFunctionsContext;
+import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowLockInfoContext;
import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowMergeStatusContext;
import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowQueryProcesslistContext;
import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowStorageGroupContext;
@@ -825,6 +827,16 @@ public class IoTDBSqlVisitor extends SqlBaseBaseVisitor<Operator> {
}
@Override
+ public Operator visitShowLockInfo(ShowLockInfoContext ctx) {
+ if (ctx.prefixPath() != null) {
+ return new ShowLockInfoOperator(SQLConstant.TOK_LOCK_INFO, parsePrefixPath(ctx.prefixPath()));
+ } else {
+ return new ShowLockInfoOperator(
+ SQLConstant.TOK_LOCK_INFO, new PartialPath(SQLConstant.getSingleRootArray()));
+ }
+ }
+
+ @Override
public Operator visitShowChildPaths(ShowChildPathsContext ctx) {
if (ctx.prefixPath() != null) {
return new ShowChildPathsOperator(
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index 5c81c6e..1024a89 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -61,6 +61,7 @@ import org.apache.iotdb.db.qp.logical.sys.ShowChildNodesOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowChildPathsOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowDevicesOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowFunctionsOperator;
+import org.apache.iotdb.db.qp.logical.sys.ShowLockInfoOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowStorageGroupOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowTTLOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowTimeSeriesOperator;
@@ -111,6 +112,7 @@ import org.apache.iotdb.db.qp.physical.sys.ShowChildNodesPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowChildPathsPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowDevicesPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowFunctionsPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowLockInfoPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowMergeStatusPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowPlan.ShowContentType;
@@ -322,6 +324,9 @@ public class PhysicalGenerator {
case SQLConstant.TOK_STORAGE_GROUP:
return new ShowStorageGroupPlan(
ShowContentType.STORAGE_GROUP, ((ShowStorageGroupOperator) operator).getPath());
+ case SQLConstant.TOK_LOCK_INFO:
+ return new ShowLockInfoPlan(
+ ShowContentType.LOCK_INFO, ((ShowLockInfoOperator) operator).getPath());
case SQLConstant.TOK_DEVICES:
ShowDevicesOperator showDevicesOperator = (ShowDevicesOperator) operator;
return new ShowDevicesPlan(