You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2023/11/22 07:35:06 UTC
(iotdb) branch TIMECHODB-395 created (now 8d6c5884d28)
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a change to branch TIMECHODB-395
in repository https://gitbox.apache.org/repos/asf/iotdb.git
at 8d6c5884d28 Fix AutoCreateSchema using template without WRITE_SCHEMA
This branch includes the following new commits:
new 8d6c5884d28 Fix AutoCreateSchema using template without WRITE_SCHEMA
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(iotdb) 01/01: Fix AutoCreateSchema using template without WRITE_SCHEMA
Posted by ja...@apache.org.
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 <ja...@gmail.com>
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);