You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by yo...@apache.org on 2023/02/23 08:46:49 UTC

[iotdb] 03/04: internal

This is an automated email from the ASF dual-hosted git repository.

yongzao pushed a commit to branch ConfigNode-metric
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 3827b1c0db532883205619e3e431cc785f7305cc
Author: YongzaoDan <53...@qq.com>
AuthorDate: Thu Feb 23 16:46:08 2023 +0800

    internal
---
 .../confignode/manager/ClusterSchemaManager.java   |  10 +-
 .../iotdb/confignode/manager/ProcedureManager.java |   8 +-
 .../iotdb/confignode/manager/node/NodeManager.java |  10 +-
 .../manager/partition/PartitionMetrics.java        | 321 +++++++++++----------
 .../procedure/env/DataNodeRemoveHandler.java       |  13 +-
 ...Procedure.java => DeleteDatabaseProcedure.java} |  18 +-
 .../procedure/store/ProcedureFactory.java          |   6 +-
 .../request/ConfigPhysicalPlanSerDeTest.java       |  16 +-
 ...eTest.java => DeleteDatabaseProcedureTest.java} |  11 +-
 9 files changed, 225 insertions(+), 188 deletions(-)

diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java
index 09c1a0b430..717a1ca88b 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java
@@ -64,6 +64,7 @@ import org.apache.iotdb.confignode.manager.consensus.ConsensusManager;
 import org.apache.iotdb.confignode.manager.node.NodeManager;
 import org.apache.iotdb.confignode.manager.observer.NodeStatisticsEvent;
 import org.apache.iotdb.confignode.manager.partition.PartitionManager;
+import org.apache.iotdb.confignode.manager.partition.PartitionMetrics;
 import org.apache.iotdb.confignode.persistence.schema.ClusterSchemaInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
@@ -127,6 +128,7 @@ public class ClusterSchemaManager {
       return RpcUtils.getStatus(
           illegalPathException.getErrorCode(), illegalPathException.getMessage());
     }
