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

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

commit bff38b2be89c271133c48a6b5b586800c010e0da
Author: samperson1997 <[email protected]>
AuthorDate: Sat Aug 15 16:36:11 2020 +0800

    [IOTDB-836] Fix merging statistics failed when endFile
---
 .../java/org/apache/iotdb/db/engine/StorageEngine.java   | 13 +++++++++++++
 .../iotdb/db/engine/storagegroup/TsFileProcessor.java    |  7 +++++++
 .../org/apache/iotdb/db/qp/executor/PlanExecutor.java    | 16 +++++++++++-----
 .../iotdb/tsfile/file/metadata/ChunkGroupMetadata.java   |  5 +++++
 .../apache/iotdb/tsfile/write/writer/TsFileIOWriter.java | 15 +++++++++++++++
 5 files changed, 51 insertions(+), 5 deletions(-)

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 65f99d4..d59744f 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
@@ -361,6 +361,19 @@ public class StorageEngine implements IService {
   }
 
   /**
+   * delete data of timeseries "{deviceId}.{measurementId}"
+   */
+  public void deleteTimeseries(String deviceId, String measurementId)
+      throws StorageEngineException {
+    StorageGroupProcessor storageGroupProcessor = getProcessor(deviceId);
+    try {
+      storageGroupProcessor.delete(deviceId, measurementId, Long.MAX_VALUE);
+    } catch (IOException e) {
+      throw new StorageEngineException(e.getMessage());
+    }
+  }
+
+  /**
    * query data.
    */
   public QueryDataSource query(SingleSeriesExpression seriesExpression, 
QueryContext context,
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
index 6d90ed8..e53437e 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
@@ -244,6 +244,13 @@ public class TsFileProcessor {
         workMemTable
             .delete(deletion.getDevice(), deletion.getMeasurement(), 
deletion.getTimestamp());
       }
+
+      // clear ChunkMetaData of the deleted timeseries
+      if (deletion.getTimestamp() == Long.MAX_VALUE) {
+        
writer.deleteMeasurementFromChunkGroupMetadataList(deletion.getDevice(),
+            deletion.getMeasurement());
+      }
+
       // flushing memTables are immutable, only record this deletion in these 
memTables for query
       for (IMemTable memTable : flushingMemTables) {
         memTable.delete(deletion);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java 
b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index 973057a..7a953a9 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -1246,11 +1246,17 @@ public class PlanExecutor implements IPlanExecutor {
    */
   private void deleteDataOfTimeSeries(List<Path> pathList)
       throws QueryProcessException, StorageGroupNotSetException, 
StorageEngineException {
-    for (Path p : pathList) {
-      DeletePlan deletePlan = new DeletePlan();
-      deletePlan.addPath(p);
-      deletePlan.setDeleteTime(Long.MAX_VALUE);
-      processNonQuery(deletePlan);
+    for (Path path : pathList) {
+      try {
+        if (!mManager.isPathExist(path.getFullPath())) {
+          throw new QueryProcessException(
+              String.format("Time series %s does not exist.", 
path.getFullPath()));
+        }
+        mManager.getStorageGroupName(path.getFullPath());
+        StorageEngine.getInstance().deleteTimeseries(path.getDevice(), 
path.getMeasurement());
+      } catch (MetadataException | StorageEngineException e) {
+        throw new QueryProcessException(e);
+      }
     }
   }
 
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkGroupMetadata.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkGroupMetadata.java
index d01f041..e318247 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkGroupMetadata.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkGroupMetadata.java
@@ -41,4 +41,9 @@ public class ChunkGroupMetadata {
   public List<ChunkMetadata> getChunkMetadataList() {
     return chunkMetadataList;
   }
+
+  public void setChunkMetadataList(
+      List<ChunkMetadata> chunkMetadataList) {
+    this.chunkMetadataList = chunkMetadataList;
+  }
 }
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
index c6b1726..69e4936 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
@@ -335,6 +335,21 @@ public class TsFileIOWriter {
     return deviceChunkMetadataMap;
   }
 
+  public void deleteMeasurementFromChunkGroupMetadataList(String deviceId, 
String measurementId) {
+    for (ChunkGroupMetadata chunkGroupMetadata : chunkGroupMetadataList) {
+      VersionUtils.applyVersion(chunkGroupMetadata.getChunkMetadataList(), 
versionInfo);
+      if (chunkGroupMetadata.getDevice().equals(deviceId)) {
+        List<ChunkMetadata> filteredChunkMetadataList = new ArrayList<>();
+        for (ChunkMetadata chunkMetadata : 
chunkGroupMetadata.getChunkMetadataList()) {
+          if (!chunkMetadata.getMeasurementUid().equals(measurementId)) {
+            filteredChunkMetadataList.add(chunkMetadata);
+          }
+        }
+        chunkGroupMetadata.setChunkMetadataList(filteredChunkMetadataList);
+      }
+    }
+  }
+
   public boolean canWrite() {
     return canWrite;
   }

Reply via email to