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 19b7f59 add clear cache command (#1223)
19b7f59 is described below
commit 19b7f590c2bd1a3683f86555a9c6b89bde7c52f6
Author: Jackie Tien <[email protected]>
AuthorDate: Tue May 19 09:46:21 2020 +0800
add clear cache command (#1223)
---
.../1-DDL Data Definition Language.md | 5 +
.../1-DDL Data Definition Language.md | 7 +
.../org/apache/iotdb/db/qp/strategy/SqlBase.g4 | 9 ++
.../apache/iotdb/db/engine/cache/ChunkCache.java | 6 +
.../iotdb/db/engine/cache/ChunkMetadataCache.java | 6 +
.../iotdb/db/engine/cache/LRULinkedHashMap.java | 6 +
.../db/engine/cache/TimeSeriesMetadataCache.java | 6 +
.../main/java/org/apache/iotdb/db/qp/Planner.java | 1 +
.../apache/iotdb/db/qp/constant/SQLConstant.java | 2 +
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 17 +-
.../org/apache/iotdb/db/qp/logical/Operator.java | 2 +-
...{MergeOperator.java => ClearCacheOperator.java} | 14 +-
.../iotdb/db/qp/logical/sys/MergeOperator.java | 8 +-
.../sys/ClearCachePlan.java} | 24 ++-
.../iotdb/db/qp/strategy/LogicalGenerator.java | 6 +
.../iotdb/db/qp/strategy/PhysicalGenerator.java | 3 +
.../iotdb/db/integration/IoTDBClearCacheIT.java | 174 +++++++++++++++++++++
17 files changed, 274 insertions(+), 22 deletions(-)
diff --git a/docs/UserGuide/5-Operation Manual/1-DDL Data Definition
Language.md b/docs/UserGuide/5-Operation Manual/1-DDL Data Definition
Language.md
index a281094..6c6ecc6 100644
--- a/docs/UserGuide/5-Operation Manual/1-DDL Data Definition Language.md
+++ b/docs/UserGuide/5-Operation Manual/1-DDL Data Definition Language.md
@@ -318,4 +318,9 @@ IoTDB> MERGE
IoTDB> FULL MERGE
```
+## CLEAR CACHE
+Clear the cache of chunk, chunk metadata and timeseries metadata to release
the memory footprint.
+```
+IoTDB> CLEAR CACHE
+```
diff --git a/docs/zh/UserGuide/5-Operation Manual/1-DDL Data Definition
Language.md b/docs/zh/UserGuide/5-Operation Manual/1-DDL Data Definition
Language.md
index eedc259..392e97b 100644
--- a/docs/zh/UserGuide/5-Operation Manual/1-DDL Data Definition Language.md
+++ b/docs/zh/UserGuide/5-Operation Manual/1-DDL Data Definition Language.md
@@ -310,4 +310,11 @@ IoTDB> MERGE
IoTDB> FULL MERGE
```
+## CLEAR CACHE
+
+手动清除chunk, chunk metadata和timeseries
metadata的缓存,在内存资源紧张时,可以通过此命令,释放查询时缓存所占的内存空间。
+```
+IoTDB> CLEAR CACHE
+```
+
diff --git a/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
b/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
index 1c878bd..4c56b68 100644
--- a/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
+++ b/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
@@ -39,6 +39,7 @@ statement
| MERGE #merge
| FLUSH prefixPath? (COMMA prefixPath)* (ID)?#flush //ID is true or false
| FULL MERGE #fullMerge
+ | CLEAR CACHE #clearcache
| CREATE USER userName=ID password=STRING_LITERAL #createUser
| ALTER USER userName=(ROOT|ID) SET PASSWORD password=STRING_LITERAL
#alterUser
| DROP USER userName=ID #dropUser
@@ -822,6 +823,14 @@ RENAME
FULL
: F U L L
;
+
+CLEAR
+ : C L E A R
+ ;
+
+CACHE
+ : C A C H E
+ ;
//============================
// End of the keywords list
//============================
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkCache.java
b/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkCache.java
index bc86c2f..d9ef0a9 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkCache.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkCache.java
@@ -26,6 +26,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.utils.TestOnly;
import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
import org.apache.iotdb.tsfile.read.common.Chunk;
@@ -184,6 +185,11 @@ public class ChunkCache {
lock.writeLock().unlock();
}
+ @TestOnly
+ public boolean isEmpty() {
+ return lruCache.isEmpty();
+ }
+
/**
* singleton pattern.
*/
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkMetadataCache.java
b/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkMetadataCache.java
index 8b5ee11..623dfec 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkMetadataCache.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkMetadataCache.java
@@ -31,6 +31,7 @@ import
org.apache.iotdb.db.conf.adapter.IoTDBConfigDynamicAdapter;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.db.query.control.FileReaderManager;
import org.apache.iotdb.db.utils.FileLoaderUtils;
+import org.apache.iotdb.db.utils.TestOnly;
import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
import org.apache.iotdb.tsfile.read.common.Path;
@@ -215,6 +216,11 @@ public class ChunkMetadataCache {
lock.writeLock().unlock();
}
+ @TestOnly
+ public boolean isEmpty() {
+ return lruCache.isEmpty();
+ }
+
/**
* singleton pattern.
*/
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/cache/LRULinkedHashMap.java
b/server/src/main/java/org/apache/iotdb/db/engine/cache/LRULinkedHashMap.java
index 004a30b..5fb0ae9 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/cache/LRULinkedHashMap.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/cache/LRULinkedHashMap.java
@@ -87,6 +87,8 @@ public abstract class LRULinkedHashMap<K extends Accountable,
V> {
public void clear() {
linkedHashMap.clear();
usedMemory = 0;
+ count = 0;
+ averageSize = 0;
}
public V remove(K key) {
@@ -125,6 +127,10 @@ public abstract class LRULinkedHashMap<K extends
Accountable, V> {
return linkedHashMap.entrySet();
}
+ public boolean isEmpty() {
+ return linkedHashMap.isEmpty();
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/cache/TimeSeriesMetadataCache.java
b/server/src/main/java/org/apache/iotdb/db/engine/cache/TimeSeriesMetadataCache.java
index bdeb952..7c59d05 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/cache/TimeSeriesMetadataCache.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/cache/TimeSeriesMetadataCache.java
@@ -30,6 +30,7 @@ import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBConstant;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.query.control.FileReaderManager;
+import org.apache.iotdb.db.utils.TestOnly;
import org.apache.iotdb.tsfile.common.cache.Accountable;
import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
@@ -207,6 +208,11 @@ public class TimeSeriesMetadataCache {
lock.writeLock().unlock();
}
+ @TestOnly
+ public boolean isEmpty() {
+ return lruCache.isEmpty();
+ }
+
public static class TimeSeriesMetadataCacheKey implements Accountable {
private final String filePath;
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/Planner.java
b/server/src/main/java/org/apache/iotdb/db/qp/Planner.java
index fce62a7..68031e9 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/Planner.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/Planner.java
@@ -97,6 +97,7 @@ public class Planner {
case MOVE_FILE:
case FLUSH:
case MERGE:
+ case CLEAR_CACHE:
return operator;
case QUERY:
case UPDATE:
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
b/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
index e7258a8..0b7324a 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
@@ -145,6 +145,8 @@ public class SQLConstant {
public static final int TOK_MERGE = 82;
public static final int TOK_FULL_MERGE = 83;
+ public static final int TOK_CLEAR_CACHE = 84;
+
public static final Map<Integer, String> tokenSymbol = new HashMap<>();
public static final Map<Integer, String> tokenNames = new HashMap<>();
public static final Map<Integer, Integer> reverseWords = new HashMap<>();
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 fa1154c..63bae27 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
@@ -62,6 +62,9 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.conf.adapter.CompressionRatio;
import org.apache.iotdb.db.conf.adapter.IoTDBConfigDynamicAdapter;
import org.apache.iotdb.db.engine.StorageEngine;
+import org.apache.iotdb.db.engine.cache.ChunkCache;
+import org.apache.iotdb.db.engine.cache.ChunkMetadataCache;
+import org.apache.iotdb.db.engine.cache.TimeSeriesMetadataCache;
import org.apache.iotdb.db.engine.flush.pool.FlushTaskPoolManager;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.db.exception.StorageEngineException;
@@ -94,6 +97,7 @@ import org.apache.iotdb.db.qp.physical.crud.RawDataQueryPlan;
import org.apache.iotdb.db.qp.physical.crud.UpdatePlan;
import org.apache.iotdb.db.qp.physical.sys.AlterTimeSeriesPlan;
import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
+import org.apache.iotdb.db.qp.physical.sys.ClearCachePlan;
import org.apache.iotdb.db.qp.physical.sys.CountPlan;
import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
@@ -238,11 +242,12 @@ public class PlanExecutor implements IPlanExecutor {
operateFlush((FlushPlan) plan);
return true;
case MERGE:
- operateMerge((MergePlan) plan);
- return true;
case FULL_MERGE:
operateMerge((MergePlan) plan);
return true;
+ case CLEAR_CACHE:
+ operateClearCache((ClearCachePlan) plan);
+ return true;
default:
throw new UnsupportedOperationException(
String.format("operation %s is not supported",
plan.getOperatorType()));
@@ -258,6 +263,14 @@ public class PlanExecutor implements IPlanExecutor {
}
}
+ private void operateClearCache(ClearCachePlan plan) {
+ ChunkCache.getInstance().clear();
+ ChunkMetadataCache.getInstance().clear();
+ TimeSeriesMetadataCache.getInstance().clear();
+ // try to notify the jvm to release the memory footprint
+ System.gc();
+ }
+
private void operateFlush(FlushPlan plan) throws StorageGroupNotSetException
{
if(plan.getPaths() == null) {
StorageEngine.getInstance().syncCloseAllProcessor();
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 50ccba6..48c530e 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
@@ -75,6 +75,6 @@ public abstract class Operator {
LIST_USER_PRIVILEGE, LIST_ROLE_PRIVILEGE, LIST_USER_ROLES, LIST_ROLE_USERS,
GRANT_WATERMARK_EMBEDDING, REVOKE_WATERMARK_EMBEDDING,
TTL, DELETE_STORAGE_GROUP, LOAD_CONFIGURATION, SHOW, LOAD_FILES,
REMOVE_FILE, MOVE_FILE, LAST, GROUP_BY_FILL,
- ALTER_TIMESERIES, FLUSH, MERGE, FULL_MERGE
+ ALTER_TIMESERIES, FLUSH, MERGE, FULL_MERGE, CLEAR_CACHE
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ClearCacheOperator.java
similarity index 86%
copy from
server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
copy to
server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ClearCacheOperator.java
index 16b9a5f..ccf40a5 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
+++
b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ClearCacheOperator.java
@@ -1,7 +1,3 @@
-package org.apache.iotdb.db.qp.logical.sys;
-
-import org.apache.iotdb.db.qp.logical.RootOperator;
-
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -20,10 +16,14 @@ import org.apache.iotdb.db.qp.logical.RootOperator;
* specific language governing permissions and limitations
* under the License.
*/
-public class MergeOperator extends RootOperator {
+package org.apache.iotdb.db.qp.logical.sys;
+
+import org.apache.iotdb.db.qp.logical.RootOperator;
+
+public class ClearCacheOperator extends RootOperator {
- public MergeOperator(int tokenIntType) {
+ public ClearCacheOperator(int tokenIntType) {
super(tokenIntType);
- operatorType = OperatorType.MERGE;
+ operatorType = OperatorType.CLEAR_CACHE;
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
index 16b9a5f..87b7364 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
@@ -1,7 +1,3 @@
-package org.apache.iotdb.db.qp.logical.sys;
-
-import org.apache.iotdb.db.qp.logical.RootOperator;
-
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -20,6 +16,10 @@ import org.apache.iotdb.db.qp.logical.RootOperator;
* specific language governing permissions and limitations
* under the License.
*/
+package org.apache.iotdb.db.qp.logical.sys;
+
+import org.apache.iotdb.db.qp.logical.RootOperator;
+
public class MergeOperator extends RootOperator {
public MergeOperator(int tokenIntType) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ClearCachePlan.java
similarity index 63%
copy from
server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
copy to
server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ClearCachePlan.java
index 16b9a5f..e747208 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
+++
b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ClearCachePlan.java
@@ -1,7 +1,3 @@
-package org.apache.iotdb.db.qp.logical.sys;
-
-import org.apache.iotdb.db.qp.logical.RootOperator;
-
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -20,10 +16,22 @@ import org.apache.iotdb.db.qp.logical.RootOperator;
* specific language governing permissions and limitations
* under the License.
*/
-public class MergeOperator extends RootOperator {
+package org.apache.iotdb.db.qp.physical.sys;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.tsfile.read.common.Path;
+
+public class ClearCachePlan extends PhysicalPlan {
+
+ public ClearCachePlan() {
+ super(false, OperatorType.CLEAR_CACHE);
+ }
- public MergeOperator(int tokenIntType) {
- super(tokenIntType);
- operatorType = OperatorType.MERGE;
+ @Override
+ public List<Path> getPaths() {
+ return new ArrayList<>();
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
index c07c13e..c84c654 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
@@ -122,6 +122,12 @@ public class LogicalGenerator extends SqlBaseBaseListener {
}
@Override
+ public void enterClearcache(SqlBaseParser.ClearcacheContext ctx) {
+ super.enterClearcache(ctx);
+ initializedOperator = new ClearCacheOperator(SQLConstant.TOK_CLEAR_CACHE);
+ }
+
+ @Override
public void enterCountNodes(CountNodesContext ctx) {
super.enterCountNodes(ctx);
initializedOperator = new CountOperator(SQLConstant.TOK_COUNT_NODES,
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index ac49be8..0dfa0b3 100644
---
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -72,6 +72,7 @@ import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
import org.apache.iotdb.db.qp.physical.crud.RawDataQueryPlan;
import org.apache.iotdb.db.qp.physical.sys.AlterTimeSeriesPlan;
import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
+import org.apache.iotdb.db.qp.physical.sys.ClearCachePlan;
import org.apache.iotdb.db.qp.physical.sys.CountPlan;
import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
@@ -269,6 +270,8 @@ public class PhysicalGenerator {
((MoveFileOperator) operator).getFile(),
((MoveFileOperator) operator).getTargetDir(),
OperatorType.MOVE_FILE);
+ case CLEAR_CACHE:
+ return new ClearCachePlan();
default:
throw new LogicalOperatorException(operator.getType().toString(), "");
}
diff --git
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBClearCacheIT.java
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBClearCacheIT.java
new file mode 100644
index 0000000..717642f
--- /dev/null
+++
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBClearCacheIT.java
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * 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
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.integration;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import org.apache.iotdb.db.engine.cache.ChunkCache;
+import org.apache.iotdb.db.engine.cache.ChunkMetadataCache;
+import org.apache.iotdb.db.engine.cache.TimeSeriesMetadataCache;
+import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.jdbc.Config;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class IoTDBClearCacheIT {
+
+ private static String[] sqls = new String[]{
+ "set storage group to root.ln",
+ "create timeseries root.ln.wf01.wt01.status with
datatype=BOOLEAN,encoding=PLAIN",
+ "insert into root.ln.wf01.wt01(timestamp,status)
values(1509465600000,true)",
+ "insert into root.ln.wf01.wt01(timestamp,status)
values(1509465660000,true)",
+ "insert into root.ln.wf01.wt01(timestamp,status)
values(1509465720000,false)",
+ "insert into root.ln.wf01.wt01(timestamp,status)
values(1509465780000,false)",
+ "insert into root.ln.wf01.wt01(timestamp,status)
values(1509465840000,false)",
+ "insert into root.ln.wf01.wt01(timestamp,status)
values(1509465900000,false)",
+ "insert into root.ln.wf01.wt01(timestamp,status)
values(1509465960000,false)",
+ "insert into root.ln.wf01.wt01(timestamp,status)
values(1509466020000,false)",
+ "insert into root.ln.wf01.wt01(timestamp,status)
values(1509466080000,false)",
+ "insert into root.ln.wf01.wt01(timestamp,status)
values(1509466140000,false)",
+ "create timeseries root.ln.wf01.wt01.temperature with
datatype=FLOAT,encoding=RLE",
+ "insert into root.ln.wf01.wt01(timestamp,temperature)
values(1509465600000,25.957603)",
+ "insert into root.ln.wf01.wt01(timestamp,temperature)
values(1509465660000,24.359503)",
+ "insert into root.ln.wf01.wt01(timestamp,temperature)
values(1509465720000,20.092794)",
+ "insert into root.ln.wf01.wt01(timestamp,temperature)
values(1509465780000,20.182663)",
+ "insert into root.ln.wf01.wt01(timestamp,temperature)
values(1509465840000,21.125198)",
+ "insert into root.ln.wf01.wt01(timestamp,temperature)
values(1509465900000,22.720892)",
+ "insert into root.ln.wf01.wt01(timestamp,temperature)
values(1509465960000,20.71)",
+ "insert into root.ln.wf01.wt01(timestamp,temperature)
values(1509466020000,21.451046)",
+ "insert into root.ln.wf01.wt01(timestamp,temperature)
values(1509466080000,22.57987)",
+ "insert into root.ln.wf01.wt01(timestamp,temperature)
values(1509466140000,20.98177)",
+ "create timeseries root.ln.wf02.wt02.hardware with
datatype=TEXT,encoding=PLAIN",
+ "insert into root.ln.wf02.wt02(timestamp,hardware)
values(1509465600000,\"v2\")",
+ "insert into root.ln.wf02.wt02(timestamp,hardware)
values(1509465660000,\"v2\")",
+ "insert into root.ln.wf02.wt02(timestamp,hardware)
values(1509465720000,\"v1\")",
+ "insert into root.ln.wf02.wt02(timestamp,hardware)
values(1509465780000,\"v1\")",
+ "insert into root.ln.wf02.wt02(timestamp,hardware)
values(1509465840000,\"v1\")",
+ "insert into root.ln.wf02.wt02(timestamp,hardware)
values(1509465900000,\"v1\")",
+ "insert into root.ln.wf02.wt02(timestamp,hardware)
values(1509465960000,\"v1\")",
+ "insert into root.ln.wf02.wt02(timestamp,hardware)
values(1509466020000,\"v1\")",
+ "insert into root.ln.wf02.wt02(timestamp,hardware)
values(1509466080000,\"v1\")",
+ "insert into root.ln.wf02.wt02(timestamp,hardware)
values(1509466140000,\"v1\")",
+ "create timeseries root.ln.wf02.wt02.status with
datatype=BOOLEAN,encoding=PLAIN",
+ "insert into root.ln.wf02.wt02(timestamp,status)
values(1509465600000,true)",
+ "insert into root.ln.wf02.wt02(timestamp,status)
values(1509465660000,true)",
+ "insert into root.ln.wf02.wt02(timestamp,status)
values(1509465720000,false)",
+ "insert into root.ln.wf02.wt02(timestamp,status)
values(1509465780000,false)",
+ "insert into root.ln.wf02.wt02(timestamp,status)
values(1509465840000,false)",
+ "insert into root.ln.wf02.wt02(timestamp,status)
values(1509465900000,false)",
+ "insert into root.ln.wf02.wt02(timestamp,status)
values(1509465960000,false)",
+ "insert into root.ln.wf02.wt02(timestamp,status)
values(1509466020000,false)",
+ "insert into root.ln.wf02.wt02(timestamp,status)
values(1509466080000,false)",
+ "insert into root.ln.wf02.wt02(timestamp,status)
values(1509466140000,false)",
+ "set storage group to root.sgcc",
+ "create timeseries root.sgcc.wf03.wt01.status with
datatype=BOOLEAN,encoding=PLAIN",
+ "insert into root.sgcc.wf03.wt01(timestamp,status)
values(1509465600000,true)",
+ "insert into root.sgcc.wf03.wt01(timestamp,status)
values(1509465660000,true)",
+ "insert into root.sgcc.wf03.wt01(timestamp,status)
values(1509465720000,false)",
+ "insert into root.sgcc.wf03.wt01(timestamp,status)
values(1509465780000,false)",
+ "insert into root.sgcc.wf03.wt01(timestamp,status)
values(1509465840000,false)",
+ "insert into root.sgcc.wf03.wt01(timestamp,status)
values(1509465900000,false)",
+ "insert into root.sgcc.wf03.wt01(timestamp,status)
values(1509465960000,false)",
+ "insert into root.sgcc.wf03.wt01(timestamp,status)
values(1509466020000,false)",
+ "insert into root.sgcc.wf03.wt01(timestamp,status)
values(1509466080000,false)",
+ "insert into root.sgcc.wf03.wt01(timestamp,status)
values(1509466140000,false)",
+ "create timeseries root.sgcc.wf03.wt01.temperature with
datatype=FLOAT,encoding=RLE",
+ "insert into root.sgcc.wf03.wt01(timestamp,temperature)
values(1509465600000,25.957603)",
+ "insert into root.sgcc.wf03.wt01(timestamp,temperature)
values(1509465660000,24.359503)",
+ "insert into root.sgcc.wf03.wt01(timestamp,temperature)
values(1509465720000,20.092794)",
+ "insert into root.sgcc.wf03.wt01(timestamp,temperature)
values(1509465780000,20.182663)",
+ "insert into root.sgcc.wf03.wt01(timestamp,temperature)
values(1509465840000,21.125198)",
+ "insert into root.sgcc.wf03.wt01(timestamp,temperature)
values(1509465900000,22.720892)",
+ "insert into root.sgcc.wf03.wt01(timestamp,temperature)
values(1509465960000,20.71)",
+ "insert into root.sgcc.wf03.wt01(timestamp,temperature)
values(1509466020000,21.451046)",
+ "insert into root.sgcc.wf03.wt01(timestamp,temperature)
values(1509466080000,22.57987)",
+ "insert into root.sgcc.wf03.wt01(timestamp,temperature)
values(1509466140000,20.98177)",
+ "flush"
+ };
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ EnvironmentUtils.closeStatMonitor();
+ EnvironmentUtils.envSetUp();
+
+ importData();
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ EnvironmentUtils.cleanEnv();
+ }
+
+ private static void importData() throws ClassNotFoundException, SQLException
{
+ Class.forName(Config.JDBC_DRIVER_NAME);
+ try (Connection connection = DriverManager
+ .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",
"root");
+ Statement statement = connection.createStatement()) {
+
+ for (String sql : sqls) {
+ statement.execute(sql);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void clearCacheTest() throws ClassNotFoundException {
+ Class.forName(Config.JDBC_DRIVER_NAME);
+ try (Connection connection = DriverManager
+ .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",
"root");
+ Statement statement = connection.createStatement()) {
+ boolean hasResultSet = statement.execute(
+ "select * from root where time>10");
+ assertTrue(hasResultSet);
+
+ try (ResultSet resultSet = statement.getResultSet()) {
+ int cnt = 0;
+ while (resultSet.next()) {
+ cnt++;
+ }
+ Assert.assertEquals(10, cnt);
+ }
+ assertFalse(ChunkCache.getInstance().isEmpty());
+ assertFalse(ChunkMetadataCache.getInstance().isEmpty());
+ assertFalse(TimeSeriesMetadataCache.getInstance().isEmpty());
+
+ statement.execute("CLEAR CACHE");
+
+ assertTrue(ChunkCache.getInstance().isEmpty());
+ assertTrue(ChunkMetadataCache.getInstance().isEmpty());
+ assertTrue(TimeSeriesMetadataCache.getInstance().isEmpty());
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+}