+
     try {
       clusterSchemaInfo.checkContainsStorageGroup(databaseSchemaPlan.getSchema().getName());
     } catch (MetadataException metadataException) {
@@ -140,10 +142,14 @@ public class ClusterSchemaManager {
       return result;
     }
 
-    // Cache StorageGroupSchema
+    // Cache DatabaseSchema
     result = getConsensusManager().write(databaseSchemaPlan).getStatus();
 
-    // Adjust the maximum RegionGroup number of each StorageGroup
+    // Bind Database metrics
+    PartitionMetrics.bindDatabasePartitionMetrics(
+        configManager, databaseSchemaPlan.getSchema().getName());
+
+    // Adjust the maximum RegionGroup number of each Database
     adjustMaxRegionGroupNum();
 
     return result;
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
index 71edebcfe9..5afe8b1343 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
@@ -49,7 +49,7 @@ import org.apache.iotdb.confignode.procedure.impl.node.AddConfigNodeProcedure;
 import org.apache.iotdb.confignode.procedure.impl.node.RemoveConfigNodeProcedure;
 import org.apache.iotdb.confignode.procedure.impl.node.RemoveDataNodeProcedure;
 import org.apache.iotdb.confignode.procedure.impl.schema.DeactivateTemplateProcedure;
-import org.apache.iotdb.confignode.procedure.impl.schema.DeleteStorageGroupProcedure;
+import org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure;
 import org.apache.iotdb.confignode.procedure.impl.schema.DeleteTimeSeriesProcedure;
 import org.apache.iotdb.confignode.procedure.impl.schema.UnsetTemplateProcedure;
 import org.apache.iotdb.confignode.procedure.impl.statemachine.CreateRegionGroupsProcedure;
@@ -150,9 +150,9 @@ public class ProcedureManager {
   public TSStatus deleteStorageGroups(ArrayList<TDatabaseSchema> deleteSgSchemaList) {
     List<Long> procedureIds = new ArrayList<>();
     for (TDatabaseSchema storageGroupSchema : deleteSgSchemaList) {
-      DeleteStorageGroupProcedure deleteStorageGroupProcedure =
-          new DeleteStorageGroupProcedure(storageGroupSchema);
-      long procedureId = this.executor.submitProcedure(deleteStorageGroupProcedure);
+      DeleteDatabaseProcedure deleteDatabaseProcedure =
+          new DeleteDatabaseProcedure(storageGroupSchema);
+      long procedureId = this.executor.submitProcedure(deleteDatabaseProcedure);
       procedureIds.add(procedureId);
     }
     List<TSStatus> procedureStatus = new ArrayList<>();
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
index 29fdbb2572..9812a2455a 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
@@ -62,6 +62,7 @@ import org.apache.iotdb.confignode.manager.node.heartbeat.BaseNodeCache;
 import org.apache.iotdb.confignode.manager.node.heartbeat.ConfigNodeHeartbeatCache;
 import org.apache.iotdb.confignode.manager.node.heartbeat.DataNodeHeartbeatCache;
 import org.apache.iotdb.confignode.manager.partition.PartitionManager;
+import org.apache.iotdb.confignode.manager.partition.PartitionMetrics;
 import org.apache.iotdb.confignode.persistence.node.NodeInfo;
 import org.apache.iotdb.confignode.procedure.env.DataNodeRemoveHandler;
 import org.apache.iotdb.confignode.rpc.thrift.TCQConfig;
@@ -256,15 +257,16 @@ public class NodeManager {
    *     success, and DATANODE_ALREADY_REGISTERED when the DataNode is already exist.
    */
   public DataSet registerDataNode(RegisterDataNodePlan registerDataNodePlan) {
+    int dataNodeId = nodeInfo.generateNextNodeId();
     DataNodeRegisterResp resp = new DataNodeRegisterResp();
 
     // Register new DataNode
-    registerDataNodePlan
-        .getDataNodeConfiguration()
-        .getLocation()
-        .setDataNodeId(nodeInfo.generateNextNodeId());
+    registerDataNodePlan.getDataNodeConfiguration().getLocation().setDataNodeId(dataNodeId);
     getConsensusManager().write(registerDataNodePlan);
 
+    // Bind DataNode metrics
+    PartitionMetrics.bindDataNodePartitionMetrics(configManager, dataNodeId);
+
     // Adjust the maximum RegionGroup number of each StorageGroup
     getClusterSchemaManager().adjustMaxRegionGroupNum();
 
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionMetrics.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionMetrics.java
index c5a3dd49e7..e942a4a725 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionMetrics.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionMetrics.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.confignode.manager.partition;
 import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
 import org.apache.iotdb.common.rpc.thrift.TDataNodeConfiguration;
 import org.apache.iotdb.commons.cluster.RegionStatus;
+import org.apache.iotdb.commons.service.metric.MetricService;
 import org.apache.iotdb.commons.service.metric.enums.Metric;
 import org.apache.iotdb.commons.service.metric.enums.Tag;
 import org.apache.iotdb.commons.utils.NodeUrlUtils;
@@ -54,14 +55,14 @@ public class PartitionMetrics implements IMetricSet {
   @Override
   public void bindTo(AbstractMetricService metricService) {
     bindRegionPartitionMetrics(metricService);
-    bindDataNodePartitionMetrics(metricService);
+    bindDataNodePartitionMetrics();
     bindDatabasePartitionMetrics(metricService);
   }
 
   @Override
   public void unbindFrom(AbstractMetricService metricService) {
     unbindRegionPartitionMetrics(metricService);
-    unbindDataNodePartitionMetrics(metricService);
+    unbindDataNodePartitionMetrics();
     unbindDatabasePartitionMetrics(metricService);
   }
 
@@ -117,99 +118,157 @@ public class PartitionMetrics implements IMetricSet {
     }
   }
 
-  private void bindDataNodePartitionMetrics(AbstractMetricService metricService) {
+  public static void bindDataNodePartitionMetrics(IManager configManager, int dataNodeId) {
+    MetricService metricService = MetricService.getInstance();
+    NodeManager nodeManager = configManager.getNodeManager();
+    PartitionManager partitionManager = configManager.getPartitionManager();
+    LoadManager loadManager = configManager.getLoadManager();
+
+    String dataNodeName =
+        NodeUrlUtils.convertTEndPointUrl(
+            nodeManager.getRegisteredDataNode(dataNodeId).getLocation().getClientRpcEndPoint());
+
+    // Count the number of Regions in the specified DataNode
+    metricService.createAutoGauge(
+        Metric.REGION_NUM_IN_DATA_NODE.toString(),
+        MetricLevel.CORE,
+        partitionManager,
+        obj -> obj.getRegionCount(dataNodeId, TConsensusGroupType.SchemaRegion),
+        Tag.NAME.toString(),
+        dataNodeName,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.SchemaRegion.toString());
+    metricService.createAutoGauge(
+        Metric.REGION_NUM_IN_DATA_NODE.toString(),
+        MetricLevel.CORE,
+        partitionManager,
+        obj -> obj.getRegionCount(dataNodeId, TConsensusGroupType.DataRegion),
+        Tag.NAME.toString(),
+        dataNodeName,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.DataRegion.toString());
+
+    // Count the number of RegionGroup-leaders in the specified DataNode
+    metricService.createAutoGauge(
+        Metric.REGION_GROUP_LEADER_NUM_IN_DATA_NODE.toString(),
+        MetricLevel.CORE,
+        loadManager,
+        obj -> obj.getRegionGroupLeaderCount(dataNodeId, TConsensusGroupType.SchemaRegion),
+        Tag.NAME.toString(),
+        dataNodeName,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.SchemaRegion.toString());
+    metricService.createAutoGauge(
+        Metric.REGION_GROUP_LEADER_NUM_IN_DATA_NODE.toString(),
+        MetricLevel.CORE,
+        loadManager,
+        obj -> obj.getRegionGroupLeaderCount(dataNodeId, TConsensusGroupType.DataRegion),
+        Tag.NAME.toString(),
+        dataNodeName,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.DataRegion.toString());
+  }
+
+  private void bindDataNodePartitionMetrics() {
     List<TDataNodeConfiguration> registerDataNodes = getNodeManager().getRegisteredDataNodes();
     for (TDataNodeConfiguration dataNodeConfiguration : registerDataNodes) {
       int dataNodeId = dataNodeConfiguration.getLocation().getDataNodeId();
-      String dataNodeName =
-          NodeUrlUtils.convertTEndPointUrl(
-              dataNodeConfiguration.getLocation().getClientRpcEndPoint());
-
-      // Count the number of Regions in the specified DataNode
-      metricService.createAutoGauge(
-          Metric.REGION_NUM_IN_DATA_NODE.toString(),
-          MetricLevel.CORE,
-          getPartitionManager(),
-          partitionManager ->
-              partitionManager.getRegionCount(dataNodeId, TConsensusGroupType.SchemaRegion),
-          Tag.NAME.toString(),
-          dataNodeName,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.SchemaRegion.toString());
-      metricService.createAutoGauge(
-          Metric.REGION_NUM_IN_DATA_NODE.toString(),
-          MetricLevel.CORE,
-          getPartitionManager(),
-          partitionManager ->
-              partitionManager.getRegionCount(dataNodeId, TConsensusGroupType.DataRegion),
-          Tag.NAME.toString(),
-          dataNodeName,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.DataRegion.toString());
-
-      // Count the number of RegionGroup-leaders in the specified DataNode
-      metricService.createAutoGauge(
-          Metric.REGION_GROUP_LEADER_NUM_IN_DATA_NODE.toString(),
-          MetricLevel.CORE,
-          getLoadManager(),
-          loadManager ->
-              loadManager.getRegionGroupLeaderCount(dataNodeId, TConsensusGroupType.SchemaRegion),
-          Tag.NAME.toString(),
-          dataNodeName,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.SchemaRegion.toString());
-      metricService.createAutoGauge(
-          Metric.REGION_GROUP_LEADER_NUM_IN_DATA_NODE.toString(),
-          MetricLevel.CORE,
-          getLoadManager(),
-          loadManager ->
-              loadManager.getRegionGroupLeaderCount(dataNodeId, TConsensusGroupType.DataRegion),
-          Tag.NAME.toString(),
-          dataNodeName,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.DataRegion.toString());
+      bindDataNodePartitionMetrics(configManager, dataNodeId);
     }
   }
 
-  private void unbindDataNodePartitionMetrics(AbstractMetricService metricService) {
+  public static void unbindDataNodePartitionMetrics(String dataNodeName) {
+    MetricService metricService = MetricService.getInstance();
+
+    // Remove the number of Regions in the specified DataNode
+    metricService.remove(
+        MetricType.AUTO_GAUGE,
+        Metric.REGION_NUM_IN_DATA_NODE.toString(),
+        Tag.NAME.toString(),
+        dataNodeName,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.SchemaRegion.toString());
+    metricService.remove(
+        MetricType.AUTO_GAUGE,
+        Metric.REGION_NUM_IN_DATA_NODE.toString(),
+        Tag.NAME.toString(),
+        dataNodeName,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.DataRegion.toString());
+
+    // Remove the number of RegionGroup-leaders in the specified DataNode
+    metricService.remove(
+        MetricType.AUTO_GAUGE,
+        Metric.REGION_GROUP_LEADER_NUM_IN_DATA_NODE.toString(),
+        Tag.NAME.toString(),
+        dataNodeName,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.SchemaRegion.toString());
+    metricService.remove(
+        MetricType.AUTO_GAUGE,
+        Metric.REGION_GROUP_LEADER_NUM_IN_DATA_NODE.toString(),
+        Tag.NAME.toString(),
+        dataNodeName,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.DataRegion.toString());
+  }
+
+  private void unbindDataNodePartitionMetrics() {
     List<TDataNodeConfiguration> registerDataNodes = getNodeManager().getRegisteredDataNodes();
     for (TDataNodeConfiguration dataNodeConfiguration : registerDataNodes) {
       String dataNodeName =
           NodeUrlUtils.convertTEndPointUrl(
               dataNodeConfiguration.getLocation().getClientRpcEndPoint());
+      unbindDataNodePartitionMetrics(dataNodeName);
+    }
+  }
 
-      // Remove the number of Regions in the specified DataNode
-      metricService.remove(
-          MetricType.AUTO_GAUGE,
-          Metric.REGION_NUM_IN_DATA_NODE.toString(),
-          Tag.NAME.toString(),
-          dataNodeName,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.SchemaRegion.toString());
-      metricService.remove(
-          MetricType.AUTO_GAUGE,
-          Metric.REGION_NUM_IN_DATA_NODE.toString(),
-          Tag.NAME.toString(),
-          dataNodeName,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.DataRegion.toString());
+  public static void bindDatabasePartitionMetrics(IManager configManager, String database) {
+    MetricService metricService = MetricService.getInstance();
+    PartitionManager partitionManager = configManager.getPartitionManager();
 
-      // Remove the number of RegionGroup-leaders in the specified DataNode
-      metricService.remove(
-          MetricType.AUTO_GAUGE,
-          Metric.REGION_GROUP_LEADER_NUM_IN_DATA_NODE.toString(),
-          Tag.NAME.toString(),
-          dataNodeName,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.SchemaRegion.toString());
-      metricService.remove(
-          MetricType.AUTO_GAUGE,
-          Metric.REGION_GROUP_LEADER_NUM_IN_DATA_NODE.toString(),
-          Tag.NAME.toString(),
-          dataNodeName,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.DataRegion.toString());
-    }
+    // Count the number of SeriesSlots in the specified Database
+    metricService.createAutoGauge(
+        Metric.SERIES_SLOT_NUM_IN_DATABASE.toString(),
+        MetricLevel.CORE,
+        partitionManager,
+        manager -> manager.getAssignedSeriesPartitionSlotsCount(database),
+        Tag.NAME.toString(),
+        database);
+
+    // Count the number of RegionGroups in the specified Database
+    metricService.createAutoGauge(
+        Metric.REGION_GROUP_NUM_IN_DATABASE.toString(),
+        MetricLevel.CORE,
+        partitionManager,
+        manager -> {
+          try {
+            return manager.getRegionGroupCount(database, TConsensusGroupType.SchemaRegion);
+          } catch (DatabaseNotExistsException e) {
+            LOGGER.warn("Error when counting SchemaRegionGroups in Database: {}", database, e);
+            throw new RuntimeException(e);
+          }
+        },
+        Tag.NAME.toString(),
+        database,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.SchemaRegion.toString());
+    metricService.createAutoGauge(
+        Metric.REGION_GROUP_NUM_IN_DATABASE.toString(),
+        MetricLevel.CORE,
+        partitionManager,
+        manager -> {
+          try {
+            return manager.getRegionGroupCount(database, TConsensusGroupType.DataRegion);
+          } catch (DatabaseNotExistsException e) {
+            LOGGER.warn("Error when counting DataRegionGroups in Database: {}", database, e);
+            throw new RuntimeException(e);
+          }
+        },
+        Tag.NAME.toString(),
+        database,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.DataRegion.toString());
   }
 
   private void bindDatabasePartitionMetrics(AbstractMetricService metricService) {
@@ -222,80 +281,44 @@ public class PartitionMetrics implements IMetricSet {
 
     List<String> databases = getClusterSchemaManager().getDatabaseNames();
     for (String database : databases) {
-      // Count the number of SeriesSlots in the specified Database
-      metricService.createAutoGauge(
-          Metric.SERIES_SLOT_NUM_IN_DATABASE.toString(),
-          MetricLevel.CORE,
-          getPartitionManager(),
-          partitionManager -> partitionManager.getAssignedSeriesPartitionSlotsCount(database),
-          Tag.NAME.toString(),
-          database);
-
-      // Count the number of RegionGroups in the specified Database
-      metricService.createAutoGauge(
-          Metric.REGION_GROUP_NUM_IN_DATABASE.toString(),
-          MetricLevel.CORE,
-          getPartitionManager(),
-          partitionManager -> {
-            try {
-              return partitionManager.getRegionGroupCount(
-                  database, TConsensusGroupType.SchemaRegion);
-            } catch (DatabaseNotExistsException e) {
-              LOGGER.warn("Error when counting SchemaRegionGroups in Database: {}", database, e);
-              throw new RuntimeException(e);
-            }
-          },
-          Tag.NAME.toString(),
-          database,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.SchemaRegion.toString());
-      metricService.createAutoGauge(
-          Metric.REGION_GROUP_NUM_IN_DATABASE.toString(),
-          MetricLevel.CORE,
-          getPartitionManager(),
-          partitionManager -> {
-            try {
-              return partitionManager.getRegionGroupCount(database, TConsensusGroupType.DataRegion);
-            } catch (DatabaseNotExistsException e) {
-              LOGGER.warn("Error when counting DataRegionGroups in Database: {}", database, e);
-              throw new RuntimeException(e);
-            }
-          },
-          Tag.NAME.toString(),
-          database,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.DataRegion.toString());
+      bindDatabasePartitionMetrics(configManager, database);
     }
   }
 
+  public static void unbindDatabasePartitionMetrics(String database) {
+    MetricService metricService = MetricService.getInstance();
+
+    // Remove the number of SeriesSlots in the specified Database
+    metricService.remove(
+        MetricType.AUTO_GAUGE,
+        Metric.SERIES_SLOT_NUM_IN_DATABASE.toString(),
+        Tag.NAME.toString(),
+        database);
+
+    // Remove number of RegionGroups in the specified Database
+    metricService.remove(
+        MetricType.AUTO_GAUGE,
+        Metric.REGION_GROUP_NUM_IN_DATABASE.toString(),
+        Tag.NAME.toString(),
+        database,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.SchemaRegion.toString());
+    metricService.remove(
+        MetricType.AUTO_GAUGE,
+        Metric.REGION_GROUP_NUM_IN_DATABASE.toString(),
+        Tag.NAME.toString(),
+        database,
+        Tag.TYPE.toString(),
+        TConsensusGroupType.DataRegion.toString());
+  }
+
   private void unbindDatabasePartitionMetrics(AbstractMetricService metricService) {
     // Remove the number of Databases
     metricService.remove(MetricType.AUTO_GAUGE, Metric.DATABASE_NUM.toString());
 
     List<String> databases = getClusterSchemaManager().getDatabaseNames();
     for (String database : databases) {
-      // Remove the number of SeriesSlots in the specified Database
-      metricService.remove(
-          MetricType.AUTO_GAUGE,
-          Metric.SERIES_SLOT_NUM_IN_DATABASE.toString(),
-          Tag.NAME.toString(),
-          database);
-
-      // Remove number of RegionGroups in the specified Database
-      metricService.remove(
-          MetricType.AUTO_GAUGE,
-          Metric.REGION_GROUP_NUM_IN_DATABASE.toString(),
-          Tag.NAME.toString(),
-          database,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.SchemaRegion.toString());
-      metricService.remove(
-          MetricType.AUTO_GAUGE,
-          Metric.REGION_GROUP_NUM_IN_DATABASE.toString(),
-          Tag.NAME.toString(),
-          database,
-          Tag.TYPE.toString(),
-          TConsensusGroupType.DataRegion.toString());
+      unbindDatabasePartitionMetrics(database);
     }
   }
 
@@ -311,10 +334,6 @@ public class PartitionMetrics implements IMetricSet {
     return configManager.getPartitionManager();
   }
 
-  private LoadManager getLoadManager() {
-    return configManager.getLoadManager();
-  }
-
   @Override
   public boolean equals(Object o) {
     if (this == o) {
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/DataNodeRemoveHandler.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/DataNodeRemoveHandler.java
index d424a1eff9..33fec29316 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/DataNodeRemoveHandler.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/DataNodeRemoveHandler.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
 import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.cluster.NodeStatus;
+import org.apache.iotdb.commons.utils.NodeUrlUtils;
 import org.apache.iotdb.confignode.client.DataNodeRequestType;
 import org.apache.iotdb.confignode.client.sync.SyncDataNodeClientPool;
 import org.apache.iotdb.confignode.conf.ConfigNodeConfig;
@@ -34,6 +35,7 @@ import org.apache.iotdb.confignode.consensus.request.write.partition.UpdateRegio
 import org.apache.iotdb.confignode.consensus.response.datanode.DataNodeToStatusResp;
 import org.apache.iotdb.confignode.manager.ConfigManager;
 import org.apache.iotdb.confignode.manager.node.heartbeat.BaseNodeCache;
+import org.apache.iotdb.confignode.manager.partition.PartitionMetrics;
 import org.apache.iotdb.confignode.persistence.node.NodeInfo;
 import org.apache.iotdb.confignode.procedure.scheduler.LockQueue;
 import org.apache.iotdb.mpp.rpc.thrift.TCreatePeerReq;
@@ -551,11 +553,16 @@ public class DataNodeRemoveHandler {
   /**
    * Remove data node in node info
    *
-   * @param tDataNodeLocation data node location
+   * @param dataNodeLocation data node location
    */
-  public void removeDataNodePersistence(TDataNodeLocation tDataNodeLocation) {
-    List<TDataNodeLocation> removeDataNodes = Collections.singletonList(tDataNodeLocation);
+  public void removeDataNodePersistence(TDataNodeLocation dataNodeLocation) {
+    // Remove consensus record
+    List<TDataNodeLocation> removeDataNodes = Collections.singletonList(dataNodeLocation);
     configManager.getConsensusManager().write(new RemoveDataNodePlan(removeDataNodes));
+
+    // Remove metrics
+    PartitionMetrics.unbindDataNodePartitionMetrics(
+        NodeUrlUtils.convertTEndPointUrl(dataNodeLocation.getClientRpcEndPoint()));
   }
 
   /**
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteStorageGroupProcedure.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteDatabaseProcedure.java
similarity index 93%
rename from confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteStorageGroupProcedure.java
rename to confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteDatabaseProcedure.java
index 89ecff9aa2..5a16ad0d0b 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteStorageGroupProcedure.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteDatabaseProcedure.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.commons.exception.runtime.ThriftSerDeException;
 import org.apache.iotdb.commons.utils.ThriftConfigNodeSerDeUtils;
 import org.apache.iotdb.confignode.consensus.request.write.region.OfferRegionMaintainTasksPlan;
 import org.apache.iotdb.confignode.consensus.request.write.storagegroup.PreDeleteDatabasePlan;
+import org.apache.iotdb.confignode.manager.partition.PartitionMetrics;
 import org.apache.iotdb.confignode.persistence.partition.maintainer.RegionDeleteTask;
 import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
 import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
@@ -45,18 +46,18 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.List;
 
-public class DeleteStorageGroupProcedure
+public class DeleteDatabaseProcedure
     extends StateMachineProcedure<ConfigNodeProcedureEnv, DeleteStorageGroupState> {
-  private static final Logger LOG = LoggerFactory.getLogger(DeleteStorageGroupProcedure.class);
+  private static final Logger LOG = LoggerFactory.getLogger(DeleteDatabaseProcedure.class);
   private static final int RETRY_THRESHOLD = 5;
 
   private TDatabaseSchema deleteSgSchema;
 
-  public DeleteStorageGroupProcedure() {
+  public DeleteDatabaseProcedure() {
     super();
   }
 
-  public DeleteStorageGroupProcedure(TDatabaseSchema deleteSgSchema) {
+  public DeleteDatabaseProcedure(TDatabaseSchema deleteSgSchema) {
     super();
     this.deleteSgSchema = deleteSgSchema;
   }
@@ -123,9 +124,12 @@ public class DeleteStorageGroupProcedure
               });
           env.getConfigManager().getConsensusManager().write(offerPlan);
 
-          // Delete StorageGroupPartitionTable
+          // Delete DatabasePartitionTable
           TSStatus status = env.deleteConfig(deleteSgSchema.getName());
 
+          // Delete Database metrics
+          PartitionMetrics.unbindDatabasePartitionMetrics(deleteSgSchema.getName());
+
           if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
             return Flow.NO_MORE_STATE;
           } else if (getCycles() > RETRY_THRESHOLD) {
@@ -208,8 +212,8 @@ public class DeleteStorageGroupProcedure
 
   @Override
   public boolean equals(Object that) {
-    if (that instanceof DeleteStorageGroupProcedure) {
-      DeleteStorageGroupProcedure thatProc = (DeleteStorageGroupProcedure) that;
+    if (that instanceof DeleteDatabaseProcedure) {
+      DeleteDatabaseProcedure thatProc = (DeleteDatabaseProcedure) that;
       return thatProc.getProcId() == this.getProcId()
           && thatProc.getState() == this.getState()
           && thatProc.deleteSgSchema.equals(this.getDeleteSgSchema());
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
index 268d1965c9..ab4e9f8af9 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
@@ -25,7 +25,7 @@ import org.apache.iotdb.confignode.procedure.impl.node.AddConfigNodeProcedure;
 import org.apache.iotdb.confignode.procedure.impl.node.RemoveConfigNodeProcedure;
 import org.apache.iotdb.confignode.procedure.impl.node.RemoveDataNodeProcedure;
 import org.apache.iotdb.confignode.procedure.impl.schema.DeactivateTemplateProcedure;
-import org.apache.iotdb.confignode.procedure.impl.schema.DeleteStorageGroupProcedure;
+import org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure;
 import org.apache.iotdb.confignode.procedure.impl.schema.DeleteTimeSeriesProcedure;
 import org.apache.iotdb.confignode.procedure.impl.schema.UnsetTemplateProcedure;
 import org.apache.iotdb.confignode.procedure.impl.statemachine.CreateRegionGroupsProcedure;
@@ -60,7 +60,7 @@ public class ProcedureFactory implements IProcedureFactory {
     Procedure procedure;
     switch (procedureType) {
       case DELETE_STORAGE_GROUP_PROCEDURE:
-        procedure = new DeleteStorageGroupProcedure();
+        procedure = new DeleteDatabaseProcedure();
         break;
       case ADD_CONFIG_NODE_PROCEDURE:
         procedure = new AddConfigNodeProcedure();
@@ -118,7 +118,7 @@ public class ProcedureFactory implements IProcedureFactory {
   }
 
   public static ProcedureType getProcedureType(Procedure procedure) {
-    if (procedure instanceof DeleteStorageGroupProcedure) {
+    if (procedure instanceof DeleteDatabaseProcedure) {
       return ProcedureType.DELETE_STORAGE_GROUP_PROCEDURE;
     } else if (procedure instanceof AddConfigNodeProcedure) {
       return ProcedureType.ADD_CONFIG_NODE_PROCEDURE;
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 7fd105a297..d91a99d0fd 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
@@ -106,7 +106,7 @@ import org.apache.iotdb.confignode.consensus.request.write.trigger.UpdateTrigger
 import org.apache.iotdb.confignode.persistence.partition.maintainer.RegionCreateTask;
 import org.apache.iotdb.confignode.persistence.partition.maintainer.RegionDeleteTask;
 import org.apache.iotdb.confignode.procedure.Procedure;
-import org.apache.iotdb.confignode.procedure.impl.schema.DeleteStorageGroupProcedure;
+import org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure;
 import org.apache.iotdb.confignode.procedure.impl.statemachine.CreateRegionGroupsProcedure;
 import org.apache.iotdb.confignode.rpc.thrift.TCreateCQReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
@@ -751,15 +751,15 @@ public class ConfigPhysicalPlanSerDeTest {
   @Test
   public void updateProcedureTest() throws IOException {
     // test procedure equals DeleteStorageGroupProcedure
-    DeleteStorageGroupProcedure deleteStorageGroupProcedure = new DeleteStorageGroupProcedure();
-    deleteStorageGroupProcedure.setDeleteSgSchema(new TDatabaseSchema("root.sg"));
+    DeleteDatabaseProcedure deleteDatabaseProcedure = new DeleteDatabaseProcedure();
+    deleteDatabaseProcedure.setDeleteSgSchema(new TDatabaseSchema("root.sg"));
     UpdateProcedurePlan updateProcedurePlan0 = new UpdateProcedurePlan();
-    updateProcedurePlan0.setProcedure(deleteStorageGroupProcedure);
+    updateProcedurePlan0.setProcedure(deleteDatabaseProcedure);
     UpdateProcedurePlan updateProcedurePlan1 =
         (UpdateProcedurePlan)
             ConfigPhysicalPlan.Factory.create(updateProcedurePlan0.serializeToByteBuffer());
     Procedure proc = updateProcedurePlan1.getProcedure();
-    Assert.assertEquals(proc, deleteStorageGroupProcedure);
+    Assert.assertEquals(proc, deleteDatabaseProcedure);
 
     // test procedure equals CreateRegionGroupsProcedure
     TDataNodeLocation dataNodeLocation0 = new TDataNodeLocation();
@@ -796,11 +796,11 @@ public class ConfigPhysicalPlanSerDeTest {
   @Test
   public void UpdateProcedurePlanTest() throws IOException {
     UpdateProcedurePlan req0 = new UpdateProcedurePlan();
-    DeleteStorageGroupProcedure deleteStorageGroupProcedure = new DeleteStorageGroupProcedure();
+    DeleteDatabaseProcedure deleteDatabaseProcedure = new DeleteDatabaseProcedure();
     TDatabaseSchema tDatabaseSchema = new TDatabaseSchema();
     tDatabaseSchema.setName("root.sg");
-    deleteStorageGroupProcedure.setDeleteSgSchema(tDatabaseSchema);
-    req0.setProcedure(deleteStorageGroupProcedure);
+    deleteDatabaseProcedure.setDeleteSgSchema(tDatabaseSchema);
+    req0.setProcedure(deleteDatabaseProcedure);
     UpdateProcedurePlan req1 =
         (UpdateProcedurePlan) ConfigPhysicalPlan.Factory.create(req0.serializeToByteBuffer());
     Assert.assertEquals(req0, req1);
diff --git a/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/DeleteStorageGroupProcedureTest.java b/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/DeleteDatabaseProcedureTest.java
similarity index 81%
rename from confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/DeleteStorageGroupProcedureTest.java
rename to confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/DeleteDatabaseProcedureTest.java
index 612ac01c60..1d4be74c5f 100644
--- a/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/DeleteStorageGroupProcedureTest.java
+++ b/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/DeleteDatabaseProcedureTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.iotdb.confignode.procedure.impl;
 
-import org.apache.iotdb.confignode.procedure.impl.schema.DeleteStorageGroupProcedure;
+import org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure;
 import org.apache.iotdb.confignode.procedure.store.ProcedureFactory;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
 import org.apache.iotdb.tsfile.utils.PublicBAOS;
@@ -32,23 +32,22 @@ import java.nio.ByteBuffer;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
-public class DeleteStorageGroupProcedureTest {
+public class DeleteDatabaseProcedureTest {
 
   @Test
   public void serializeDeserializeTest() {
 
     PublicBAOS byteArrayOutputStream = new PublicBAOS();
     DataOutputStream outputStream = new DataOutputStream(byteArrayOutputStream);
-    DeleteStorageGroupProcedure p1 =
-        new DeleteStorageGroupProcedure(new TDatabaseSchema("root.sg"));
+    DeleteDatabaseProcedure p1 = new DeleteDatabaseProcedure(new TDatabaseSchema("root.sg"));
 
     try {
       p1.serialize(outputStream);
       ByteBuffer buffer =
           ByteBuffer.wrap(byteArrayOutputStream.getBuf(), 0, byteArrayOutputStream.size());
 
-      DeleteStorageGroupProcedure p2 =
-          (DeleteStorageGroupProcedure) ProcedureFactory.getInstance().create(buffer);
+      DeleteDatabaseProcedure p2 =
+          (DeleteDatabaseProcedure) ProcedureFactory.getInstance().create(buffer);
       assertEquals(p1, p2);
 
     } catch (Exception e) {