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 f0b8a4b [IOTDB-836] Fix merging statistics failed when endFile (#1637)
f0b8a4b is described below
commit f0b8a4be8aec82d6662391b267b41f519e2d0c9e
Author: Zesong Sun <[email protected]>
AuthorDate: Sat Aug 22 16:47:07 2020 +0800
[IOTDB-836] Fix merging statistics failed when endFile (#1637)
* [IOTDB-836] Fix merging statistics failed when endFile
---
.../org/apache/iotdb/db/engine/StorageEngine.java | 13 ++++++
.../iotdb/db/engine/memtable/AbstractMemTable.java | 2 +
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 18 +--------
.../writelog/recover/TsFileRecoverPerformer.java | 5 +++
.../db/integration/IoTDBDeleteTimeseriesIT.java | 47 ++++++++++++++++------
.../iotdb/tsfile/write/writer/TsFileIOWriter.java | 5 ++-
6 files changed, 60 insertions(+), 30 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 57f97ff..a555696 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
@@ -441,6 +441,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.MIN_VALUE,
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/memtable/AbstractMemTable.java
b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
index 763b8b4..5750502 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
@@ -237,6 +237,8 @@ public abstract class AbstractMemTable implements IMemTable
{
if (chunk == null) {
return;
}
+ // If startTimestamp == Long.MIN_VALUE && endTimestamp == Long.MAX_VALUE,
+ // it means that the whole timeseries is deleted
if (startTimestamp == Long.MIN_VALUE && endTimestamp == Long.MAX_VALUE) {
deviceMap.remove(measurementId);
}
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 7420dcd..068d888 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
@@ -977,9 +977,9 @@ public class PlanExecutor implements IPlanExecutor {
throws QueryProcessException {
List<Path> deletePathList = deleteTimeSeriesPlan.getPaths();
try {
- deleteDataOfTimeSeries(deletePathList);
List<String> failedNames = new LinkedList<>();
for (Path path : deletePathList) {
+ StorageEngine.getInstance().deleteTimeseries(path.getDevice(),
path.getMeasurement());
String failedTimeseries = mManager.deleteTimeseries(path.toString());
if (!failedTimeseries.isEmpty()) {
failedNames.add(failedTimeseries);
@@ -1059,22 +1059,6 @@ public class PlanExecutor implements IPlanExecutor {
return true;
}
- /**
- * Delete all data of time series in pathList.
- *
- * @param pathList deleted paths
- */
- protected void deleteDataOfTimeSeries(List<Path> pathList)
- throws QueryProcessException, StorageGroupNotSetException,
StorageEngineException {
- for (Path p : pathList) {
- DeletePlan deletePlan = new DeletePlan();
- deletePlan.addPath(p);
- deletePlan.setDeleteStartTime(Long.MIN_VALUE);
- deletePlan.setDeleteEndTime(Long.MAX_VALUE);
- processNonQuery(deletePlan);
- }
- }
-
protected QueryDataSet processAuthorQuery(AuthorPlan plan)
throws QueryProcessException {
AuthorType authorType = plan.getAuthorType();
diff --git
a/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java
b/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java
index 35e3e7e..8ce6cc3 100644
---
a/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java
+++
b/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java
@@ -46,6 +46,7 @@ import
org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager;
import org.apache.iotdb.tsfile.exception.NotCompatibleTsFileException;
import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
import org.apache.iotdb.tsfile.utils.Pair;
@@ -289,7 +290,11 @@ public class TsFileRecoverPerformer {
for (Map.Entry<String, List<ChunkMetadata>> entry :
deviceChunkMetaDataMap.entrySet()) {
String deviceId = entry.getKey();
List<ChunkMetadata> chunkMetadataList = entry.getValue();
+ TSDataType dataType = entry.getValue().get(entry.getValue().size() -
1).getDataType();
for (ChunkMetadata chunkMetaData : chunkMetadataList) {
+ if (!chunkMetaData.getDataType().equals(dataType)) {
+ continue;
+ }
tsFileResource.updateStartTime(deviceId, chunkMetaData.getStartTime());
tsFileResource.updateEndTime(deviceId, chunkMetaData.getEndTime());
}
diff --git
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBDeleteTimeseriesIT.java
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBDeleteTimeseriesIT.java
index 67a451c..41e49d9 100644
---
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBDeleteTimeseriesIT.java
+++
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBDeleteTimeseriesIT.java
@@ -7,7 +7,7 @@
* "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
+ * 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
@@ -16,6 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
+
package org.apache.iotdb.db.integration;
import java.sql.Connection;
@@ -23,6 +24,7 @@ import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.apache.iotdb.jdbc.Config;
import org.junit.After;
@@ -32,14 +34,23 @@ import org.junit.Test;
public class IoTDBDeleteTimeseriesIT {
+ private long memtableSizeThreshold;
+ private boolean enableVm;
+
@Before
public void setUp() throws Exception {
EnvironmentUtils.closeStatMonitor();
EnvironmentUtils.envSetUp();
+ memtableSizeThreshold =
IoTDBDescriptor.getInstance().getConfig().getMemtableSizeThreshold();
+ enableVm = IoTDBDescriptor.getInstance().getConfig().isEnableVm();
+ IoTDBDescriptor.getInstance().getConfig().setMemtableSizeThreshold(16);
+ IoTDBDescriptor.getInstance().getConfig().setEnableVm(false);
}
@After
public void tearDown() throws Exception {
+
IoTDBDescriptor.getInstance().getConfig().setMemtableSizeThreshold(memtableSizeThreshold);
+ IoTDBDescriptor.getInstance().getConfig().setEnableVm(enableVm);
EnvironmentUtils.cleanEnv();
}
@@ -47,20 +58,20 @@ public class IoTDBDeleteTimeseriesIT {
public void testDeleteTimeseries() throws Exception {
Class.forName(Config.JDBC_DRIVER_NAME);
String[] retArray = new String[]{
- "1,2,",
- "1,2.1,"
+ "1,1,",
+ "2,1.1,"
};
int cnt = 0;
try (Connection connection = DriverManager.
getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
- Statement statement = connection.createStatement();) {
+ Statement statement = connection.createStatement()) {
statement.execute(
- "create timeseries root.turbine1.d1.s2 with datatype=INT64,
encoding=PLAIN, compression=SNAPPY");
+ "create timeseries root.turbine1.d1.s1 with datatype=INT64,
encoding=PLAIN, compression=SNAPPY");
statement.execute(
- "create timeseries root.turbine1.d1.s3 with datatype=INT64,
encoding=PLAIN, compression=SNAPPY");
- statement.execute("INSERT INTO root.turbine1.d1(timestamp,s2,s3)
VALUES(1,2,3)");
- boolean hasResult = statement.execute("SELECT s2 FROM root.turbine1.d1");
+ "create timeseries root.turbine1.d1.s2 with datatype=INT64,
encoding=PLAIN, compression=SNAPPY");
+ statement.execute("INSERT INTO root.turbine1.d1(timestamp,s1,s2)
VALUES(1,1,2)");
+ boolean hasResult = statement.execute("SELECT s1 FROM root.turbine1.d1");
Assert.assertTrue(hasResult);
try (ResultSet resultSet = statement.getResultSet()) {
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
@@ -73,11 +84,13 @@ public class IoTDBDeleteTimeseriesIT {
cnt++;
}
}
- statement.execute("DELETE timeseries root.turbine1.d1.s2");
+ statement.execute("DELETE timeseries root.turbine1.d1.s1");
statement.execute(
- "create timeseries root.turbine1.d1.s2 with datatype=FLOAT,
encoding=PLAIN, compression=SNAPPY");
- statement.execute("INSERT INTO root.turbine1.d1(timestamp,s2,s3)
VALUES(1,2.1,3)");
- hasResult = statement.execute("SELECT s2 FROM root.turbine1.d1");
+ "create timeseries root.turbine1.d1.s1 with datatype=DOUBLE,
encoding=PLAIN, compression=SNAPPY");
+ statement.execute("INSERT INTO root.turbine1.d1(timestamp,s1)
VALUES(2,1.1)");
+ statement.execute("FLUSH");
+
+ hasResult = statement.execute("SELECT s1 FROM root.turbine1.d1");
Assert.assertTrue(hasResult);
try (ResultSet resultSet = statement.getResultSet()) {
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
@@ -91,5 +104,15 @@ public class IoTDBDeleteTimeseriesIT {
}
}
}
+
+ EnvironmentUtils.restartDaemon();
+
+ try(Connection connection = DriverManager
+ .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",
+ "root");
+ Statement statement = connection.createStatement()){
+ boolean hasResult = statement.execute("SELECT * FROM root");
+ Assert.assertTrue(hasResult);
+ }
}
}
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 17138aa..72586c0 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
@@ -291,13 +291,16 @@ public class TsFileIOWriter {
String device = path.getDevice();
// create TimeseriesMetaData
- TSDataType dataType = entry.getValue().get(0).getDataType();
+ TSDataType dataType = entry.getValue().get(entry.getValue().size() -
1).getDataType();
long offsetOfChunkMetadataList = out.getPosition();
Statistics seriesStatistics = Statistics.getStatsByType(dataType);
int chunkMetadataListLength = 0;
// flush chunkMetadataList one by one
for (ChunkMetadata chunkMetadata : entry.getValue()) {
+ if (!chunkMetadata.getDataType().equals(dataType)) {
+ continue;
+ }
chunkMetadataListLength +=
chunkMetadata.serializeTo(out.wrapAsStream());
seriesStatistics.mergeStatistics(chunkMetadata.getStatistics());
}