[IOTDB-5740] Fix drop database does not delete its template (#9792)

diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java b/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
index d931899..a266b1f 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
@@ -663,8 +663,8 @@
     return true;
   }
 
-  public boolean startWith(String otherNode) {
-    return nodes[0].equals(otherNode);
+  public boolean startsWith(String prefix) {
+    return getFullPath().startsWith(prefix);
   }
 
   public boolean containNode(String otherNode) {
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/template/ClusterTemplateManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/template/ClusterTemplateManager.java
index 94898c9..e7e6871 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/template/ClusterTemplateManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/template/ClusterTemplateManager.java
@@ -602,6 +602,42 @@
     }
   }
 
+  public void invalid(String database) {
+    readWriteLock.writeLock().lock();
+    try {
+      for (PartialPath fullPath : pathSetTemplateMap.keySet()) {
+        if (fullPath.startsWith(database)) {
+          int templateId = pathSetTemplateMap.remove(fullPath);
+          templateSetOnPathsMap.get(templateId).remove(fullPath);
+          if (templateSetOnPathsMap.get(templateId).size() == 0
+              && (!templatePreSetOnPathsMap.containsKey(templateId)
+                  || templatePreSetOnPathsMap.get(templateId).size() == 0)) {
+            templateSetOnPathsMap.remove(templateId);
+            templatePreSetOnPathsMap.remove(templateId);
+            Template template = templateIdMap.remove(templateId);
+            templateNameMap.remove(template.getName());
+          }
+        }
+      }
+      for (PartialPath fullPath : pathPreSetTemplateMap.keySet()) {
+        if (fullPath.startsWith(database)) {
+          int templateId = pathPreSetTemplateMap.remove(fullPath);
+          templatePreSetOnPathsMap.get(templateId).remove(fullPath);
+          if ((!templateSetOnPathsMap.containsKey(templateId)
+                  || templateSetOnPathsMap.get(templateId).size() == 0)
+              && templatePreSetOnPathsMap.get(templateId).size() == 0) {
+            templateSetOnPathsMap.remove(templateId);
+            templatePreSetOnPathsMap.remove(templateId);
+            Template template = templateIdMap.remove(templateId);
+            templateNameMap.remove(template.getName());
+          }
+        }
+      }
+    } finally {
+      readWriteLock.writeLock().unlock();
+    }
+  }
+
   @TestOnly
   public void putTemplate(Template template) {
     templateIdMap.put(template.getId(), template);
diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
index a0675c0..0b51762 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
@@ -422,6 +422,7 @@
     DataNodeSchemaCache.getInstance().takeWriteLock();
     try {
       DataNodeSchemaCache.getInstance().invalidateAll();
+      ClusterTemplateManager.getInstance().invalid(req.getFullPath());
       return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
     } finally {
       DataNodeSchemaCache.getInstance().releaseWriteLock();