You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by lt...@apache.org on 2019/11/15 04:36:36 UTC
[incubator-iotdb] 05/06: add show dynamic parameter and flush task
info
This is an automated email from the ASF dual-hosted git repository.
lta pushed a commit to branch fix_show_info
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
commit f496dae489da560783311a26da7f8b924252785d
Author: lta <li...@163.com>
AuthorDate: Fri Nov 15 11:58:11 2019 +0800
add show dynamic parameter and flush task info
---
.../org/apache/iotdb/db/sql/parse/TqlLexer.g | 7 +-
.../org/apache/iotdb/db/sql/parse/TqlParser.g | 25 +++
.../org/apache/iotdb/db/conf/IoTDBConstant.java | 10 +-
.../org/apache/iotdb/db/qp/QueryProcessor.java | 1 +
.../apache/iotdb/db/qp/constant/SQLConstant.java | 5 +
.../qp/executor/AbstractQueryProcessExecutor.java | 90 ++++++++++-
.../org/apache/iotdb/db/qp/logical/Operator.java | 2 +-
.../{ShowTTLOperator.java => ShowOperator.java} | 20 +--
.../iotdb/db/qp/logical/sys/ShowTTLOperator.java | 5 +-
.../sys/ShowPlan.java} | 41 +++--
.../iotdb/db/qp/physical/sys/ShowTTLPlan.java | 7 +-
.../iotdb/db/qp/strategy/LogicalGenerator.java | 19 +++
.../iotdb/db/qp/strategy/PhysicalGenerator.java | 12 ++
.../org/apache/iotdb/db/service/TSServiceImpl.java | 169 ++++++++++-----------
.../apache/iotdb/db/qp/plan/PhysicalPlanTest.java | 17 +++
15 files changed, 289 insertions(+), 141 deletions(-)
diff --git a/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TqlLexer.g b/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TqlLexer.g
index 00ce42e..7237522 100644
--- a/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TqlLexer.g
+++ b/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TqlLexer.g
@@ -286,15 +286,16 @@ K_TASK
;
K_DYNAMIC
- : D Y N A M I C
+ : D Y N A M I C
;
-K_PARAMETERS
- : P A R A M E T E R S
+K_PARAMETER
+ : P A R A M E T E R
;
K_INFO
: I N F O
+ ;
//************** logical operator***********
OPERATOR_AND
diff --git a/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TqlParser.g b/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TqlParser.g
index 9f420c4..e9cf046 100644
--- a/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TqlParser.g
+++ b/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TqlParser.g
@@ -108,6 +108,8 @@ tokens{
TOK_DATE_EXPR;
TOK_DURATION;
TOK_LOAD_CONFIGURATION;
+ TOK_DYNAMIC_PARAMETER;
+ TOK_FLUSH_TASK_INFO;
}
@header{
@@ -172,6 +174,13 @@ static {
tokenNameMap.put("K_LIST", "LIST");
tokenNameMap.put("K_TTL", "TTL");
tokenNameMap.put("K_UNSET", "UNSET");
+ tokenNameMap.put("K_CONFIGURATION", "CONFIGURATION");
+ tokenNameMap.put("K_FLUSH", "FLUSH");
+ tokenNameMap.put("K_TASK", "TASK");
+ tokenNameMap.put("K_DYNAMIC", "DYNAMIC");
+ tokenNameMap.put("K_PARAMETER", "PARAMETER");
+ tokenNameMap.put("K_INFO", "INFO");
+
// Operators
tokenNameMap.put("DOT", ".");
tokenNameMap.put("COLON", ":");
@@ -276,6 +285,7 @@ sqlStatement
| dmlStatement
| administrationStatement
| configurationStatement
+ | showStatement
;
dmlStatement
@@ -765,6 +775,21 @@ loadConfigurationStatement
-> ^(TOK_LOAD_CONFIGURATION)
;
+showStatement
+ : showFlushTaskInfo
+ | showDynamicParameter
+ ;
+
+showFlushTaskInfo
+ : K_SHOW K_FLUSH K_TASK K_INFO
+ -> ^(TOK_SHOW TOK_FLUSH_TASK_INFO)
+ ;
+
+showDynamicParameter
+ : K_SHOW K_DYNAMIC K_PARAMETER
+ -> ^(TOK_SHOW TOK_DYNAMIC_PARAMETER)
+ ;
+
/*
****
*************
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
index 9fe4780..8591c93 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
@@ -54,12 +54,10 @@ public class IoTDBConstant {
public static final String MIN_TIME = "min_time";
public static final int MIN_SUPPORTED_JDK_VERSION = 8;
- // for cluster, set read consistency level
- public static final String SET_READ_CONSISTENCY_LEVEL_PATTERN = "set\\s+read.*level.*";
-
- public static final String SHOW_FLUSH_TASK_INFO = "show\\s+flush\\s+task\\s+info";
-
- public static final String SHOW_DYNAMIC_PARAMETERS = "show\\s+dynamic\\s+parameters";
+ // show info
+ public static final String ITEM = "item";
+ public static final String PARAMETER = "parameter";
+ public static final String VALUE = "value(B)";
public static final String ROLE = "role";
public static final String USER = "user";
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java b/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
index 2e60a29..746465a 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
@@ -129,6 +129,7 @@ public class QueryProcessor {
case REVOKE_WATERMARK_EMBEDDING:
case TTL:
case LOAD_CONFIGURATION:
+ case SHOW:
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 adc63f6..d62ec8d 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
@@ -104,6 +104,9 @@ public class SQLConstant {
public static final int TOK_SHOW = 65;
public static final int TOK_LOAD_CONFIGURATION = 66;
+ public static final int TOK_FLUSH_TASK_INFO = 67;
+ public static final int TOK_DYNAMIC_PARAMETER = 68;
+
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<>();
@@ -164,6 +167,8 @@ public class SQLConstant {
tokenNames.put(TOK_SHOW, "TOK_SHOW");
tokenNames.put(TOK_LOAD_CONFIGURATION, "TOK_LOAD_CONFIGURATION");
+ tokenNames.put(TOK_FLUSH_TASK_INFO, "TOK_FLUSH_TASK_INFO");
+ tokenNames.put(TOK_DYNAMIC_PARAMETER, "TOK_DYNAMIC_PARAMETER");
}
static {
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
index 8443892..8877860 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
@@ -18,16 +18,23 @@
*/
package org.apache.iotdb.db.qp.executor;
+import static org.apache.iotdb.db.conf.IoTDBConstant.ITEM;
+import static org.apache.iotdb.db.conf.IoTDBConstant.PARAMETER;
import static org.apache.iotdb.db.conf.IoTDBConstant.STORAGE_GROUP;
import static org.apache.iotdb.db.conf.IoTDBConstant.TTL;
+import static org.apache.iotdb.db.conf.IoTDBConstant.VALUE;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import org.apache.iotdb.db.exception.metadata.MetadataException;
+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.flush.pool.FlushTaskPoolManager;
import org.apache.iotdb.db.exception.StorageEngineException;
+import org.apache.iotdb.db.exception.metadata.MetadataException;
import org.apache.iotdb.db.exception.query.QueryProcessException;
import org.apache.iotdb.db.metadata.MManager;
import org.apache.iotdb.db.metadata.MNode;
@@ -38,6 +45,7 @@ import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan;
import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
import org.apache.iotdb.db.query.context.QueryContext;
import org.apache.iotdb.db.query.dataset.DeviceIterateDataSet;
@@ -64,13 +72,26 @@ public abstract class AbstractQueryProcessExecutor implements IQueryProcessExecu
return processDataQuery((QueryPlan) queryPlan, context);
} else if (queryPlan instanceof AuthorPlan) {
return processAuthorQuery((AuthorPlan) queryPlan, context);
- } else if (queryPlan instanceof ShowTTLPlan) {
- return processShowTTLQuery((ShowTTLPlan) queryPlan);
+ } else if (queryPlan instanceof ShowPlan) {
+ return processShowQuery((ShowPlan) queryPlan);
} else {
throw new QueryProcessException(String.format("Unrecognized query plan %s", queryPlan));
}
}
+ private QueryDataSet processShowQuery(ShowPlan showPlan) throws QueryProcessException {
+ switch (showPlan.getShowContentType()) {
+ case TTL:
+ return processShowTTLQuery((ShowTTLPlan) showPlan);
+ case DYNAMIC_PARAMETER:
+ return processShowDynamicParameterQuery();
+ case FLUSH_TASK_INFO:
+ return processShowFlushTaskInfo();
+ default:
+ throw new QueryProcessException(String.format("Unrecognized show plan %s", showPlan));
+ }
+ }
+
private QueryDataSet processShowTTLQuery(ShowTTLPlan showTTLPlan) {
List<Path> paths = new ArrayList<>();
paths.add(new Path(STORAGE_GROUP));
@@ -83,13 +104,13 @@ public abstract class AbstractQueryProcessExecutor implements IQueryProcessExecu
List<String> selectedSgs = showTTLPlan.getStorageGroups();
List<MNode> storageGroups = MManager.getInstance().getAllStorageGroups();
- int i = 0;
+ int timestamp = 0;
for (MNode mNode : storageGroups) {
String sgName = mNode.getFullPath();
if (!selectedSgs.isEmpty() && !selectedSgs.contains(sgName)) {
continue;
}
- RowRecord rowRecord = new RowRecord(i++);
+ RowRecord rowRecord = new RowRecord(timestamp++);
Field sg = new Field(TSDataType.TEXT);
Field ttl;
sg.setBinaryV(new Binary(sgName));
@@ -107,6 +128,65 @@ public abstract class AbstractQueryProcessExecutor implements IQueryProcessExecu
return listDataSet;
}
+ private QueryDataSet processShowDynamicParameterQuery() {
+ List<Path> paths = new ArrayList<>();
+ paths.add(new Path(PARAMETER));
+ paths.add(new Path(VALUE));
+ List<TSDataType> dataTypes = new ArrayList<>();
+ dataTypes.add(TSDataType.TEXT);
+ dataTypes.add(TSDataType.INT64);
+ ListDataSet listDataSet = new ListDataSet(paths, dataTypes);
+
+ int timestamp = 0;
+ addRowRecordForShowQuery(listDataSet, timestamp++, "memtable size threshold",
+ IoTDBDescriptor.getInstance().getConfig().getMemtableSizeThreshold());
+ addRowRecordForShowQuery(listDataSet, timestamp++, "memtable number",
+ IoTDBDescriptor.getInstance().getConfig().getMaxMemtableNumber());
+ addRowRecordForShowQuery(listDataSet, timestamp++, "tsfile size threshold",
+ IoTDBDescriptor.getInstance().getConfig().getTsFileSizeThreshold());
+ addRowRecordForShowQuery(listDataSet, timestamp++, "compression ratio",
+ (long) CompressionRatio.getInstance().getRatio());
+ addRowRecordForShowQuery(listDataSet, timestamp++, "storage group number",
+ MManager.getInstance().getAllStorageGroupNames().size());
+ addRowRecordForShowQuery(listDataSet, timestamp++, "timeseries number",
+ IoTDBConfigDynamicAdapter.getInstance().getTotalTimeseries());
+ addRowRecordForShowQuery(listDataSet, timestamp++,
+ "maximal timeseries number among storage groups",
+ MManager.getInstance().getMaximalSeriesNumberAmongStorageGroups());
+ return listDataSet;
+ }
+
+ private QueryDataSet processShowFlushTaskInfo() {
+ List<Path> paths = new ArrayList<>();
+ paths.add(new Path(ITEM));
+ paths.add(new Path(VALUE));
+ List<TSDataType> dataTypes = new ArrayList<>();
+ dataTypes.add(TSDataType.TEXT);
+ dataTypes.add(TSDataType.INT64);
+ ListDataSet listDataSet = new ListDataSet(paths, dataTypes);
+
+ int timestamp = 0;
+ addRowRecordForShowQuery(listDataSet, timestamp++, "total number of flush tasks",
+ FlushTaskPoolManager.getInstance().getTotalTasks());
+ addRowRecordForShowQuery(listDataSet, timestamp++, "number of working flush tasks",
+ FlushTaskPoolManager.getInstance().getWorkingTasksNumber());
+ addRowRecordForShowQuery(listDataSet, timestamp++, "number of waiting flush tasks",
+ FlushTaskPoolManager.getInstance().getWaitingTasksNumber());
+ return listDataSet;
+ }
+
+ private void addRowRecordForShowQuery(ListDataSet listDataSet, int timestamp, String item,
+ long value) {
+ RowRecord rowRecord = new RowRecord(timestamp);
+ Field itemField = new Field(TSDataType.TEXT);
+ itemField.setBinaryV(new Binary(item));
+ Field valueField = new Field(TSDataType.INT64);
+ valueField.setLongV(value);
+ rowRecord.addField(itemField);
+ rowRecord.addField(valueField);
+ listDataSet.putRecord(rowRecord);
+ }
+
protected abstract QueryDataSet processAuthorQuery(AuthorPlan plan, QueryContext context)
throws QueryProcessException;
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 06fc4be..8c4eeac 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
@@ -74,6 +74,6 @@ public abstract class Operator {
DELETE_ROLE, GRANT_ROLE_PRIVILEGE, REVOKE_ROLE_PRIVILEGE, LIST_USER, LIST_ROLE,
LIST_USER_PRIVILEGE, LIST_ROLE_PRIVILEGE, LIST_USER_ROLES, LIST_ROLE_USERS,
GRANT_WATERMARK_EMBEDDING, REVOKE_WATERMARK_EMBEDDING,
- TTL, DELETE_STORAGE_GROUP, LOAD_CONFIGURATION
+ TTL, DELETE_STORAGE_GROUP, LOAD_CONFIGURATION, SHOW
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowOperator.java
similarity index 69%
copy from server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
copy to server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowOperator.java
index b8406ef..9c5c3b2 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowOperator.java
@@ -17,24 +17,18 @@
* under the License.
*
*/
-
package org.apache.iotdb.db.qp.logical.sys;
-import java.util.List;
-import org.apache.iotdb.db.qp.constant.SQLConstant;
import org.apache.iotdb.db.qp.logical.RootOperator;
-public class ShowTTLOperator extends RootOperator {
-
- private List<String> storageGroups;
+public class ShowOperator extends RootOperator {
- public ShowTTLOperator(List<String> storageGroups) {
- super(SQLConstant.TOK_SHOW);
- this.operatorType = OperatorType.TTL;
- this.storageGroups = storageGroups;
+ public ShowOperator(int tokenIntType) {
+ this(tokenIntType, OperatorType.SHOW);
}
- public List<String> getStorageGroups() {
- return storageGroups;
+ public ShowOperator(int tokenIntType, OperatorType operatorType) {
+ super(tokenIntType);
+ this.operatorType = operatorType;
}
-}
\ No newline at end of file
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
index b8406ef..3426883 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
@@ -24,13 +24,12 @@ import java.util.List;
import org.apache.iotdb.db.qp.constant.SQLConstant;
import org.apache.iotdb.db.qp.logical.RootOperator;
-public class ShowTTLOperator extends RootOperator {
+public class ShowTTLOperator extends ShowOperator {
private List<String> storageGroups;
public ShowTTLOperator(List<String> storageGroups) {
- super(SQLConstant.TOK_SHOW);
- this.operatorType = OperatorType.TTL;
+ super(SQLConstant.TOK_SHOW, OperatorType.TTL);
this.storageGroups = storageGroups;
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
similarity index 51%
copy from server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
copy to server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
index b8406ef..5c2f9dd 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
@@ -17,24 +17,39 @@
* under the License.
*
*/
-
-package org.apache.iotdb.db.qp.logical.sys;
+package org.apache.iotdb.db.qp.physical.sys;
import java.util.List;
-import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.logical.RootOperator;
+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 ShowPlan extends PhysicalPlan {
+
+ private ShowContentType showContentType;
+
+ public ShowPlan(ShowContentType showContentType){
+ super(true);
+ this.showContentType = showContentType;
+ setOperatorType(OperatorType.SHOW);
+ }
-public class ShowTTLOperator extends RootOperator {
+ @Override
+ public List<Path> getPaths() {
+ return null;
+ }
- private List<String> storageGroups;
+ public ShowContentType getShowContentType() {
+ return showContentType;
+ }
- public ShowTTLOperator(List<String> storageGroups) {
- super(SQLConstant.TOK_SHOW);
- this.operatorType = OperatorType.TTL;
- this.storageGroups = storageGroups;
+ @Override
+ public String toString() {
+ return String.format("%s %s", getOperatorType().toString(), showContentType);
}
- public List<String> getStorageGroups() {
- return storageGroups;
+ public enum ShowContentType {
+ DYNAMIC_PARAMETER, FLUSH_TASK_INFO, TTL
}
-}
\ No newline at end of file
+
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowTTLPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowTTLPlan.java
index 5061b4e..1632a61 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowTTLPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowTTLPlan.java
@@ -5,18 +5,15 @@
package org.apache.iotdb.db.qp.physical.sys;
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 ShowTTLPlan extends PhysicalPlan {
+public class ShowTTLPlan extends ShowPlan {
private List<String> storageGroups;
public ShowTTLPlan(List<String> storageGroups) {
- super(true);
+ super(ShowContentType.TTL);
this.storageGroups = storageGroups;
- setOperatorType(OperatorType.TTL);
}
@Override
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 2e7c962..a8d4ae0 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
@@ -37,7 +37,9 @@ import static org.apache.iotdb.db.sql.parse.TqlParser.TOK_CREATE;
import static org.apache.iotdb.db.sql.parse.TqlParser.TOK_DATETIME;
import static org.apache.iotdb.db.sql.parse.TqlParser.TOK_DELETE;
import static org.apache.iotdb.db.sql.parse.TqlParser.TOK_DROP;
+import static org.apache.iotdb.db.sql.parse.TqlParser.TOK_DYNAMIC_PARAMETER;
import static org.apache.iotdb.db.sql.parse.TqlParser.TOK_FILL;
+import static org.apache.iotdb.db.sql.parse.TqlParser.TOK_FLUSH_TASK_INFO;
import static org.apache.iotdb.db.sql.parse.TqlParser.TOK_FROM;
import static org.apache.iotdb.db.sql.parse.TqlParser.TOK_GRANT;
import static org.apache.iotdb.db.sql.parse.TqlParser.TOK_GRANT_WATERMARK_EMBEDDING;
@@ -109,6 +111,7 @@ import org.apache.iotdb.db.qp.logical.sys.LoadDataOperator;
import org.apache.iotdb.db.qp.logical.sys.PropertyOperator;
import org.apache.iotdb.db.qp.logical.sys.SetStorageGroupOperator;
import org.apache.iotdb.db.qp.logical.sys.SetTTLOperator;
+import org.apache.iotdb.db.qp.logical.sys.ShowOperator;
import org.apache.iotdb.db.qp.logical.sys.ShowTTLOperator;
import org.apache.iotdb.db.query.fill.IFill;
import org.apache.iotdb.db.query.fill.LinearFill;
@@ -280,6 +283,9 @@ public class LogicalGenerator {
case TOK_LOAD_CONFIGURATION:
initializedOperator = new LoadConfigurationOperator();
return;
+ case TOK_SHOW:
+ analyzeShow(astNode);
+ return;
default:
throw new QueryProcessException("Not supported TqlParser type " + token.getText());
}
@@ -288,6 +294,19 @@ public class LogicalGenerator {
}
}
+ private void analyzeShow(AstNode astNode){
+ switch (astNode.getChild(0).getType()) {
+ case TOK_DYNAMIC_PARAMETER:
+ initializedOperator = new ShowOperator(SQLConstant.TOK_DYNAMIC_PARAMETER);
+ break;
+ case TOK_FLUSH_TASK_INFO:
+ initializedOperator = new ShowOperator(SQLConstant.TOK_FLUSH_TASK_INFO);
+ break;
+ default:
+ break;
+ }
+ }
+
private void analyzeTTL(AstNode astNode) throws QueryProcessException {
int tokenType = astNode.getChild(0).getToken().getType();
switch (tokenType) {
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 0aeef61..e4ed293 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
@@ -66,6 +66,8 @@ import org.apache.iotdb.db.qp.physical.sys.LoadDataPlan;
import org.apache.iotdb.db.qp.physical.sys.PropertyPlan;
import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowPlan.ShowContentType;
import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
import org.apache.iotdb.db.service.TSServiceImpl;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -155,6 +157,16 @@ public class PhysicalGenerator {
}
case LOAD_CONFIGURATION:
return new LoadConfigurationPlan();
+ case SHOW:
+ switch (operator.getTokenIntType()){
+ case SQLConstant.TOK_DYNAMIC_PARAMETER:
+ return new ShowPlan(ShowContentType.DYNAMIC_PARAMETER);
+ case SQLConstant.TOK_FLUSH_TASK_INFO:
+ return new ShowPlan(ShowContentType.FLUSH_TASK_INFO);
+ default:
+ throw new LogicalOperatorException(String
+ .format("not supported operator type %s in show operation.", operator.getType()));
+ }
default:
throw new LogicalOperatorException(operator.getType().toString(), "");
}
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index f8abfce..d5449c4 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -18,11 +18,14 @@
*/
package org.apache.iotdb.db.service;
+import static org.apache.iotdb.db.conf.IoTDBConstant.ITEM;
+import static org.apache.iotdb.db.conf.IoTDBConstant.PARAMETER;
import static org.apache.iotdb.db.conf.IoTDBConstant.PRIVILEGE;
import static org.apache.iotdb.db.conf.IoTDBConstant.ROLE;
import static org.apache.iotdb.db.conf.IoTDBConstant.STORAGE_GROUP;
import static org.apache.iotdb.db.conf.IoTDBConstant.TTL;
import static org.apache.iotdb.db.conf.IoTDBConstant.USER;
+import static org.apache.iotdb.db.conf.IoTDBConstant.VALUE;
import java.io.IOException;
import java.nio.ByteBuffer;
@@ -37,7 +40,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
-import java.util.regex.Pattern;
import org.apache.iotdb.db.auth.AuthException;
import org.apache.iotdb.db.auth.AuthorityChecker;
import org.apache.iotdb.db.auth.authorizer.IAuthorizer;
@@ -45,15 +47,12 @@ import org.apache.iotdb.db.auth.authorizer.LocalFileAuthorizer;
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.conf.adapter.CompressionRatio;
-import org.apache.iotdb.db.conf.adapter.IoTDBConfigDynamicAdapter;
import org.apache.iotdb.db.cost.statistic.Measurement;
import org.apache.iotdb.db.cost.statistic.Operation;
import org.apache.iotdb.db.engine.StorageEngine;
-import org.apache.iotdb.db.engine.flush.pool.FlushTaskPoolManager;
-import org.apache.iotdb.db.exception.metadata.MetadataException;
import org.apache.iotdb.db.exception.QueryInBatchStatementException;
import org.apache.iotdb.db.exception.StorageEngineException;
+import org.apache.iotdb.db.exception.metadata.MetadataException;
import org.apache.iotdb.db.exception.path.PathException;
import org.apache.iotdb.db.exception.query.QueryProcessException;
import org.apache.iotdb.db.exception.storageGroup.StorageGroupException;
@@ -73,7 +72,7 @@ import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
import org.apache.iotdb.db.qp.physical.sys.DeleteStorageGroupPlan;
import org.apache.iotdb.db.qp.physical.sys.DeleteTimeSeriesPlan;
import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
-import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowPlan;
import org.apache.iotdb.db.query.context.QueryContext;
import org.apache.iotdb.db.query.control.QueryResourceManager;
import org.apache.iotdb.db.tools.watermark.GroupedLSBWatermarkEncoder;
@@ -218,32 +217,38 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
zoneIds.remove();
}
// clear the statementId counter
- if (statementIdGenerator.get() != null)
+ if (statementIdGenerator.get() != null) {
statementIdGenerator.remove();
+ }
// clear the queryId counter
- if (queryIdGenerator.get() != null)
+ if (queryIdGenerator.get() != null) {
queryIdGenerator.remove();
+ }
// clear all cached physical plans of the connection
- if (operationStatus.get() != null)
+ if (operationStatus.get() != null) {
operationStatus.remove();
+ }
// clear all cached ResultSets of the connection
- if (queryDataSets.get() != null)
+ if (queryDataSets.get() != null) {
queryDataSets.remove();
+ }
// clear all cached query context of the connection
if (contextMapLocal.get() != null) {
try {
for (QueryContext context : contextMapLocal.get().values()) {
- QueryResourceManager.getInstance().endQueryForGivenJob(context.getJobId());
+ QueryResourceManager.getInstance().endQueryForGivenJob(context.getJobId());
}
contextMapLocal.remove();
} catch (StorageEngineException e) {
logger.error("Error in closeSession : ", e);
- return new TSStatus(getStatus(TSStatusCode.CLOSE_OPERATION_ERROR, "Error in closeOperation"));
+ return new TSStatus(
+ getStatus(TSStatusCode.CLOSE_OPERATION_ERROR, "Error in closeOperation"));
}
}
// clear the statementId to queryId map
- if (statementId2QueryId.get() != null)
+ if (statementId2QueryId.get() != null) {
statementId2QueryId.remove();
+ }
return new TSStatus(tsStatus);
}
@@ -262,8 +267,9 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
long stmtId = req.getStmtId();
Set<Long> queryIdSet = statementId2QueryId.get().get(stmtId);
if (queryIdSet != null) {
- for (long queryId : queryIdSet)
+ for (long queryId : queryIdSet) {
releaseQueryResource(queryId);
+ }
statementId2QueryId.get().remove(stmtId);
}
}
@@ -282,21 +288,21 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
/**
* release single operation resource
- * @param queryId
- * @throws StorageEngineException
*/
private void releaseQueryResource(long queryId) throws StorageEngineException {
// remove the corresponding Physical Plan
- if (operationStatus.get() != null)
+ if (operationStatus.get() != null) {
operationStatus.get().remove(queryId);
+ }
// remove the corresponding Dataset
- if (queryDataSets.get() != null)
+ if (queryDataSets.get() != null) {
queryDataSets.get().remove(queryId);
+ }
// remove the corresponding query context and query resource
if (contextMapLocal.get() != null && contextMapLocal.get().containsKey(queryId)) {
QueryResourceManager.getInstance()
- .endQueryForGivenJob(contextMapLocal.get().remove(queryId).getJobId());
+ .endQueryForGivenJob(contextMapLocal.get().remove(queryId).getJobId());
}
}
@@ -601,34 +607,6 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
getStatus(TSStatusCode.SUCCESS_STATUS, "ADMIN_COMMAND_SUCCESS"));
}
- if (execShowFlushInfo(statement)) {
- String msg = String.format(
- "There are %d flush tasks, %d flush tasks are in execution and %d flush tasks are waiting for execution.",
- FlushTaskPoolManager.getInstance().getTotalTasks(),
- FlushTaskPoolManager.getInstance().getWorkingTasksNumber(),
- FlushTaskPoolManager.getInstance().getWaitingTasksNumber());
- return getTSExecuteStatementResp(getStatus(TSStatusCode.SUCCESS_STATUS, msg));
- }
-
- if (execShowDynamicParameters(statement)) {
- String msg = String.format(
- "Memtable size threshold: %dB, Memtable number: %d, Tsfile size threshold: %dB, Compression ratio: %f,"
- + " Storage group number: %d, Timeseries number: %d, Maximal timeseries number among storage groups: %d",
- IoTDBDescriptor.getInstance().getConfig().getMemtableSizeThreshold(),
- IoTDBDescriptor.getInstance().getConfig().getMaxMemtableNumber(),
- IoTDBDescriptor.getInstance().getConfig().getTsFileSizeThreshold(),
- CompressionRatio.getInstance().getRatio(),
- MManager.getInstance().getAllStorageGroupNames().size(),
- IoTDBConfigDynamicAdapter.getInstance().getTotalTimeseries(),
- MManager.getInstance().getMaximalSeriesNumberAmongStorageGroups());
- return getTSExecuteStatementResp(getStatus(TSStatusCode.SUCCESS_STATUS, msg));
- }
-
- if (execSetConsistencyLevel(statement)) {
- return getTSExecuteStatementResp(getStatus(TSStatusCode.SUCCESS_STATUS,
- "Execute set consistency level successfully"));
- }
-
PhysicalPlan physicalPlan;
physicalPlan = processor.parseSQLToPhysicalPlan(statement, zoneIds.get());
if (physicalPlan.isQuery()) {
@@ -649,7 +627,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
logger.error("check metadata error: ", e);
return getTSExecuteStatementResp(getStatus(TSStatusCode.METADATA_ERROR,
"Check metadata error: " + e.getMessage()));
- } catch (SQLException | QueryProcessException e) {
+ } catch (QueryProcessException e) {
logger.error("meet error while parsing SQL to physical plan: ", e);
return getTSExecuteStatementResp(getStatus(TSStatusCode.SQL_PARSE_ERROR,
"Statement format is not right: " + e.getMessage()));
@@ -660,52 +638,14 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
}
}
- /**
- * Show flush info
- */
- private boolean execShowFlushInfo(String statement) {
- if (statement == null) {
- return false;
- }
- statement = statement.toLowerCase().trim();
- return Pattern.matches(IoTDBConstant.SHOW_FLUSH_TASK_INFO, statement);
- }
-
- /**
- * Show dynamic parameters
- */
- private boolean execShowDynamicParameters(String statement) {
- if (statement == null) {
- return false;
- }
- statement = statement.toLowerCase().trim();
- return Pattern.matches(IoTDBConstant.SHOW_DYNAMIC_PARAMETERS, statement);
- }
-
- /**
- * Set consistency level
- */
- private boolean execSetConsistencyLevel(String statement) throws SQLException {
- if (statement == null) {
- return false;
- }
- statement = statement.toLowerCase().trim();
- if (Pattern.matches(IoTDBConstant.SET_READ_CONSISTENCY_LEVEL_PATTERN, statement)) {
- throw new SQLException(
- "IoTDB Stand-alone version does not support setting read-insert consistency level");
- } else {
- return false;
- }
- }
-
private TSExecuteStatementResp executeQueryStatement(long statementId, PhysicalPlan plan) {
long t1 = System.currentTimeMillis();
try {
TSExecuteStatementResp resp;
if (plan instanceof AuthorPlan) {
resp = executeAuthQuery(plan);
- } else if (plan instanceof ShowTTLPlan) {
- resp = executeShowTTL();
+ } else if (plan instanceof ShowPlan) {
+ resp = executeShow((ShowPlan) plan);
} else {
resp = executeDataQuery(plan);
}
@@ -716,7 +656,8 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
// generate the queryId for the operation
long queryId = generateQueryId();
// put it into the corresponding Set
- Set<Long> queryIdSet = statementId2QueryId.get().computeIfAbsent(statementId, k -> new HashSet<>());
+ Set<Long> queryIdSet = statementId2QueryId.get()
+ .computeIfAbsent(statementId, k -> new HashSet<>());
queryIdSet.add(queryId);
TSHandleIdentifier operationId = new TSHandleIdentifier(
@@ -767,6 +708,19 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
return columnTypes;
}
+ private TSExecuteStatementResp executeShow(ShowPlan showPlan) throws Exception {
+ switch (showPlan.getShowContentType()) {
+ case TTL:
+ return executeShowTTL();
+ case FLUSH_TASK_INFO:
+ return executeShowFlushTaskInfo();
+ case DYNAMIC_PARAMETER:
+ return executeShowDynamicParameter();
+ default:
+ logger.error("Unsupported show content type: {}", showPlan.getShowContentType());
+ throw new Exception("Unsupported show content type:" + showPlan.getShowContentType());
+ }
+ }
private TSExecuteStatementResp executeShowTTL() {
TSExecuteStatementResp resp =
@@ -783,6 +737,36 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
return resp;
}
+ private TSExecuteStatementResp executeShowFlushTaskInfo() {
+ TSExecuteStatementResp resp =
+ getTSExecuteStatementResp(getStatus(TSStatusCode.SUCCESS_STATUS));
+ resp.setIgnoreTimeStamp(true);
+ List<String> columns = new ArrayList<>();
+ List<String> columnTypes = new ArrayList<>();
+ columns.add(ITEM);
+ columns.add(VALUE);
+ columnTypes.add(TSDataType.TEXT.toString());
+ columnTypes.add(TSDataType.INT64.toString());
+ resp.setColumns(columns);
+ resp.setDataTypeList(columnTypes);
+ return resp;
+ }
+
+ private TSExecuteStatementResp executeShowDynamicParameter() {
+ TSExecuteStatementResp resp =
+ getTSExecuteStatementResp(getStatus(TSStatusCode.SUCCESS_STATUS));
+ resp.setIgnoreTimeStamp(true);
+ List<String> columns = new ArrayList<>();
+ List<String> columnTypes = new ArrayList<>();
+ columns.add(PARAMETER);
+ columns.add(VALUE);
+ columnTypes.add(TSDataType.TEXT.toString());
+ columnTypes.add(TSDataType.INT64.toString());
+ resp.setColumns(columns);
+ resp.setDataTypeList(columnTypes);
+ return resp;
+ }
+
private TSExecuteStatementResp executeAuthQuery(PhysicalPlan plan) {
TSExecuteStatementResp resp = getTSExecuteStatementResp(getStatus(TSStatusCode.SUCCESS_STATUS));
resp.setIgnoreTimeStamp(true);
@@ -1164,7 +1148,8 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
}
long stmtId = req.getStmtId();
- InsertPlan plan = (InsertPlan) operationStatus.get().computeIfAbsent(stmtId, k -> new InsertPlan());
+ InsertPlan plan = (InsertPlan) operationStatus.get()
+ .computeIfAbsent(stmtId, k -> new InsertPlan());
// the old parameter will be used if new parameter is not set
if (req.isSetDeviceId()) {
@@ -1351,7 +1336,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
@Override
public long requestStatementId() {
long statementId = statementIdGenerator.get();
- statementIdGenerator.set(statementId+1);
+ statementIdGenerator.set(statementId + 1);
return statementId;
}
@@ -1383,7 +1368,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
private long generateQueryId() {
long queryId = queryIdGenerator.get();
- queryIdGenerator.set(queryId+1);
+ queryIdGenerator.set(queryId + 1);
return queryId;
}
}
diff --git a/server/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java b/server/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java
index eec5c7b..2877bef 100644
--- a/server/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java
@@ -37,6 +37,7 @@ import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
import org.apache.iotdb.db.qp.physical.sys.LoadConfigurationPlan;
import org.apache.iotdb.db.qp.physical.sys.PropertyPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowPlan;
import org.apache.iotdb.db.qp.utils.MemIntQpExecutor;
import org.apache.iotdb.db.query.fill.LinearFill;
import org.apache.iotdb.db.query.fill.PreviousFill;
@@ -494,4 +495,20 @@ public class PhysicalPlanTest {
LoadConfigurationPlan plan = (LoadConfigurationPlan) processor.parseSQLToPhysicalPlan(metadata);
assertEquals("LOAD_CONFIGURATION", plan.toString());
}
+
+ @Test
+ public void testShowDynamicParameter() throws QueryProcessException, MetadataException {
+ String metadata = "show dynamic parameter";
+ QueryProcessor processor = new QueryProcessor(new MemIntQpExecutor());
+ ShowPlan plan = (ShowPlan) processor.parseSQLToPhysicalPlan(metadata);
+ assertEquals("SHOW DYNAMIC_PARAMETER", plan.toString());
+ }
+
+ @Test
+ public void testShowFlushInfo() throws QueryProcessException, MetadataException {
+ String metadata = "show flush task info";
+ QueryProcessor processor = new QueryProcessor(new MemIntQpExecutor());
+ ShowPlan plan = (ShowPlan) processor.parseSQLToPhysicalPlan(metadata);
+ assertEquals("SHOW FLUSH_TASK_INFO", plan.toString());
+ }
}