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());
+    }
+  }
+}

Reply via email to