This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch ClearCache in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
commit 149f080383bad85077037c877d218b55fcfa0d4c Author: JackieTien97 <[email protected]> AuthorDate: Mon May 18 20:18:22 2020 +0800 add clear cache command --- .../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()); + } + } +}
