[IOTDB-4324][IOTDB-4339] Antlr and Statement for Show Triggers and Implementation (#7234)
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 0ae3b55..a415703 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.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 @@
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 bc66dd2..f85faf4 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 @@
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 @@
String className,
String jarName,
Map<String, String> attributes,
+ TriggerEvent event,
TTriggerState triggerState,
boolean isStateful,
TDataNodeLocation dataNodeLocation) {
@@ -64,6 +66,7 @@
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 @@
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 @@
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 @@
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 ffba5e9..effd6ca 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 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 @@
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 2dceb33..d753879 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.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;
@@ -904,6 +905,22 @@
}
@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++) {
try {
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 a1ebb0d..ee9dde0 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 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 @@
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 b6f9f5a..c8ccb8a 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 @@
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 b743458..680d922 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 @@
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 aee5e3f..260a2f2 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.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.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,17 +206,25 @@
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 bf4356e..d2efd13 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.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.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.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;
@@ -330,6 +333,27 @@
}
@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();
List<String> storageGroupPathPattern =
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 d6b69f7..9eb64fc 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 @@
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 aca6198..78d7f2e 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
@@ -266,6 +266,16 @@
}
@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();
try {
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 0000000..3bc1911
--- /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 37bd56d..7428a40 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.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 @@
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 fba7acd..9c38a7b 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.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 @@
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 0000000..ee9c652
--- /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 6b63006..f3904fd 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 @@
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 @@
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 14b7979..1d89531 100644
--- a/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/thrift-confignode/src/main/thrift/confignode.thrift
@@ -271,6 +271,12 @@
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 @@
// 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