This is an automated email from the ASF dual-hosted git repository.
jackietien 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 f58133d4f6 [IOTDB-4324][IOTDB-4339] Antlr and Statement for Show
Triggers and Implementation (#7234)
f58133d4f6 is described below
commit f58133d4f6e28bc66aad8ed84358e93be8ee18a8
Author: Liao Lanyu <[email protected]>
AuthorDate: Fri Sep 23 16:01:33 2022 +0800
[IOTDB-4324][IOTDB-4339] Antlr and Statement for Show Triggers and
Implementation (#7234)
---
.../thrift/ConfigNodeRPCServiceProcessor.java | 7 ++
.../iotdb/commons/trigger/TriggerInformation.java | 17 +++-
.../apache/iotdb/commons/trigger/TriggerTable.java | 17 ++--
.../apache/iotdb/db/client/ConfigNodeClient.java | 17 ++++
.../db/mpp/common/header/ColumnHeaderConstant.java | 18 +++++
.../db/mpp/common/header/DatasetHeaderFactory.java | 4 +
.../iotdb/db/mpp/plan/constant/StatementType.java | 2 +
.../plan/execution/config/ConfigTaskVisitor.java | 10 +++
.../config/executor/ClusterConfigTaskExecutor.java | 24 ++++++
.../config/executor/IConfigTaskExecutor.java | 2 +
.../executor/StandaloneConfigTaskExecutor.java | 10 +++
.../config/metadata/ShowTriggersTask.java | 93 ++++++++++++++++++++++
.../iotdb/db/mpp/plan/parser/ASTVisitor.java | 6 ++
.../db/mpp/plan/statement/StatementVisitor.java | 5 ++
.../statement/metadata/ShowTriggersStatement.java | 52 ++++++++++++
.../trigger/service/TriggerManagementService.java | 24 ++++--
.../src/main/thrift/confignode.thrift | 37 ++++++---
17 files changed, 317 insertions(+), 28 deletions(-)
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
index 0ae3b555c7..a415703ce0 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
@@ -83,6 +83,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TDropTriggerReq;
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetTriggerTableResp;
import org.apache.iotdb.confignode.rpc.thrift.TLoginReq;
import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
import org.apache.iotdb.confignode.rpc.thrift.TRegionMigrateResultReportReq;
@@ -484,6 +485,12 @@ public class ConfigNodeRPCServiceProcessor implements
IConfigNodeRPCService.Ifac
return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
}
+ public TGetTriggerTableResp getTriggerTable() throws TException {
+ // todo: implementation
+ return new TGetTriggerTableResp(
+ new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()), null);
+ }
+
@Override
public TSStatus merge() throws TException {
return configManager.merge();
diff --git
a/node-commons/src/main/java/org/apache/iotdb/commons/trigger/TriggerInformation.java
b/node-commons/src/main/java/org/apache/iotdb/commons/trigger/TriggerInformation.java
index bc66dd28b8..f85faf4bdb 100644
---
a/node-commons/src/main/java/org/apache/iotdb/commons/trigger/TriggerInformation.java
+++
b/node-commons/src/main/java/org/apache/iotdb/commons/trigger/TriggerInformation.java
@@ -16,13 +16,13 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.iotdb.commons.trigger;
import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.utils.ThriftCommonsSerDeUtils;
import org.apache.iotdb.confignode.rpc.thrift.TTriggerState;
+import org.apache.iotdb.trigger.api.enums.TriggerEvent;
import org.apache.iotdb.tsfile.utils.PublicBAOS;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
@@ -40,11 +40,12 @@ public class TriggerInformation {
private Map<String, String> attributes;
+ private TriggerEvent event;
+
private TTriggerState triggerState;
/** indicate this Trigger is Stateful or Stateless */
private boolean isStateful;
-
/** only used for Stateful Trigger */
private TDataNodeLocation dataNodeLocation;
@@ -56,6 +57,7 @@ public class TriggerInformation {
String className,
String jarName,
Map<String, String> attributes,
+ TriggerEvent event,
TTriggerState triggerState,
boolean isStateful,
TDataNodeLocation dataNodeLocation) {
@@ -64,6 +66,7 @@ public class TriggerInformation {
this.className = className;
this.jarName = jarName;
this.attributes = attributes;
+ this.event = event;
this.triggerState = triggerState;
this.isStateful = isStateful;
this.dataNodeLocation = dataNodeLocation;
@@ -82,6 +85,7 @@ public class TriggerInformation {
ReadWriteIOUtils.write(className, outputStream);
ReadWriteIOUtils.write(jarName, outputStream);
ReadWriteIOUtils.write(attributes, outputStream);
+ ReadWriteIOUtils.write(event.getId(), outputStream);
ReadWriteIOUtils.write(triggerState.getValue(), outputStream);
ReadWriteIOUtils.write(isStateful, outputStream);
if (isStateful) {
@@ -96,6 +100,7 @@ public class TriggerInformation {
triggerInformation.className = ReadWriteIOUtils.readString(byteBuffer);
triggerInformation.jarName = ReadWriteIOUtils.readString(byteBuffer);
triggerInformation.attributes = ReadWriteIOUtils.readMap(byteBuffer);
+ triggerInformation.event =
TriggerEvent.construct(ReadWriteIOUtils.readByte(byteBuffer));
triggerInformation.triggerState =
TTriggerState.findByValue(ReadWriteIOUtils.readInt(byteBuffer));
boolean isStateful = ReadWriteIOUtils.readBool(byteBuffer);
@@ -131,6 +136,14 @@ public class TriggerInformation {
this.className = className;
}
+ public TriggerEvent getEvent() {
+ return event;
+ }
+
+ public void setEvent(TriggerEvent event) {
+ this.event = event;
+ }
+
public Map<String, String> getAttributes() {
return attributes;
}
diff --git
a/node-commons/src/main/java/org/apache/iotdb/commons/trigger/TriggerTable.java
b/node-commons/src/main/java/org/apache/iotdb/commons/trigger/TriggerTable.java
index ffba5e9e05..effd6ca1be 100644
---
a/node-commons/src/main/java/org/apache/iotdb/commons/trigger/TriggerTable.java
+++
b/node-commons/src/main/java/org/apache/iotdb/commons/trigger/TriggerTable.java
@@ -16,7 +16,6 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.iotdb.commons.trigger;
import org.apache.iotdb.confignode.rpc.thrift.TTriggerState;
@@ -42,12 +41,10 @@ public class TriggerTable {
public TriggerTable(Map<String, TriggerInformation> triggerTable) {
this.triggerTable = triggerTable;
}
-
// for createTrigger
public void addTriggerInformation(String triggerName, TriggerInformation
triggerInformation) {
triggerTable.put(triggerName, triggerInformation);
}
-
// for dropTrigger
public void deleteTriggerInformation(String triggerName) {
triggerTable.remove(triggerName);
@@ -61,16 +58,26 @@ public class TriggerTable {
triggerTable.get(triggerName).setTriggerState(TTriggerState.ACTIVE);
}
+ public TriggerInformation getTriggerInformation(String triggerName) {
+ return triggerTable.get(triggerName);
+ }
+
+ public void setTriggerInformation(String triggerName, TriggerInformation
triggerInformation) {
+ triggerTable.put(triggerName, triggerInformation);
+ }
+
// for showTrigger
public Map<String, TTriggerState> getAllTriggerStates() {
Map<String, TTriggerState> allTriggerStates = new
HashMap<>(triggerTable.size());
-
triggerTable.forEach((k, v) -> allTriggerStates.put(k,
v.getTriggerState()));
return allTriggerStates;
}
-
// for getTriggerTable
public Map<String, TriggerInformation> getTable() {
return triggerTable;
}
+
+ public boolean isEmpty() {
+ return triggerTable.isEmpty();
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
index 2dceb33ed5..d753879c77 100644
--- a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
+++ b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
@@ -57,6 +57,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TDropTriggerReq;
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetTriggerTableResp;
import org.apache.iotdb.confignode.rpc.thrift.TLoginReq;
import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
import org.apache.iotdb.confignode.rpc.thrift.TRegionMigrateResultReportReq;
@@ -903,6 +904,22 @@ public class ConfigNodeClient
throw new TException(MSG_RECONNECTION_FAIL);
}
+ @Override
+ public TGetTriggerTableResp getTriggerTable() throws TException {
+ for (int i = 0; i < RETRY_NUM; i++) {
+ try {
+ TGetTriggerTableResp resp = client.getTriggerTable();
+ if (!updateConfigNodeLeader(resp.getStatus())) {
+ return resp;
+ }
+ } catch (TException e) {
+ configLeader = null;
+ }
+ reconnect();
+ }
+ throw new TException(MSG_RECONNECTION_FAIL);
+ }
+
@Override
public TSStatus createSchemaTemplate(TCreateSchemaTemplateReq req) throws
TException {
for (int i = 0; i < RETRY_NUM; i++) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
index a1ebb0d55a..ee9dde0b24 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
@@ -75,6 +75,15 @@ public class ColumnHeaderConstant {
public static final String COLUMN_FUNCTION_TYPE = "function type";
public static final String COLUMN_FUNCTION_CLASS = "class name (UDF)";
+ // column names for show triggers statement
+ public static final String COLUMN_TRIGGER_NAME = "Trigger Name";
+ public static final String COLUMN_TRIGGER_EVENT = "Trigger Event";
+ public static final String COLUMN_TRIGGER_TYPE = "Trigger Type";
+ public static final String COLUMN_TRIGGER_STATE = "Trigger STATE";
+ public static final String COLUMN_TRIGGER_PATTERN = "Trigger PathPattern";
+ public static final String COLUMN_TRIGGER_CLASSNAME = "Trigger ClassName";
+ public static final String COLUMN_TRIGGER_LOCATION = "Trigger Location";
+
// column names for show region statement
public static final String COLUMN_REGION_ID = "RegionId";
public static final String COLUMN_TYPE = "Type";
@@ -236,6 +245,15 @@ public class ColumnHeaderConstant {
new ColumnHeader(COLUMN_FUNCTION_TYPE, TSDataType.TEXT),
new ColumnHeader(COLUMN_FUNCTION_CLASS, TSDataType.TEXT));
+ public static final List<ColumnHeader> showTriggersColumnHeaders =
+ ImmutableList.of(
+ new ColumnHeader(COLUMN_TRIGGER_NAME, TSDataType.TEXT),
+ new ColumnHeader(COLUMN_TRIGGER_EVENT, TSDataType.TEXT),
+ new ColumnHeader(COLUMN_TRIGGER_TYPE, TSDataType.TEXT),
+ new ColumnHeader(COLUMN_TRIGGER_STATE, TSDataType.TEXT),
+ new ColumnHeader(COLUMN_TRIGGER_PATTERN, TSDataType.TEXT),
+ new ColumnHeader(COLUMN_TRIGGER_LOCATION, TSDataType.TEXT));
+
public static final List<ColumnHeader> showSchemaTemplateHeaders =
ImmutableList.of(new ColumnHeader(COLUMN_TEMPLATE_NAME,
TSDataType.TEXT));
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
index b6f9f5a6c3..c8ccb8a1e8 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
@@ -85,6 +85,10 @@ public class DatasetHeaderFactory {
return new DatasetHeader(ColumnHeaderConstant.showFunctionsColumnHeaders,
true);
}
+ public static DatasetHeader getShowTriggersHeader() {
+ return new DatasetHeader(ColumnHeaderConstant.showTriggersColumnHeaders,
true);
+ }
+
public static DatasetHeader getShowRegionHeader() {
return new DatasetHeader(ColumnHeaderConstant.showRegionColumnHeaders,
true);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
index b74345889e..680d922e28 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
@@ -148,4 +148,6 @@ public enum StatementType {
START_PIPE,
STOP_PIPE,
DROP_PIPE,
+
+ SHOW_TRIGGERS,
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
index aee5e3fff9..260a2f2feb 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
@@ -35,6 +35,7 @@ import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowFunctionsTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowRegionTask;
import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowStorageGroupTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowTTLTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowTriggersTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.UnSetTTLTask;
import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.CreateSchemaTemplateTask;
import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.SetSchemaTemplateTask;
@@ -74,6 +75,7 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowFunctionsStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowRegionStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStorageGroupStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTriggersStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.UnSetTTLStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement;
@@ -204,16 +206,24 @@ public class ConfigTaskVisitor
return new ShowFunctionsTask();
}
+ @Override
public IConfigTask visitCreateTrigger(
CreateTriggerStatement createTriggerStatement, TaskContext context) {
return new CreateTriggerTask(createTriggerStatement);
}
+ @Override
public IConfigTask visitDropTrigger(
DropTriggerStatement dropTriggerStatement, TaskContext context) {
return new DropTriggerTask(dropTriggerStatement);
}
+ @Override
+ public IConfigTask visitShowTriggers(
+ ShowTriggersStatement showTriggersStatement, TaskContext context) {
+ return new ShowTriggersTask();
+ }
+
@Override
public IConfigTask visitShowRegion(ShowRegionStatement showRegionStatement,
TaskContext context) {
return new ShowRegionTask(showRegionStatement);
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index bf4356ec12..d2efd137f7 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.commons.exception.IoTDBException;
import org.apache.iotdb.commons.executable.ExecutableManager;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.commons.trigger.TriggerTable;
import org.apache.iotdb.confignode.rpc.thrift.TCountStorageGroupResp;
import org.apache.iotdb.confignode.rpc.thrift.TCreateFunctionReq;
import org.apache.iotdb.confignode.rpc.thrift.TCreateTriggerReq;
@@ -37,6 +38,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropFunctionReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropTriggerReq;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetTriggerTableResp;
import org.apache.iotdb.confignode.rpc.thrift.TSetStorageGroupReq;
import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
@@ -61,6 +63,7 @@ import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowDataNodesTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowRegionTask;
import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowStorageGroupTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowTTLTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowTriggersTask;
import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowNodesInSchemaTemplateTask;
import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowPathSetTemplateTask;
import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowSchemaTemplateTask;
@@ -329,6 +332,27 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
return future;
}
+ @Override
+ public SettableFuture<ConfigTaskResult> showTriggers() {
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ try (ConfigNodeClient client =
+
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.partitionRegionId)) {
+ TGetTriggerTableResp getTriggerTableResp = client.getTriggerTable();
+ if (getTriggerTableResp.getStatus().getCode()
+ != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ future.setException(
+ new IoTDBException(
+ getTriggerTableResp.getStatus().message,
getTriggerTableResp.getStatus().code));
+ return future;
+ }
+ } catch (TException | IOException e) {
+ future.setException(e);
+ }
+ // convert triggerTable and buildTsBlock
+ ShowTriggersTask.buildTsBlock(new TriggerTable(), future);
+ return future;
+ }
+
@Override
public SettableFuture<ConfigTaskResult> setTTL(SetTTLStatement
setTTLStatement, String taskName) {
SettableFuture<ConfigTaskResult> future = SettableFuture.create();
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
index d6b69f7a5d..9eb64fc8be 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -73,6 +73,8 @@ public interface IConfigTaskExecutor {
SettableFuture<ConfigTaskResult> dropTrigger(String triggerName);
+ SettableFuture<ConfigTaskResult> showTriggers();
+
SettableFuture<ConfigTaskResult> setTTL(SetTTLStatement setTTLStatement,
String taskName);
SettableFuture<ConfigTaskResult> merge(boolean onCluster);
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
index aca6198bd1..78d7f2e942 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
@@ -265,6 +265,16 @@ public class StandaloneConfigTaskExecutor implements
IConfigTaskExecutor {
return future;
}
+ @Override
+ public SettableFuture<ConfigTaskResult> showTriggers() {
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ future.setException(
+ new IoTDBException(
+ "Executing show triggers in standalone mode is not supported",
+ TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode()));
+ return future;
+ }
+
@Override
public SettableFuture<ConfigTaskResult> setTTL(SetTTLStatement
setTTLStatement, String taskName) {
SettableFuture<ConfigTaskResult> future = SettableFuture.create();
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowTriggersTask.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowTriggersTask.java
new file mode 100644
index 0000000000..3bc191101c
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowTriggersTask.java
@@ -0,0 +1,93 @@
+/*
+ * 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.mpp.plan.execution.config.metadata;
+
+import org.apache.iotdb.commons.trigger.TriggerInformation;
+import org.apache.iotdb.commons.trigger.TriggerTable;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
+import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.mpp.plan.execution.config.IConfigTask;
+import
org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.trigger.api.enums.TriggerType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.iotdb.tsfile.utils.Binary;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ShowTriggersTask implements IConfigTask {
+
+ @Override
+ public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor
configTaskExecutor)
+ throws InterruptedException {
+ return configTaskExecutor.showTriggers();
+ }
+
+ public static void buildTsBlock(
+ TriggerTable triggerTable, SettableFuture<ConfigTaskResult> future) {
+ List<TSDataType> outputDataTypes =
+ ColumnHeaderConstant.showTriggersColumnHeaders.stream()
+ .map(ColumnHeader::getColumnType)
+ .collect(Collectors.toList());
+ TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
+ if (triggerTable != null && !triggerTable.isEmpty()) {
+ for (TriggerInformation triggerInformation :
triggerTable.getTable().values()) {
+ builder.getTimeColumnBuilder().writeLong(0L);
+ builder
+ .getColumnBuilder(0)
+ .writeBinary(Binary.valueOf(triggerInformation.getTriggerName()));
+ builder
+ .getColumnBuilder(1)
+
.writeBinary(Binary.valueOf(triggerInformation.getEvent().toString()));
+ builder
+ .getColumnBuilder(2)
+ .writeBinary(
+ Binary.valueOf(
+ triggerInformation.isStateful()
+ ? TriggerType.STATEFUL.toString()
+ : TriggerType.STATELESS.toString()));
+ builder
+ .getColumnBuilder(3)
+
.writeBinary(Binary.valueOf(triggerInformation.getTriggerState().toString()));
+ builder
+ .getColumnBuilder(4)
+
.writeBinary(Binary.valueOf(triggerInformation.getPathPattern().toString()));
+ builder
+ .getColumnBuilder(5)
+ .writeBinary(
+ Binary.valueOf(
+ !triggerInformation.isStateful()
+ ? "ALL"
+ :
triggerInformation.getDataNodeLocation().internalEndPoint.getIp()));
+ builder.declarePosition();
+ }
+ }
+ DatasetHeader datasetHeader = DatasetHeaderFactory.getShowTriggersHeader();
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS,
builder.build(), datasetHeader));
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
index 37bd56dce1..7428a40500 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
@@ -113,6 +113,7 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowRegionStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStorageGroupStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTimeSeriesStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTriggersStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.UnSetTTLStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ActivateTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
@@ -767,6 +768,11 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
return new
DropTriggerStatement(parseIdentifier(ctx.triggerName.getText()));
}
+ @Override
+ public Statement visitShowTriggers(IoTDBSqlParser.ShowTriggersContext ctx) {
+ return new ShowTriggersStatement();
+ }
+
// Show Child Paths
=====================================================================
@Override
public Statement visitShowChildPaths(IoTDBSqlParser.ShowChildPathsContext
ctx) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
index fba7acdc9a..9c38a7bb6d 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
@@ -58,6 +58,7 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowRegionStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStorageGroupStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTimeSeriesStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTriggersStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.UnSetTTLStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ActivateTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
@@ -186,6 +187,10 @@ public abstract class StatementVisitor<R, C> {
return visitStatement(dropTriggerStatement, context);
}
+ public R visitShowTriggers(ShowTriggersStatement showTriggersStatement, C
context) {
+ return visitStatement(showTriggersStatement, context);
+ }
+
/** Data Manipulation Language (DML) */
// Select Statement
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/ShowTriggersStatement.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/ShowTriggersStatement.java
new file mode 100644
index 0000000000..ee9c65278b
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/ShowTriggersStatement.java
@@ -0,0 +1,52 @@
+/*
+ * 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.mpp.plan.statement.metadata;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
+import org.apache.iotdb.db.mpp.plan.constant.StatementType;
+import org.apache.iotdb.db.mpp.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
+
+import java.util.Collections;
+import java.util.List;
+
+public class ShowTriggersStatement extends ShowStatement implements
IConfigStatement {
+
+ public ShowTriggersStatement() {
+ super();
+ statementType = StatementType.SHOW_TRIGGERS;
+ }
+
+ @Override
+ public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+ return visitor.visitShowTriggers(this, context);
+ }
+
+ @Override
+ public QueryType getQueryType() {
+ return QueryType.READ;
+ }
+
+ @Override
+ public List<PartialPath> getPaths() {
+ return Collections.emptyList();
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/trigger/service/TriggerManagementService.java
b/server/src/main/java/org/apache/iotdb/db/trigger/service/TriggerManagementService.java
index 6b63006df6..f3904fd71d 100644
---
a/server/src/main/java/org/apache/iotdb/db/trigger/service/TriggerManagementService.java
+++
b/server/src/main/java/org/apache/iotdb/db/trigger/service/TriggerManagementService.java
@@ -46,7 +46,7 @@ public class TriggerManagementService implements IService {
private static final Logger LOGGER =
LoggerFactory.getLogger(TriggerManagementService.class);
- private final ReentrantLock registrationLock;
+ private final ReentrantLock lock;
private final TriggerTable triggerTable;
@@ -57,24 +57,32 @@ public class TriggerManagementService implements IService {
private TDataNodeLocation tDataNodeLocationCache;
private TriggerManagementService() {
- this.registrationLock = new ReentrantLock();
+ this.lock = new ReentrantLock();
this.triggerTable = new TriggerTable();
this.executorMap = new ConcurrentHashMap<>();
}
public void acquireRegistrationLock() {
- registrationLock.lock();
+ lock.lock();
}
public void releaseRegistrationLock() {
- registrationLock.unlock();
+ lock.unlock();
}
public void register(TriggerInformation triggerInformation) {
- acquireRegistrationLock();
- checkIfRegistered(triggerInformation);
- doRegister(triggerInformation);
- releaseRegistrationLock();
+ try {
+ acquireRegistrationLock();
+ checkIfRegistered(triggerInformation);
+ doRegister(triggerInformation);
+ } catch (Exception e) {
+ LOGGER.warn(
+ "Failed to register trigger({}) on data node, the cause is: {}",
+ triggerInformation.getTriggerName(),
+ e.getMessage());
+ } finally {
+ releaseRegistrationLock();
+ }
};
public void activeTrigger(String triggerName) {
diff --git a/thrift-confignode/src/main/thrift/confignode.thrift
b/thrift-confignode/src/main/thrift/confignode.thrift
index 14b7979fce..1d89531251 100644
--- a/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/thrift-confignode/src/main/thrift/confignode.thrift
@@ -271,6 +271,12 @@ struct TDropTriggerReq {
1: required string triggerName
}
+// Get trigger table from config node
+struct TGetTriggerTableResp {
+ 1: required common.TSStatus status
+ 2: required binary triggerTable
+}
+
// Show cluster
struct TShowClusterResp {
1: required common.TSStatus status
@@ -649,22 +655,27 @@ service IConfigNodeRPCService {
// Trigger
// ======================================================
- /**
- * Create a statless trigger on all online DataNodes or Create a stateful
trigger on a specific DataNode
- * and sync Information of it to all ConfigNodes
- *
- * @return SUCCESS_STATUS if the trigger was created successfully
- * EXECUTE_STATEMENT_ERROR if operations on any node failed
- */
+ /**
+ * Create a statless trigger on all online DataNodes or Create a stateful
trigger on a specific DataNode
+ * and sync Information of it to all ConfigNodes
+ *
+ * @return SUCCESS_STATUS if the trigger was created successfully
+ * EXECUTE_STATEMENT_ERROR if operations on any node failed
+ */
common.TSStatus createTrigger(TCreateTriggerReq req)
/**
- * Remove a trigger on all online ConfigNodes and DataNodes
- *
- * @return SUCCESS_STATUS if the function was removed successfully
- * EXECUTE_STATEMENT_ERROR if operations on any node failed
- */
- common.TSStatus dropTrigger(TDropTriggerReq req)
+ * Remove a trigger on all online ConfigNodes and DataNodes
+ *
+ * @return SUCCESS_STATUS if the function was removed successfully
+ * EXECUTE_STATEMENT_ERROR if operations on any node failed
+ */
+ common.TSStatus dropTrigger(TDropTriggerReq req)
+
+ /**
+ * Return the trigger table of config leader
+ */
+ TGetTriggerTableResp getTriggerTable()
// ======================================================
// Maintenance Tools