You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/10/20 05:37:30 UTC

[iotdb] branch master updated: [IOTDB-4698]Implement interface of getLocationOfStatefulTrigger (#7663)

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 40571eb259 [IOTDB-4698]Implement interface of getLocationOfStatefulTrigger (#7663)
40571eb259 is described below

commit 40571eb259f27d2c3b40c578b22e5b18e785046f
Author: Weihao Li <60...@users.noreply.github.com>
AuthorDate: Thu Oct 20 13:37:25 2022 +0800

    [IOTDB-4698]Implement interface of getLocationOfStatefulTrigger (#7663)
---
 .../consensus/request/ConfigPhysicalPlan.java      |  4 ++
 .../consensus/request/ConfigPhysicalPlanType.java  |  3 +-
 .../request/read/GetTriggerLocationPlan.java       | 62 ++++++++++++++++++++++
 .../consensus/response/TriggerLocationResp.java    | 49 +++++++++++++++++
 .../iotdb/confignode/manager/ConfigManager.java    |  9 ++++
 .../apache/iotdb/confignode/manager/IManager.java  |  4 ++
 .../iotdb/confignode/manager/TriggerManager.java   | 16 +++++-
 .../iotdb/confignode/persistence/TriggerInfo.java  | 17 ++++++
 .../persistence/executor/ConfigPlanExecutor.java   |  3 ++
 .../thrift/ConfigNodeRPCServiceProcessor.java      |  4 +-
 .../request/ConfigPhysicalPlanSerDeTest.java       | 11 ++++
 .../apache/iotdb/commons/trigger/TriggerTable.java |  5 ++
 .../apache/iotdb/db/client/ConfigNodeClient.java   |  2 +-
 .../src/main/thrift/confignode.thrift              |  2 +-
 14 files changed, 183 insertions(+), 8 deletions(-)

diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
index be83d6f453..c38ec65dae 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
@@ -34,6 +34,7 @@ import org.apache.iotdb.confignode.consensus.request.read.GetStorageGroupPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTimeSlotListPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTransferringTriggersPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTriggerJarPlan;
+import org.apache.iotdb.confignode.consensus.request.read.GetTriggerLocationPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTriggerTablePlan;
 import org.apache.iotdb.confignode.consensus.request.read.template.CheckTemplateSettablePlan;
 import org.apache.iotdb.confignode.consensus.request.read.template.GetAllSchemaTemplatePlan;
@@ -243,6 +244,9 @@ public abstract class ConfigPhysicalPlan implements IConsensusRequest {
         case GetTriggerTable:
           req = new GetTriggerTablePlan();
           break;
+        case GetTriggerLocation:
+          req = new GetTriggerLocationPlan();
+          break;
         case GetTriggerJar:
           req = new GetTriggerJarPlan();
           break;
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
index e81f4ddcc6..f2492a1766 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
@@ -95,5 +95,6 @@ public enum ConfigPhysicalPlanType {
   GetTimeSlotList,
   UpdateTriggersOnTransferNodes,
   UpdateTriggerLocation,
-  GetTransferringTriggers
+  GetTransferringTriggers,
+  GetTriggerLocation
 }
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/read/GetTriggerLocationPlan.java b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/read/GetTriggerLocationPlan.java
new file mode 100644
index 0000000000..1024aa7e33
--- /dev/null
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/read/GetTriggerLocationPlan.java
@@ -0,0 +1,62 @@
+/*
+ * 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.confignode.consensus.request.read;
+
+import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlan;
+import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class GetTriggerLocationPlan extends ConfigPhysicalPlan {
+
+  String triggerName;
+
+  public GetTriggerLocationPlan() {
+    super(ConfigPhysicalPlanType.GetTriggerLocation);
+  }
+
+  public GetTriggerLocationPlan(String triggerName) {
+    this();
+    this.triggerName = triggerName;
+  }
+
+  public String getTriggerName() {
+    return triggerName;
+  }
+
+  public void setTriggerName(String triggerName) {
+    this.triggerName = triggerName;
+  }
+
+  @Override
+  protected void serializeImpl(DataOutputStream stream) throws IOException {
+    stream.writeInt(ConfigPhysicalPlanType.GetTriggerLocation.ordinal());
+
+    ReadWriteIOUtils.write(triggerName, stream);
+  }
+
+  @Override
+  protected void deserializeImpl(ByteBuffer buffer) throws IOException {
+    this.triggerName = ReadWriteIOUtils.readString(buffer);
+  }
+}
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/TriggerLocationResp.java b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/TriggerLocationResp.java
new file mode 100644
index 0000000000..12a8165945
--- /dev/null
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/TriggerLocationResp.java
@@ -0,0 +1,49 @@
+/*
+ * 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.confignode.consensus.response;
+
+import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.confignode.rpc.thrift.TGetLocationForTriggerResp;
+import org.apache.iotdb.consensus.common.DataSet;
+
+public class TriggerLocationResp implements DataSet {
+
+  private TSStatus status;
+
+  private TDataNodeLocation dataNodeLocation;
+
+  public TriggerLocationResp(TSStatus status, TDataNodeLocation dataNodeLocation) {
+    this.status = status;
+    this.dataNodeLocation = dataNodeLocation;
+  }
+
+  public void setDataNodeLocation(TDataNodeLocation dataNodeLocation) {
+    this.dataNodeLocation = dataNodeLocation;
+  }
+
+  public void setStatus(TSStatus status) {
+    this.status = status;
+  }
+
+  public TGetLocationForTriggerResp convertToThriftResponse() {
+    return new TGetLocationForTriggerResp(status).setDataNodeLocation(dataNodeLocation);
+  }
+}
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index 1165a52c83..1f76144618 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -94,6 +94,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionTableResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropTriggerReq;
 import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetLocationForTriggerResp;
 import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TGetPipeSinkReq;
 import org.apache.iotdb.confignode.rpc.thrift.TGetPipeSinkResp;
@@ -815,6 +816,14 @@ public class ConfigManager implements IManager {
         : new TGetTriggerTableResp(status, Collections.emptyList());
   }
 
+  @Override
+  public TGetLocationForTriggerResp getLocationOfStatefulTrigger(String triggerName) {
+    TSStatus status = confirmLeader();
+    return status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()
+        ? triggerManager.getLocationOfStatefulTrigger(triggerName)
+        : new TGetLocationForTriggerResp(status);
+  }
+
   @Override
   public TGetTriggerJarResp getTriggerJar(TGetTriggerJarReq req) {
     TSStatus status = confirmLeader();
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
index b45989915a..a0f3ce3041 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
@@ -55,6 +55,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionTableResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropTriggerReq;
 import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetLocationForTriggerResp;
 import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TGetPipeSinkReq;
 import org.apache.iotdb.confignode.rpc.thrift.TGetPipeSinkResp;
@@ -313,6 +314,9 @@ public interface IManager {
   /** DataNode refresh stateful trigger cache */
   TGetTriggerTableResp getStatefulTriggerTable();
 
+  /** Get DataNodeLocation of stateful trigger */
+  TGetLocationForTriggerResp getLocationOfStatefulTrigger(String triggerName);
+
   /** Get Trigger jar */
   TGetTriggerJarResp getTriggerJar(TGetTriggerJarReq req);
 
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/TriggerManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/TriggerManager.java
index 7080a6d56a..e56e4475e1 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/TriggerManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/TriggerManager.java
@@ -29,16 +29,19 @@ import org.apache.iotdb.confignode.client.async.AsyncDataNodeClientPool;
 import org.apache.iotdb.confignode.client.async.handlers.AsyncClientHandler;
 import org.apache.iotdb.confignode.consensus.request.read.GetTransferringTriggersPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTriggerJarPlan;
+import org.apache.iotdb.confignode.consensus.request.read.GetTriggerLocationPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTriggerTablePlan;
 import org.apache.iotdb.confignode.consensus.request.write.trigger.UpdateTriggerLocationPlan;
 import org.apache.iotdb.confignode.consensus.request.write.trigger.UpdateTriggersOnTransferNodesPlan;
 import org.apache.iotdb.confignode.consensus.response.TransferringTriggersResp;
 import org.apache.iotdb.confignode.consensus.response.TriggerJarResp;
+import org.apache.iotdb.confignode.consensus.response.TriggerLocationResp;
 import org.apache.iotdb.confignode.consensus.response.TriggerTableResp;
 import org.apache.iotdb.confignode.manager.node.NodeManager;
 import org.apache.iotdb.confignode.persistence.TriggerInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TCreateTriggerReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropTriggerReq;
+import org.apache.iotdb.confignode.rpc.thrift.TGetLocationForTriggerResp;
 import org.apache.iotdb.confignode.rpc.thrift.TGetTriggerJarReq;
 import org.apache.iotdb.confignode.rpc.thrift.TGetTriggerJarResp;
 import org.apache.iotdb.confignode.rpc.thrift.TGetTriggerTableResp;
@@ -129,6 +132,15 @@ public class TriggerManager {
     }
   }
 
+  public TGetLocationForTriggerResp getLocationOfStatefulTrigger(String triggerName) {
+    return ((TriggerLocationResp)
+            configManager
+                .getConsensusManager()
+                .read(new GetTriggerLocationPlan(triggerName))
+                .getDataset())
+        .convertToThriftResponse();
+  }
+
   public TGetTriggerJarResp getTriggerJar(TGetTriggerJarReq req) {
     try {
       return ((TriggerJarResp)
@@ -161,7 +173,7 @@ public class TriggerManager {
    * @return result of transferTrigger
    */
   public TSStatus transferTrigger(
-      List<TDataNodeLocation> newUnknownDataList,
+      List<TDataNodeLocation> newUnknownDataNodeList,
       Map<Integer, TDataNodeLocation> dataNodeLocationMap) {
     TSStatus transferResult;
     triggerInfo.acquireTriggerTableLock();
@@ -171,7 +183,7 @@ public class TriggerManager {
 
       transferResult =
           consensusManager
-              .write(new UpdateTriggersOnTransferNodesPlan(newUnknownDataList))
+              .write(new UpdateTriggersOnTransferNodesPlan(newUnknownDataNodeList))
               .getStatus();
       if (transferResult.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         return transferResult;
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/TriggerInfo.java b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/TriggerInfo.java
index 341129110f..9f283d97c1 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/TriggerInfo.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/TriggerInfo.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.confignode.persistence;
 
+import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.executable.ExecutableManager;
 import org.apache.iotdb.commons.snapshot.SnapshotProcessor;
@@ -30,6 +31,7 @@ import org.apache.iotdb.confignode.conf.ConfigNodeConfig;
 import org.apache.iotdb.confignode.conf.ConfigNodeDescriptor;
 import org.apache.iotdb.confignode.consensus.request.read.GetTransferringTriggersPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTriggerJarPlan;
+import org.apache.iotdb.confignode.consensus.request.read.GetTriggerLocationPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTriggerTablePlan;
 import org.apache.iotdb.confignode.consensus.request.write.trigger.AddTriggerInTablePlan;
 import org.apache.iotdb.confignode.consensus.request.write.trigger.DeleteTriggerInTablePlan;
@@ -38,8 +40,10 @@ import org.apache.iotdb.confignode.consensus.request.write.trigger.UpdateTrigger
 import org.apache.iotdb.confignode.consensus.request.write.trigger.UpdateTriggersOnTransferNodesPlan;
 import org.apache.iotdb.confignode.consensus.response.TransferringTriggersResp;
 import org.apache.iotdb.confignode.consensus.response.TriggerJarResp;
+import org.apache.iotdb.confignode.consensus.response.TriggerLocationResp;
 import org.apache.iotdb.confignode.consensus.response.TriggerTableResp;
 import org.apache.iotdb.confignode.rpc.thrift.TTriggerState;
+import org.apache.iotdb.consensus.common.DataSet;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
@@ -176,6 +180,19 @@ public class TriggerInfo implements SnapshotProcessor {
     }
   }
 
+  public DataSet getTriggerLocation(GetTriggerLocationPlan req) {
+    TDataNodeLocation dataNodeLocation = triggerTable.getTriggerLocation(req.getTriggerName());
+    if (dataNodeLocation != null) {
+      return new TriggerLocationResp(
+          new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()), dataNodeLocation);
+    } else {
+      return new TriggerLocationResp(
+          new TSStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode())
+              .setMessage(String.format("Fail to get Location trigger[%s]", req.getTriggerName())),
+          null);
+    }
+  }
+
   public TriggerJarResp getTriggerJar(GetTriggerJarPlan physicalPlan) {
     List<ByteBuffer> jarList = new ArrayList<>();
     try {
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
index ee2a4849e1..e5815cd695 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
@@ -37,6 +37,7 @@ import org.apache.iotdb.confignode.consensus.request.read.GetStorageGroupPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTimeSlotListPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTransferringTriggersPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTriggerJarPlan;
+import org.apache.iotdb.confignode.consensus.request.read.GetTriggerLocationPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTriggerTablePlan;
 import org.apache.iotdb.confignode.consensus.request.read.template.CheckTemplateSettablePlan;
 import org.apache.iotdb.confignode.consensus.request.read.template.GetPathsSetTemplatePlan;
@@ -186,6 +187,8 @@ public class ConfigPlanExecutor {
         return syncInfo.showPipe((ShowPipePlan) req);
       case GetTriggerTable:
         return triggerInfo.getTriggerTable((GetTriggerTablePlan) req);
+      case GetTriggerLocation:
+        return triggerInfo.getTriggerLocation((GetTriggerLocationPlan) req);
       case GetTriggerJar:
         return triggerInfo.getTriggerJar((GetTriggerJarPlan) req);
       case GetTransferringTriggers:
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 8603f18648..aab23491c2 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
@@ -516,9 +516,7 @@ public class ConfigNodeRPCServiceProcessor implements IConfigNodeRPCService.Ifac
 
   @Override
   public TGetLocationForTriggerResp getLocationOfStatefulTrigger(String triggerName) {
-    // todo: implementation
-    return new TGetLocationForTriggerResp(
-        new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()), null);
+    return configManager.getLocationOfStatefulTrigger(triggerName);
   }
 
   public TGetTriggerJarResp getTriggerJar(TGetTriggerJarReq req) {
diff --git a/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java b/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
index 4858362c81..d76d6833c8 100644
--- a/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
+++ b/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
@@ -54,6 +54,7 @@ import org.apache.iotdb.confignode.consensus.request.read.GetStorageGroupPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTimeSlotListPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTransferringTriggersPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTriggerJarPlan;
+import org.apache.iotdb.confignode.consensus.request.read.GetTriggerLocationPlan;
 import org.apache.iotdb.confignode.consensus.request.read.GetTriggerTablePlan;
 import org.apache.iotdb.confignode.consensus.request.read.template.GetAllSchemaTemplatePlan;
 import org.apache.iotdb.confignode.consensus.request.read.template.GetAllTemplateSetInfoPlan;
@@ -955,6 +956,16 @@ public class ConfigPhysicalPlanSerDeTest {
         getTriggerTablePlan0.isOnlyStateful(), getTriggerTablePlan1.isOnlyStateful());
   }
 
+  @Test
+  public void GetTriggerLocationPlanTest() throws IOException {
+    GetTriggerLocationPlan getTriggerLocationPlan0 = new GetTriggerLocationPlan("test1");
+    GetTriggerLocationPlan getTriggerLocationPlan1 =
+        (GetTriggerLocationPlan)
+            ConfigPhysicalPlan.Factory.create(getTriggerLocationPlan0.serializeToByteBuffer());
+    Assert.assertEquals(
+        getTriggerLocationPlan0.getTriggerName(), getTriggerLocationPlan1.getTriggerName());
+  }
+
   @Test
   public void AddTriggerInTablePlanTest() throws IOException, IllegalPathException {
     TriggerInformation triggerInformation =
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 fbc09275ae..ae28de2801 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
@@ -88,6 +88,11 @@ public class TriggerTable {
         .collect(Collectors.toList());
   }
 
+  public TDataNodeLocation getTriggerLocation(String triggerName) {
+    TriggerInformation triggerInformation = triggerTable.get(triggerName);
+    return triggerInformation == null ? null : triggerInformation.getDataNodeLocation();
+  }
+
   public List<String> getTransferringTriggers() {
     return triggerTable.values().stream()
         .filter(
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 a3d4f38722..df0e0b65e8 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
@@ -957,7 +957,7 @@ public class ConfigNodeClient
   public TGetTriggerTableResp getStatefulTriggerTable() throws TException {
     for (int i = 0; i < RETRY_NUM; i++) {
       try {
-        TGetTriggerTableResp resp = client.getTriggerTable();
+        TGetTriggerTableResp resp = client.getStatefulTriggerTable();
         if (!updateConfigNodeLeader(resp.getStatus())) {
           return resp;
         }
diff --git a/thrift-confignode/src/main/thrift/confignode.thrift b/thrift-confignode/src/main/thrift/confignode.thrift
index 21591ddcab..4af568e3e0 100644
--- a/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/thrift-confignode/src/main/thrift/confignode.thrift
@@ -344,7 +344,7 @@ struct TDropTriggerReq {
 
 struct TGetLocationForTriggerResp {
   1: required common.TSStatus status
-  2: required common.TDataNodeLocation dataNodeLocation
+  2: optional common.TDataNodeLocation dataNodeLocation
 }
 
 // Get trigger table from config node