You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2019/09/26 04:54:26 UTC

[incubator-iotdb] branch master updated: [IOTDB-188] Delete storage group (#416)

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

qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 59f66f6  [IOTDB-188] Delete storage group (#416)
59f66f6 is described below

commit 59f66f6a2544ef91c905b43d354a7181fd730174
Author: Yi Tao <th...@163.com>
AuthorDate: Thu Sep 26 12:54:22 2019 +0800

    [IOTDB-188] Delete storage group (#416)
    
    * add delete storage group interface in session
---
 .../UserGuide/7-Session API/1-Session API.md       | 154 ++++++++-------------
 .../UserGuide/7-Session API/1-Session API.md       | 154 +++++++--------------
 .../db/conf/adapter/IoTDBConfigDynamicAdapter.java |   3 -
 .../org/apache/iotdb/db/engine/StorageEngine.java  |   6 +
 .../engine/storagegroup/StorageGroupProcessor.java |  18 +++
 .../java/org/apache/iotdb/db/metadata/MGraph.java  |  22 ++-
 .../org/apache/iotdb/db/metadata/MManager.java     |  81 ++++++++---
 .../java/org/apache/iotdb/db/metadata/MNode.java   |  16 +--
 .../java/org/apache/iotdb/db/metadata/MTree.java   |  45 +++---
 .../iotdb/db/metadata/MetadataOperationType.java   |   3 +-
 .../org/apache/iotdb/db/monitor/StatMonitor.java   |   9 +-
 .../org/apache/iotdb/db/qp/QueryProcessor.java     |   1 +
 .../iotdb/db/qp/executor/QueryProcessExecutor.java |   9 +-
 .../org/apache/iotdb/db/qp/logical/Operator.java   |   2 +-
 .../iotdb/db/qp/logical/sys/MetadataOperator.java  |   9 +-
 .../iotdb/db/qp/physical/sys/MetadataPlan.java     |   2 +
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  18 +++
 .../iotdb/db/sync/receiver/SyncServiceImpl.java    |  10 +-
 .../iotdb/db/engine/MetadataManagerHelper.java     |   9 +-
 .../apache/iotdb/db/engine/merge/MergeTest.java    |   2 +-
 .../engine/modification/DeletionFileNodeTest.java  |   4 +-
 .../db/engine/modification/DeletionQueryTest.java  |   4 +-
 .../storagegroup/FileNodeManagerBenchmark.java     |   2 +-
 .../org/apache/iotdb/db/metadata/MGraphTest.java   |  12 +-
 .../iotdb/db/metadata/MManagerAdvancedTest.java    |  14 +-
 .../iotdb/db/metadata/MManagerBasicTest.java       |  49 ++++---
 .../iotdb/db/metadata/MManagerImproveTest.java     |   2 +-
 .../org/apache/iotdb/db/metadata/MetadataTest.java |  16 +--
 .../org/apache/iotdb/db/qp/QueryProcessorTest.java |   4 +-
 .../apache/iotdb/db/writelog/PerformanceTest.java  |   2 +-
 service-rpc/src/main/thrift/rpc.thrift             |   4 +-
 .../java/org/apache/iotdb/session/Session.java     |  14 ++
 .../org/apache/iotdb/session/IoTDBSessionIT.java   |  49 +++++++
 33 files changed, 427 insertions(+), 322 deletions(-)

diff --git a/docs/Documentation-CHN/UserGuide/7-Session API/1-Session API.md b/docs/Documentation-CHN/UserGuide/7-Session API/1-Session API.md
index dfc1efd..b5023f8 100644
--- a/docs/Documentation-CHN/UserGuide/7-Session API/1-Session API.md	
+++ b/docs/Documentation-CHN/UserGuide/7-Session API/1-Session API.md	
@@ -7,9 +7,9 @@
     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
@@ -28,9 +28,14 @@
 * JDK >= 1.8
 * Maven >= 3.1
 
+## 仅在client模块中打包
+
+在根目录下运行:
+> mvn clean package -pl client -am -Dmaven.test.skip=true
+
 ## 安装到本地 maven 库
 
-In root directory:
+在根目录下运行:
 > mvn clean install -pl session -am -Dmaven.test.skip=true
 
 ## 在 maven 中使用 session 接口
@@ -46,99 +51,56 @@ In root directory:
 ```
 
 ## Session 接口使用示例
+下面将给出Session对应的接口的简要介绍和对应参数:
 
+### 启动Session的相关命令:
 
-```Java
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.iotdb.session.IoTDBSessionException;
-import org.apache.iotdb.session.Session;
-import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
-import org.apache.iotdb.tsfile.write.record.RowBatch;
-import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
-import org.apache.iotdb.tsfile.write.schema.Schema;
-
-public class SessionExample {
-
-  private static Session session;
-
-  public static void main(String[] args) throws IoTDBSessionException {
-    session = new Session("127.0.0.1", 6667, "root", "root");
-    session.open();
-
-    session.setStorageGroup("root.sg1");
-    session.createTimeseries("root.sg1.d1.s1", TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY);
-    session.createTimeseries("root.sg1.d1.s2", TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY);
-    session.createTimeseries("root.sg1.d1.s3", TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY);
-
-    insert();
-    insertRowBatch();
-    deleteData();
-    deleteTimeseries();
-    session.close();
-  }
-
-  private static void insert() throws IoTDBSessionException {
-    String deviceId = "root.sg1.d1";
-    List<String> measurements = new ArrayList<>();
-    measurements.add("s1");
-    measurements.add("s2");
-    measurements.add("s3");
-    for (long time = 0; time < 100; time++) {
-      List<String> values = new ArrayList<>();
-      values.add("1");
-      values.add("2");
-      values.add("3");
-      session.insert(deviceId, time, measurements, values);
-    }
-  }
-
-  private static void insertRowBatch() throws IoTDBSessionException {
-    Schema schema = new Schema();
-    schema.registerMeasurement(new MeasurementSchema("s1", TSDataType.INT64, TSEncoding.RLE));
-    schema.registerMeasurement(new MeasurementSchema("s2", TSDataType.INT64, TSEncoding.RLE));
-    schema.registerMeasurement(new MeasurementSchema("s3", TSDataType.INT64, TSEncoding.RLE));
-
-    RowBatch rowBatch = schema.createRowBatch("root.sg1.d1", 100);
-
-    long[] timestamps = rowBatch.timestamps;
-    Object[] values = rowBatch.values;
-
-    for (long time = 0; time < 100; time++) {
-      int row = rowBatch.batchSize++;
-      timestamps[row] = time;
-      for (int i = 0; i < 3; i++) {
-        long[] sensor = (long[]) values[i];
-        sensor[row] = i;
-      }
-      if (rowBatch.batchSize == rowBatch.getMaxBatchSize()) {
-        session.insertBatch(rowBatch);
-        rowBatch.reset();
-      }
-    }
-
-    if (rowBatch.batchSize != 0) {
-      session.insertBatch(rowBatch);
-      rowBatch.reset();
-    }
-  }
-
-  private static void deleteData() throws IoTDBSessionException {
-    String path = "root.sg1.d1.s1";
-    long deleteTime = 99;
-    session.deleteData(path, deleteTime);
-  }
-
-  private static void deleteTimeseries() throws IoTDBSessionException {
-    List<String> paths = new ArrayList<>();
-    paths.add("root.sg1.d1.s1");
-    paths.add("root.sg1.d1.s2");
-    paths.add("root.sg1.d1.s3");
-    session.deleteTimeseries(paths);
-  }
-}
-```
+* 初始化Session
+  ​	Session(String host, int port)
+  	Session(String host, String port, String username, String password)
+  	Session(String host, int port, String username, String password)
+
+* 开启Session
+  ​	Session.open()
+
+* 关闭Session
+  ​	Session.close()
+
+### Session的相关数据操作命令
+
+* 设置存储组
+
+  ​	TSStatus setStorageGroup(String storageGroupId)
+
+* 删除单个或多个存储组
+
+  ​	TSStatus deleteStorageGroup(String storageGroup)
+  	TSStatus deleteStorageGroups(List<String> storageGroups)
+
+* 创建单个时间序列
+
+  ​	TSStatus createTimeseries(String path, TSDataType dataType, TSEncoding encoding, CompressionType compressor)
+
+* 删除一个或多个时间序列
+
+  ​	TSStatus deleteTimeseries(String path)
+  	TSStatus deleteTimeseries(List<String> paths)
+
+* 删除某一特定时间前的时间序列
+
+  ​	TSStatus deleteData(String path, long time)
+  	TSStatus deleteData(List<String> paths, long time)
+
+* 插入时序数据
+
+  ​	TSStatus insert(String deviceId, long time, List<String> measurements, List<String> values)
+
+* 批量插入时序数据
+
+  ​	TSExecuteBatchStatementResp insertBatch(RowBatch rowBatch)
+
+### 示例代码
+
+ 浏览上述接口的详细信息,请参阅代码session/src/main/java/org/apache/iotdb/session/Session.java
 
-> The code is in example/session/src/main/java/org/apache/iotdb/session/SessionExample.java
\ No newline at end of file
+ 使用上述接口的示例代码在example/session/src/main/java/org/apache/iotdb/SessionExample.java,在此文件中包含了开启session和执行批量插入等操作
\ No newline at end of file
diff --git a/docs/Documentation/UserGuide/7-Session API/1-Session API.md b/docs/Documentation/UserGuide/7-Session API/1-Session API.md
index 0bf86ba..c8fef86 100644
--- a/docs/Documentation/UserGuide/7-Session API/1-Session API.md	
+++ b/docs/Documentation/UserGuide/7-Session API/1-Session API.md	
@@ -7,9 +7,9 @@
     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
@@ -51,103 +51,55 @@ In root directory:
 ```
 
 
-## Examples with Session
-
-This chapter provides an example of how to open an IoTDB session, execute a batch insertion.
-
-Requires that you include the packages containing the Client classes needed for database programming.
-
-```Java
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.iotdb.session.IoTDBSessionException;
-import org.apache.iotdb.session.Session;
-import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
-import org.apache.iotdb.tsfile.write.record.RowBatch;
-import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
-import org.apache.iotdb.tsfile.write.schema.Schema;
-
-public class SessionExample {
-
-  private static Session session;
-
-  public static void main(String[] args) throws IoTDBSessionException {
-    session = new Session("127.0.0.1", 6667, "root", "root");
-    session.open();
-
-    session.setStorageGroup("root.sg1");
-    session.createTimeseries("root.sg1.d1.s1", TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY);
-    session.createTimeseries("root.sg1.d1.s2", TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY);
-    session.createTimeseries("root.sg1.d1.s3", TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY);
-
-    insert();
-    insertRowBatch();
-    deleteData();
-    deleteTimeseries();
-    session.close();
-  }
-
-  private static void insert() throws IoTDBSessionException {
-    String deviceId = "root.sg1.d1";
-    List<String> measurements = new ArrayList<>();
-    measurements.add("s1");
-    measurements.add("s2");
-    measurements.add("s3");
-    for (long time = 0; time < 100; time++) {
-      List<String> values = new ArrayList<>();
-      values.add("1");
-      values.add("2");
-      values.add("3");
-      session.insert(deviceId, time, measurements, values);
-    }
-  }
-
-  private static void insertRowBatch() throws IoTDBSessionException {
-    Schema schema = new Schema();
-    schema.registerMeasurement(new MeasurementSchema("s1", TSDataType.INT64, TSEncoding.RLE));
-    schema.registerMeasurement(new MeasurementSchema("s2", TSDataType.INT64, TSEncoding.RLE));
-    schema.registerMeasurement(new MeasurementSchema("s3", TSDataType.INT64, TSEncoding.RLE));
-
-    RowBatch rowBatch = schema.createRowBatch("root.sg1.d1", 100);
-
-    long[] timestamps = rowBatch.timestamps;
-    Object[] values = rowBatch.values;
-
-    for (long time = 0; time < 100; time++) {
-      int row = rowBatch.batchSize++;
-      timestamps[row] = time;
-      for (int i = 0; i < 3; i++) {
-        long[] sensor = (long[]) values[i];
-        sensor[row] = i;
-      }
-      if (rowBatch.batchSize == rowBatch.getMaxBatchSize()) {
-        session.insertBatch(rowBatch);
-        rowBatch.reset();
-      }
-    }
-
-    if (rowBatch.batchSize != 0) {
-      session.insertBatch(rowBatch);
-      rowBatch.reset();
-    }
-  }
-
-  private static void deleteData() throws IoTDBSessionException {
-    String path = "root.sg1.d1.s1";
-    long deleteTime = 99;
-    session.deleteData(path, deleteTime);
-  }
-
-  private static void deleteTimeseries() throws IoTDBSessionException {
-    List<String> paths = new ArrayList<>();
-    paths.add("root.sg1.d1.s1");
-    paths.add("root.sg1.d1.s2");
-    paths.add("root.sg1.d1.s3");
-    session.deleteTimeseries(paths);
-  }
-}
-```
+## Examples with Session interfaces
+
+Here we show the commonly used interfaces and their parameters in the Session:
+
+### Run the Session
+
+* Initialize Session
+  	Session(String host, int port)
+  	Session(String host, String port, String username, String password)
+  	Session(String host, int port, String username, String password)
+
+* Open Session
+  ​	Session.open()
+
+* Close Session
+  ​	Session.close()
+
+### Operate the Session
+
+* Set a storage group
+
+  ​	TSStatus setStorageGroup(String storageGroupId)
+
+* Delete one or several storage groups
+
+  ​	TSStatus deleteStorageGroup(String storageGroup)
+  	TSStatus deleteStorageGroups(List<String> storageGroups)
+
+* Create a timeseries under a existing storage group
+  ​	TSStatus createTimeseries(String path, TSDataType dataType, TSEncoding encoding, CompressionType compressor)
+
+* Delete one or several timeseries
+  ​	TSStatus deleteTimeseries(String path)
+  	TSStatus deleteTimeseries(List<String> paths)
+
+* Delete one or several timeseries before a certain timestamp
+  ​	TSStatus deleteData(String path, long time)
+  	TSStatus deleteData(List<String> paths, long time)
+
+* Insert data in existing timeseries
+
+  ​	TSStatus insert(String deviceId, long time, List<String> measurements, List<String> values)
+
+* Batch insertion of timeseries
+
+  ​	TSExecuteBatchStatementResp insertBatch(RowBatch rowBatch)
+
+### Sample code
+
+To get more information of the following interfaces, please view session/src/main/java/org/apache/iotdb/session/Session.java
 
-> The code is in example/session/src/main/java/org/apache/iotdb/session/SessionExample.java
\ No newline at end of file
+The sample code of using these interfaces is in example/session/src/main/java/org/apache/iotdb/SessionExample.java,which provides an example of how to open an IoTDB session, execute a batch insertion.
\ No newline at end of file
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapter.java b/server/src/main/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapter.java
index cb4bae1..41dd543 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapter.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapter.java
@@ -208,9 +208,6 @@ public class IoTDBConfigDynamicAdapter implements IDynamicAdapter {
         * PrimitiveArrayPool.ARRAY_SIZE * Long.BYTES * 2;
   }
 
-  /**
-   * TODO: Currently IoTDB only supports to add a storage group.
-   */
   @Override
   public void addOrDeleteStorageGroup(int diff) throws ConfigAdjusterException {
     totalStorageGroup += diff;
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
index fed82c0..d0f8fa7 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
@@ -346,4 +346,10 @@ public class StorageEngine implements IService {
     return true;
   }
 
+  public void deleteStorageGroup(String storageGroupName) {
+    deleteAllDataFilesInOneStorageGroup(storageGroupName);
+    StorageGroupProcessor processor = processorMap.remove(storageGroupName);
+    processor.deleteFolder(systemDir);
+  }
+
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
index 5377adf..70ac9c7 100755
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
@@ -527,6 +527,24 @@ public class StorageGroupProcessor {
     }
   }
 
+  /**
+   * delete the storageGroup's own folder in folder data/system/storage_groups
+   */
+  public void deleteFolder(String systemDir) {
+    waitForAllCurrentTsFileProcessorsClosed();
+    writeLock();
+    try {
+      File storageGroupFolder = SystemFileFactory.INSTANCE.getFile(systemDir, storageGroupName);
+      if (storageGroupFolder.exists()) {
+        FileUtils.deleteDirectory(storageGroupFolder);
+      }
+    } catch (IOException e) {
+      logger.error("Cannot delete the folder in storage group {}, because", storageGroupName, e);
+    } finally {
+      writeUnlock();
+    }
+  }
+
   public void syncDeleteDataFiles() {
     waitForAllCurrentTsFileProcessorsClosed();
     writeLock();
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MGraph.java b/server/src/main/java/org/apache/iotdb/db/metadata/MGraph.java
index 1dedc80..9a7a5cc 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MGraph.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MGraph.java
@@ -152,21 +152,29 @@ public class MGraph implements Serializable {
   }
 
   /**
-   * Set storage level for current Metadata Tree.
+   * Set storage group for current Metadata Tree.
    *
    * @param path Format: root.node.(node)*
    */
-  void setStorageLevel(String path) throws PathErrorException {
+  void setStorageGroup(String path) throws PathErrorException {
     mtree.setStorageGroup(path);
   }
 
   /**
-   * Check whether the input path is storage level for current Metadata Tree or not.
+   * Delete storage group from current Metadata Tree.
+   *
+   * @param path Format: root.node
+   */
+  void deleteStorageGroup(String path) throws PathErrorException {
+    mtree.deleteStorageGroup(path);
+  }
+  /**
+   * Check whether the input path is storage group for current Metadata Tree or not.
    *
    * @param path Format: root.node.(node)*
    * @apiNote :for cluster
    */
-  boolean checkStorageLevel(String path) {
+  boolean checkStorageGroup(String path) {
     return mtree.checkStorageGroup(path);
   }
 
@@ -289,9 +297,9 @@ public class MGraph implements Serializable {
   }
 
   /**
-   * Calculate the count of storage-level nodes included in given seriesPath.
+   * Calculate the count of storage-group nodes included in given seriesPath.
    *
-   * @return The total count of storage-level nodes.
+   * @return The total count of storage-group nodes.
    */
   int getFileCountForOneType(String path) throws PathErrorException {
     return mtree.getFileCountForOneType(path);
@@ -299,7 +307,7 @@ public class MGraph implements Serializable {
 
   /**
    * Get the file name for given seriesPath Notice: This method could be called if and only if the
-   * seriesPath includes one node whose {@code isStorageLevel} is true.
+   * seriesPath includes one node whose {@code isStorageGroup} is true.
    */
   String getStorageGroupNameByPath(String path) throws PathErrorException {
     return mtree.getStorageGroupNameByPath(path);
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index 05c9331..c8c6bfa 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -30,7 +30,6 @@ import org.apache.iotdb.db.exception.MetadataErrorException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.monitor.MonitorConstants;
 import org.apache.iotdb.db.utils.RandomDeleteCache;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.exception.cache.CacheException;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -209,8 +208,15 @@ public class MManager {
       case MetadataOperationType.DELETE_PATH_FROM_MTREE:
         deletePaths(Collections.singletonList(new Path(args[1])));
         break;
-      case MetadataOperationType.SET_STORAGE_LEVEL_TO_MTREE:
-        setStorageLevelToMTree(args[1]);
+      case MetadataOperationType.SET_STORAGE_GROUP_TO_MTREE:
+        setStorageGroupToMTree(args[1]);
+        break;
+      case MetadataOperationType.DELETE_STORAGE_GROUP_FROM_MTREE:
+        List<Path> storageGroups = new ArrayList<>();
+        for (int l = 1; l < args.length; l++){
+          storageGroups.add(new Path(args[l]));
+        }
+        deleteStorageGroupsFromMTree(storageGroups);
         break;
       case MetadataOperationType.ADD_A_PTREE:
         addAPTree(args[1]);
@@ -519,19 +525,19 @@ public class MManager {
   }
 
   /**
-   * function for setting storage level of the given path to mTree.
+   * function for setting storage group of the given path to mTree.
    */
-  public void setStorageLevelToMTree(String path) throws MetadataErrorException {
+  public void setStorageGroupToMTree(String path) throws MetadataErrorException {
     lock.writeLock().lock();
     try {
       checkAndGetDataTypeCache.clear();
       mNodeCache.clear();
       IoTDBConfigDynamicAdapter.getInstance().addOrDeleteStorageGroup(1);
-      mgraph.setStorageLevel(path);
+      mgraph.setStorageGroup(path);
       seriesNumberInStorageGroups.put(path, 0);
       if (writeToLog) {
         BufferedWriter writer = getLogWriter();
-        writer.write(MetadataOperationType.SET_STORAGE_LEVEL_TO_MTREE + "," + path);
+        writer.write(MetadataOperationType.SET_STORAGE_GROUP_TO_MTREE + "," + path);
         writer.newLine();
         writer.flush();
       }
@@ -550,14 +556,57 @@ public class MManager {
   }
 
   /**
-   * function for checking if the given path is storage level of mTree or not.
+   * function for deleting storage groups of the given path from mTree.
+   * the log format is like "delete_storage_group,sg1,sg2,sg3"
+   */
+  public boolean deleteStorageGroupsFromMTree(List<Path> deletePathList) throws MetadataErrorException {
+    List<String> pathList = new ArrayList<>();
+    String jointPath = "";
+    for (Path storagePath : deletePathList) {
+      pathList.add(storagePath.getFullPath());
+      jointPath = jointPath + "," + storagePath.getFullPath();
+    }
+    lock.writeLock().lock();
+    try {
+      if (writeToLog) {
+        BufferedWriter writer = getLogWriter();
+        writer.write(MetadataOperationType.DELETE_STORAGE_GROUP_FROM_MTREE + jointPath);
+        writer.newLine();
+        writer.flush();
+      }
+      for (String delStorageGroup : pathList) {
+        try {
+          checkAndGetDataTypeCache.clear();
+          mNodeCache.clear();
+          IoTDBConfigDynamicAdapter.getInstance().addOrDeleteStorageGroup(-1);
+          mgraph.deleteStorageGroup(delStorageGroup);
+          seriesNumberInStorageGroups.remove(delStorageGroup);
+        } catch (PathErrorException e){
+          try {
+            IoTDBConfigDynamicAdapter.getInstance().addOrDeleteStorageGroup(1);
+          } catch (ConfigAdjusterException ex){
+            throw new MetadataErrorException(ex);
+          }
+          throw new MetadataErrorException(e);
+        }
+      }
+    } catch (IOException | ConfigAdjusterException e){
+      throw new MetadataErrorException(e);
+    } finally {
+      lock.writeLock().unlock();
+    }
+    return true;
+  }
+
+  /**
+   * function for checking if the given path is storage group of mTree or not.
    *
    * @apiNote :for cluster
    */
-  boolean checkStorageLevelOfMTree(String path) {
+  boolean checkStorageGroupOfMTree(String path) {
     lock.readLock().lock();
     try {
-      return mgraph.checkStorageLevel(path);
+      return mgraph.checkStorageGroup(path);
     } finally {
       lock.readLock().unlock();
     }
@@ -845,9 +894,9 @@ public class MManager {
   }
 
   /**
-   * Calculate the count of storage-level nodes included in given seriesPath.
+   * Calculate the count of storage-group nodes included in given seriesPath.
    *
-   * @return The total count of storage-level nodes.
+   * @return The total count of storage-group nodes.
    */
   // future feature
   @SuppressWarnings("unused")
@@ -863,7 +912,7 @@ public class MManager {
 
   /**
    * Get the file name for given seriesPath Notice: This method could be called if and only if the
-   * seriesPath includes one node whose {@code isStorageLevel} is true.
+   * seriesPath includes one node whose {@code isStorageGroup} is true.
    *
    * @return A String represented the file name
    */
@@ -1114,7 +1163,7 @@ public class MManager {
   }
 
   /**
-   * Check whether given seriesPath contains a MNode whose {@code MNode.isStorageLevel} is true.
+   * Check whether given seriesPath contains a MNode whose {@code MNode.isStorageGroup} is true.
    */
   public boolean checkFileLevel(List<Path> path) throws PathErrorException {
 
@@ -1186,11 +1235,11 @@ public class MManager {
 
   /**
    * Check whether {@code seriesPath} exists and whether {@code seriesPath} has been set storage
-   * level.
+   * group.
    *
    * @return {@link PathCheckRet}
    */
-  PathCheckRet checkPathStorageLevelAndGetDataType(String path) throws PathErrorException {
+  PathCheckRet checkPathStorageGroupAndGetDataType(String path) throws PathErrorException {
     try {
       return checkAndGetDataTypeCache.get(path);
     } catch (CacheException e) {
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/MNode.java
index 433b7d5..4d92cdb 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MNode.java
@@ -39,8 +39,8 @@ public class MNode implements Serializable {
   private String name;
   // Whether current node is a leaf in the Metadata Tree
   private boolean isLeaf;
-  // Whether current node is Storage Level in the Metadata Tree
-  private boolean isStorageLevel;
+  // Whether current node is Storage group in the Metadata Tree
+  private boolean isStorageGroup;
   // Map for the schema in this storage group
   private Map<String, MeasurementSchema> schemaMap;
   private Map<String, Integer> numSchemaMap;
@@ -59,7 +59,7 @@ public class MNode implements Serializable {
     this.setName(name);
     this.parent = parent;
     this.isLeaf = isLeaf;
-    this.isStorageLevel = false;
+    this.isStorageGroup = false;
     if (!isLeaf) {
       children = new LinkedHashMap<>();
     }
@@ -71,15 +71,15 @@ public class MNode implements Serializable {
     this.schema = new MeasurementSchema(name, dataType, encoding, type);
   }
 
-  public boolean isStorageLevel() {
-    return isStorageLevel;
+  public boolean isStorageGroup() {
+    return isStorageGroup;
   }
 
   /**
-   * function for setting storage level.
+   * function for setting storage group.
    */
-  public void setStorageLevel(boolean b) {
-    this.isStorageLevel = b;
+  public void setStorageGroup(boolean b) {
+    this.isStorageGroup = b;
     if (b) {
       schemaMap = new HashMap<>();
       numSchemaMap = new HashMap<>();
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
index e3f6431..77753d4 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
@@ -101,7 +101,7 @@ public class MTree implements Serializable {
     int i = 1;
     while (i < nodeNames.length - 1) {
       String nodeName = nodeNames[i];
-      if (cur.isStorageLevel()) {
+      if (cur.isStorageGroup()) {
         levelPath = cur.getDataFileName();
       }
       if (!cur.hasChild(nodeName)) {
@@ -197,7 +197,7 @@ public class MTree implements Serializable {
       if (temp == null) {
         // add one child node
         cur.addChild(nodeNames[i], new MNode(nodeNames[i], cur, false));
-      } else if (temp.isStorageLevel()) {
+      } else if (temp.isStorageGroup()) {
         // before set storage group should check the seriesPath exist or not
         // throw exception
         throw new PathErrorException(
@@ -215,10 +215,23 @@ public class MTree implements Serializable {
               path));
     }
     cur = cur.getChild(nodeNames[i]);
-    cur.setStorageLevel(true);
+    cur.setStorageGroup(true);
     setDataFileName(path, cur);
   }
 
+  public void deleteStorageGroup(String path) throws PathErrorException {
+    MNode cur = getNodeByPath(path);
+    if (!cur.isStorageGroup()) {
+      throw new PathErrorException(String.format("The path %s is not a deletable storage group", path));
+    }
+    cur.getParent().deleteChild(cur.getName());
+    cur = cur.getParent();
+    while (cur != null && !MetadataConstant.ROOT.equals(cur.getName()) && cur.getChildren().size() == 0) {
+      cur.getParent().deleteChild(cur.getName());
+      cur = cur.getParent();
+    }
+  }
+
   /**
    * Check whether the input path is storage group or not
    * @param path input path
@@ -234,14 +247,14 @@ public class MTree implements Serializable {
     int i = 1;
     while (i < nodeNames.length - 1) {
       MNode temp = cur.getChild(nodeNames[i]);
-      if (temp == null || temp.isStorageLevel()) {
+      if (temp == null || temp.isStorageGroup()) {
         return false;
       }
       cur = cur.getChild(nodeNames[i]);
       i++;
     }
     MNode temp = cur.getChild(nodeNames[i]);
-    return temp != null && temp.isStorageLevel();
+    return temp != null && temp.isStorageGroup();
   }
 
   /**
@@ -294,13 +307,13 @@ public class MTree implements Serializable {
     // if the storage group node is deleted, the dataFileName should be
     // return
     String dataFileName = null;
-    if (cur.isStorageLevel()) {
+    if (cur.isStorageGroup()) {
       dataFileName = cur.getDataFileName();
     }
     cur.getParent().deleteChild(cur.getName());
     cur = cur.getParent();
     while (cur != null && !MetadataConstant.ROOT.equals(cur.getName()) && cur.getChildren().size() == 0) {
-      if (cur.isStorageLevel()) {
+      if (cur.isStorageGroup()) {
         dataFileName = cur.getDataFileName();
         return dataFileName;
       }
@@ -461,7 +474,7 @@ public class MTree implements Serializable {
             String.format(NO_CHILD_ERROR,cur.getName(),nodes[i]));
       }
       cur = cur.getChild(nodes[i]);
-      if (cur.isStorageLevel()) {
+      if (cur.isStorageGroup()) {
         fileLevelChecked = true;
       }
     }
@@ -536,13 +549,13 @@ public class MTree implements Serializable {
         throw new PathErrorException(
             String.format(NOT_SERIES_PATH,
                 path));
-      } else if (cur.isStorageLevel()) {
+      } else if (cur.isStorageGroup()) {
         return cur.getDataFileName();
       } else {
         cur = cur.getChild(nodes[i]);
       }
     }
-    if (cur.isStorageLevel()) {
+    if (cur.isStorageGroup()) {
       return cur.getDataFileName();
     }
     throw new PathErrorException(
@@ -571,7 +584,7 @@ public class MTree implements Serializable {
    */
   private void findFileName(MNode node, String[] nodes, int idx, String parent,
       ArrayList<String> paths) {
-    if (node.isStorageLevel()) {
+    if (node.isStorageGroup()) {
       paths.add(node.getDataFileName());
       return;
     }
@@ -605,13 +618,13 @@ public class MTree implements Serializable {
         throw new PathErrorException(
             String.format(NOT_SERIES_PATH,
                 path));
-      } else if (cur.isStorageLevel()) {
+      } else if (cur.isStorageGroup()) {
         return cur.getDataFileName();
       } else {
         cur = cur.getChild(nodes[i]);
       }
     }
-    if (cur.isStorageLevel()) {
+    if (cur.isStorageGroup()) {
       return cur.getDataFileName();
     }
     throw new PathErrorException(
@@ -631,7 +644,7 @@ public class MTree implements Serializable {
     for (int i = 1; i <= nodes.length; i++) {
       if (cur == null) {
         return false;
-      } else if (cur.isStorageLevel()) {
+      } else if (cur.isStorageGroup()) {
         return true;
       } else {
         cur = cur.getChild(nodes[i]);
@@ -715,7 +728,7 @@ public class MTree implements Serializable {
 
   private int getFileCountForOneNode(MNode node) {
 
-    if (node.isStorageLevel()) {
+    if (node.isStorageGroup()) {
       return 1;
     }
     int sum = 0;
@@ -755,7 +768,7 @@ public class MTree implements Serializable {
   }
 
   private void findStorageGroup(MNode node, String path, HashSet<String> res) {
-    if (node.isStorageLevel()) {
+    if (node.isStorageGroup()) {
       res.add(path);
       return;
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MetadataOperationType.java b/server/src/main/java/org/apache/iotdb/db/metadata/MetadataOperationType.java
index 2e52eff..0ed0304 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MetadataOperationType.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MetadataOperationType.java
@@ -26,7 +26,7 @@ public class MetadataOperationType {
 
   public static final String ADD_PATH_TO_MTREE = "0";
   public static final String DELETE_PATH_FROM_MTREE = "1";
-  public static final String SET_STORAGE_LEVEL_TO_MTREE = "2";
+  public static final String SET_STORAGE_GROUP_TO_MTREE = "2";
   public static final String ADD_A_PTREE = "3";
   public static final String ADD_A_PATH_TO_PTREE = "4";
   public static final String DELETE_PATH_FROM_PTREE = "5";
@@ -34,4 +34,5 @@ public class MetadataOperationType {
   public static final String UNLINK_MNODE_FROM_PTREE = "7";
   public static final String ADD_INDEX_TO_PATH = "8";
   public static final String DELETE_INDEX_FROM_PATH = "9";
+  public static final String DELETE_STORAGE_GROUP_FROM_MTREE = "10";
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/monitor/StatMonitor.java b/server/src/main/java/org/apache/iotdb/db/monitor/StatMonitor.java
index 951b655..130c1be 100644
--- a/server/src/main/java/org/apache/iotdb/db/monitor/StatMonitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/monitor/StatMonitor.java
@@ -41,7 +41,6 @@ import org.apache.iotdb.db.monitor.collector.FileSize;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.service.IService;
 import org.apache.iotdb.db.service.ServiceType;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -87,10 +86,10 @@ public class StatMonitor implements IService {
       try {
         String prefix = MonitorConstants.STAT_STORAGE_GROUP_PREFIX;
         if (!mmanager.pathExist(prefix)) {
-          mmanager.setStorageLevelToMTree(prefix);
+          mmanager.setStorageGroupToMTree(prefix);
         }
       } catch (MetadataErrorException e) {
-        logger.error("MManager cannot set storage level to MTree.", e);
+        logger.error("MManager cannot set storage group to MTree.", e);
       }
     }
   }
@@ -144,10 +143,10 @@ public class StatMonitor implements IService {
     String prefix = MonitorConstants.STAT_STORAGE_GROUP_PREFIX;
     try {
       if (!mManager.pathExist(prefix)) {
-        mManager.setStorageLevelToMTree(prefix);
+        mManager.setStorageGroupToMTree(prefix);
       }
     } catch (Exception e) {
-      logger.error("MManager cannot set storage level to MTree.", e);
+      logger.error("MManager cannot set storage group to MTree.", e);
     }
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java b/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
index ebb30c2..59525bd 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
@@ -131,6 +131,7 @@ public class QueryProcessor {
       case AUTHOR:
       case METADATA:
       case SET_STORAGE_GROUP:
+      case DELETE_STORAGE_GROUP:
       case CREATE_TIMESERIES:
       case DELETE_TIMESERIES:
       case PROPERTY:
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
index 1c58ea7..be3f5a2 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
@@ -113,6 +113,7 @@ public class QueryProcessExecutor extends AbstractQueryProcessExecutor {
       case DELETE_TIMESERIES:
       case CREATE_TIMESERIES:
       case SET_STORAGE_GROUP:
+      case DELETE_STORAGE_GROUP:
       case METADATA:
         MetadataPlan metadata = (MetadataPlan) plan;
         return operateMetadata(metadata);
@@ -397,7 +398,13 @@ public class QueryProcessExecutor extends AbstractQueryProcessExecutor {
           }
           break;
         case SET_STORAGE_GROUP:
-          mManager.setStorageLevelToMTree(path.getFullPath());
+          mManager.setStorageGroupToMTree(path.getFullPath());
+          break;
+        case DELETE_STORAGE_GROUP:
+          mManager.deleteStorageGroupsFromMTree(deletePathList);
+          for (Path storageGroupPath : deletePathList) {
+            storageEngine.deleteStorageGroup(storageGroupPath.getFullPath());
+          }
           break;
         default:
           throw new ProcessorException("unknown namespace type:" + namespaceType);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
index cab4ed4..28af958 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
@@ -73,6 +73,6 @@ public abstract class Operator {
     GRANT_USER_PRIVILEGE, REVOKE_USER_PRIVILEGE, GRANT_USER_ROLE, REVOKE_USER_ROLE, CREATE_ROLE,
     DELETE_ROLE, GRANT_ROLE_PRIVILEGE, REVOKE_ROLE_PRIVILEGE, LIST_USER, LIST_ROLE,
     LIST_USER_PRIVILEGE, LIST_ROLE_PRIVILEGE, LIST_USER_ROLES, LIST_ROLE_USERS,
-    GRANT_WATERMARK_EMBEDDING, REVOKE_WATERMARK_EMBEDDING
+    GRANT_WATERMARK_EMBEDDING, REVOKE_WATERMARK_EMBEDDING, DELETE_STORAGE_GROUP,
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MetadataOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MetadataOperator.java
index 2a80f6b..c0dfeb4 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MetadataOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MetadataOperator.java
@@ -46,6 +46,9 @@ public class MetadataOperator extends RootOperator {
     super(tokenIntType);
     namespaceType = type;
     switch (type) {
+      case DELETE_STORAGE_GROUP:
+        operatorType = OperatorType.DELETE_STORAGE_GROUP;
+        break;
       case SET_STORAGE_GROUP:
         operatorType = OperatorType.SET_STORAGE_GROUP;
         break;
@@ -113,7 +116,7 @@ public class MetadataOperator extends RootOperator {
   }
 
   public enum NamespaceType {
-    ADD_PATH, DELETE_PATH, SET_STORAGE_GROUP;
+    ADD_PATH, DELETE_PATH, SET_STORAGE_GROUP, DELETE_STORAGE_GROUP;
 
     /**
      * deserialize short number.
@@ -129,6 +132,8 @@ public class MetadataOperator extends RootOperator {
           return DELETE_PATH;
         case 2:
           return SET_STORAGE_GROUP;
+        case 3:
+          return DELETE_STORAGE_GROUP;
         default:
           return null;
       }
@@ -147,6 +152,8 @@ public class MetadataOperator extends RootOperator {
           return 1;
         case SET_STORAGE_GROUP:
           return 2;
+        case DELETE_STORAGE_GROUP:
+          return 3;
         default:
           return -1;
       }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java
index 4b3866d..d4c51ec 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java
@@ -201,6 +201,8 @@ public class MetadataPlan extends PhysicalPlan {
       case DELETE_PATH:
         setOperatorType(Operator.OperatorType.DELETE_TIMESERIES);
         break;
+      case DELETE_STORAGE_GROUP:
+        setOperatorType(Operator.OperatorType.DELETE_STORAGE_GROUP);
       default:
         break;
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 41ceed3..afbf306 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -1150,6 +1150,24 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
   }
 
   @Override
+  public TSStatus deleteStorageGroups(List<String> storageGroups) {
+    if (!checkLogin()) {
+      logger.info(INFO_NOT_LOGIN, IoTDBConstant.GLOBAL_DB_NAME);
+      return new TSStatus(getStatus(TSStatusCode.NOT_LOGIN_ERROR));
+    }
+    List<Path> storageGroupList = new ArrayList<>();
+    for (String storageGroup: storageGroups) {
+      storageGroupList.add(new Path(storageGroup));
+    }
+    MetadataPlan plan = new MetadataPlan(MetadataOperator.NamespaceType.DELETE_STORAGE_GROUP, storageGroupList);
+    TSStatus status = checkAuthority(plan);
+    if (status != null) {
+      return new TSStatus(status);
+    }
+    return new TSStatus(executePlan(plan));
+  }
+
+  @Override
   public TSStatus createTimeseries(TSCreateTimeseriesReq req) {
     if (!checkLogin()) {
       logger.info(INFO_NOT_LOGIN, IoTDBConstant.GLOBAL_DB_NAME);
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServiceImpl.java
index a2fa8c6..53ce023 100644
--- a/server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServiceImpl.java
@@ -287,8 +287,8 @@ public class SyncServiceImpl implements SyncService.Iface {
       case MetadataOperationType.DELETE_PATH_FROM_MTREE:
         metadataManger.deletePaths(Collections.singletonList(new Path(args[1])));
         break;
-      case MetadataOperationType.SET_STORAGE_LEVEL_TO_MTREE:
-        metadataManger.setStorageLevelToMTree(args[1]);
+      case MetadataOperationType.SET_STORAGE_GROUP_TO_MTREE:
+        metadataManger.setStorageGroupToMTree(args[1]);
         break;
       case MetadataOperationType.ADD_A_PTREE:
         metadataManger.addAPTree(args[1]);
@@ -305,6 +305,12 @@ public class SyncServiceImpl implements SyncService.Iface {
       case MetadataOperationType.UNLINK_MNODE_FROM_PTREE:
         metadataManger.unlinkMNodeFromPTree(args[1], args[2]);
         break;
+      case MetadataOperationType.DELETE_STORAGE_GROUP_FROM_MTREE:
+        List<Path> storageGroups = new ArrayList<>();
+        for (int l = 1; l < args.length; l++){
+          storageGroups.add(new Path(args[l]));
+        }
+        metadataManger.deleteStorageGroupsFromMTree(storageGroups);
       default:
         logger.error("Unrecognizable command {}", cmd);
     }
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/MetadataManagerHelper.java b/server/src/test/java/org/apache/iotdb/db/engine/MetadataManagerHelper.java
index 842f44d..8da1c43 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/MetadataManagerHelper.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/MetadataManagerHelper.java
@@ -20,7 +20,6 @@ package org.apache.iotdb.db.engine;
 
 import java.util.Collections;
 import org.apache.iotdb.db.metadata.MManager;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -36,9 +35,9 @@ public class MetadataManagerHelper {
     mmanager.init();
     mmanager.clear();
     try {
-      mmanager.setStorageLevelToMTree("root.vehicle.d0");
-      mmanager.setStorageLevelToMTree("root.vehicle.d1");
-      mmanager.setStorageLevelToMTree("root.vehicle.d2");
+      mmanager.setStorageGroupToMTree("root.vehicle.d0");
+      mmanager.setStorageGroupToMTree("root.vehicle.d1");
+      mmanager.setStorageGroupToMTree("root.vehicle.d2");
 
       CompressionType compressionType =CompressionType.valueOf(
           TSFileDescriptor.getInstance().getConfig().getCompressor());
@@ -98,7 +97,7 @@ public class MetadataManagerHelper {
     mmanager = MManager.getInstance();
     mmanager.clear();
     try {
-      mmanager.setStorageLevelToMTree("root.vehicle");
+      mmanager.setStorageGroupToMTree("root.vehicle");
       CompressionType compressionType =CompressionType.valueOf(TSFileDescriptor.getInstance().getConfig().getCompressor());
 
       mmanager.addPathToMTree(new Path("root.vehicle.d0.s0"), TSDataType.valueOf("INT32"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeTest.java b/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeTest.java
index 59dad16..34bce41 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeTest.java
@@ -102,7 +102,7 @@ abstract class MergeTest {
     for (int i = 0; i < deviceNum; i++) {
       deviceIds[i] = MERGE_TEST_SG + PATH_SEPARATOR + "device" + i;
     }
-    MManager.getInstance().setStorageLevelToMTree(MERGE_TEST_SG);
+    MManager.getInstance().setStorageGroupToMTree(MERGE_TEST_SG);
     for (String device : deviceIds) {
       for (MeasurementSchema measurementSchema : measurementSchemas) {
         MManager.getInstance().addPathToMTree(
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
index b759816..66b3db6 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
@@ -43,7 +43,6 @@ import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.utils.TimeValuePair;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -54,7 +53,6 @@ import org.apache.iotdb.tsfile.write.record.TSRecord;
 import org.apache.iotdb.tsfile.write.record.datapoint.DoubleDataPoint;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class DeletionFileNodeTest {
@@ -76,7 +74,7 @@ public class DeletionFileNodeTest {
       PathErrorException, IOException, StorageEngineException, StartupException {
     EnvironmentUtils.envSetUp();
 
-    MManager.getInstance().setStorageLevelToMTree(processorName);
+    MManager.getInstance().setStorageGroupToMTree(processorName);
     for (int i = 0; i < 10; i++) {
       MManager.getInstance().addPathToMTree(processorName + "." + measurements[i], dataType,
           encoding);
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
index 6cfeb82..d455cff 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
@@ -35,7 +35,6 @@ import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.query.executor.EngineQueryRouter;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -48,7 +47,6 @@ import org.apache.iotdb.tsfile.write.record.TSRecord;
 import org.apache.iotdb.tsfile.write.record.datapoint.DoubleDataPoint;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class  DeletionQueryTest {
@@ -71,7 +69,7 @@ public class  DeletionQueryTest {
       PathErrorException, IOException, StorageEngineException, StartupException {
     EnvironmentUtils.envSetUp();
 
-    MManager.getInstance().setStorageLevelToMTree(processorName);
+    MManager.getInstance().setStorageGroupToMTree(processorName);
     for (int i = 0; i < 10; i++) {
       MManager.getInstance().addPathToMTree(processorName + "." + measurements[i], dataType,
           encoding);
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
index 7d16042..9549475 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
@@ -64,7 +64,7 @@ public class FileNodeManagerBenchmark {
 
   private static void prepare() throws MetadataErrorException, PathErrorException, IOException {
     MManager manager = MManager.getInstance();
-    manager.setStorageLevelToMTree(prefix);
+    manager.setStorageGroupToMTree(prefix);
     for (String device : devices) {
       for (String measurement : measurements) {
         manager.addPathToMTree(device + "." + measurement, TSDataType.INT64.toString(),
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MGraphTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MGraphTest.java
index 3e18835..c5995b5 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MGraphTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MGraphTest.java
@@ -45,26 +45,26 @@ public class MGraphTest {
     MGraph root2 = new MGraph("root");
     MGraph root3 = new MGraph("root");
     try {
-      root.setStorageLevel("root.a.d0");
+      root.setStorageGroup("root.a.d0");
       root.addPathToMTree("root.a.d0.s0", "INT32", "RLE");
       root.addPathToMTree("root.a.d0.s1", "INT32", "RLE");
 
-      root.setStorageLevel("root.a.d1");
+      root.setStorageGroup("root.a.d1");
       root.addPathToMTree("root.a.d1.s0", "INT32", "RLE");
       root.addPathToMTree("root.a.d1.s1", "INT32", "RLE");
 
-      root.setStorageLevel("root.a.b.d0");
+      root.setStorageGroup("root.a.b.d0");
       root.addPathToMTree("root.a.b.d0.s0", "INT32", "RLE");
 
-      root1.setStorageLevel("root.a.d0");
+      root1.setStorageGroup("root.a.d0");
       root1.addPathToMTree("root.a.d0.s0", "INT32", "RLE");
       root1.addPathToMTree("root.a.d0.s1", "INT32", "RLE");
 
-      root2.setStorageLevel("root.a.d1");
+      root2.setStorageGroup("root.a.d1");
       root2.addPathToMTree("root.a.d1.s0", "INT32", "RLE");
       root2.addPathToMTree("root.a.d1.s1", "INT32", "RLE");
 
-      root3.setStorageLevel("root.a.b.d0");
+      root3.setStorageGroup("root.a.b.d0");
       root3.addPathToMTree("root.a.b.d0.s0", "INT32", "RLE");
 
       String[] metadatas = new String[3];
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
index 94bfd40..29ed209 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
@@ -44,9 +44,9 @@ public class MManagerAdvancedTest {
     EnvironmentUtils.envSetUp();
     mmanager = MManager.getInstance();
 
-    mmanager.setStorageLevelToMTree("root.vehicle.d0");
-    mmanager.setStorageLevelToMTree("root.vehicle.d1");
-    mmanager.setStorageLevelToMTree("root.vehicle.d2");
+    mmanager.setStorageGroupToMTree("root.vehicle.d0");
+    mmanager.setStorageGroupToMTree("root.vehicle.d1");
+    mmanager.setStorageGroupToMTree("root.vehicle.d2");
 
     mmanager.addPathToMTree("root.vehicle.d0.s0", "INT32", "RLE");
     mmanager.addPathToMTree("root.vehicle.d0.s1", "INT64", "RLE");
@@ -105,14 +105,14 @@ public class MManagerAdvancedTest {
     mmanager.addPathToMTree("root.vehicle.d2.s3", "TEXT", "PLAIN");
 
     Assert.assertEquals(TSDataType.INT32,
-        mmanager.checkPathStorageLevelAndGetDataType("root.vehicle.d0.s0").getDataType());
+        mmanager.checkPathStorageGroupAndGetDataType("root.vehicle.d0.s0").getDataType());
     Assert.assertEquals(TSDataType.INT64,
-        mmanager.checkPathStorageLevelAndGetDataType("root.vehicle.d0.s1").getDataType());
+        mmanager.checkPathStorageGroupAndGetDataType("root.vehicle.d0.s1").getDataType());
 
     Assert.assertEquals(false,
-        mmanager.checkPathStorageLevelAndGetDataType("root.vehicle.d0.s100").isSuccessfully());
+        mmanager.checkPathStorageGroupAndGetDataType("root.vehicle.d0.s100").isSuccessfully());
     Assert.assertEquals(null,
-        mmanager.checkPathStorageLevelAndGetDataType("root.vehicle.d0.s100").getDataType());
+        mmanager.checkPathStorageGroupAndGetDataType("root.vehicle.d0.s100").getDataType());
 
     MNode node = mmanager.getNodeByDeviceIdFromCache("root.vehicle.d0");
     Assert.assertEquals(TSDataType.INT32, node.getChild("s0").getSchema().getType());
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
index a01a5a7..7c13ae1 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
@@ -29,7 +29,6 @@ import java.util.List;
 import org.apache.iotdb.db.exception.MetadataErrorException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -64,14 +63,14 @@ public class MManagerBasicTest {
     assertFalse(manager.pathExist("root.laptop"));
 
     try {
-      manager.setStorageLevelToMTree("root.laptop.d1");
+      manager.setStorageGroupToMTree("root.laptop.d1");
     } catch (MetadataErrorException e) {
       e.printStackTrace();
       fail(e.getMessage());
     }
 
     try {
-      manager.setStorageLevelToMTree("root.laptop");
+      manager.setStorageGroupToMTree("root.laptop");
     } catch (MetadataErrorException e) {
       Assert.assertEquals(
           "org.apache.iotdb.db.exception.PathErrorException: The seriesPath of"
@@ -152,7 +151,7 @@ public class MManagerBasicTest {
     }
 
     try {
-      manager.setStorageLevelToMTree("root.laptop.d2");
+      manager.setStorageGroupToMTree("root.laptop.d2");
     } catch (MetadataErrorException e) {
       Assert.assertEquals(
           String.format("The seriesPath of %s already exist, it can't be set to the storage group",
@@ -260,25 +259,25 @@ public class MManagerBasicTest {
   }
 
   @Test
-  public void testSetStorageLevelAndExist() {
+  public void testSetStorageGroupAndExist() {
 
     MManager manager = MManager.getInstance();
 
     try {
-      assertFalse(manager.checkStorageLevelOfMTree("root"));
-      assertFalse(manager.checkStorageLevelOfMTree("root1.laptop.d2"));
-
-      manager.setStorageLevelToMTree("root.laptop.d1");
-      assertTrue(manager.checkStorageLevelOfMTree("root.laptop.d1"));
-      assertFalse(manager.checkStorageLevelOfMTree("root.laptop.d2"));
-      assertFalse(manager.checkStorageLevelOfMTree("root.laptop"));
-      assertFalse(manager.checkStorageLevelOfMTree("root.laptop.d1.s1"));
-
-      manager.setStorageLevelToMTree("root.laptop.d2");
-      assertTrue(manager.checkStorageLevelOfMTree("root.laptop.d1"));
-      assertTrue(manager.checkStorageLevelOfMTree("root.laptop.d2"));
-      assertFalse(manager.checkStorageLevelOfMTree("root.laptop.d3"));
-      assertFalse(manager.checkStorageLevelOfMTree("root.laptop"));
+      assertFalse(manager.checkStorageGroupOfMTree("root"));
+      assertFalse(manager.checkStorageGroupOfMTree("root1.laptop.d2"));
+
+      manager.setStorageGroupToMTree("root.laptop.d1");
+      assertTrue(manager.checkStorageGroupOfMTree("root.laptop.d1"));
+      assertFalse(manager.checkStorageGroupOfMTree("root.laptop.d2"));
+      assertFalse(manager.checkStorageGroupOfMTree("root.laptop"));
+      assertFalse(manager.checkStorageGroupOfMTree("root.laptop.d1.s1"));
+
+      manager.setStorageGroupToMTree("root.laptop.d2");
+      assertTrue(manager.checkStorageGroupOfMTree("root.laptop.d1"));
+      assertTrue(manager.checkStorageGroupOfMTree("root.laptop.d2"));
+      assertFalse(manager.checkStorageGroupOfMTree("root.laptop.d3"));
+      assertFalse(manager.checkStorageGroupOfMTree("root.laptop"));
     } catch (MetadataErrorException e) {
       e.printStackTrace();
       fail(e.getMessage());
@@ -290,8 +289,8 @@ public class MManagerBasicTest {
 
     MManager manager = MManager.getInstance();
     try {
-      manager.setStorageLevelToMTree("root.laptop.d1");
-      manager.setStorageLevelToMTree("root.laptop.d2");
+      manager.setStorageGroupToMTree("root.laptop.d1");
+      manager.setStorageGroupToMTree("root.laptop.d2");
       manager.addPathToMTree(new Path("root.laptop.d1.s1"), TSDataType.INT32, TSEncoding.PLAIN,
           CompressionType.GZIP, null);
       manager.addPathToMTree(new Path("root.laptop.d2.s1"), TSDataType.INT32, TSEncoding.PLAIN,
@@ -322,14 +321,14 @@ public class MManagerBasicTest {
       assertTrue(manager.getAllFileNamesByPath("root.vehicle.device").isEmpty());
       assertTrue(manager.getAllFileNamesByPath("root.vehicle.device.sensor").isEmpty());
 
-      manager.setStorageLevelToMTree("root.vehicle");
+      manager.setStorageGroupToMTree("root.vehicle");
       assertFalse(manager.getAllFileNamesByPath("root.vehicle").isEmpty());
       assertFalse(manager.getAllFileNamesByPath("root.vehicle.device").isEmpty());
       assertFalse(manager.getAllFileNamesByPath("root.vehicle.device.sensor").isEmpty());
       assertTrue(manager.getAllFileNamesByPath("root.vehicle1").isEmpty());
       assertTrue(manager.getAllFileNamesByPath("root.vehicle1.device").isEmpty());
 
-      manager.setStorageLevelToMTree("root.vehicle1.device");
+      manager.setStorageGroupToMTree("root.vehicle1.device");
       assertTrue(manager.getAllFileNamesByPath("root.vehicle1.device1").isEmpty());
       assertTrue(manager.getAllFileNamesByPath("root.vehicle1.device2").isEmpty());
       assertTrue(manager.getAllFileNamesByPath("root.vehicle1.device3").isEmpty());
@@ -344,14 +343,14 @@ public class MManagerBasicTest {
   public void testMaximalSeriesNumberAmongStorageGroup() throws MetadataErrorException {
     MManager manager = MManager.getInstance();
     assertEquals(0, manager.getMaximalSeriesNumberAmongStorageGroups());
-    manager.setStorageLevelToMTree("root.laptop");
+    manager.setStorageGroupToMTree("root.laptop");
     assertEquals(0, manager.getMaximalSeriesNumberAmongStorageGroups());
     manager.addPathToMTree("root.laptop.d1.s1", TSDataType.INT32, TSEncoding.PLAIN,
         CompressionType.GZIP, null);
     manager.addPathToMTree("root.laptop.d1.s2", TSDataType.INT32, TSEncoding.PLAIN,
         CompressionType.GZIP, null);
     assertEquals(2, manager.getMaximalSeriesNumberAmongStorageGroups());
-    manager.setStorageLevelToMTree("root.vehicle");
+    manager.setStorageGroupToMTree("root.vehicle");
     manager.addPathToMTree("root.vehicle.d1.s1", TSDataType.INT32, TSEncoding.PLAIN,
         CompressionType.GZIP, null);
     assertEquals(2, manager.getMaximalSeriesNumberAmongStorageGroups());
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
index ade6040..33911b7 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
@@ -46,7 +46,7 @@ public class MManagerImproveTest {
   public void setUp() throws Exception {
     EnvironmentUtils.envSetUp();
     mManager = MManager.getInstance();
-    mManager.setStorageLevelToMTree("root.t1.v2");
+    mManager.setStorageGroupToMTree("root.t1.v2");
 
     for (int j = 0; j < DEVICE_NUM; j++) {
       for (int i = 0; i < TIMESERIES_NUM; i++) {
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MetadataTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MetadataTest.java
index 4a79db2..56098db 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MetadataTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MetadataTest.java
@@ -45,34 +45,34 @@ public class MetadataTest {
     MManager manager = MManager.getInstance();
 
     try {
-      manager.setStorageLevelToMTree("root.t.d1");
+      manager.setStorageGroupToMTree("root.t.d1");
       manager.addPathToMTree("root.t.d1.s0", "INT32", "RLE");
       manager.addPathToMTree("root.t.d1.s1", "DOUBLE", "RLE");
-      manager.setStorageLevelToMTree("root.t.d2");
+      manager.setStorageGroupToMTree("root.t.d2");
       manager.addPathToMTree("root.t.d2.s1", "DOUBLE", "RLE");
       Metadata metadata1 = manager.getMetadata();
 
       manager.clear();
 
-      manager.setStorageLevelToMTree("root.t.d3");
+      manager.setStorageGroupToMTree("root.t.d3");
       manager.addPathToMTree("root.t.d3.s1", "DOUBLE", "RLE");
       manager.addPathToMTree("root.t.d3.s2", "TEXT", "RLE");
-      manager.setStorageLevelToMTree("root.t1.d1");
+      manager.setStorageGroupToMTree("root.t1.d1");
       manager.addPathToMTree("root.t1.d1.s1", "DOUBLE", "RLE");
       manager.addPathToMTree("root.t1.d1.s2", "TEXT", "RLE");
       Metadata metadata2 = manager.getMetadata();
 
       manager.clear();
 
-      manager.setStorageLevelToMTree("root.t.d1");
+      manager.setStorageGroupToMTree("root.t.d1");
       manager.addPathToMTree("root.t.d1.s0", "INT32", "RLE");
       manager.addPathToMTree("root.t.d1.s1", "DOUBLE", "RLE");
-      manager.setStorageLevelToMTree("root.t.d2");
+      manager.setStorageGroupToMTree("root.t.d2");
       manager.addPathToMTree("root.t.d2.s1", "DOUBLE", "RLE");
-      manager.setStorageLevelToMTree("root.t.d3");
+      manager.setStorageGroupToMTree("root.t.d3");
       manager.addPathToMTree("root.t.d3.s1", "DOUBLE", "RLE");
       manager.addPathToMTree("root.t.d3.s2", "TEXT", "RLE");
-      manager.setStorageLevelToMTree("root.t1.d1");
+      manager.setStorageGroupToMTree("root.t1.d1");
       manager.addPathToMTree("root.t1.d1.s1", "DOUBLE", "RLE");
       manager.addPathToMTree("root.t1.d1.s2", "TEXT", "RLE");
       Metadata metadata = manager.getMetadata();
diff --git a/server/src/test/java/org/apache/iotdb/db/qp/QueryProcessorTest.java b/server/src/test/java/org/apache/iotdb/db/qp/QueryProcessorTest.java
index c77ea83..3d5a6a8 100644
--- a/server/src/test/java/org/apache/iotdb/db/qp/QueryProcessorTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/qp/QueryProcessorTest.java
@@ -48,8 +48,8 @@ public class QueryProcessorTest {
   @Before
   public void setUp() throws Exception {
     EnvironmentUtils.envSetUp();
-    mManager.setStorageLevelToMTree("root.vehicle");
-    mManager.setStorageLevelToMTree("root.vehicle1");
+    mManager.setStorageGroupToMTree("root.vehicle");
+    mManager.setStorageGroupToMTree("root.vehicle1");
     mManager.addPathToMTree("root.vehicle.device1.sensor1", TSDataType.valueOf("INT32"),
         TSEncoding.valueOf("RLE"), compressionType, Collections
             .emptyMap());
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
index d692b24..1014569 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
@@ -124,7 +124,7 @@ public class PerformanceTest {
     tempProcessorStore.createNewFile();
 
     try {
-      MManager.getInstance().setStorageLevelToMTree("root.logTestDevice");
+      MManager.getInstance().setStorageGroupToMTree("root.logTestDevice");
     } catch (MetadataErrorException ignored) {
     }
     MManager.getInstance().addPathToMTree("root.logTestDevice.s1",
diff --git a/service-rpc/src/main/thrift/rpc.thrift b/service-rpc/src/main/thrift/rpc.thrift
index 79ff757..a3f838b 100644
--- a/service-rpc/src/main/thrift/rpc.thrift
+++ b/service-rpc/src/main/thrift/rpc.thrift
@@ -300,7 +300,9 @@ service TSIService {
 
 	TSStatus createTimeseries(1:TSCreateTimeseriesReq req);
 
-  TSStatus deleteTimeseries(1:list<string> path)
+    TSStatus deleteTimeseries(1:list<string> path)
+
+    TSStatus deleteStorageGroups(1:list<string> storageGroup);
 
 	TSStatus insertRow(1:TSInsertReq req);
 
diff --git a/session/src/main/java/org/apache/iotdb/session/Session.java b/session/src/main/java/org/apache/iotdb/session/Session.java
index 03f130b..0ad5508 100644
--- a/session/src/main/java/org/apache/iotdb/session/Session.java
+++ b/session/src/main/java/org/apache/iotdb/session/Session.java
@@ -235,6 +235,20 @@ public class Session {
     }
   }
 
+  public synchronized TSStatus deleteStorageGroup(String storageGroup) throws IoTDBSessionException {
+    List<String> groups = new ArrayList<>();
+    groups.add(storageGroup);
+    return deleteStorageGroups(groups);
+  }
+
+  public synchronized TSStatus deleteStorageGroups(List<String> storageGroup) throws IoTDBSessionException {
+    try {
+        return checkAndReturn(client.deleteStorageGroups(storageGroup));
+    } catch (TException e) {
+        throw new IoTDBSessionException(e);
+    }
+  }
+
   public synchronized TSStatus createTimeseries(String path, TSDataType dataType, TSEncoding encoding, CompressionType compressor) throws IoTDBSessionException {
     TSCreateTimeseriesReq request = new TSCreateTimeseriesReq();
     request.setPath(path);
diff --git a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
index 839f27f..05d1c91 100644
--- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
+++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
@@ -21,6 +21,9 @@ package org.apache.iotdb.session;
 import java.sql.*;
 import java.util.ArrayList;
 import java.util.List;
+import java.io.File;
+
+import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.jdbc.Config;
 import org.apache.iotdb.session.utils.EnvironmentUtils;
@@ -35,6 +38,8 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
+
 public class IoTDBSessionIT {
 
   private IoTDB daemon;
@@ -72,6 +77,12 @@ public class IoTDBSessionIT {
 
     query2();
 
+    // Add another storage group to test the deletion of storage group
+    session.setStorageGroup("root.sg2");
+    session.createTimeseries("root.sg2.d1.s1", TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY);
+
+    deleteStorageGroupTest();
+
     session.close();
   }
 
@@ -190,4 +201,42 @@ public class IoTDBSessionIT {
       Assert.assertEquals(resultStr.toString(), standard);
     }
   }
+
+  public void deleteStorageGroupTest() throws ClassNotFoundException, SQLException, IoTDBSessionException {
+    try {
+      session.deleteStorageGroup("root.sg1.d1.s1");
+    } catch (IoTDBSessionException e) {
+      assertEquals("The path root.sg1.d1.s1 is not a deletable storage group", e.getMessage());
+    }
+    session.deleteStorageGroup("root.sg1");
+    File folder = new File("data/system/storage_groups/root.sg1/");
+    assertEquals(folder.exists(), false);
+    session.setStorageGroup("root.sg1.d1");
+    session.createTimeseries("root.sg1.d1.s1", TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY);
+    // using the query result as the QueryTest to verify the deletion and the new insertion
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    String standard = "Time\n" + "root.sg1.d1.s1\n" + "root.sg2.d1.s1\n";
+    try (Connection connection = DriverManager
+            .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+         Statement statement = connection.createStatement()) {
+      ResultSet resultSet = statement.executeQuery("select * from root");
+      final ResultSetMetaData metaData = resultSet.getMetaData();
+      final int colCount = metaData.getColumnCount();
+      StringBuilder resultStr = new StringBuilder();
+      for (int i = 0; i < colCount; i++) {
+        resultStr.append(metaData.getColumnLabel(i + 1) + "\n");
+      }
+      while (resultSet.next()) {
+        for (int i = 1; i <= colCount; i++) {
+          resultStr.append(resultSet.getString(i)).append(",");
+        }
+        resultStr.append("\n");
+      }
+      Assert.assertEquals(resultStr.toString(), standard);
+      List<String> storageGroups = new ArrayList<>();
+      storageGroups.add("root.sg1.d1");
+      storageGroups.add("root.sg2");
+      session.deleteStorageGroups(storageGroups);
+    }
+  }
 }