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 <[email protected]> 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()); + } }
