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; }
