This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch TIMECHODB-395 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 8d6c5884d280fef871e509fef4cd19e7fffd9d55 Author: JackieTien97 <[email protected]> AuthorDate: Wed Nov 22 15:34:53 2023 +0800 Fix AutoCreateSchema using template without WRITE_SCHEMA --- .../analyze/schema/AutoCreateSchemaExecutor.java | 86 +++++++++------------- .../InternalBatchActivateTemplateStatement.java | 33 ++++++++- .../template/AlterSchemaTemplateStatement.java | 14 ++++ 3 files changed, 80 insertions(+), 53 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java index 1d30bc26859..5340cd9c378 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java @@ -20,12 +20,10 @@ package org.apache.iotdb.db.queryengine.plan.analyze.schema; import org.apache.iotdb.common.rpc.thrift.TSStatus; -import org.apache.iotdb.commons.auth.entity.PrivilegeType; import org.apache.iotdb.commons.exception.IoTDBException; import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.path.MeasurementPath; import org.apache.iotdb.commons.path.PartialPath; -import org.apache.iotdb.commons.service.metric.PerformanceOverviewMetrics; import org.apache.iotdb.db.auth.AuthorityChecker; import org.apache.iotdb.db.conf.IoTDBConfig; import org.apache.iotdb.db.conf.IoTDBDescriptor; @@ -82,6 +80,7 @@ class AutoCreateSchemaExecutor { } private ExecutionResult executeStatement(Statement statement, MPPQueryContext context) { + return coordinator.execute( statement, SessionManager.getInstance().requestQueryId(), @@ -195,44 +194,12 @@ class AutoCreateSchemaExecutor { List<String> measurementList, List<TSDataType> dataTypeList, MPPQueryContext context) { - long startTime = System.nanoTime(); - try { - String userName = context.getSession().getUserName(); - if (!AuthorityChecker.SUPER_USER.equals(userName)) { - TSStatus status = - AuthorityChecker.getTSStatus( - AuthorityChecker.checkSystemPermission( - userName, PrivilegeType.EXTEND_TEMPLATE.ordinal()), - PrivilegeType.EXTEND_TEMPLATE); - if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - throw new RuntimeException(new IoTDBException(status.getMessage(), status.getCode())); - } - } - } finally { - PerformanceOverviewMetrics.getInstance().recordAuthCost(System.nanoTime() - startTime); - } internalExtendTemplate(templateName, measurementList, dataTypeList, null, null, context); } // Used for insert records or tablets void autoExtendTemplate( Map<String, TemplateExtendInfo> templateExtendInfoMap, MPPQueryContext context) { - long startTime = System.nanoTime(); - try { - String userName = context.getSession().getUserName(); - if (!AuthorityChecker.SUPER_USER.equals(userName)) { - TSStatus status = - AuthorityChecker.getTSStatus( - AuthorityChecker.checkSystemPermission( - userName, PrivilegeType.EXTEND_TEMPLATE.ordinal()), - PrivilegeType.EXTEND_TEMPLATE); - if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - throw new RuntimeException(new IoTDBException(status.getMessage(), status.getCode())); - } - } - } finally { - PerformanceOverviewMetrics.getInstance().recordAuthCost(System.nanoTime() - startTime); - } TemplateExtendInfo templateExtendInfo; for (Map.Entry<String, TemplateExtendInfo> entry : templateExtendInfoMap.entrySet()) { templateExtendInfo = entry.getValue().deduplicate(); @@ -535,9 +502,14 @@ class AutoCreateSchemaExecutor { } private void internalActivateTemplate(PartialPath devicePath, MPPQueryContext context) { - ExecutionResult executionResult = - executeStatement(new ActivateTemplateStatement(devicePath), context); - TSStatus status = executionResult.status; + ActivateTemplateStatement statement = new ActivateTemplateStatement(devicePath); + TSStatus status = + AuthorityChecker.checkAuthority(statement, context.getSession().getUserName()); + if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + throw new RuntimeException(new IoTDBException(status.getMessage(), status.getCode())); + } + ExecutionResult executionResult = executeStatement(statement, context); + status = executionResult.status; if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode() && status.getCode() != TSStatusCode.TEMPLATE_IS_IN_USE.getStatusCode()) { throw new SemanticException(new IoTDBException(status.getMessage(), status.getCode())); @@ -547,10 +519,15 @@ class AutoCreateSchemaExecutor { private void internalActivateTemplate( Map<PartialPath, Pair<Template, PartialPath>> devicesNeedActivateTemplate, MPPQueryContext context) { - ExecutionResult executionResult = - executeStatement( - new InternalBatchActivateTemplateStatement(devicesNeedActivateTemplate), context); - TSStatus status = executionResult.status; + InternalBatchActivateTemplateStatement statement = + new InternalBatchActivateTemplateStatement(devicesNeedActivateTemplate); + TSStatus status = + AuthorityChecker.checkAuthority(statement, context.getSession().getUserName()); + if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + throw new RuntimeException(new IoTDBException(status.getMessage(), status.getCode())); + } + ExecutionResult executionResult = executeStatement(statement, context); + status = executionResult.status; if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode() || status.getCode() == TSStatusCode.TEMPLATE_IS_IN_USE.getStatusCode()) { return; @@ -621,17 +598,22 @@ class AutoCreateSchemaExecutor { List<CompressionType> compressionTypeList, MPPQueryContext context) { - ExecutionResult executionResult = - executeStatement( - new AlterSchemaTemplateStatement( - templateName, - measurementList, - dataTypeList, - encodingList, - compressionTypeList, - TemplateAlterOperationType.EXTEND_TEMPLATE), - context); - TSStatus status = executionResult.status; + AlterSchemaTemplateStatement statement = + new AlterSchemaTemplateStatement( + templateName, + measurementList, + dataTypeList, + encodingList, + compressionTypeList, + TemplateAlterOperationType.EXTEND_TEMPLATE); + TSStatus status = + AuthorityChecker.checkAuthority(statement, context.getSession().getUserName()); + if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + throw new RuntimeException(new IoTDBException(status.getMessage(), status.getCode())); + } + + ExecutionResult executionResult = executeStatement(statement, context); + status = executionResult.status; if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode() && status.getCode() != TSStatusCode.MEASUREMENT_ALREADY_EXISTS_IN_TEMPLATE.getStatusCode()) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/InternalBatchActivateTemplateStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/InternalBatchActivateTemplateStatement.java index ca2c5c79e65..06775c3ef5c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/InternalBatchActivateTemplateStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/InternalBatchActivateTemplateStatement.java @@ -19,16 +19,22 @@ package org.apache.iotdb.db.queryengine.plan.statement.internal; +import org.apache.iotdb.common.rpc.thrift.TSStatus; +import org.apache.iotdb.commons.auth.entity.PrivilegeType; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.db.auth.AuthorityChecker; import org.apache.iotdb.db.queryengine.plan.statement.Statement; import org.apache.iotdb.db.queryengine.plan.statement.StatementType; import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor; +import org.apache.iotdb.db.schemaengine.template.ClusterTemplateManager; import org.apache.iotdb.db.schemaengine.template.Template; +import org.apache.iotdb.rpc.TSStatusCode; import org.apache.iotdb.tsfile.utils.Pair; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; // This is only used for auto activate template on multi devices while inserting data public class InternalBatchActivateTemplateStatement extends Statement { @@ -49,7 +55,32 @@ public class InternalBatchActivateTemplateStatement extends Statement { @Override public List<PartialPath> getPaths() { - return new ArrayList<>(deviceMap.keySet()); + ClusterTemplateManager clusterTemplateManager = ClusterTemplateManager.getInstance(); + List<String> templatePaths = new ArrayList<>(); + for (PartialPath path : deviceMap.keySet()) { + Pair<Template, PartialPath> templateSetInfo = + clusterTemplateManager.checkTemplateSetInfo(path); + if (templateSetInfo == null) { + continue; + } + templatePaths.addAll(templateSetInfo.left.getSchemaMap().keySet()); + } + return deviceMap.keySet().stream() + .flatMap(path -> templatePaths.stream().map(path::concatNode)) + .collect(Collectors.toList()); + } + + @Override + public TSStatus checkPermissionBeforeProcess(String userName) { + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()); + } + List<PartialPath> checkedPaths = getPaths(); + return AuthorityChecker.getTSStatus( + AuthorityChecker.checkPatternPermission( + userName, checkedPaths, PrivilegeType.WRITE_SCHEMA.ordinal()), + checkedPaths, + PrivilegeType.WRITE_SCHEMA); } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/template/AlterSchemaTemplateStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/template/AlterSchemaTemplateStatement.java index 1e070a1040a..ca17b7d725d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/template/AlterSchemaTemplateStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/template/AlterSchemaTemplateStatement.java @@ -19,7 +19,10 @@ package org.apache.iotdb.db.queryengine.plan.statement.metadata.template; +import org.apache.iotdb.common.rpc.thrift.TSStatus; +import org.apache.iotdb.commons.auth.entity.PrivilegeType; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.db.auth.AuthorityChecker; import org.apache.iotdb.db.queryengine.plan.analyze.QueryType; import org.apache.iotdb.db.queryengine.plan.statement.IConfigStatement; import org.apache.iotdb.db.queryengine.plan.statement.Statement; @@ -28,6 +31,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor; import org.apache.iotdb.db.schemaengine.template.TemplateAlterOperationType; import org.apache.iotdb.db.schemaengine.template.alter.TemplateAlterInfo; import org.apache.iotdb.db.schemaengine.template.alter.TemplateExtendInfo; +import org.apache.iotdb.rpc.TSStatusCode; import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding; @@ -79,6 +83,16 @@ public class AlterSchemaTemplateStatement extends Statement implements IConfigSt return Collections.emptyList(); } + @Override + public TSStatus checkPermissionBeforeProcess(String userName) { + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()); + } + return AuthorityChecker.getTSStatus( + AuthorityChecker.checkSystemPermission(userName, PrivilegeType.EXTEND_TEMPLATE.ordinal()), + PrivilegeType.EXTEND_TEMPLATE); + } + @Override public <R, C> R accept(StatementVisitor<R, C> visitor, C context) { return visitor.visitAlterSchemaTemplate(this, context);
