From 098ece9b27e6298fc68a73cb2883602f4565d189 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Thu, 6 Nov 2025 20:40:50 +0800 Subject: [PATCH 01/15] Implemented the alter encoding compression function for tree model (#16672) * ifpermitted * reconstruct * final-prev * complete-dn * partial * very-partial * fix * partial-set * fix * test * fix * shop * fix * some * partial * bishop * fix * fix * grasia * fix * main * fix * partial * fix * minor * fix * fix * spotless * test * part * fix * bug-fix * fix * Revert "fix" This reverts commit da7a080906737af14c6022294935e963bae88ad2. * Reapply "fix" This reverts commit 27de58a8ffb335b85e617c60cbbc6e753f7141e4. (cherry picked from commit f096b8210ff2fa04566b9667ba5509bf7a344816) --- .../IoTDBAlterEncodingCompressorIT.java | 187 ++++++++++ .../pipe/it/manual/IoTDBPipeInclusionIT.java | 9 +- .../apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 6 +- .../org/apache/iotdb/db/qp/sql/SqlLexer.g4 | 4 + .../client/async/CnToDnAsyncRequestType.java | 2 + ...oDnInternalServiceAsyncRequestManager.java | 6 + .../rpc/DataNodeAsyncRequestRPCHandler.java | 1 + .../consensus/request/ConfigPhysicalPlan.java | 5 + .../request/ConfigPhysicalPlanType.java | 1 + .../request/ConfigPhysicalPlanVisitor.java | 9 + .../PipeAlterEncodingCompressorPlan.java | 113 ++++++ .../confignode/manager/ConfigManager.java | 18 + .../iotdb/confignode/manager/IManager.java | 3 + .../confignode/manager/ProcedureManager.java | 41 +++ .../protocol/IoTDBConfigNodeReceiver.java | 61 +++- ...PipeConfigPhysicalPlanTSStatusVisitor.java | 12 + .../IoTDBConfigNodeSyncClientManager.java | 6 +- .../protocol/IoTDBConfigRegionAirGapSink.java | 2 + .../sink/protocol/IoTDBConfigRegionSink.java | 6 +- .../source/ConfigRegionListeningFilter.java | 3 + ...ConfigPhysicalPlanPatternParseVisitor.java | 25 ++ .../executor/ConfigPlanExecutor.java | 1 + .../AlterEncodingCompressorProcedure.java | 331 ++++++++++++++++++ .../schema/DataNodeTSStatusTaskExecutor.java | 74 ++++ .../schema/DeactivateTemplateProcedure.java | 26 +- .../schema/DeleteLogicalViewProcedure.java | 26 +- .../schema/DeleteTimeSeriesProcedure.java | 46 +-- .../state/AlterEncodingCompressorState.java | 25 ++ .../procedure/store/ProcedureFactory.java | 9 + .../procedure/store/ProcedureType.java | 3 + .../thrift/ConfigNodeRPCServiceProcessor.java | 6 + .../receiver/PipeEnrichedProcedureTest.java | 29 ++ .../AlterEncodingCompressorProcedureTest.java | 62 ++++ .../schemaregion/SchemaExecutionVisitor.java | 15 + .../IoTDBDataNodeAsyncClientManager.java | 9 +- .../IoTDBDataNodeSyncClientManager.java | 6 +- .../airgap/IoTDBDataNodeAirGapSink.java | 2 + .../async/IoTDBDataRegionAsyncSink.java | 6 +- .../thrift/sync/IoTDBDataNodeSyncSink.java | 6 +- .../db/protocol/client/ConfigNodeClient.java | 7 + .../impl/DataNodeInternalRPCServiceImpl.java | 38 +- .../execution/config/ConfigTaskVisitor.java | 14 +- .../executor/ClusterConfigTaskExecutor.java | 65 ++++ .../config/executor/IConfigTaskExecutor.java | 14 + .../metadata/AlterEncodingCompressorTask.java | 47 +++ .../queryengine/plan/parser/ASTVisitor.java | 68 +++- .../plan/planner/plan/node/PlanNodeType.java | 4 + .../plan/planner/plan/node/PlanVisitor.java | 5 + .../plan/statement/StatementType.java | 1 + .../plan/statement/StatementVisitor.java | 10 +- .../AlterEncodingCompressorStatement.java | 126 +++++++ .../metadata/DeleteDatabaseStatement.java | 2 +- .../metadata/ShowDatabaseStatement.java | 2 +- .../schemaregion/ISchemaRegion.java | 13 + .../schemaregion/SchemaRegionPlanType.java | 2 + .../schemaregion/SchemaRegionPlanVisitor.java | 15 + .../impl/SchemaRegionMemoryImpl.java | 37 +- .../impl/SchemaRegionPBTreeImpl.java | 18 + .../visitor/SchemaRegionPlanDeserializer.java | 17 + .../visitor/SchemaRegionPlanSerializer.java | 28 ++ .../impl/mem/MTreeBelowSGMemoryImpl.java | 33 ++ .../req/SchemaRegionWritePlanFactory.java | 12 + .../commons/exception/MetadataException.java | 2 +- .../iotdb/commons/path/PathPatternNode.java | 7 + .../iotdb/commons/path/PathPatternTree.java | 13 +- .../pipe/receiver/IoTDBFileReceiver.java | 6 + .../pipe/sink/client/IoTDBClientManager.java | 5 +- .../sink/client/IoTDBSyncClientManager.java | 9 +- .../common/PipeTransferHandshakeConstant.java | 1 + .../commons/pipe/sink/protocol/IoTDBSink.java | 3 +- .../pipe/sink/protocol/IoTDBSslSyncSink.java | 6 +- .../iotdb/commons/utils/SerializeUtils.java | 18 + .../src/main/thrift/confignode.thrift | 12 + .../src/main/thrift/datanode.thrift | 13 + 74 files changed, 1741 insertions(+), 134 deletions(-) create mode 100644 integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java create mode 100644 iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java create mode 100644 iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java create mode 100644 iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeTSStatusTaskExecutor.java create mode 100644 iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/AlterEncodingCompressorState.java create mode 100644 iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedureTest.java create mode 100644 iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/AlterEncodingCompressorTask.java create mode 100644 iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java new file mode 100644 index 000000000000..42c0275ab35b --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java @@ -0,0 +1,187 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.db.it.schema; + +import org.apache.iotdb.it.env.EnvFactory; +import org.apache.iotdb.itbase.category.ClusterIT; +import org.apache.iotdb.itbase.category.LocalStandaloneIT; +import org.apache.iotdb.util.AbstractSchemaIT; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runners.Parameterized; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +@Category({LocalStandaloneIT.class, ClusterIT.class}) +public class IoTDBAlterEncodingCompressorIT extends AbstractSchemaIT { + + public IoTDBAlterEncodingCompressorIT(SchemaTestMode schemaTestMode) { + super(schemaTestMode); + } + + @Parameterized.BeforeParam + public static void before() throws Exception { + setUpEnvironment(); + EnvFactory.getEnv().initClusterEnvironment(); + } + + @Parameterized.AfterParam + public static void after() throws Exception { + EnvFactory.getEnv().cleanClusterEnvironment(); + tearDownEnvironment(); + } + + @After + public void tearDown() throws Exception { + clearSchema(); + } + + @Test + public void alterEncodingAndCompressorTest() throws Exception { + if (schemaTestMode.equals(SchemaTestMode.PBTree)) { + return; + } + try (final Connection connection = EnvFactory.getEnv().getConnection(); + final Statement statement = connection.createStatement()) { + statement.execute("create timeSeries root.vehicle.wind.a int32"); + + try { + statement.execute("alter timeSeries root.nonExist.** set encoding=PLAIN"); + fail(); + } catch (final SQLException e) { + Assert.assertEquals( + "508: Timeseries [root.nonExist.**] does not exist or is represented by device template", + e.getMessage()); + } + + try { + statement.execute("alter timeSeries if exists root.nonExist.** set encoding=PLAIN"); + } catch (final SQLException e) { + fail( + "Alter encoding & compressor shall not fail when timeSeries not exists if set if exists"); + } + + try { + statement.execute("alter timeSeries if exists root.vehicle.** set encoding=aaa"); + fail(); + } catch (final SQLException e) { + Assert.assertEquals("701: Unsupported encoding: AAA", e.getMessage()); + } + + try { + statement.execute("alter timeSeries if exists root.vehicle.** set compressor=aaa"); + fail(); + } catch (final SQLException e) { + Assert.assertEquals("701: Unsupported compressor: AAA", e.getMessage()); + } + + try { + statement.execute("alter timeSeries if exists root.vehicle.** set falseKey=aaa"); + fail(); + } catch (final SQLException e) { + Assert.assertEquals("701: property falsekey is unsupported yet.", e.getMessage()); + } + + try { + statement.execute("alter timeSeries if exists root.vehicle.** set encoding=DICTIONARY"); + fail(); + } catch (final SQLException e) { + Assert.assertTrue(e.getMessage().contains("encoding DICTIONARY does not support INT32")); + } + + statement.execute("alter timeSeries root.** set encoding=Plain, compressor=LZMA2"); + + try (final ResultSet resultSet = statement.executeQuery("SHOW TIMESERIES")) { + while (resultSet.next()) { + assertEquals("PLAIN", resultSet.getString(5)); + assertEquals("LZMA2", resultSet.getString(6)); + } + } + + statement.execute("create user IoTDBUser '!@#$!dfdfzvd343'"); + statement.execute("grant write on root.vehicle.wind.a to user IoTDBUser"); + statement.execute("create timeSeries root.vehicle.wind.b int32"); + } + + try (final Connection connection = + EnvFactory.getEnv().getConnection("IoTDBUser", "!@#$!dfdfzvd343"); + final Statement statement = connection.createStatement()) { + try { + statement.execute("alter timeSeries root.vechile.** set encoding=PLAIN, compressor=LZMA2"); + fail(); + } catch (final SQLException e) { + Assert.assertEquals( + "803: No permissions for this operation, please add privilege WRITE_SCHEMA on [root.vechile.**]", + e.getMessage()); + } + + try { + statement.execute( + "alter timeSeries root.vechile.wind.a, root.__audit.** set encoding=PLAIN, compressor=LZMA2"); + fail(); + } catch (final SQLException e) { + Assert.assertEquals( + "803: 'AUDIT' permission is needed to alter the encoding and compressor of database root.__audit", + e.getMessage()); + } + + try { + statement.execute( + "alter timeSeries if permitted root.vehicle.**, root.__audit.** set encoding=GORILLA, compressor=GZIP"); + } catch (final SQLException e) { + fail("Alter encoding & compressor shall not fail when no privileges if set if permitted"); + } + } + + try (final Connection connection = EnvFactory.getEnv().getConnection(); + final Statement statement = connection.createStatement()) { + try (final ResultSet resultSet = + statement.executeQuery("SHOW TIMESERIES root.__audit.**._0.password")) { + while (resultSet.next()) { + assertEquals("PLAIN", resultSet.getString(5)); + assertEquals("LZMA2", resultSet.getString(6)); + } + } + + try (final ResultSet resultSet = + statement.executeQuery("SHOW TIMESERIES root.vehicle.wind.b")) { + resultSet.next(); + assertEquals("TS_2DIFF", resultSet.getString(5)); + assertEquals("LZ4", resultSet.getString(6)); + } + + try (final ResultSet resultSet = + statement.executeQuery("SHOW TIMESERIES root.vehicle.wind.a")) { + resultSet.next(); + assertEquals("GORILLA", resultSet.getString(5)); + assertEquals("GZIP", resultSet.getString(6)); + } + } + } +} diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java index 661027160bfa..720cab5ace10 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java @@ -79,9 +79,10 @@ public void testPureSchemaInclusion() throws Exception { Arrays.asList( // TODO: add database creation after the database auto creating on receiver can be // banned - "create timeseries root.ln.wf01.wt01.status with datatype=BOOLEAN,encoding=PLAIN", - "ALTER timeseries root.ln.wf01.wt01.status ADD TAGS tag3=v3", - "ALTER timeseries root.ln.wf01.wt01.status ADD ATTRIBUTES attr4=v4"))) { + "create timeSeries root.ln.wf01.wt01.status with datatype=BOOLEAN,encoding=PLAIN", + "ALTER timeSeries root.ln.wf01.wt01.status ADD TAGS tag3=v3", + "ALTER timeSeries root.ln.wf01.wt01.status ADD ATTRIBUTES attr4=v4", + "ALTER timeSeries root.** set compressor=ZSTD"))) { return; } @@ -90,7 +91,7 @@ public void testPureSchemaInclusion() throws Exception { "show timeseries", "Timeseries,Alias,Database,DataType,Encoding,Compression,Tags,Attributes,Deadband,DeadbandParameters,ViewType,", Collections.singleton( - "root.ln.wf01.wt01.status,null,root.ln,BOOLEAN,PLAIN,LZ4,{\"tag3\":\"v3\"},{\"attr4\":\"v4\"},null,null,BASE,")); + "root.ln.wf01.wt01.status,null,root.ln,BOOLEAN,PLAIN,ZSTD,{\"tag3\":\"v3\"},{\"attr4\":\"v4\"},null,null,BASE,")); if (!TestUtils.tryExecuteNonQueriesWithRetry( senderEnv, diff --git a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 index f37ef7368518..36dc10048b3b 100644 --- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 +++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 @@ -39,7 +39,7 @@ ddlStatement // Database : createDatabase | dropDatabase | dropPartition | alterDatabase | showDatabases | countDatabases // Timeseries & Path - | createTimeseries | dropTimeseries | alterTimeseries + | createTimeseries | dropTimeseries | alterTimeseries | alterEncodingCompressor | showDevices | showTimeseries | showChildPaths | showChildNodes | countDevices | countTimeseries | countNodes // Device Template | createSchemaTemplate | createTimeseriesUsingSchemaTemplate | dropSchemaTemplate | dropTimeseriesOfSchemaTemplate @@ -176,6 +176,10 @@ alterClause | UPSERT aliasClause? tagClause? attributeClause? ; +alterEncodingCompressor + : ALTER TIMESERIES (IF EXISTS)? (IF PERMITTED)? prefixPath (COMMA prefixPath)* SET attributePair (COMMA attributePair)* + ; + aliasClause : ALIAS operator_eq alias ; diff --git a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 index f90a0d3dbfd2..1cccee25f6bc 100644 --- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 +++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 @@ -566,6 +566,10 @@ PATHS : P A T H S ; +PERMITTED + : P E R M I T T E D + ; + PIPE : P I P E ; diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/CnToDnAsyncRequestType.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/CnToDnAsyncRequestType.java index 225d43419132..53ff81ee8da4 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/CnToDnAsyncRequestType.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/CnToDnAsyncRequestType.java @@ -89,6 +89,8 @@ public enum CnToDnAsyncRequestType { DELETE_DATA_FOR_DELETE_SCHEMA, DELETE_TIMESERIES, + ALTER_ENCODING_COMPRESSOR, + CONSTRUCT_SCHEMA_BLACK_LIST_WITH_TEMPLATE, ROLLBACK_SCHEMA_BLACK_LIST_WITH_TEMPLATE, DEACTIVATE_TEMPLATE, diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/CnToDnInternalServiceAsyncRequestManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/CnToDnInternalServiceAsyncRequestManager.java index b9aac92a1650..1e171891a55c 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/CnToDnInternalServiceAsyncRequestManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/CnToDnInternalServiceAsyncRequestManager.java @@ -47,6 +47,7 @@ import org.apache.iotdb.confignode.client.async.handlers.rpc.subscription.ConsumerGroupPushMetaRPCHandler; import org.apache.iotdb.confignode.client.async.handlers.rpc.subscription.TopicPushMetaRPCHandler; import org.apache.iotdb.mpp.rpc.thrift.TActiveTriggerInstanceReq; +import org.apache.iotdb.mpp.rpc.thrift.TAlterEncodingCompressorReq; import org.apache.iotdb.mpp.rpc.thrift.TAlterViewReq; import org.apache.iotdb.mpp.rpc.thrift.TCheckSchemaRegionUsingTemplateReq; import org.apache.iotdb.mpp.rpc.thrift.TCheckTimeSeriesExistenceReq; @@ -297,6 +298,11 @@ protected void initActionMapBuilder() { CnToDnAsyncRequestType.DELETE_TIMESERIES, (req, client, handler) -> client.deleteTimeSeries((TDeleteTimeSeriesReq) req, (SchemaUpdateRPCHandler) handler)); + actionMapBuilder.put( + CnToDnAsyncRequestType.ALTER_ENCODING_COMPRESSOR, + (req, client, handler) -> + client.alterEncodingCompressor( + (TAlterEncodingCompressorReq) req, (SchemaUpdateRPCHandler) handler)); actionMapBuilder.put( CnToDnAsyncRequestType.CONSTRUCT_SCHEMA_BLACK_LIST_WITH_TEMPLATE, (req, client, handler) -> diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/rpc/DataNodeAsyncRequestRPCHandler.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/rpc/DataNodeAsyncRequestRPCHandler.java index 69021eaec1ae..fb188500cc28 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/rpc/DataNodeAsyncRequestRPCHandler.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/rpc/DataNodeAsyncRequestRPCHandler.java @@ -82,6 +82,7 @@ public static DataNodeAsyncRequestRPCHandler buildHandler( case ROLLBACK_SCHEMA_BLACK_LIST: case DELETE_DATA_FOR_DELETE_SCHEMA: case DELETE_TIMESERIES: + case ALTER_ENCODING_COMPRESSOR: case CONSTRUCT_SCHEMA_BLACK_LIST_WITH_TEMPLATE: case ROLLBACK_SCHEMA_BLACK_LIST_WITH_TEMPLATE: case DEACTIVATE_TEMPLATE: diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java index b7a0936ca450..d29919fe8285 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java @@ -59,6 +59,8 @@ import org.apache.iotdb.confignode.consensus.request.write.partition.CreateSchemaPartitionPlan; import org.apache.iotdb.confignode.consensus.request.write.partition.RemoveRegionLocationPlan; import org.apache.iotdb.confignode.consensus.request.write.partition.UpdateRegionLocationPlan; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeAlterEncodingCompressorPlan; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeCreateTableOrViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeactivateTemplatePlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteLogicalViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteTimeSeriesPlan; @@ -408,6 +410,9 @@ public static ConfigPhysicalPlan create(final ByteBuffer buffer) throws IOExcept case PipeDeactivateTemplate: plan = new PipeDeactivateTemplatePlan(); break; + case PipeAlterEncodingCompressor: + plan = new PipeAlterEncodingCompressorPlan(); + break; case UpdateTriggersOnTransferNodes: plan = new UpdateTriggersOnTransferNodesPlan(); break; diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java index 24e5b9ba9c63..3b013b64a72c 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java @@ -229,6 +229,7 @@ public enum ConfigPhysicalPlanType { PipeDeleteLogicalView((short) 1703), PipeDeactivateTemplate((short) 1704), PipeSetTTL((short) 1705), + PipeAlterEncodingCompressor((short) 1708), /** Subscription */ CreateTopic((short) 1800), diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java index 1e418e338194..1c668e25c74a 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java @@ -23,6 +23,8 @@ import org.apache.iotdb.confignode.consensus.request.write.database.DatabaseSchemaPlan; import org.apache.iotdb.confignode.consensus.request.write.database.DeleteDatabasePlan; import org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeAlterEncodingCompressorPlan; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeCreateTableOrViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeactivateTemplatePlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteLogicalViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteTimeSeriesPlan; @@ -83,6 +85,8 @@ public R process(ConfigPhysicalPlan plan, C context) { return visitRevokeRoleFromUser((AuthorPlan) plan, context); case SetTTL: return visitTTL((SetTTLPlan) plan, context); + case PipeAlterEncodingCompressor: + return visitPipeAlterEncodingCompressor((PipeAlterEncodingCompressorPlan) plan, context); default: return visitPlan(plan, context); } @@ -190,4 +194,9 @@ public R visitRevokeRoleFromUser(AuthorPlan revokeRoleFromUserPlan, C context) { public R visitTTL(SetTTLPlan setTTLPlan, C context) { return visitPlan(setTTLPlan, context); } + + public R visitPipeAlterEncodingCompressor( + final PipeAlterEncodingCompressorPlan pipeAlterEncodingCompressorPlan, final C context) { + return visitPlan(pipeAlterEncodingCompressorPlan, context); + } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java new file mode 100644 index 000000000000..bd31a7c57b2e --- /dev/null +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.confignode.consensus.request.write.pipe.payload; + +import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlan; +import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType; + +import org.apache.tsfile.utils.ReadWriteIOUtils; + +import javax.annotation.Nonnull; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Objects; + +public class PipeAlterEncodingCompressorPlan extends ConfigPhysicalPlan { + + private ByteBuffer patternTreeBytes; + private byte encoding; + private byte compressor; + private boolean mayAlterAudit; + + public PipeAlterEncodingCompressorPlan() { + super(ConfigPhysicalPlanType.PipeAlterEncodingCompressor); + } + + public PipeAlterEncodingCompressorPlan( + final @Nonnull ByteBuffer patternTreeBytes, + final byte encoding, + final byte compressor, + final boolean mayAlterAudit) { + super(ConfigPhysicalPlanType.PipeAlterEncodingCompressor); + this.patternTreeBytes = patternTreeBytes; + this.encoding = encoding; + this.compressor = compressor; + this.mayAlterAudit = mayAlterAudit; + } + + public void setPatternTreeBytes(ByteBuffer patternTreeBytes) { + this.patternTreeBytes = patternTreeBytes; + } + + public ByteBuffer getPatternTreeBytes() { + patternTreeBytes.rewind(); + return patternTreeBytes; + } + + public byte getEncoding() { + return encoding; + } + + public byte getCompressor() { + return compressor; + } + + public void setMayAlterAudit(final boolean mayAlterAudit) { + this.mayAlterAudit = mayAlterAudit; + } + + public boolean isMayAlterAudit() { + return mayAlterAudit; + } + + @Override + protected void serializeImpl(final DataOutputStream stream) throws IOException { + stream.writeShort(getType().getPlanType()); + ReadWriteIOUtils.write(patternTreeBytes, stream); + ReadWriteIOUtils.write(encoding, stream); + ReadWriteIOUtils.write(compressor, stream); + } + + @Override + protected void deserializeImpl(final ByteBuffer buffer) throws IOException { + patternTreeBytes = ByteBuffer.wrap(ReadWriteIOUtils.readBinary(buffer).getValues()); + encoding = ReadWriteIOUtils.readByte(buffer); + compressor = ReadWriteIOUtils.readByte(buffer); + } + + @Override + public int hashCode() { + return Objects.hash(patternTreeBytes, encoding, compressor); + } + + @Override + public String toString() { + return "PipeAlterEncodingCompressorPlan{" + + "patternTreeBytes=" + + patternTreeBytes + + ", encoding=" + + encoding + + ", compressor=" + + compressor + + '}'; + } +} diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java index 2d34c20e8ae3..d52c1fa2fd8a 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java @@ -130,6 +130,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TAINodeRegisterReq; import org.apache.iotdb.confignode.rpc.thrift.TAINodeRestartReq; import org.apache.iotdb.confignode.rpc.thrift.TAINodeRestartResp; +import org.apache.iotdb.confignode.rpc.thrift.TAlterEncodingCompressorReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterLogicalViewReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterPipeReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterSchemaTemplateReq; @@ -2022,6 +2023,23 @@ public TSStatus alterSchemaTemplate(TAlterSchemaTemplateReq req) { } } + @Override + public TSStatus alterEncodingCompressor(final TAlterEncodingCompressorReq req) { + TSStatus status = confirmLeader(); + if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + return procedureManager.alterEncodingCompressor( + req.getQueryId(), + PathPatternTree.deserialize(req.pathPatternTree), + req.getEncoding(), + req.getCompressor(), + req.isIfExists(), + req.isIsGeneratedByPipe(), + req.isMayAlterAudit()); + } else { + return status; + } + } + @Override public TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req) { TSStatus status = confirmLeader(); diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java index 326182fbef36..91fbcea52d3d 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java @@ -59,6 +59,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TAINodeRegisterReq; import org.apache.iotdb.confignode.rpc.thrift.TAINodeRestartReq; import org.apache.iotdb.confignode.rpc.thrift.TAINodeRestartResp; +import org.apache.iotdb.confignode.rpc.thrift.TAlterEncodingCompressorReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterLogicalViewReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterPipeReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterSchemaTemplateReq; @@ -655,6 +656,8 @@ TDataPartitionTableResp getOrCreateDataPartition( TSStatus alterSchemaTemplate(TAlterSchemaTemplateReq req); + TSStatus alterEncodingCompressor(TAlterEncodingCompressorReq req); + /** Delete timeseries. */ TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req); diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java index 5f6450769f58..ff828e514d7d 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java @@ -81,6 +81,7 @@ import org.apache.iotdb.confignode.procedure.impl.region.RegionMigrationPlan; import org.apache.iotdb.confignode.procedure.impl.region.RegionOperationProcedure; import org.apache.iotdb.confignode.procedure.impl.region.RemoveRegionPeerProcedure; +import org.apache.iotdb.confignode.procedure.impl.schema.AlterEncodingCompressorProcedure; import org.apache.iotdb.confignode.procedure.impl.schema.AlterLogicalViewProcedure; import org.apache.iotdb.confignode.procedure.impl.schema.DeactivateTemplateProcedure; import org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure; @@ -252,6 +253,46 @@ public TSStatus deleteDatabases( } } + public TSStatus alterEncodingCompressor( + final String queryId, + final PathPatternTree patternTree, + final byte encoding, + final byte compressor, + final boolean ifExists, + final boolean isGeneratedByPipe, + final boolean mayAlterAudit) { + AlterEncodingCompressorProcedure procedure = null; + synchronized (this) { + ProcedureType type; + AlterEncodingCompressorProcedure alterEncodingCompressorProcedure; + for (Procedure runningProcedure : executor.getProcedures().values()) { + type = ProcedureFactory.getProcedureType(runningProcedure); + if (type == null || !type.equals(ProcedureType.ALTER_ENCODING_COMPRESSOR_PROCEDURE)) { + continue; + } + alterEncodingCompressorProcedure = ((AlterEncodingCompressorProcedure) runningProcedure); + if (queryId.equals(alterEncodingCompressorProcedure.getQueryId())) { + procedure = alterEncodingCompressorProcedure; + break; + } + } + + if (procedure == null) { + procedure = + new AlterEncodingCompressorProcedure( + isGeneratedByPipe, + queryId, + patternTree, + ifExists, + encoding, + compressor, + mayAlterAudit); + this.executor.submitProcedure(procedure); + } + } + return waitingProcedureFinished(procedure); + } + public TSStatus deleteTimeSeries( String queryId, PathPatternTree patternTree, boolean isGeneratedByPipe) { DeleteTimeSeriesProcedure procedure = null; diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java index 5ba70f808901..343a1cc245cb 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java @@ -25,6 +25,7 @@ import org.apache.iotdb.commons.conf.IoTDBConstant; import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.path.PathPatternTree; +import org.apache.iotdb.commons.path.PathPatternTreeUtils; import org.apache.iotdb.commons.pipe.datastructure.pattern.IoTDBPipePattern; import org.apache.iotdb.commons.pipe.datastructure.pattern.PipePattern; import org.apache.iotdb.commons.pipe.datastructure.pattern.UnionIoTDBPipePattern; @@ -35,6 +36,11 @@ import org.apache.iotdb.commons.pipe.sink.payload.thrift.request.PipeTransferCompressedReq; import org.apache.iotdb.commons.pipe.sink.payload.thrift.request.PipeTransferFileSealReqV1; import org.apache.iotdb.commons.pipe.sink.payload.thrift.request.PipeTransferFileSealReqV2; +import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant; +import org.apache.iotdb.commons.schema.table.Audit; +import org.apache.iotdb.commons.schema.table.TreeViewSchema; +import org.apache.iotdb.commons.schema.table.TsTable; +import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema; import org.apache.iotdb.commons.schema.ttl.TTLCache; import org.apache.iotdb.commons.utils.StatusUtils; import org.apache.iotdb.confignode.conf.ConfigNodeDescriptor; @@ -44,6 +50,8 @@ import org.apache.iotdb.confignode.consensus.request.write.database.DatabaseSchemaPlan; import org.apache.iotdb.confignode.consensus.request.write.database.DeleteDatabasePlan; import org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeAlterEncodingCompressorPlan; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeCreateTableOrViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeactivateTemplatePlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteLogicalViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteTimeSeriesPlan; @@ -237,7 +245,7 @@ private TSStatus executePlanAndClassifyExceptions(final ConfigPhysicalPlan plan) return result; } - private TSStatus checkPermission(final ConfigPhysicalPlan plan) { + private TSStatus checkPermission(final ConfigPhysicalPlan plan) throws IOException { switch (plan.getType()) { case CreateDatabase: case AlterDatabase: @@ -268,6 +276,45 @@ private TSStatus checkPermission(final ConfigPhysicalPlan plan) { .getAllPathPatterns()), PrivilegeType.WRITE_SCHEMA.ordinal()) .getStatus(); + case PipeAlterEncodingCompressor: + // Judge here in the future + if (configManager + .checkUserPrivileges(username, new PrivilegeUnion(PrivilegeType.AUDIT)) + .getStatus() + .getCode() + != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + ((PipeAlterEncodingCompressorPlan) plan).setMayAlterAudit(false); + } + if (skipIfNoPrivileges.get()) { + final PathPatternTree pathPatternTree = + PathPatternTree.deserialize( + ByteBuffer.wrap( + configManager + .fetchAuthizedPatternTree(username, PrivilegeType.WRITE_SCHEMA.ordinal()) + .getPathPatternTree())); + if (((PipeAlterEncodingCompressorPlan) plan).isMayAlterAudit()) { + pathPatternTree.appendPathPattern(Audit.TREE_MODEL_AUDIT_DATABASE_PATH_PATTERN, true); + } + ((PipeAlterEncodingCompressorPlan) plan) + .setPatternTreeBytes( + PathPatternTreeUtils.intersectWithFullPathPrefixTree( + PathPatternTree.deserialize( + ((PipeAlterEncodingCompressorPlan) plan).getPatternTreeBytes()), + pathPatternTree) + .serialize()); + return StatusUtils.OK; + } else { + return configManager + .checkUserPrivileges( + username, + new PrivilegeUnion( + new ArrayList<>( + PathPatternTree.deserialize( + ((PipeAlterEncodingCompressorPlan) plan).getPatternTreeBytes()) + .getAllPathPatterns()), + PrivilegeType.WRITE_SCHEMA)) + .getStatus(); + } case PipeDeleteLogicalView: return configManager .checkUserPrivileges( @@ -430,6 +477,18 @@ private TSStatus executePlan(final ConfigPhysicalPlan plan) throws ConsensusExce generatePseudoQueryId(), ((PipeDeactivateTemplatePlan) plan).getTemplateSetInfo(), shouldMarkAsPipeRequest.get()); + case PipeAlterEncodingCompressor: + return configManager + .getProcedureManager() + .alterEncodingCompressor( + queryId, + PathPatternTree.deserialize( + ((PipeAlterEncodingCompressorPlan) plan).getPatternTreeBytes()), + ((PipeAlterEncodingCompressorPlan) plan).getEncoding(), + ((PipeAlterEncodingCompressorPlan) plan).getCompressor(), + true, + shouldMarkAsPipeRequest.get(), + ((PipeAlterEncodingCompressorPlan) plan).isMayAlterAudit()); case UpdateTriggerStateInTable: // TODO: Record complete message in trigger return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()); diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java index a772ab774578..58cf339e9ecd 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java @@ -26,6 +26,8 @@ import org.apache.iotdb.confignode.consensus.request.write.database.DatabaseSchemaPlan; import org.apache.iotdb.confignode.consensus.request.write.database.DeleteDatabasePlan; import org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeAlterEncodingCompressorPlan; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeCreateTableOrViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeactivateTemplatePlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteLogicalViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteTimeSeriesPlan; @@ -315,4 +317,14 @@ public TSStatus visitTTL(final SetTTLPlan plan, final TSStatus context) { } return super.visitTTL(plan, context); } + + @Override + public TSStatus visitPipeAlterEncodingCompressor( + final PipeAlterEncodingCompressorPlan plan, final TSStatus context) { + if (context.getCode() == TSStatusCode.PATH_NOT_EXIST.getStatusCode()) { + return new TSStatus(TSStatusCode.PIPE_RECEIVER_IDEMPOTENT_CONFLICT_EXCEPTION.getStatusCode()) + .setMessage(context.getMessage()); + } + return visitPlan(plan, context); + } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/client/IoTDBConfigNodeSyncClientManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/client/IoTDBConfigNodeSyncClientManager.java index dfe4844d09e0..8aa750ce41a5 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/client/IoTDBConfigNodeSyncClientManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/client/IoTDBConfigNodeSyncClientManager.java @@ -44,7 +44,8 @@ public IoTDBConfigNodeSyncClientManager( boolean shouldReceiverConvertOnTypeMismatch, String loadTsFileStrategy, boolean validateTsFile, - boolean shouldMarkAsPipeRequest) { + boolean shouldMarkAsPipeRequest, + final boolean skipIfNoPrivileges) { super( endPoints, username, @@ -57,7 +58,8 @@ public IoTDBConfigNodeSyncClientManager( shouldReceiverConvertOnTypeMismatch, loadTsFileStrategy, validateTsFile, - shouldMarkAsPipeRequest); + shouldMarkAsPipeRequest, + skipIfNoPrivileges); } @Override diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/protocol/IoTDBConfigRegionAirGapSink.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/protocol/IoTDBConfigRegionAirGapSink.java index 97413d68bebf..9361c8e9dc3f 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/protocol/IoTDBConfigRegionAirGapSink.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/protocol/IoTDBConfigRegionAirGapSink.java @@ -80,6 +80,8 @@ protected byte[] generateHandShakeV2Payload() throws IOException { params.put( PipeTransferHandshakeConstant.HANDSHAKE_KEY_MARK_AS_PIPE_REQUEST, Boolean.toString(shouldMarkAsPipeRequest)); + params.put( + PipeTransferHandshakeConstant.HANDSHAKE_KEY_SKIP_IF, Boolean.toString(skipIfNoPrivileges)); return PipeTransferConfigNodeHandshakeV2Req.toTPipeTransferBytes(params); } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/protocol/IoTDBConfigRegionSink.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/protocol/IoTDBConfigRegionSink.java index d3555e62dfa9..cf007efdc22a 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/protocol/IoTDBConfigRegionSink.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/sink/protocol/IoTDBConfigRegionSink.java @@ -69,7 +69,8 @@ protected IoTDBSyncClientManager constructClient( final boolean shouldReceiverConvertOnTypeMismatch, final String loadTsFileStrategy, final boolean validateTsFile, - final boolean shouldMarkAsPipeRequest) { + final boolean shouldMarkAsPipeRequest, + final boolean skipIfNoPrivileges) { return new IoTDBConfigNodeSyncClientManager( nodeUrls, username, @@ -81,7 +82,8 @@ protected IoTDBSyncClientManager constructClient( shouldReceiverConvertOnTypeMismatch, loadTsFileStrategy, validateTsFile, - shouldMarkAsPipeRequest); + shouldMarkAsPipeRequest, + skipIfNoPrivileges); } @Override diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningFilter.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningFilter.java index fdcb7b03417f..dfb0c83b8e7e 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningFilter.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/ConfigRegionListeningFilter.java @@ -87,6 +87,9 @@ public class ConfigRegionListeningFilter { Arrays.asList( ConfigPhysicalPlanType.UnsetTemplate, ConfigPhysicalPlanType.PipeUnsetTemplate))); + OPTION_PLAN_MAP.put( + new PartialPath("schema.timeseries.ordinary.alter"), + Collections.singletonList(ConfigPhysicalPlanType.PipeAlterEncodingCompressor)); OPTION_PLAN_MAP.put( new PartialPath("schema.timeseries.ordinary.drop"), Collections.singletonList(ConfigPhysicalPlanType.PipeDeleteTimeSeries)); diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigPhysicalPlanPatternParseVisitor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigPhysicalPlanPatternParseVisitor.java index c8beb49181cc..92e91b8b745f 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigPhysicalPlanPatternParseVisitor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigPhysicalPlanPatternParseVisitor.java @@ -30,6 +30,7 @@ import org.apache.iotdb.confignode.consensus.request.write.database.DatabaseSchemaPlan; import org.apache.iotdb.confignode.consensus.request.write.database.DeleteDatabasePlan; import org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeAlterEncodingCompressorPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeactivateTemplatePlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteLogicalViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteTimeSeriesPlan; @@ -253,6 +254,30 @@ public Optional visitPipeDeleteLogicalView( } } + @Override + public Optional visitPipeAlterEncodingCompressor( + final PipeAlterEncodingCompressorPlan pipeAlterEncodingCompressorPlan, + final UnionIoTDBTreePattern pattern) { + try { + final PathPatternTree intersectedTree = + pattern.getIntersection( + PathPatternTree.deserialize(pipeAlterEncodingCompressorPlan.getPatternTreeBytes())); + return !intersectedTree.isEmpty() + ? Optional.of( + new PipeAlterEncodingCompressorPlan( + intersectedTree.serialize(), + pipeAlterEncodingCompressorPlan.getEncoding(), + pipeAlterEncodingCompressorPlan.getCompressor(), + pipeAlterEncodingCompressorPlan.isMayAlterAudit())) + : Optional.empty(); + } catch (final IOException e) { + LOGGER.warn( + "Serialization failed for the alter encoding time series plan in pipe transmission, skip transfer", + e); + return Optional.empty(); + } + } + @Override public Optional visitPipeDeactivateTemplate( final PipeDeactivateTemplatePlan pipeDeactivateTemplatePlan, diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java index 4facb308d8a2..18231be05b5a 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java @@ -560,6 +560,7 @@ public TSStatus executeNonQueryPlan(ConfigPhysicalPlan physicalPlan) case PipeDeleteTimeSeries: case PipeDeleteLogicalView: case PipeDeactivateTemplate: + case PipeAlterEncodingCompressor: // Pipe payload, used to trigger plan extraction. // Will not be actually executed. return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()); diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java new file mode 100644 index 000000000000..a76e3494d051 --- /dev/null +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java @@ -0,0 +1,331 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.confignode.procedure.impl.schema; + +import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId; +import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation; +import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet; +import org.apache.iotdb.common.rpc.thrift.TSStatus; +import org.apache.iotdb.commons.exception.MetadataException; +import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; +import org.apache.iotdb.commons.utils.SerializeUtils; +import org.apache.iotdb.commons.utils.TestOnly; +import org.apache.iotdb.confignode.client.async.CnToDnAsyncRequestType; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeAlterEncodingCompressorPlan; +import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeEnrichedPlan; +import org.apache.iotdb.confignode.manager.ClusterManager; +import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv; +import org.apache.iotdb.confignode.procedure.exception.ProcedureException; +import org.apache.iotdb.confignode.procedure.impl.StateMachineProcedure; +import org.apache.iotdb.confignode.procedure.state.AlterEncodingCompressorState; +import org.apache.iotdb.confignode.procedure.store.ProcedureType; +import org.apache.iotdb.consensus.exception.ConsensusException; +import org.apache.iotdb.db.exception.metadata.PathNotExistException; +import org.apache.iotdb.mpp.rpc.thrift.TAlterEncodingCompressorReq; +import org.apache.iotdb.pipe.api.exception.PipeException; +import org.apache.iotdb.rpc.TSStatusCode; + +import org.apache.tsfile.utils.ReadWriteIOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.apache.iotdb.confignode.procedure.impl.schema.DeleteTimeSeriesProcedure.invalidateCache; +import static org.apache.iotdb.confignode.procedure.impl.schema.DeleteTimeSeriesProcedure.preparePatternTreeBytesData; + +public class AlterEncodingCompressorProcedure + extends StateMachineProcedure { + private static final Logger LOGGER = LoggerFactory.getLogger(AlterEncodingCompressorState.class); + private String queryId; + private PathPatternTree patternTree; + private boolean ifExists; + private byte encoding; + private byte compressor; + private boolean mayAlterAudit; + + private transient ByteBuffer patternTreeBytes; + private transient String requestMessage; + + public AlterEncodingCompressorProcedure(final boolean isGeneratedByPipe) { + super(isGeneratedByPipe); + } + + public AlterEncodingCompressorProcedure( + final boolean isGeneratedByPipe, + final String queryId, + final PathPatternTree pathPatternTree, + final boolean ifExists, + final byte encoding, + final byte compressor, + final boolean mayAlterAudit) { + super(isGeneratedByPipe); + this.queryId = queryId; + setPatternTree(pathPatternTree); + this.ifExists = ifExists; + this.encoding = encoding; + this.compressor = compressor; + this.mayAlterAudit = mayAlterAudit; + } + + public String getQueryId() { + return queryId; + } + + @TestOnly + public PathPatternTree getPatternTree() { + return patternTree; + } + + public void setPatternTree(final PathPatternTree patternTree) { + this.patternTree = patternTree; + requestMessage = patternTree.getAllPathPatterns().toString(); + patternTreeBytes = preparePatternTreeBytesData(patternTree); + } + + @Override + protected Flow executeFromState( + final ConfigNodeProcedureEnv env, final AlterEncodingCompressorState state) + throws InterruptedException { + final long startTime = System.currentTimeMillis(); + try { + switch (state) { + case ALTER_SCHEMA_REGION: + if (LOGGER.isInfoEnabled()) { + LOGGER.info( + "Alter encoding {} & compressor {} in schema region for timeSeries {}", + SerializeUtils.deserializeEncodingNullable(encoding), + SerializeUtils.deserializeCompressorNullable(compressor), + requestMessage); + } + alterEncodingCompressorInSchemaRegion(env); + break; + case CLEAR_CACHE: + LOGGER.info("Invalidate cache of timeSeries {}", requestMessage); + invalidateCache(env, patternTreeBytes, requestMessage, this::setFailure); + collectPayload4Pipe(env); + return Flow.NO_MORE_STATE; + default: + setFailure(new ProcedureException("Unrecognized state " + state)); + return Flow.NO_MORE_STATE; + } + return Flow.HAS_MORE_STATE; + } finally { + LOGGER.info( + "AlterEncodingCompressor-[{}] costs {}ms", + state, + (System.currentTimeMillis() - startTime)); + } + } + + private void alterEncodingCompressorInSchemaRegion(final ConfigNodeProcedureEnv env) { + final Map relatedSchemaRegionGroup = + env.getConfigManager().getRelatedSchemaRegionGroup(patternTree, mayAlterAudit); + + if (relatedSchemaRegionGroup.isEmpty()) { + if (!ifExists) { + setFailure( + new ProcedureException( + new PathNotExistException( + patternTree.getAllPathPatterns().stream() + .map(PartialPath::getFullPath) + .collect(Collectors.toList()), + false))); + } + return; + } + + final DataNodeTSStatusTaskExecutor alterEncodingCompressorTask = + new DataNodeTSStatusTaskExecutor( + env, + env.getConfigManager().getRelatedSchemaRegionGroup(patternTree, mayAlterAudit), + false, + CnToDnAsyncRequestType.ALTER_ENCODING_COMPRESSOR, + ((dataNodeLocation, consensusGroupIdList) -> + new TAlterEncodingCompressorReq(consensusGroupIdList, patternTreeBytes, ifExists) + .setCompressor(compressor) + .setEncoding(encoding))) { + + private final Map failureMap = new HashMap<>(); + + @Override + protected List processResponseOfOneDataNode( + final TDataNodeLocation dataNodeLocation, + final List consensusGroupIdList, + final TSStatus response) { + final List failedRegionList = new ArrayList<>(); + if (response.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + failureMap.remove(dataNodeLocation); + return failedRegionList; + } + + if (response.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()) { + final List subStatus = response.getSubStatus(); + for (int i = 0; i < subStatus.size(); i++) { + if (subStatus.get(i).getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode() + && !(subStatus.get(i).getCode() == TSStatusCode.PATH_NOT_EXIST.getStatusCode() + && ifExists)) { + failedRegionList.add(consensusGroupIdList.get(i)); + } + } + } else if (!(response.getCode() == TSStatusCode.PATH_NOT_EXIST.getStatusCode() + && ifExists)) { + failedRegionList.addAll(consensusGroupIdList); + } + if (!failedRegionList.isEmpty()) { + failureMap.put(dataNodeLocation, response); + } else { + failureMap.remove(dataNodeLocation); + } + return failedRegionList; + } + + @Override + protected void onAllReplicasetFailure( + final TConsensusGroupId consensusGroupId, + final Set dataNodeLocationSet) { + setFailure( + new ProcedureException( + new MetadataException( + String.format( + "Alter encoding compressor %s in schema regions failed. Failures: %s", + requestMessage, failureMap)))); + interruptTask(); + } + }; + alterEncodingCompressorTask.execute(); + setNextState(AlterEncodingCompressorState.CLEAR_CACHE); + } + + private void collectPayload4Pipe(final ConfigNodeProcedureEnv env) { + TSStatus result; + try { + result = + env.getConfigManager() + .getConsensusManager() + .write( + isGeneratedByPipe + ? new PipeEnrichedPlan( + new PipeAlterEncodingCompressorPlan( + patternTreeBytes, encoding, compressor, mayAlterAudit)) + : new PipeAlterEncodingCompressorPlan( + patternTreeBytes, encoding, compressor, mayAlterAudit)); + } catch (final ConsensusException e) { + LOGGER.warn(ClusterManager.CONSENSUS_WRITE_ERROR, e); + result = new TSStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode()); + result.setMessage(e.getMessage()); + } + if (result.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + throw new PipeException(result.getMessage()); + } + } + + @Override + protected void rollbackState( + final ConfigNodeProcedureEnv env, + final AlterEncodingCompressorState alterEncodingCompressorState) + throws IOException, InterruptedException, ProcedureException { + // Not supported now + } + + @Override + protected AlterEncodingCompressorState getState(final int stateId) { + return AlterEncodingCompressorState.values()[stateId]; + } + + @Override + protected int getStateId(final AlterEncodingCompressorState alterEncodingCompressorState) { + return alterEncodingCompressorState.ordinal(); + } + + @Override + protected AlterEncodingCompressorState getInitialState() { + return AlterEncodingCompressorState.ALTER_SCHEMA_REGION; + } + + @Override + public void serialize(final DataOutputStream stream) throws IOException { + stream.writeShort( + isGeneratedByPipe + ? ProcedureType.PIPE_ENRICHED_ALTER_ENCODING_COMPRESSOR_PROCEDURE.getTypeCode() + : ProcedureType.ALTER_ENCODING_COMPRESSOR_PROCEDURE.getTypeCode()); + super.serialize(stream); + ReadWriteIOUtils.write(queryId, stream); + patternTree.serialize(stream); + ReadWriteIOUtils.write(ifExists, stream); + ReadWriteIOUtils.write(encoding, stream); + ReadWriteIOUtils.write(compressor, stream); + ReadWriteIOUtils.write(mayAlterAudit, stream); + } + + @Override + public void deserialize(final ByteBuffer byteBuffer) { + super.deserialize(byteBuffer); + queryId = ReadWriteIOUtils.readString(byteBuffer); + setPatternTree(PathPatternTree.deserialize(byteBuffer)); + ifExists = ReadWriteIOUtils.readBoolean(byteBuffer); + encoding = ReadWriteIOUtils.readByte(byteBuffer); + compressor = ReadWriteIOUtils.readByte(byteBuffer); + mayAlterAudit = ReadWriteIOUtils.readBoolean(byteBuffer); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) { + return false; + } + final AlterEncodingCompressorProcedure that = (AlterEncodingCompressorProcedure) o; + return this.getProcId() == that.getProcId() + && this.getCurrentState().equals(that.getCurrentState()) + && this.getCycles() == getCycles() + && Objects.equals(this.queryId, that.queryId) + && this.isGeneratedByPipe == that.isGeneratedByPipe + && this.patternTree.equals(that.patternTree) + && this.encoding == that.encoding + && this.compressor == that.compressor + && this.mayAlterAudit == that.mayAlterAudit; + } + + @Override + public int hashCode() { + return Objects.hash( + getProcId(), + getCurrentState(), + getCycles(), + queryId, + isGeneratedByPipe, + patternTree, + ifExists, + encoding, + compressor, + mayAlterAudit); + } +} diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeTSStatusTaskExecutor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeTSStatusTaskExecutor.java new file mode 100644 index 000000000000..700cb3a9a49a --- /dev/null +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeTSStatusTaskExecutor.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.confignode.procedure.impl.schema; + +import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId; +import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation; +import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet; +import org.apache.iotdb.common.rpc.thrift.TSStatus; +import org.apache.iotdb.confignode.client.async.CnToDnAsyncRequestType; +import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv; +import org.apache.iotdb.rpc.TSStatusCode; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; + +public abstract class DataNodeTSStatusTaskExecutor + extends DataNodeRegionTaskExecutor { + + protected DataNodeTSStatusTaskExecutor( + final ConfigNodeProcedureEnv env, + final Map targetRegionGroup, + final boolean executeOnAllReplicaset, + final CnToDnAsyncRequestType dataNodeRequestType, + final BiFunction, Q> dataNodeRequestGenerator) { + super( + env, + targetRegionGroup, + executeOnAllReplicaset, + dataNodeRequestType, + dataNodeRequestGenerator); + } + + @Override + protected List processResponseOfOneDataNode( + final TDataNodeLocation dataNodeLocation, + final List consensusGroupIdList, + final TSStatus response) { + final List failedRegionList = new ArrayList<>(); + if (response.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + return failedRegionList; + } + + if (response.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()) { + final List subStatus = response.getSubStatus(); + for (int i = 0; i < subStatus.size(); i++) { + if (subStatus.get(i).getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + failedRegionList.add(consensusGroupIdList.get(i)); + } + } + } else { + failedRegionList.addAll(consensusGroupIdList); + } + return failedRegionList; + } +} diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java index e1a94cf0934d..dba389bf43f8 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java @@ -428,8 +428,7 @@ public int hashCode() { getProcId(), getCurrentState(), getCycles(), isGeneratedByPipe, queryId, templateSetInfo); } - private class DeactivateTemplateRegionTaskExecutor - extends DataNodeRegionTaskExecutor { + private class DeactivateTemplateRegionTaskExecutor extends DataNodeTSStatusTaskExecutor { private final String taskName; @@ -459,29 +458,6 @@ private class DeactivateTemplateRegionTaskExecutor this.taskName = taskName; } - @Override - protected List processResponseOfOneDataNode( - TDataNodeLocation dataNodeLocation, - List consensusGroupIdList, - TSStatus response) { - List failedRegionList = new ArrayList<>(); - if (response.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - return failedRegionList; - } - - if (response.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()) { - List subStatus = response.getSubStatus(); - for (int i = 0; i < subStatus.size(); i++) { - if (subStatus.get(i).getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - failedRegionList.add(consensusGroupIdList.get(i)); - } - } - } else { - failedRegionList.addAll(consensusGroupIdList); - } - return failedRegionList; - } - @Override protected void onAllReplicasetFailure( TConsensusGroupId consensusGroupId, Set dataNodeLocationSet) { diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java index 4d92454fd22b..9b289d0c15af 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java @@ -333,8 +333,7 @@ public int hashCode() { getProcId(), getCurrentState(), getCycles(), isGeneratedByPipe, patternTree); } - private class DeleteLogicalViewRegionTaskExecutor - extends DataNodeRegionTaskExecutor { + private class DeleteLogicalViewRegionTaskExecutor extends DataNodeTSStatusTaskExecutor { private final String taskName; @@ -348,29 +347,6 @@ private class DeleteLogicalViewRegionTaskExecutor this.taskName = taskName; } - @Override - protected List processResponseOfOneDataNode( - TDataNodeLocation dataNodeLocation, - List consensusGroupIdList, - TSStatus response) { - List failedRegionList = new ArrayList<>(); - if (response.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - return failedRegionList; - } - - if (response.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()) { - List subStatus = response.getSubStatus(); - for (int i = 0; i < subStatus.size(); i++) { - if (subStatus.get(i).getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - failedRegionList.add(consensusGroupIdList.get(i)); - } - } - } else { - failedRegionList.addAll(consensusGroupIdList); - } - return failedRegionList; - } - @Override protected void onAllReplicasetFailure( TConsensusGroupId consensusGroupId, Set dataNodeLocationSet) { diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java index c7ad4c880210..4372bef0e08c 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java @@ -60,6 +60,7 @@ import java.util.Objects; import java.util.Set; import java.util.function.BiFunction; +import java.util.function.Consumer; import java.util.stream.Collectors; public class DeleteTimeSeriesProcedure @@ -116,7 +117,8 @@ protected Flow executeFromState( } case CLEAN_DATANODE_SCHEMA_CACHE: LOGGER.info("Invalidate cache of timeSeries {}", requestMessage); - invalidateCache(env); + invalidateCache(env, patternTreeBytes, requestMessage, this::setFailure); + setNextState(DeleteTimeSeriesState.DELETE_DATA); break; case DELETE_DATA: LOGGER.info("Delete data of timeSeries {}", requestMessage); @@ -193,7 +195,11 @@ protected List processResponseOfOneDataNode( .orElse(0L); } - private void invalidateCache(final ConfigNodeProcedureEnv env) { + public static void invalidateCache( + final ConfigNodeProcedureEnv env, + final ByteBuffer patternTreeBytes, + final String requestMessage, + final Consumer setFailure) { final Map dataNodeLocationMap = env.getConfigManager().getNodeManager().getRegisteredDataNodeLocations(); final DataNodeAsyncRequestContext clientHandler = @@ -207,13 +213,11 @@ private void invalidateCache(final ConfigNodeProcedureEnv env) { // All dataNodes must clear the related schemaEngine cache if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { LOGGER.error("Failed to invalidate schemaEngine cache of timeSeries {}", requestMessage); - setFailure( + setFailure.accept( new ProcedureException(new MetadataException("Invalidate schemaEngine cache failed"))); return; } } - - setNextState(DeleteTimeSeriesState.DELETE_DATA); } private void deleteData(final ConfigNodeProcedureEnv env) { @@ -341,7 +345,7 @@ public void setPatternTree(final PathPatternTree patternTree) { patternTreeBytes = preparePatternTreeBytesData(patternTree); } - private ByteBuffer preparePatternTreeBytesData(final PathPatternTree patternTree) { + public static ByteBuffer preparePatternTreeBytesData(final PathPatternTree patternTree) { final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); try { @@ -376,7 +380,9 @@ public void deserialize(final ByteBuffer byteBuffer) { @Override public boolean equals(final Object o) { - if (this == o) return true; + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) return false; final DeleteTimeSeriesProcedure that = (DeleteTimeSeriesProcedure) o; return this.getProcId() == that.getProcId() @@ -392,8 +398,7 @@ public int hashCode() { getProcId(), getCurrentState(), getCycles(), isGeneratedByPipe, patternTree); } - private class DeleteTimeSeriesRegionTaskExecutor - extends DataNodeRegionTaskExecutor { + private class DeleteTimeSeriesRegionTaskExecutor extends DataNodeTSStatusTaskExecutor { private final String taskName; @@ -423,29 +428,6 @@ private class DeleteTimeSeriesRegionTaskExecutor this.taskName = taskName; } - @Override - protected List processResponseOfOneDataNode( - final TDataNodeLocation dataNodeLocation, - final List consensusGroupIdList, - final TSStatus response) { - final List failedRegionList = new ArrayList<>(); - if (response.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - return failedRegionList; - } - - if (response.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()) { - final List subStatus = response.getSubStatus(); - for (int i = 0; i < subStatus.size(); i++) { - if (subStatus.get(i).getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - failedRegionList.add(consensusGroupIdList.get(i)); - } - } - } else { - failedRegionList.addAll(consensusGroupIdList); - } - return failedRegionList; - } - @Override protected void onAllReplicasetFailure( final TConsensusGroupId consensusGroupId, diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/AlterEncodingCompressorState.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/AlterEncodingCompressorState.java new file mode 100644 index 000000000000..4045971d2f19 --- /dev/null +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/AlterEncodingCompressorState.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.confignode.procedure.state; + +public enum AlterEncodingCompressorState { + ALTER_SCHEMA_REGION, + CLEAR_CACHE +} diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java index fc88b54f3d56..b5200a6bbc72 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java @@ -44,6 +44,7 @@ import org.apache.iotdb.confignode.procedure.impl.region.ReconstructRegionProcedure; import org.apache.iotdb.confignode.procedure.impl.region.RegionMigrateProcedure; import org.apache.iotdb.confignode.procedure.impl.region.RemoveRegionPeerProcedure; +import org.apache.iotdb.confignode.procedure.impl.schema.AlterEncodingCompressorProcedure; import org.apache.iotdb.confignode.procedure.impl.schema.AlterLogicalViewProcedure; import org.apache.iotdb.confignode.procedure.impl.schema.DeactivateTemplateProcedure; import org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure; @@ -125,6 +126,9 @@ public Procedure create(ByteBuffer buffer) throws IOException { case NOTIFY_REGION_MIGRATION_PROCEDURE: procedure = new NotifyRegionMigrationProcedure(); break; + case ALTER_ENCODING_COMPRESSOR_PROCEDURE: + procedure = new AlterEncodingCompressorProcedure(false); + break; case DELETE_TIMESERIES_PROCEDURE: procedure = new DeleteTimeSeriesProcedure(false); break; @@ -238,6 +242,9 @@ public Procedure create(ByteBuffer buffer) throws IOException { case PIPE_ENRICHED_AUTH_OPERATE_PROCEDURE: procedure = new AuthOperationProcedure(true); break; + case PIPE_ENRICHED_ALTER_ENCODING_COMPRESSOR_PROCEDURE: + procedure = new AlterEncodingCompressorProcedure(true); + break; case REMOVE_AI_NODE_PROCEDURE: procedure = new RemoveAINodeProcedure(); break; @@ -319,6 +326,8 @@ public static ProcedureType getProcedureType(Procedure procedure) { return ProcedureType.REMOVE_REGION_PEER_PROCEDURE; } else if (procedure instanceof CreateRegionGroupsProcedure) { return ProcedureType.CREATE_REGION_GROUPS; + } else if (procedure instanceof AlterEncodingCompressorProcedure) { + return ProcedureType.ALTER_ENCODING_COMPRESSOR_PROCEDURE; } else if (procedure instanceof DeleteTimeSeriesProcedure) { return ProcedureType.DELETE_TIMESERIES_PROCEDURE; } else if (procedure instanceof ReconstructRegionProcedure) { diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java index 48ccca42d44a..afe8c8fa718b 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ + package org.apache.iotdb.confignode.procedure.store; import org.apache.iotdb.commons.utils.TestOnly; @@ -45,6 +46,7 @@ public enum ProcedureType { /** Timeseries */ DELETE_TIMESERIES_PROCEDURE((short) 300), + ALTER_ENCODING_COMPRESSOR_PROCEDURE((short) 301), /** Trigger */ CREATE_TRIGGER_PROCEDURE((short) 400), @@ -110,6 +112,7 @@ public enum ProcedureType { PIPE_ENRICHED_DROP_TRIGGER_PROCEDURE((short) 1409), PIPE_ENRICHED_AUTH_OPERATE_PROCEDURE((short) 1410), PIPE_ENRICHED_SET_TTL_PROCEDURE((short) 1411), +PIPE_ENRICHED_ALTER_ENCODING_COMPRESSOR_PROCEDURE((short) 148), /** Subscription */ CREATE_TOPIC_PROCEDURE((short) 1500), diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java index 289e40ecec3f..25332ae2db9d 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java @@ -86,6 +86,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TAINodeRestartReq; import org.apache.iotdb.confignode.rpc.thrift.TAINodeRestartResp; import org.apache.iotdb.confignode.rpc.thrift.TAddConsensusGroupReq; +import org.apache.iotdb.confignode.rpc.thrift.TAlterEncodingCompressorReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterLogicalViewReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterPipeReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterSchemaTemplateReq; @@ -1069,6 +1070,11 @@ public TSStatus alterSchemaTemplate(TAlterSchemaTemplateReq req) { return configManager.alterSchemaTemplate(req); } + @Override + public TSStatus alterEncodingCompressor(final TAlterEncodingCompressorReq req) throws TException { + return configManager.alterEncodingCompressor(req); + } + @Override public TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req) { return configManager.deleteTimeSeries(req); diff --git a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java index da57c1fd2a56..7ec9d52cd883 100644 --- a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java +++ b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java @@ -29,6 +29,7 @@ import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType; import org.apache.iotdb.confignode.consensus.request.write.auth.AuthorPlan; import org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan; +import org.apache.iotdb.confignode.procedure.impl.schema.AlterEncodingCompressorProcedure; import org.apache.iotdb.confignode.procedure.impl.schema.AlterLogicalViewProcedure; import org.apache.iotdb.confignode.procedure.impl.schema.DeactivateTemplateProcedure; import org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure; @@ -41,6 +42,7 @@ import org.apache.iotdb.confignode.procedure.impl.trigger.CreateTriggerProcedure; import org.apache.iotdb.confignode.procedure.impl.trigger.DropTriggerProcedure; import org.apache.iotdb.confignode.procedure.store.ProcedureFactory; +import org.apache.iotdb.confignode.procedure.store.ProcedureType; import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema; import org.apache.iotdb.confignode.rpc.thrift.TTriggerState; import org.apache.iotdb.db.schemaengine.template.Template; @@ -362,4 +364,31 @@ public void setTTLTest() throws IOException, IllegalPathException { buffer.clear(); byteArrayOutputStream.reset(); } + + @Test + public void alterEncodingCompressorTest() throws IllegalPathException, IOException { + final String queryId = "1"; + final PathPatternTree patternTree = new PathPatternTree(); + patternTree.appendPathPattern(new PartialPath("root.sg1.**")); + patternTree.appendPathPattern(new PartialPath("root.sg2.*.s1")); + patternTree.constructTree(); + final AlterEncodingCompressorProcedure alterEncodingCompressorProcedure = + new AlterEncodingCompressorProcedure( + false, queryId, patternTree, false, (byte) 0, (byte) 0, false); + + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); + alterEncodingCompressorProcedure.serialize(dataOutputStream); + + final ByteBuffer byteBuffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray()); + + Assert.assertEquals( + ProcedureType.ALTER_ENCODING_COMPRESSOR_PROCEDURE.getTypeCode(), byteBuffer.getShort()); + + final AlterEncodingCompressorProcedure deserializedProcedure = + new AlterEncodingCompressorProcedure(false); + deserializedProcedure.deserialize(byteBuffer); + + Assert.assertEquals(alterEncodingCompressorProcedure, deserializedProcedure); + } } diff --git a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedureTest.java b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedureTest.java new file mode 100644 index 000000000000..b6f2541b2158 --- /dev/null +++ b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedureTest.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.confignode.procedure.impl.schema; + +import org.apache.iotdb.commons.exception.IllegalPathException; +import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; +import org.apache.iotdb.confignode.procedure.store.ProcedureType; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; + +public class AlterEncodingCompressorProcedureTest { + @Test + public void serializeDeserializeTest() throws IllegalPathException, IOException { + final String queryId = "1"; + final PathPatternTree patternTree = new PathPatternTree(); + patternTree.appendPathPattern(new PartialPath("root.sg1.**")); + patternTree.appendPathPattern(new PartialPath("root.sg2.*.s1")); + patternTree.constructTree(); + final AlterEncodingCompressorProcedure alterEncodingCompressorProcedure = + new AlterEncodingCompressorProcedure( + false, queryId, patternTree, false, (byte) 0, (byte) 0, false); + + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); + alterEncodingCompressorProcedure.serialize(dataOutputStream); + + final ByteBuffer byteBuffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray()); + + Assert.assertEquals( + ProcedureType.ALTER_ENCODING_COMPRESSOR_PROCEDURE.getTypeCode(), byteBuffer.getShort()); + + final AlterEncodingCompressorProcedure deserializedProcedure = + new AlterEncodingCompressorProcedure(false); + deserializedProcedure.deserialize(byteBuffer); + + Assert.assertEquals(alterEncodingCompressorProcedure, deserializedProcedure); + } +} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java index 9698c2a463a5..3d65a33632b2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java @@ -34,6 +34,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ActivateTemplateNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; @@ -530,6 +531,20 @@ public TSStatus visitDeleteTimeseries( } } + @Override + public TSStatus visitAlterEncodingCompressor( + final AlterEncodingCompressorNode node, final ISchemaRegion schemaRegion) { + try { + schemaRegion.alterEncodingCompressor(node); + return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS); + } catch (final MetadataException e) { + if (e.getErrorCode() != TSStatusCode.PATH_NOT_EXIST.getStatusCode()) { + logger.error(e.getMessage(), e); + } + return RpcUtils.getStatus(e.getErrorCode(), e.getMessage()); + } + } + @Override public TSStatus visitPreDeactivateTemplate( final PreDeactivateTemplateNode node, final ISchemaRegion schemaRegion) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/client/IoTDBDataNodeAsyncClientManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/client/IoTDBDataNodeAsyncClientManager.java index 5901e488a58e..b33f09589ea9 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/client/IoTDBDataNodeAsyncClientManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/client/IoTDBDataNodeAsyncClientManager.java @@ -101,7 +101,8 @@ public IoTDBDataNodeAsyncClientManager( final String loadTsFileStrategy, final boolean validateTsFile, final boolean shouldMarkAsPipeRequest, - final boolean isTSFileUsed) { + final boolean isTSFileUsed, + final boolean skipIfNoPrivileges) { super( endPoints, username, @@ -110,7 +111,8 @@ public IoTDBDataNodeAsyncClientManager( loadTsFileStrategy, useLeaderCache, validateTsFile, - shouldMarkAsPipeRequest); + shouldMarkAsPipeRequest, + skipIfNoPrivileges); endPointSet = new HashSet<>(endPoints); @@ -299,6 +301,9 @@ public void onError(final Exception e) { params.put( PipeTransferHandshakeConstant.HANDSHAKE_KEY_MARK_AS_PIPE_REQUEST, Boolean.toString(shouldMarkAsPipeRequest)); + params.put( + PipeTransferHandshakeConstant.HANDSHAKE_KEY_SKIP_IF, + Boolean.toString(skipIfNoPrivileges)); client.setTimeoutDynamically(PipeConfig.getInstance().getPipeConnectorHandshakeTimeoutMs()); client.pipeTransfer(PipeTransferDataNodeHandshakeV2Req.toTPipeTransferReq(params), callback); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/client/IoTDBDataNodeSyncClientManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/client/IoTDBDataNodeSyncClientManager.java index 2a05fe613780..abe56ff79a4d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/client/IoTDBDataNodeSyncClientManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/client/IoTDBDataNodeSyncClientManager.java @@ -54,7 +54,8 @@ public IoTDBDataNodeSyncClientManager( final boolean shouldReceiverConvertOnTypeMismatch, final String loadTsFileStrategy, final boolean validateTsFile, - final boolean shouldMarkAsPipeRequest) { + final boolean shouldMarkAsPipeRequest, + final boolean skipIfNoPrivileges) { super( endPoints, username, @@ -67,7 +68,8 @@ public IoTDBDataNodeSyncClientManager( shouldReceiverConvertOnTypeMismatch, loadTsFileStrategy, validateTsFile, - shouldMarkAsPipeRequest); + shouldMarkAsPipeRequest, + skipIfNoPrivileges); } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/airgap/IoTDBDataNodeAirGapSink.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/airgap/IoTDBDataNodeAirGapSink.java index c968558eaafd..3c19fa2e9783 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/airgap/IoTDBDataNodeAirGapSink.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/airgap/IoTDBDataNodeAirGapSink.java @@ -69,6 +69,8 @@ protected byte[] generateHandShakeV2Payload() throws IOException { params.put( PipeTransferHandshakeConstant.HANDSHAKE_KEY_MARK_AS_PIPE_REQUEST, Boolean.toString(shouldMarkAsPipeRequest)); + params.put( + PipeTransferHandshakeConstant.HANDSHAKE_KEY_SKIP_IF, Boolean.toString(skipIfNoPrivileges)); return PipeTransferDataNodeHandshakeV2Req.toTPipeTransferBytes(params); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/async/IoTDBDataRegionAsyncSink.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/async/IoTDBDataRegionAsyncSink.java index 2b57d94bfc36..b2518e95fd27 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/async/IoTDBDataRegionAsyncSink.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/async/IoTDBDataRegionAsyncSink.java @@ -157,7 +157,8 @@ public void customize( loadTsFileStrategy, loadTsFileValidation, shouldMarkAsPipeRequest, - false); + false, + skipIfNoPrivileges); transferTsFileClientManager = new IoTDBDataNodeAsyncClientManager( @@ -172,7 +173,8 @@ public void customize( loadTsFileStrategy, loadTsFileValidation, shouldMarkAsPipeRequest, - isSplitTSFileBatchModeEnabled); + isSplitTSFileBatchModeEnabled, + skipIfNoPrivileges); if (isTabletBatchModeEnabled) { tabletBatchBuilder = new PipeTransferBatchReqBuilder(parameters); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/sync/IoTDBDataNodeSyncSink.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/sync/IoTDBDataNodeSyncSink.java index 3e6c0ff83ead..5a97c716057a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/sync/IoTDBDataNodeSyncSink.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/sync/IoTDBDataNodeSyncSink.java @@ -60,7 +60,8 @@ protected IoTDBSyncClientManager constructClient( final boolean shouldReceiverConvertOnTypeMismatch, final String loadTsFileStrategy, final boolean validateTsFile, - final boolean shouldMarkAsPipeRequest) { + final boolean shouldMarkAsPipeRequest, + final boolean skipIfNoPrivileges) { clientManager = new IoTDBDataNodeSyncClientManager( nodeUrls, @@ -74,7 +75,8 @@ protected IoTDBSyncClientManager constructClient( shouldReceiverConvertOnTypeMismatch, loadTsFileStrategy, validateTsFile, - shouldMarkAsPipeRequest); + shouldMarkAsPipeRequest, + skipIfNoPrivileges); return clientManager; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java index 948afb1d563c..08bb95506994 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java @@ -48,6 +48,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TAINodeRestartReq; import org.apache.iotdb.confignode.rpc.thrift.TAINodeRestartResp; import org.apache.iotdb.confignode.rpc.thrift.TAddConsensusGroupReq; +import org.apache.iotdb.confignode.rpc.thrift.TAlterEncodingCompressorReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterLogicalViewReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterPipeReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterSchemaTemplateReq; @@ -996,6 +997,12 @@ public TSStatus alterSchemaTemplate(TAlterSchemaTemplateReq req) throws TExcepti () -> client.alterSchemaTemplate(req), status -> !updateConfigNodeLeader(status)); } + @Override + public TSStatus alterEncodingCompressor(TAlterEncodingCompressorReq req) throws TException { + return executeRemoteCallWithRetry( + () -> client.alterEncodingCompressor(req), status -> !updateConfigNodeLeader(status)); + } + @Override public TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req) throws TException { return executeRemoteCallWithRetry( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java index 9d837b6f8fb0..c04bf76b7275 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java @@ -72,6 +72,9 @@ import org.apache.iotdb.commons.trigger.TriggerInformation; import org.apache.iotdb.commons.udf.UDFInformation; import org.apache.iotdb.commons.udf.service.UDFManagementService; +import org.apache.iotdb.commons.utils.PathUtils; +import org.apache.iotdb.commons.utils.SerializeUtils; +import org.apache.iotdb.commons.utils.StatusUtils; import org.apache.iotdb.consensus.ConsensusFactory; import org.apache.iotdb.consensus.common.Peer; import org.apache.iotdb.consensus.exception.ConsensusException; @@ -127,6 +130,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.load.LoadTsFilePieceNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.DeactivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.DeleteTimeSeriesNode; @@ -169,6 +173,7 @@ import org.apache.iotdb.metrics.utils.SystemMetric; import org.apache.iotdb.mpp.rpc.thrift.IDataNodeRPCService; import org.apache.iotdb.mpp.rpc.thrift.TActiveTriggerInstanceReq; +import org.apache.iotdb.mpp.rpc.thrift.TAlterEncodingCompressorReq; import org.apache.iotdb.mpp.rpc.thrift.TAlterViewReq; import org.apache.iotdb.mpp.rpc.thrift.TCancelFragmentInstanceReq; import org.apache.iotdb.mpp.rpc.thrift.TCancelPlanFragmentReq; @@ -695,11 +700,11 @@ public TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req) throws TException { return executeInternalSchemaTask( req.getSchemaRegionIdList(), consensusGroupId -> { - String storageGroup = + String database = schemaEngine .getSchemaRegion(new SchemaRegionId(consensusGroupId.getId())) .getDatabaseFullPath(); - PathPatternTree filteredPatternTree = filterPathPatternTree(patternTree, storageGroup); + PathPatternTree filteredPatternTree = filterPathPatternTree(patternTree, database); if (filteredPatternTree.isEmpty()) { return RpcUtils.SUCCESS_STATUS; } @@ -715,6 +720,35 @@ public TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req) throws TException { }); } + @Override + public TSStatus alterEncodingCompressor(final TAlterEncodingCompressorReq req) throws TException { + final PathPatternTree patternTree = + PathPatternTree.deserialize(ByteBuffer.wrap(req.getPathPatternTree())); + return executeInternalSchemaTask( + req.getSchemaRegionIdList(), + consensusGroupId -> { + final String database = + schemaEngine + .getSchemaRegion(new SchemaRegionId(consensusGroupId.getId())) + .getDatabaseFullPath(); + final PathPatternTree filteredPatternTree = filterPathPatternTree(patternTree, database); + if (filteredPatternTree.isEmpty()) { + return RpcUtils.SUCCESS_STATUS; + } + final RegionWriteExecutor executor = new RegionWriteExecutor(); + return executor + .execute( + new SchemaRegionId(consensusGroupId.getId()), + new AlterEncodingCompressorNode( + new PlanNodeId(""), + filteredPatternTree, + req.isIfExists(), + SerializeUtils.deserializeEncodingNullable(req.getEncoding()), + SerializeUtils.deserializeCompressorNullable(req.getCompressor()))) + .getStatus(); + }); + } + @Override public TSStatus constructSchemaBlackListWithTemplate(TConstructSchemaBlackListWithTemplateReq req) throws TException { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigTaskVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigTaskVisitor.java index 7a0556007ca3..0660967c7847 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigTaskVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigTaskVisitor.java @@ -21,6 +21,7 @@ import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; +import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.AlterEncodingCompressorTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.CountDatabaseTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.CountTimeSlotListTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.CreateContinuousQueryTask; @@ -103,6 +104,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.Statement; import org.apache.iotdb.db.queryengine.plan.statement.StatementNode; import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor; +import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterEncodingCompressorStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDatabaseStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountTimeSlotListStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CreateContinuousQueryStatement; @@ -212,14 +214,13 @@ public IConfigTask visitAlterDatabase( } @Override - public IConfigTask visitDeleteStorageGroup( + public IConfigTask visitDeleteDatabase( DeleteDatabaseStatement statement, MPPQueryContext context) { return new DeleteStorageGroupTask(statement); } @Override - public IConfigTask visitShowStorageGroup( - ShowDatabaseStatement statement, MPPQueryContext context) { + public IConfigTask visitShowDatabase(ShowDatabaseStatement statement, MPPQueryContext context) { return new ShowDatabaseTask(statement); } @@ -547,6 +548,13 @@ public IConfigTask visitDropSubscription( return new DropSubscriptionTask(dropSubscriptionStatement); } + @Override + public IConfigTask visitAlterEncodingCompressor( + AlterEncodingCompressorStatement alterEncodingCompressorStatement, MPPQueryContext context) { + return new AlterEncodingCompressorTask( + context.getQueryId().getId(), alterEncodingCompressorStatement); + } + @Override public IConfigTask visitDeleteTimeSeries( DeleteTimeSeriesStatement deleteTimeSeriesStatement, MPPQueryContext context) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java index 1ca57bea55fd..9da6a1d1531e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -62,7 +62,11 @@ import org.apache.iotdb.commons.udf.service.UDFClassLoader; import org.apache.iotdb.commons.udf.service.UDFExecutableManager; import org.apache.iotdb.commons.utils.CommonDateTimeUtils; +import org.apache.iotdb.commons.utils.PathUtils; +import org.apache.iotdb.commons.utils.SerializeUtils; import org.apache.iotdb.commons.utils.TimePartitionUtils; +import org.apache.iotdb.confignode.rpc.thrift.TAINodeRemoveReq; +import org.apache.iotdb.confignode.rpc.thrift.TAlterEncodingCompressorReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterLogicalViewReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterPipeReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterSchemaTemplateReq; @@ -183,6 +187,13 @@ import org.apache.iotdb.db.queryengine.plan.expression.Expression; import org.apache.iotdb.db.queryengine.plan.expression.visitor.TransformToViewExpressionVisitor; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.view.AlterLogicalViewNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.view.AlterLogicalViewNode; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DeleteDevice; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropDB; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCluster; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowDB; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Use; +import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterEncodingCompressorStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDatabaseStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountTimeSlotListStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CreateContinuousQueryStatement; @@ -2361,6 +2372,60 @@ public SettableFuture showTopics(ShowTopicsStatement showTopic return future; } + @Override + public SettableFuture alterEncodingCompressor( + final String queryId, + final AlterEncodingCompressorStatement alterEncodingCompressorStatement) { + final SettableFuture future = SettableFuture.create(); + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); + try { + alterEncodingCompressorStatement.getPatternTree().serialize(dataOutputStream); + } catch (final IOException ignored) { + // memory operation, won't happen + } + final TAlterEncodingCompressorReq req = + new TAlterEncodingCompressorReq( + queryId, + ByteBuffer.wrap(byteArrayOutputStream.toByteArray()), + SerializeUtils.serializeNullable(alterEncodingCompressorStatement.getEncoding()), + SerializeUtils.serializeNullable(alterEncodingCompressorStatement.getCompressor()), + alterEncodingCompressorStatement.ifExists(), + alterEncodingCompressorStatement.isWithAudit()); + try (final ConfigNodeClient client = + CLUSTER_DELETION_CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { + TSStatus tsStatus; + do { + try { + tsStatus = client.alterEncodingCompressor(req); + } catch (final TTransportException e) { + if (e.getType() == TTransportException.TIMED_OUT + || e.getCause() instanceof SocketTimeoutException) { + // time out mainly caused by slow execution, wait until + tsStatus = RpcUtils.getStatus(TSStatusCode.OVERLAP_WITH_EXISTING_TASK); + } else { + throw e; + } + } + // keep waiting until task ends + } while (TSStatusCode.OVERLAP_WITH_EXISTING_TASK.getStatusCode() == tsStatus.getCode()); + + if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { + if (tsStatus.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()) { + future.setException( + new BatchProcessException(tsStatus.subStatus.toArray(new TSStatus[0]))); + } else { + future.setException(new IoTDBException(tsStatus)); + } + } else { + future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); + } + } catch (final ClientManagerException | TException e) { + future.setException(e); + } + return future; + } + @Override public SettableFuture deleteTimeSeries( String queryId, DeleteTimeSeriesStatement deleteTimeSeriesStatement) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java index b663017fadd9..bb1c2819ac38 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java @@ -29,6 +29,17 @@ import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.view.AlterLogicalViewNode; +import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ExtendRegionTask; +import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.MigrateRegionTask; +import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ReconstructRegionTask; +import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.RemoveRegionTask; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.view.AlterLogicalViewNode; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DeleteDevice; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropDB; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCluster; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowDB; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Use; +import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterEncodingCompressorStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDatabaseStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountTimeSlotListStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CreateContinuousQueryStatement; @@ -208,6 +219,9 @@ SettableFuture dropSubscription( SettableFuture showTopics(ShowTopicsStatement showTopicsStatement); + SettableFuture alterEncodingCompressor( + String queryId, AlterEncodingCompressorStatement alterEncodingCompressorStatement); + SettableFuture deleteTimeSeries( String queryId, DeleteTimeSeriesStatement deleteTimeSeriesStatement); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/AlterEncodingCompressorTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/AlterEncodingCompressorTask.java new file mode 100644 index 000000000000..21a878397bf6 --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/AlterEncodingCompressorTask.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.db.queryengine.plan.execution.config.metadata; + +import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult; +import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask; +import org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor; +import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterEncodingCompressorStatement; + +import com.google.common.util.concurrent.ListenableFuture; + +public class AlterEncodingCompressorTask implements IConfigTask { + + private final String queryId; + + private final AlterEncodingCompressorStatement alterEncodingCompressorStatement; + + public AlterEncodingCompressorTask( + final String queryId, + final AlterEncodingCompressorStatement alterEncodingCompressorStatement) { + this.queryId = queryId; + this.alterEncodingCompressorStatement = alterEncodingCompressorStatement; + } + + @Override + public ListenableFuture execute(final IConfigTaskExecutor configTaskExecutor) + throws InterruptedException { + return configTaskExecutor.alterEncodingCompressor(queryId, alterEncodingCompressorStatement); + } +} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java index 62e7e803b5e9..f37708c0a8c5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java @@ -29,6 +29,7 @@ import org.apache.iotdb.commons.cq.TimeoutPolicy; import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.schema.cache.CacheClearOptions; import org.apache.iotdb.commons.schema.filter.SchemaFilter; import org.apache.iotdb.commons.schema.filter.SchemaFilterFactory; @@ -128,6 +129,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.literal.Literal; import org.apache.iotdb.db.queryengine.plan.statement.literal.LongLiteral; import org.apache.iotdb.db.queryengine.plan.statement.literal.StringLiteral; +import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterEncodingCompressorStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterTimeSeriesStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDatabaseStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDevicesStatement; @@ -255,6 +257,7 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -264,6 +267,9 @@ import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; +import static org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_TIMESERIES_COMPRESSION; +import static org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_TIMESERIES_COMPRESSOR; +import static org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_TIMESERIES_ENCODING; import static org.apache.iotdb.commons.schema.SchemaConstant.ALL_RESULT_NODES; import static org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.canPushDownLimitOffsetToGroupByTime; import static org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.pushDownLimitOffsetToTimeParameter; @@ -418,13 +424,11 @@ private void checkPropsInCreateTimeSeries(CreateTimeSeriesStatement createTimeSe final IoTDBDescriptor ioTDBDescriptor = IoTDBDescriptor.getInstance(); createTimeSeriesStatement.setEncoding( ioTDBDescriptor.getDefaultEncodingByType(createTimeSeriesStatement.getDataType())); - if (props != null - && props.containsKey(IoTDBConstant.COLUMN_TIMESERIES_ENCODING.toLowerCase())) { - String encodingString = - props.get(IoTDBConstant.COLUMN_TIMESERIES_ENCODING.toLowerCase()).toUpperCase(); + if (props != null && props.containsKey(COLUMN_TIMESERIES_ENCODING.toLowerCase())) { + String encodingString = props.get(COLUMN_TIMESERIES_ENCODING.toLowerCase()).toUpperCase(); try { createTimeSeriesStatement.setEncoding(TSEncoding.valueOf(encodingString)); - props.remove(IoTDBConstant.COLUMN_TIMESERIES_ENCODING.toLowerCase()); + props.remove(COLUMN_TIMESERIES_ENCODING.toLowerCase()); } catch (Exception e) { throw new SemanticException(String.format("Unsupported encoding: %s", encodingString)); } @@ -481,13 +485,12 @@ public void parseAttributeClausesForCreateAlignedTimeSeries( } TSEncoding encoding = IoTDBDescriptor.getInstance().getDefaultEncodingByType(dataType); - if (props.containsKey(IoTDBConstant.COLUMN_TIMESERIES_ENCODING.toLowerCase())) { - String encodingString = - props.get(IoTDBConstant.COLUMN_TIMESERIES_ENCODING.toLowerCase()).toUpperCase(); + if (props.containsKey(COLUMN_TIMESERIES_ENCODING.toLowerCase())) { + String encodingString = props.get(COLUMN_TIMESERIES_ENCODING.toLowerCase()).toUpperCase(); try { encoding = TSEncoding.valueOf(encodingString); createAlignedTimeSeriesStatement.addEncoding(encoding); - props.remove(IoTDBConstant.COLUMN_TIMESERIES_ENCODING.toLowerCase()); + props.remove(COLUMN_TIMESERIES_ENCODING.toLowerCase()); } catch (Exception e) { throw new SemanticException(String.format("unsupported encoding: %s", encodingString)); } @@ -621,6 +624,46 @@ public void parseAliasClause( } } + @Override + public Statement visitAlterEncodingCompressor( + final IoTDBSqlParser.AlterEncodingCompressorContext ctx) { + final PathPatternTree tree = new PathPatternTree(); + ctx.prefixPath().forEach(path -> tree.appendPathPattern(parsePrefixPath(path))); + tree.constructTree(); + TSEncoding encoding = null; + CompressionType compressor = null; + for (final IoTDBSqlParser.AttributePairContext pair : ctx.attributePair()) { + final String key = parseAttributeKey(pair.key).toLowerCase(Locale.ENGLISH); + final String value = parseAttributeValue(pair.value).toUpperCase(Locale.ENGLISH); + switch (key) { + case COLUMN_TIMESERIES_ENCODING: + try { + encoding = TSEncoding.valueOf(value); + } catch (final Exception e) { + throw new SemanticException(String.format("Unsupported encoding: %s", value)); + } + break; + case COLUMN_TIMESERIES_COMPRESSOR: + case COLUMN_TIMESERIES_COMPRESSION: + try { + compressor = CompressionType.valueOf(value); + } catch (final Exception e) { + throw new SemanticException(String.format("Unsupported compressor: %s", value)); + } + break; + default: + throw new SemanticException(String.format("property %s is unsupported yet.", key)); + } + } + + return new AlterEncodingCompressorStatement( + tree, + encoding, + compressor, + Objects.nonNull(ctx.EXISTS()), + Objects.nonNull(ctx.PERMITTED())); + } + // Drop Timeseries ====================================================================== @Override @@ -3640,13 +3683,12 @@ void parseAttributeClauseForSchemaTemplate( } TSEncoding encoding = IoTDBDescriptor.getInstance().getDefaultEncodingByType(dataType); - if (props.containsKey(IoTDBConstant.COLUMN_TIMESERIES_ENCODING.toLowerCase())) { - String encodingString = - props.get(IoTDBConstant.COLUMN_TIMESERIES_ENCODING.toLowerCase()).toUpperCase(); + if (props.containsKey(COLUMN_TIMESERIES_ENCODING.toLowerCase())) { + String encodingString = props.get(COLUMN_TIMESERIES_ENCODING.toLowerCase()).toUpperCase(); try { encoding = TSEncoding.valueOf(encodingString); encodings.add(encoding); - props.remove(IoTDBConstant.COLUMN_TIMESERIES_ENCODING.toLowerCase()); + props.remove(COLUMN_TIMESERIES_ENCODING.toLowerCase()); } catch (Exception e) { throw new SemanticException(String.format("Unsupported encoding: %s", encodingString)); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java index 6033233abbdb..8f80e349031a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java @@ -38,6 +38,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesCountNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesSchemaScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ActivateTemplateNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; @@ -227,6 +228,7 @@ public enum PlanNodeType { CONTINUOUS_SAME_SEARCH_INDEX_SEPARATOR((short) 97), LAST_QUERY_SCAN((short) 98), + ALTER_ENCODING_COMPRESSOR((short) 99), ; public static final int BYTES = Short.BYTES; @@ -482,6 +484,8 @@ public static PlanNode deserialize(ByteBuffer buffer, short nodeType) { "You should never see ContinuousSameSearchIndexSeparatorNode in this function, because ContinuousSameSearchIndexSeparatorNode should never be used in network transmission."); case 98: return LastQueryScanNode.deserialize(buffer); + case 99: + return AlterEncodingCompressorNode.deserialize(buffer); default: throw new IllegalArgumentException("Invalid node type: " + nodeType); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java index f018817ffe65..8e9215e010bc 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java @@ -35,6 +35,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesCountNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesSchemaScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ActivateTemplateNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; @@ -454,6 +455,10 @@ public R visitDeleteTimeseries(DeleteTimeSeriesNode node, C context) { return visitPlan(node, context); } + public R visitAlterEncodingCompressor(AlterEncodingCompressorNode node, C context) { + return visitPlan(node, context); + } + public R visitConstructSchemaBlackList(ConstructSchemaBlackListNode node, C context) { return visitPlan(node, context); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementType.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementType.java index 4d5fe5dbf3fb..6db9862e3cad 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementType.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementType.java @@ -56,6 +56,7 @@ public enum StatementType { CREATE_MULTI_TIME_SERIES, DELETE_TIME_SERIES, ALTER_TIME_SERIES, + ALTER_ENCODING_COMPRESSOR, CHANGE_ALIAS, CHANGE_TAG_OFFSET, diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java index 1792d4eb2687..fa81e12036f5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java @@ -33,6 +33,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.internal.InternalCreateMultiTimeSeriesStatement; import org.apache.iotdb.db.queryengine.plan.statement.internal.InternalCreateTimeSeriesStatement; import org.apache.iotdb.db.queryengine.plan.statement.internal.SeriesSchemaFetchStatement; +import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterEncodingCompressorStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterTimeSeriesStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDatabaseStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDevicesStatement; @@ -185,11 +186,16 @@ public R visitAlterTimeSeries(AlterTimeSeriesStatement alterTimeSeriesStatement, return visitStatement(alterTimeSeriesStatement, context); } + public R visitAlterEncodingCompressor( + AlterEncodingCompressorStatement alterEncodingCompressorStatement, C context) { + return visitStatement(alterEncodingCompressorStatement, context); + } + public R visitDeleteTimeSeries(DeleteTimeSeriesStatement deleteTimeSeriesStatement, C context) { return visitStatement(deleteTimeSeriesStatement, context); } - public R visitDeleteStorageGroup(DeleteDatabaseStatement deleteDatabaseStatement, C context) { + public R visitDeleteDatabase(DeleteDatabaseStatement deleteDatabaseStatement, C context) { return visitStatement(deleteDatabaseStatement, context); } @@ -353,7 +359,7 @@ public R visitAuthor(AuthorStatement authorStatement, C context) { return visitStatement(authorStatement, context); } - public R visitShowStorageGroup(ShowDatabaseStatement showDatabaseStatement, C context) { + public R visitShowDatabase(ShowDatabaseStatement showDatabaseStatement, C context) { return visitStatement(showDatabaseStatement, context); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java new file mode 100644 index 000000000000..a8dd88841a43 --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.db.queryengine.plan.statement.metadata; + +import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; +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; +import org.apache.iotdb.db.queryengine.plan.statement.StatementType; +import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor; + +import org.apache.tsfile.file.metadata.enums.CompressionType; +import org.apache.tsfile.file.metadata.enums.TSEncoding; + +import java.util.List; +import java.util.Objects; + +public class AlterEncodingCompressorStatement extends Statement implements IConfigStatement { + + private PathPatternTree patternTree; + private final TSEncoding encoding; + private final CompressionType compressor; + private final boolean ifExists; + private final boolean ifPermitted; + private boolean withAudit = false; + + public AlterEncodingCompressorStatement( + final PathPatternTree pathPatternTree, + final TSEncoding encoding, + final CompressionType compressor, + final boolean ifExists, + final boolean ifPermitted) { + statementType = StatementType.ALTER_ENCODING_COMPRESSOR; + this.patternTree = pathPatternTree; + this.encoding = encoding; + this.compressor = compressor; + this.ifExists = ifExists; + this.ifPermitted = ifPermitted; + } + + public TSEncoding getEncoding() { + return encoding; + } + + public CompressionType getCompressor() { + return compressor; + } + + public PathPatternTree getPatternTree() { + return patternTree; + } + + public void setPatternTree(final PathPatternTree patternTree) { + this.patternTree = patternTree; + } + + public boolean ifExists() { + return ifExists; + } + + public boolean ifPermitted() { + return ifPermitted; + } + + public void setWithAudit(final boolean withAudit) { + this.withAudit = withAudit; + } + + public boolean isWithAudit() { + return withAudit; + } + + @Override + public List getPaths() { + return patternTree.getAllPathPatterns(); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + final AlterEncodingCompressorStatement that = (AlterEncodingCompressorStatement) obj; + return Objects.equals(this.patternTree, that.patternTree) + && Objects.equals(this.encoding, that.encoding) + && Objects.equals(this.compressor, that.compressor) + && Objects.equals(this.ifExists, that.ifExists) + && Objects.equals(this.ifPermitted, that.ifPermitted); + } + + @Override + public int hashCode() { + return Objects.hash(patternTree, encoding, compressor, ifExists, ifPermitted); + } + + @Override + public R accept(final StatementVisitor visitor, final C context) { + return visitor.visitAlterEncodingCompressor(this, context); + } + + @Override + public QueryType getQueryType() { + return QueryType.WRITE; + } +} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DeleteDatabaseStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DeleteDatabaseStatement.java index dadc186da4cf..028c983af1c2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DeleteDatabaseStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DeleteDatabaseStatement.java @@ -77,7 +77,7 @@ public List getPrefixPath() { @Override public R accept(StatementVisitor visitor, C context) { - return visitor.visitDeleteStorageGroup(this, context); + return visitor.visitDeleteDatabase(this, context); } public void setPrefixPath(List prefixPathList) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java index 356336bf5ad7..ec6f7e8f0122 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java @@ -116,7 +116,7 @@ public void buildTSBlock( @Override public R accept(StatementVisitor visitor, C context) { - return visitor.visitShowStorageGroup(this, context); + return visitor.visitShowDatabase(this, context); } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java index 12630a147c0d..701821051f53 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java @@ -27,6 +27,17 @@ import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.exception.metadata.SchemaQuotaExceededException; import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TableId; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.metric.ISchemaRegionMetric; import org.apache.iotdb.db.schemaengine.rescon.ISchemaRegionStatistics; import org.apache.iotdb.db.schemaengine.schemaregion.read.req.IShowDevicesPlan; @@ -182,6 +193,8 @@ Pair constructSchemaBlackList(final PathPatternTree patternTree) */ void deleteTimeseriesInBlackList(PathPatternTree patternTree) throws MetadataException; + void alterEncodingCompressor(final AlterEncodingCompressorNode node) throws MetadataException; + // endregion // region Interfaces for Logical View diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java index 09a69f2b4f69..f101dc33a2a9 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java @@ -39,6 +39,8 @@ public enum SchemaRegionPlanType { ACTIVATE_TEMPLATE_IN_CLUSTER((byte) 63), PRE_DELETE_TIMESERIES_IN_CLUSTER((byte) 64), ROLLBACK_PRE_DELETE_TIMESERIES((byte) 65), + ALTER_ENCODING_COMPRESSOR((byte) 66), + // endregion PRE_DEACTIVATE_TEMPLATE((byte) 0), diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java index 292d8501fcc2..46b93cb04282 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java @@ -19,6 +19,16 @@ package org.apache.iotdb.db.schemaengine.schemaregion; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.IActivateTemplateInClusterPlan; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.IAutoCreateDeviceMNodePlan; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.IChangeAliasPlan; @@ -116,4 +126,9 @@ public R visitRollbackPreDeleteLogicalView( public R visitDeleteLogicalView(IDeleteLogicalViewPlan deleteLogicalViewPlan, C context) { return visitSchemaRegionPlan(deleteLogicalViewPlan, context); } + + public R visitAlterEncodingCompressor( + final AlterEncodingCompressorNode alterEncodingCompressorNode, final C context) { + return visitSchemaRegionPlan(alterEncodingCompressorNode, context); + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java index 06a00c64e033..c587a5f0923c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java @@ -34,10 +34,12 @@ import org.apache.iotdb.consensus.ConsensusFactory; import org.apache.iotdb.db.conf.IoTDBConfig; import org.apache.iotdb.db.conf.IoTDBDescriptor; +import org.apache.iotdb.db.exception.metadata.PathNotExistException; import org.apache.iotdb.db.exception.metadata.SchemaDirCreationFailureException; import org.apache.iotdb.db.exception.metadata.SchemaQuotaExceededException; import org.apache.iotdb.db.exception.metadata.SeriesOverflowException; import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode; import org.apache.iotdb.db.schemaengine.metric.ISchemaRegionMetric; import org.apache.iotdb.db.schemaengine.metric.SchemaRegionMemMetric; @@ -825,21 +827,36 @@ public Set fetchSchemaBlackList(PathPatternTree patternTree) } @Override - public void deleteTimeseriesInBlackList(PathPatternTree patternTree) throws MetadataException { - for (PartialPath pathPattern : patternTree.getAllPathPatterns()) { - for (PartialPath path : mtree.getPreDeletedTimeseries(pathPattern)) { + public void deleteTimeseriesInBlackList(final PathPatternTree patternTree) + throws MetadataException { + for (final PartialPath pathPattern : patternTree.getAllPathPatterns()) { + for (final PartialPath path : mtree.getPreDeletedTimeseries(pathPattern)) { try { deleteSingleTimeseriesInBlackList(path); writeToMLog( SchemaRegionWritePlanFactory.getDeleteTimeSeriesPlan( Collections.singletonList(path))); - } catch (IOException e) { + } catch (final IOException e) { throw new MetadataException(e); } } } } + @Override + public void alterEncodingCompressor(final AlterEncodingCompressorNode node) + throws MetadataException { + boolean exist = false; + for (final PartialPath pathPattern : node.getPatternTree().getAllPathPatterns()) { + exist |= + mTree.alterEncodingCompressor(pathPattern, node.getEncoding(), node.getCompressionType()); + } + if (!exist) { + throw new PathNotExistException(node.getPatternTree().getAllPathPatterns().toString(), false); + } + writeToMLog(node); + } + @Override public void createLogicalView(ICreateLogicalViewPlan plan) throws MetadataException { if (!regionStatistics.isAllowToCreateNewSeries()) { @@ -1576,5 +1593,17 @@ public RecoverOperationResult visitDeleteLogicalView( return new RecoverOperationResult(e); } } + + @Override + public RecoverOperationResult visitAlterEncodingCompressor( + final AlterEncodingCompressorNode alterEncodingCompressorNode, + final SchemaRegionMemoryImpl context) { + try { + alterEncodingCompressor(alterEncodingCompressorNode); + return RecoverOperationResult.SUCCESS; + } catch (final MetadataException e) { + return new RecoverOperationResult(e); + } + } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java index 7c05e864b81f..97c58aa82220 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java @@ -38,6 +38,17 @@ import org.apache.iotdb.db.exception.metadata.SchemaDirCreationFailureException; import org.apache.iotdb.db.exception.metadata.SchemaQuotaExceededException; import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TableId; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.metric.ISchemaRegionMetric; import org.apache.iotdb.db.schemaengine.metric.SchemaRegionCachedMetric; import org.apache.iotdb.db.schemaengine.rescon.CachedSchemaRegionStatistics; @@ -925,6 +936,13 @@ public void deleteTimeseriesInBlackList(PathPatternTree patternTree) throws Meta } } + @Override + public void alterEncodingCompressor(final AlterEncodingCompressorNode node) + throws MetadataException { + throw new UnsupportedOperationException( + "PBTree does not support altering encoding and compressor yet."); + } + @Override public void createLogicalView(ICreateLogicalViewPlan plan) throws MetadataException { while (!regionStatistics.isAllowToCreateNewSeries()) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java index 4c8c3120e411..609fab0963e7 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java @@ -23,6 +23,17 @@ import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.path.PathDeserializeUtil; import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegionPlan; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanType; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanVisitor; @@ -395,5 +406,11 @@ public ISchemaRegionPlan visitAlterLogicalView( alterLogicalViewPlan.setSourceExpression(ViewExpression.deserialize(buffer)); return alterLogicalViewPlan; } + + @Override + public ISchemaRegionPlan visitAlterEncodingCompressor( + final AlterEncodingCompressorNode alterEncodingCompressorNode, final ByteBuffer buffer) { + return (AlterEncodingCompressorNode) PlanNodeType.deserialize(buffer); + } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java index a7930b1fd3d7..928b79e7c1f0 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java @@ -21,6 +21,17 @@ import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegionPlan; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanVisitor; import org.apache.iotdb.db.schemaengine.schemaregion.logfile.ISerializer; @@ -475,5 +486,22 @@ public SchemaRegionPlanSerializationResult visitAlterLogicalView( return new SchemaRegionPlanSerializationResult(e); } } + + @Override + public SchemaRegionPlanSerializationResult visitAlterEncodingCompressor( + final AlterEncodingCompressorNode alterEncodingCompressorNode, + final DataOutputStream outputStream) { + return visitPlanNode(alterEncodingCompressorNode, outputStream); + } + + private SchemaRegionPlanSerializationResult visitPlanNode( + final PlanNode planNode, final DataOutputStream outputStream) { + try { + planNode.serialize(outputStream); + return SchemaRegionPlanSerializationResult.SUCCESS; + } catch (final IOException e) { + return new SchemaRegionPlanSerializationResult(e); + } + } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java index f8d2bd2316a5..7c6c349a7e8f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java @@ -69,6 +69,7 @@ import org.apache.iotdb.db.schemaengine.schemaregion.utils.filter.DeviceFilterVisitor; import org.apache.iotdb.db.schemaengine.template.Template; import org.apache.iotdb.db.storageengine.rescon.quotas.DataNodeSpaceQuotaManager; +import org.apache.iotdb.db.utils.SchemaUtils; import org.apache.iotdb.rpc.TSStatusCode; import com.google.common.util.concurrent.ListenableFuture; @@ -638,6 +639,38 @@ protected Void collectMeasurement(IMeasurementMNode node) { return result; } + public boolean alterEncodingCompressor( + final PartialPath pathPattern, final TSEncoding encoding, final CompressionType compressor) + throws MetadataException { + final boolean[] exist = {false}; + try (final MeasurementUpdater collector = + new MeasurementUpdater( + rootNode, pathPattern, store, false, SchemaConstant.ALL_MATCH_SCOPE) { + @Override + protected void updateMeasurement(final IMeasurementMNode node) + throws MetadataException { + if (node.isLogicalView()) { + return; + } + exist[0] = true; + final IMeasurementSchema schema = node.getSchema(); + if (Objects.nonNull(encoding)) { + SchemaUtils.checkDataTypeWithEncoding(node.getDataType(), encoding); + } + node.setSchema( + new MeasurementSchema( + schema.getMeasurementName(), + schema.getType(), + Objects.nonNull(encoding) ? encoding : schema.getEncodingType(), + Objects.nonNull(compressor) ? compressor : schema.getCompressor(), + schema.getProps())); + } + }) { + collector.traverse(); + } + return exist[0]; + } + // TODO: seems useless public Set getDevicesOfPreDeletedTimeseries(PartialPath pathPattern) throws MetadataException { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java index 42a2c530e2ac..8e1236f756ca 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java @@ -21,6 +21,16 @@ import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegionPlan; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanType; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.impl.ActivateTemplateInClusterPlanImpl; @@ -77,6 +87,8 @@ public static ISchemaRegionPlan getEmptyPlan(final SchemaRegionPlanType planType return new PreDeleteTimeSeriesPlanImpl(); case ROLLBACK_PRE_DELETE_TIMESERIES: return new RollbackPreDeleteTimeSeriesPlanImpl(); + case ALTER_ENCODING_COMPRESSOR: + return AlterEncodingCompressorNode.MOCK_INSTANCE; case PRE_DEACTIVATE_TEMPLATE: return new PreDeactivateTemplatePlanImpl(); case ROLLBACK_PRE_DEACTIVATE_TEMPLATE: diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/MetadataException.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/MetadataException.java index 3a83a6310f54..5229c9716302 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/MetadataException.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/MetadataException.java @@ -45,7 +45,7 @@ public MetadataException(String msg, boolean isUserException) { } public MetadataException(String message, Throwable cause) { - super(message + cause.getMessage(), TSStatusCode.METADATA_ERROR.getStatusCode()); + super(message, cause, TSStatusCode.METADATA_ERROR.getStatusCode()); } public MetadataException(IoTDBException exception) { diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java index 89ae7444d19f..44dce4ef5788 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java @@ -234,6 +234,13 @@ void serializeChildren(DataOutputStream outputStream) throws IOException { } } + void clear() { + if (Objects.nonNull(valueSet)) { + valueSet.clear(); + } + children.clear(); + } + public static > PathPatternNode deserializeNode( ByteBuffer buffer, T serializer, Consumer nodeNameProcessor) { PathPatternNode node = diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java index 3b40a3b2ae20..ca449056a4df 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java @@ -94,9 +94,17 @@ public void appendFullPath(PartialPath devicePath, String measurement) { appendBranchWithoutPrune(root, pathNodes, 0); } + public void appendPathPattern(final PartialPath pathPattern) { + appendPathPattern(pathPattern, false); + } + /** Add a pathPattern (may contain wildcards) to pathPatternList. */ - public void appendPathPattern(PartialPath pathPattern) { + public void appendPathPattern(final PartialPath pathPattern, final boolean isReload) { if (useWildcard) { + // This does not guarantee multi-thread safety + if (isReload && (pathPatternList == null || pathPatternList.isEmpty())) { + pathPatternList = getAllPathPatterns(); + } boolean isExist = false; for (PartialPath path : pathPatternList) { if (path.include(pathPattern)) { @@ -110,6 +118,9 @@ public void appendPathPattern(PartialPath pathPattern) { pathPatternList.removeIf(pathPattern::include); pathPatternList.add(pathPattern); } + if (isReload) { + root.clear(); + } } else { appendBranchWithoutPrune(root, pathPattern.getNodes(), 0); } diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/IoTDBFileReceiver.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/IoTDBFileReceiver.java index 65283916939e..4f0dd552778e 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/IoTDBFileReceiver.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/receiver/IoTDBFileReceiver.java @@ -93,6 +93,7 @@ public abstract class IoTDBFileReceiver implements IoTDBReceiver { protected final AtomicBoolean validateTsFile = new AtomicBoolean(true); protected final AtomicBoolean shouldMarkAsPipeRequest = new AtomicBoolean(true); + protected final AtomicBoolean skipIfNoPrivileges = new AtomicBoolean(false); @Override public IoTDBSinkRequestVersion getVersion() { @@ -326,6 +327,11 @@ protected TPipeTransferResp handleTransferHandshakeV2(final PipeTransferHandshak .getOrDefault( PipeTransferHandshakeConstant.HANDSHAKE_KEY_MARK_AS_PIPE_REQUEST, "true"))); + skipIfNoPrivileges.set( + Boolean.parseBoolean( + req.getParams() + .getOrDefault(PipeTransferHandshakeConstant.HANDSHAKE_KEY_SKIP_IF, "false"))); + // Handle the handshake request as a v1 request. // Here we construct a fake "dataNode" request to valid from v1 validation logic, though // it may not require the actual type of the v1 request. diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/client/IoTDBClientManager.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/client/IoTDBClientManager.java index 118f2f268763..19449a3048e5 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/client/IoTDBClientManager.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/client/IoTDBClientManager.java @@ -48,6 +48,7 @@ public abstract class IoTDBClientManager { protected final boolean useLeaderCache; protected final boolean shouldMarkAsPipeRequest; + protected final boolean skipIfNoPrivileges; // This flag indicates whether the receiver supports mods transferring if // it is a DataNode receiver. The flag is useless for configNode receiver. @@ -66,7 +67,8 @@ protected IoTDBClientManager( final String loadTsFileStrategy, boolean useLeaderCache, final boolean validateTsFile, - final boolean shouldMarkAsPipeRequest) { + final boolean shouldMarkAsPipeRequest, + final boolean skipIfNoPrivileges) { this.endPointList = endPointList; this.username = username; this.password = password; @@ -75,6 +77,7 @@ protected IoTDBClientManager( this.useLeaderCache = useLeaderCache; this.validateTsFile = validateTsFile; this.shouldMarkAsPipeRequest = shouldMarkAsPipeRequest; + this.skipIfNoPrivileges = skipIfNoPrivileges; } public boolean supportModsIfIsDataNodeReceiver() { diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/client/IoTDBSyncClientManager.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/client/IoTDBSyncClientManager.java index 7dc92b8cba24..9aea012eb8d9 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/client/IoTDBSyncClientManager.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/client/IoTDBSyncClientManager.java @@ -76,7 +76,8 @@ protected IoTDBSyncClientManager( boolean shouldReceiverConvertOnTypeMismatch, String loadTsFileStrategy, boolean validateTsFile, - boolean shouldMarkAsPipeRequest) { + boolean shouldMarkAsPipeRequest, + final boolean skipIfNoPrivileges) { super( endPoints, username, @@ -85,7 +86,8 @@ protected IoTDBSyncClientManager( loadTsFileStrategy, useLeaderCache, validateTsFile, - shouldMarkAsPipeRequest); + shouldMarkAsPipeRequest, + skipIfNoPrivileges); this.useSSL = useSSL; this.trustStorePath = trustStorePath; @@ -237,6 +239,9 @@ public void sendHandshakeReq(final Pair clientAndStatu params.put( PipeTransferHandshakeConstant.HANDSHAKE_KEY_MARK_AS_PIPE_REQUEST, Boolean.toString(shouldMarkAsPipeRequest)); + params.put( + PipeTransferHandshakeConstant.HANDSHAKE_KEY_SKIP_IF, + Boolean.toString(skipIfNoPrivileges)); // Try to handshake by PipeTransferHandshakeV2Req. TPipeTransferResp resp = client.pipeTransfer(buildHandshakeV2Req(params)); diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/payload/thrift/common/PipeTransferHandshakeConstant.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/payload/thrift/common/PipeTransferHandshakeConstant.java index 8976a25c5cc1..cc3dd79e33b0 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/payload/thrift/common/PipeTransferHandshakeConstant.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/payload/thrift/common/PipeTransferHandshakeConstant.java @@ -29,6 +29,7 @@ public class PipeTransferHandshakeConstant { public static final String HANDSHAKE_KEY_PASSWORD = "password"; public static final String HANDSHAKE_KEY_VALIDATE_TSFILE = "validateTsFile"; public static final String HANDSHAKE_KEY_MARK_AS_PIPE_REQUEST = "markAsPipeRequest"; + public static final String HANDSHAKE_KEY_SKIP_IF = "skipIf"; private PipeTransferHandshakeConstant() { // Utility class diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/protocol/IoTDBSink.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/protocol/IoTDBSink.java index 0668f7cc99bd..73d740e5285d 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/protocol/IoTDBSink.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/protocol/IoTDBSink.java @@ -159,6 +159,7 @@ public abstract class IoTDBSink implements PipeConnector { protected boolean loadTsFileValidation; protected boolean shouldMarkAsPipeRequest; + protected boolean skipIfNoPrivileges; private boolean isRpcCompressionEnabled; private final List compressors = new ArrayList<>(); @@ -420,7 +421,7 @@ public void customize( .filter(s -> !s.isEmpty()) .map(String::toLowerCase) .collect(Collectors.toSet()); - boolean skipIfNoPrivileges = skipIfOptionSet.remove(CONNECTOR_IOTDB_SKIP_IF_NO_PRIVILEGES); + skipIfNoPrivileges = skipIfOptionSet.remove(CONNECTOR_IOTDB_SKIP_IF_NO_PRIVILEGES); if (!skipIfOptionSet.isEmpty()) { throw new PipeParameterNotValidException( String.format("Parameters in set %s are not allowed in 'skipif'", skipIfOptionSet)); diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/protocol/IoTDBSslSyncSink.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/protocol/IoTDBSslSyncSink.java index 080efd25846d..a4629072f34a 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/protocol/IoTDBSslSyncSink.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/sink/protocol/IoTDBSslSyncSink.java @@ -135,7 +135,8 @@ public void customize( shouldReceiverConvertOnTypeMismatch, loadTsFileStrategy, loadTsFileValidation, - shouldMarkAsPipeRequest); + shouldMarkAsPipeRequest, + skipIfNoPrivileges); } protected abstract IoTDBSyncClientManager constructClient( @@ -150,7 +151,8 @@ protected abstract IoTDBSyncClientManager constructClient( final boolean shouldReceiverConvertOnTypeMismatch, final String loadTsFileStrategy, final boolean validateTsFile, - final boolean shouldMarkAsPipeRequest); + final boolean shouldMarkAsPipeRequest, + final boolean skipIfNoPrivileges); @Override public void handshake() throws Exception { diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/SerializeUtils.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/SerializeUtils.java index 8e5893edd05c..2db0ea391c7f 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/SerializeUtils.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/SerializeUtils.java @@ -21,6 +21,8 @@ import org.apache.tsfile.common.conf.TSFileConfig; import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.file.metadata.enums.CompressionType; +import org.apache.tsfile.file.metadata.enums.TSEncoding; import org.apache.tsfile.read.TimeValuePair; import org.apache.tsfile.read.common.BatchData; import org.apache.tsfile.read.common.BatchData.BatchDataType; @@ -44,6 +46,22 @@ private SerializeUtils() { // util class } + public static byte serializeNullable(final TSEncoding encoding) { + return encoding == null ? -1 : encoding.serialize(); + } + + public static TSEncoding deserializeEncodingNullable(final byte encoding) { + return encoding == -1 ? null : TSEncoding.deserialize(encoding); + } + + public static byte serializeNullable(final CompressionType compressor) { + return compressor == null ? -1 : compressor.serialize(); + } + + public static CompressionType deserializeCompressorNullable(final byte compressor) { + return compressor == -1 ? null : CompressionType.deserialize(compressor); + } + public static void serialize(String str, DataOutputStream dataOutputStream) { try { byte[] strBytes = str.getBytes(TSFileConfig.STRING_CHARSET); diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift index d6e0b186aad2..29de878d6da2 100644 --- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift +++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift @@ -790,6 +790,16 @@ struct TPipeConfigTransferResp { 2: optional binary body } +struct TAlterEncodingCompressorReq { + 1: required string queryId + 2: required binary pathPatternTree + 3: required byte encoding + 4: required byte compressor + 5: required bool ifExists + 6: required bool mayAlterAudit + 7: optional bool isGeneratedByPipe +} + struct TDeleteTimeSeriesReq { 1: required string queryId 2: required binary pathPatternTree @@ -1593,6 +1603,8 @@ service IConfigNodeRPCService { common.TSStatus alterSchemaTemplate(TAlterSchemaTemplateReq req) + common.TSStatus alterEncodingCompressor(TAlterEncodingCompressorReq req) + /** * Generate a set of DeleteTimeSeriesProcedure to delete some specific TimeSeries * diff --git a/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift b/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift index 989d624f3378..fd4a22c8a7b5 100644 --- a/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift +++ b/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift @@ -383,6 +383,14 @@ struct TDeleteTimeSeriesReq { 3: optional bool isGeneratedByPipe } +struct TAlterEncodingCompressorReq { + 1: required list schemaRegionIdList + 2: required binary pathPatternTree + 3: required bool ifExists + 4: optional byte encoding + 5: optional byte compressor +} + struct TConstructSchemaBlackListWithTemplateReq { 1: required list schemaRegionIdList 2: required map> templateSetInfo @@ -962,6 +970,11 @@ service IDataNodeRPCService { */ common.TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req) + /** + * Alter matched timeseries to specific encoding and compressor in target schemaRegions + */ + common.TSStatus alterEncodingCompressor(TAlterEncodingCompressorReq req) + /** * Construct schema black list in target schemaRegion to block R/W on matched timeseries represent by template */ From c8932f86dd908a72798a9bdbe8f5e91d12661e98 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Fri, 7 Nov 2025 14:35:27 +0800 Subject: [PATCH 02/15] fix --- .../consensus/request/ConfigPhysicalPlan.java | 7 ++- .../request/ConfigPhysicalPlanVisitor.java | 11 ++-- .../protocol/IoTDBConfigNodeReceiver.java | 4 -- ...PipeConfigPhysicalPlanTSStatusVisitor.java | 17 +++--- .../procedure/store/ProcedureType.java | 2 +- .../receiver/PipeEnrichedProcedureTest.java | 52 +++++++++---------- .../schemaregion/SchemaExecutionVisitor.java | 2 +- .../impl/DataNodeInternalRPCServiceImpl.java | 2 - .../executor/ClusterConfigTaskExecutor.java | 9 +--- .../config/executor/IConfigTaskExecutor.java | 11 +--- .../plan/planner/plan/node/PlanNodeType.java | 2 +- .../plan/planner/plan/node/PlanVisitor.java | 2 +- .../schemaregion/ISchemaRegion.java | 10 ---- .../schemaregion/SchemaRegionPlanVisitor.java | 17 ++---- .../impl/SchemaRegionPBTreeImpl.java | 10 ---- .../visitor/SchemaRegionPlanDeserializer.java | 19 ++----- .../visitor/SchemaRegionPlanSerializer.java | 37 +++++-------- .../req/SchemaRegionWritePlanFactory.java | 9 ---- 18 files changed, 71 insertions(+), 152 deletions(-) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java index d29919fe8285..099d053a142b 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java @@ -60,7 +60,6 @@ import org.apache.iotdb.confignode.consensus.request.write.partition.RemoveRegionLocationPlan; import org.apache.iotdb.confignode.consensus.request.write.partition.UpdateRegionLocationPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeAlterEncodingCompressorPlan; -import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeCreateTableOrViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeactivateTemplatePlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteLogicalViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteTimeSeriesPlan; @@ -410,9 +409,9 @@ public static ConfigPhysicalPlan create(final ByteBuffer buffer) throws IOExcept case PipeDeactivateTemplate: plan = new PipeDeactivateTemplatePlan(); break; - case PipeAlterEncodingCompressor: - plan = new PipeAlterEncodingCompressorPlan(); - break; + case PipeAlterEncodingCompressor: + plan = new PipeAlterEncodingCompressorPlan(); + break; case UpdateTriggersOnTransferNodes: plan = new UpdateTriggersOnTransferNodesPlan(); break; diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java index 1c668e25c74a..b2e776e0c927 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanVisitor.java @@ -24,7 +24,6 @@ import org.apache.iotdb.confignode.consensus.request.write.database.DeleteDatabasePlan; import org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeAlterEncodingCompressorPlan; -import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeCreateTableOrViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeactivateTemplatePlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteLogicalViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteTimeSeriesPlan; @@ -85,7 +84,7 @@ public R process(ConfigPhysicalPlan plan, C context) { return visitRevokeRoleFromUser((AuthorPlan) plan, context); case SetTTL: return visitTTL((SetTTLPlan) plan, context); - case PipeAlterEncodingCompressor: + case PipeAlterEncodingCompressor: return visitPipeAlterEncodingCompressor((PipeAlterEncodingCompressorPlan) plan, context); default: return visitPlan(plan, context); @@ -195,8 +194,8 @@ public R visitTTL(SetTTLPlan setTTLPlan, C context) { return visitPlan(setTTLPlan, context); } - public R visitPipeAlterEncodingCompressor( - final PipeAlterEncodingCompressorPlan pipeAlterEncodingCompressorPlan, final C context) { - return visitPlan(pipeAlterEncodingCompressorPlan, context); - } + public R visitPipeAlterEncodingCompressor( + final PipeAlterEncodingCompressorPlan pipeAlterEncodingCompressorPlan, final C context) { + return visitPlan(pipeAlterEncodingCompressorPlan, context); + } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java index 343a1cc245cb..283f81883cca 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java @@ -38,9 +38,6 @@ import org.apache.iotdb.commons.pipe.sink.payload.thrift.request.PipeTransferFileSealReqV2; import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant; import org.apache.iotdb.commons.schema.table.Audit; -import org.apache.iotdb.commons.schema.table.TreeViewSchema; -import org.apache.iotdb.commons.schema.table.TsTable; -import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema; import org.apache.iotdb.commons.schema.ttl.TTLCache; import org.apache.iotdb.commons.utils.StatusUtils; import org.apache.iotdb.confignode.conf.ConfigNodeDescriptor; @@ -51,7 +48,6 @@ import org.apache.iotdb.confignode.consensus.request.write.database.DeleteDatabasePlan; import org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeAlterEncodingCompressorPlan; -import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeCreateTableOrViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeactivateTemplatePlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteLogicalViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteTimeSeriesPlan; diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java index 58cf339e9ecd..f1c1451fec2d 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/visitor/PipeConfigPhysicalPlanTSStatusVisitor.java @@ -27,7 +27,6 @@ import org.apache.iotdb.confignode.consensus.request.write.database.DeleteDatabasePlan; import org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeAlterEncodingCompressorPlan; -import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeCreateTableOrViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeactivateTemplatePlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteLogicalViewPlan; import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeDeleteTimeSeriesPlan; @@ -318,13 +317,13 @@ public TSStatus visitTTL(final SetTTLPlan plan, final TSStatus context) { return super.visitTTL(plan, context); } - @Override - public TSStatus visitPipeAlterEncodingCompressor( - final PipeAlterEncodingCompressorPlan plan, final TSStatus context) { - if (context.getCode() == TSStatusCode.PATH_NOT_EXIST.getStatusCode()) { - return new TSStatus(TSStatusCode.PIPE_RECEIVER_IDEMPOTENT_CONFLICT_EXCEPTION.getStatusCode()) - .setMessage(context.getMessage()); - } - return visitPlan(plan, context); + @Override + public TSStatus visitPipeAlterEncodingCompressor( + final PipeAlterEncodingCompressorPlan plan, final TSStatus context) { + if (context.getCode() == TSStatusCode.PATH_NOT_EXIST.getStatusCode()) { + return new TSStatus(TSStatusCode.PIPE_RECEIVER_IDEMPOTENT_CONFLICT_EXCEPTION.getStatusCode()) + .setMessage(context.getMessage()); } + return visitPlan(plan, context); + } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java index afe8c8fa718b..bb941bbc93e5 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java @@ -112,7 +112,7 @@ public enum ProcedureType { PIPE_ENRICHED_DROP_TRIGGER_PROCEDURE((short) 1409), PIPE_ENRICHED_AUTH_OPERATE_PROCEDURE((short) 1410), PIPE_ENRICHED_SET_TTL_PROCEDURE((short) 1411), -PIPE_ENRICHED_ALTER_ENCODING_COMPRESSOR_PROCEDURE((short) 148), + PIPE_ENRICHED_ALTER_ENCODING_COMPRESSOR_PROCEDURE((short) 148), /** Subscription */ CREATE_TOPIC_PROCEDURE((short) 1500), diff --git a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java index 7ec9d52cd883..d06026841710 100644 --- a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java +++ b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java @@ -365,30 +365,30 @@ public void setTTLTest() throws IOException, IllegalPathException { byteArrayOutputStream.reset(); } - @Test - public void alterEncodingCompressorTest() throws IllegalPathException, IOException { - final String queryId = "1"; - final PathPatternTree patternTree = new PathPatternTree(); - patternTree.appendPathPattern(new PartialPath("root.sg1.**")); - patternTree.appendPathPattern(new PartialPath("root.sg2.*.s1")); - patternTree.constructTree(); - final AlterEncodingCompressorProcedure alterEncodingCompressorProcedure = - new AlterEncodingCompressorProcedure( - false, queryId, patternTree, false, (byte) 0, (byte) 0, false); - - final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); - alterEncodingCompressorProcedure.serialize(dataOutputStream); - - final ByteBuffer byteBuffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray()); - - Assert.assertEquals( - ProcedureType.ALTER_ENCODING_COMPRESSOR_PROCEDURE.getTypeCode(), byteBuffer.getShort()); - - final AlterEncodingCompressorProcedure deserializedProcedure = - new AlterEncodingCompressorProcedure(false); - deserializedProcedure.deserialize(byteBuffer); - - Assert.assertEquals(alterEncodingCompressorProcedure, deserializedProcedure); - } + @Test + public void alterEncodingCompressorTest() throws IllegalPathException, IOException { + final String queryId = "1"; + final PathPatternTree patternTree = new PathPatternTree(); + patternTree.appendPathPattern(new PartialPath("root.sg1.**")); + patternTree.appendPathPattern(new PartialPath("root.sg2.*.s1")); + patternTree.constructTree(); + final AlterEncodingCompressorProcedure alterEncodingCompressorProcedure = + new AlterEncodingCompressorProcedure( + false, queryId, patternTree, false, (byte) 0, (byte) 0, false); + + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); + alterEncodingCompressorProcedure.serialize(dataOutputStream); + + final ByteBuffer byteBuffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray()); + + Assert.assertEquals( + ProcedureType.ALTER_ENCODING_COMPRESSOR_PROCEDURE.getTypeCode(), byteBuffer.getShort()); + + final AlterEncodingCompressorProcedure deserializedProcedure = + new AlterEncodingCompressorProcedure(false); + deserializedProcedure.deserialize(byteBuffer); + + Assert.assertEquals(alterEncodingCompressorProcedure, deserializedProcedure); + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java index 3d65a33632b2..e1c5ce8be267 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java @@ -33,8 +33,8 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java index c04bf76b7275..7d04b84cff81 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java @@ -72,9 +72,7 @@ import org.apache.iotdb.commons.trigger.TriggerInformation; import org.apache.iotdb.commons.udf.UDFInformation; import org.apache.iotdb.commons.udf.service.UDFManagementService; -import org.apache.iotdb.commons.utils.PathUtils; import org.apache.iotdb.commons.utils.SerializeUtils; -import org.apache.iotdb.commons.utils.StatusUtils; import org.apache.iotdb.consensus.ConsensusFactory; import org.apache.iotdb.consensus.common.Peer; import org.apache.iotdb.consensus.exception.ConsensusException; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java index 9da6a1d1531e..dfc3aa8da73c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -62,10 +62,8 @@ import org.apache.iotdb.commons.udf.service.UDFClassLoader; import org.apache.iotdb.commons.udf.service.UDFExecutableManager; import org.apache.iotdb.commons.utils.CommonDateTimeUtils; -import org.apache.iotdb.commons.utils.PathUtils; import org.apache.iotdb.commons.utils.SerializeUtils; import org.apache.iotdb.commons.utils.TimePartitionUtils; -import org.apache.iotdb.confignode.rpc.thrift.TAINodeRemoveReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterEncodingCompressorReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterLogicalViewReq; import org.apache.iotdb.confignode.rpc.thrift.TAlterPipeReq; @@ -186,13 +184,8 @@ import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowTopicsTask; import org.apache.iotdb.db.queryengine.plan.expression.Expression; import org.apache.iotdb.db.queryengine.plan.expression.visitor.TransformToViewExpressionVisitor; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.view.AlterLogicalViewNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.view.AlterLogicalViewNode; -import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DeleteDevice; -import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropDB; -import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCluster; -import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowDB; -import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Use; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.view.AlterLogicalViewNode; import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterEncodingCompressorStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDatabaseStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountTimeSlotListStatement; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java index bb1c2819ac38..bca5d7bbf87d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java @@ -28,17 +28,8 @@ import org.apache.iotdb.confignode.rpc.thrift.TThrottleQuotaResp; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.view.AlterLogicalViewNode; -import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ExtendRegionTask; -import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.MigrateRegionTask; -import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ReconstructRegionTask; -import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.RemoveRegionTask; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.view.AlterLogicalViewNode; -import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DeleteDevice; -import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropDB; -import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCluster; -import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowDB; -import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Use; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.view.AlterLogicalViewNode; import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterEncodingCompressorStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDatabaseStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountTimeSlotListStatement; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java index 8f80e349031a..30bcf0d44f0a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java @@ -20,6 +20,7 @@ import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.load.LoadTsFilePieceNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.CountSchemaMergeNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.DeviceSchemaFetchScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.DevicesCountNode; @@ -38,7 +39,6 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesCountNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesSchemaScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ActivateTemplateNode; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java index 8e9215e010bc..496a66166c95 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java @@ -18,6 +18,7 @@ */ package org.apache.iotdb.db.queryengine.plan.planner.plan.node; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.CountSchemaMergeNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.DeviceSchemaFetchScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.DevicesCountNode; @@ -35,7 +36,6 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesCountNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesSchemaScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ActivateTemplateNode; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java index 701821051f53..23822089999a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java @@ -28,16 +28,6 @@ import org.apache.iotdb.db.exception.metadata.SchemaQuotaExceededException; import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; -import org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TableId; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.metric.ISchemaRegionMetric; import org.apache.iotdb.db.schemaengine.rescon.ISchemaRegionStatistics; import org.apache.iotdb.db.schemaengine.schemaregion.read.req.IShowDevicesPlan; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java index 46b93cb04282..0d49df98dd83 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java @@ -20,15 +20,6 @@ package org.apache.iotdb.db.schemaengine.schemaregion; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.IActivateTemplateInClusterPlan; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.IAutoCreateDeviceMNodePlan; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.IChangeAliasPlan; @@ -127,8 +118,8 @@ public R visitDeleteLogicalView(IDeleteLogicalViewPlan deleteLogicalViewPlan, C return visitSchemaRegionPlan(deleteLogicalViewPlan, context); } - public R visitAlterEncodingCompressor( - final AlterEncodingCompressorNode alterEncodingCompressorNode, final C context) { - return visitSchemaRegionPlan(alterEncodingCompressorNode, context); - } + public R visitAlterEncodingCompressor( + final AlterEncodingCompressorNode alterEncodingCompressorNode, final C context) { + return visitSchemaRegionPlan(alterEncodingCompressorNode, context); + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java index 97c58aa82220..2dba16eb93eb 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java @@ -39,16 +39,6 @@ import org.apache.iotdb.db.exception.metadata.SchemaQuotaExceededException; import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; -import org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TableId; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.metric.ISchemaRegionMetric; import org.apache.iotdb.db.schemaengine.metric.SchemaRegionCachedMetric; import org.apache.iotdb.db.schemaengine.rescon.CachedSchemaRegionStatistics; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java index 609fab0963e7..ec1a9272bfc1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java @@ -25,15 +25,6 @@ import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegionPlan; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanType; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanVisitor; @@ -407,10 +398,10 @@ public ISchemaRegionPlan visitAlterLogicalView( return alterLogicalViewPlan; } - @Override - public ISchemaRegionPlan visitAlterEncodingCompressor( - final AlterEncodingCompressorNode alterEncodingCompressorNode, final ByteBuffer buffer) { - return (AlterEncodingCompressorNode) PlanNodeType.deserialize(buffer); - } + @Override + public ISchemaRegionPlan visitAlterEncodingCompressor( + final AlterEncodingCompressorNode alterEncodingCompressorNode, final ByteBuffer buffer) { + return (AlterEncodingCompressorNode) PlanNodeType.deserialize(buffer); + } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java index 928b79e7c1f0..d428187cabde 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java @@ -23,15 +23,6 @@ import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegionPlan; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanVisitor; import org.apache.iotdb.db.schemaengine.schemaregion.logfile.ISerializer; @@ -487,21 +478,21 @@ public SchemaRegionPlanSerializationResult visitAlterLogicalView( } } - @Override - public SchemaRegionPlanSerializationResult visitAlterEncodingCompressor( - final AlterEncodingCompressorNode alterEncodingCompressorNode, - final DataOutputStream outputStream) { - return visitPlanNode(alterEncodingCompressorNode, outputStream); - } + @Override + public SchemaRegionPlanSerializationResult visitAlterEncodingCompressor( + final AlterEncodingCompressorNode alterEncodingCompressorNode, + final DataOutputStream outputStream) { + return visitPlanNode(alterEncodingCompressorNode, outputStream); + } - private SchemaRegionPlanSerializationResult visitPlanNode( - final PlanNode planNode, final DataOutputStream outputStream) { - try { - planNode.serialize(outputStream); - return SchemaRegionPlanSerializationResult.SUCCESS; - } catch (final IOException e) { - return new SchemaRegionPlanSerializationResult(e); - } + private SchemaRegionPlanSerializationResult visitPlanNode( + final PlanNode planNode, final DataOutputStream outputStream) { + try { + planNode.serialize(outputStream); + return SchemaRegionPlanSerializationResult.SUCCESS; + } catch (final IOException e) { + return new SchemaRegionPlanSerializationResult(e); } + } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java index 8e1236f756ca..58766fcf4e74 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java @@ -22,15 +22,6 @@ import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.ConstructTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.CreateOrUpdateTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDeviceNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.DeleteTableDevicesInBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.RollbackTableDevicesBlackListNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableAttributeColumnDropNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeCommitUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableDeviceAttributeUpdateNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.schema.TableNodeLocationAddNode; import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegionPlan; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanType; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.impl.ActivateTemplateInClusterPlanImpl; From c7c4489bfa86ceab352ebe97bfff0c862a5e4e2a Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Thu, 6 Nov 2025 20:40:50 +0800 Subject: [PATCH 03/15] Implemented the alter encoding compression function for tree model (#16672) * ifpermitted * reconstruct * final-prev * complete-dn * partial * very-partial * fix * partial-set * fix * test * fix * shop * fix * some * partial * bishop * fix * fix * grasia * fix * main * fix * partial * fix * minor * fix * fix * spotless * test * part * fix * bug-fix * fix * Revert "fix" This reverts commit da7a080906737af14c6022294935e963bae88ad2. * Reapply "fix" This reverts commit 27de58a8ffb335b85e617c60cbbc6e753f7141e4. (cherry picked from commit f096b8210ff2fa04566b9667ba5509bf7a344816) --- .../procedure/store/ProcedureFactory.java | 3 + .../receiver/PipeEnrichedProcedureTest.java | 27 ++++ .../write/AlterEncodingCompressorNode.java | 146 ++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metedata/write/AlterEncodingCompressorNode.java diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java index b5200a6bbc72..53fbc35fd3c3 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java @@ -245,6 +245,9 @@ public Procedure create(ByteBuffer buffer) throws IOException { case PIPE_ENRICHED_ALTER_ENCODING_COMPRESSOR_PROCEDURE: procedure = new AlterEncodingCompressorProcedure(true); break; + case PIPE_ENRICHED_ALTER_ENCODING_COMPRESSOR_PROCEDURE: + procedure = new AlterEncodingCompressorProcedure(true); + break; case REMOVE_AI_NODE_PROCEDURE: procedure = new RemoveAINodeProcedure(); break; diff --git a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java index d06026841710..d8ec28091cda 100644 --- a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java +++ b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java @@ -391,4 +391,31 @@ public void alterEncodingCompressorTest() throws IllegalPathException, IOExcepti Assert.assertEquals(alterEncodingCompressorProcedure, deserializedProcedure); } + + @Test + public void alterEncodingCompressorTest() throws IllegalPathException, IOException { + final String queryId = "1"; + final PathPatternTree patternTree = new PathPatternTree(); + patternTree.appendPathPattern(new PartialPath("root.sg1.**")); + patternTree.appendPathPattern(new PartialPath("root.sg2.*.s1")); + patternTree.constructTree(); + final AlterEncodingCompressorProcedure alterEncodingCompressorProcedure = + new AlterEncodingCompressorProcedure( + false, queryId, patternTree, false, (byte) 0, (byte) 0, false); + + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); + alterEncodingCompressorProcedure.serialize(dataOutputStream); + + final ByteBuffer byteBuffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray()); + + Assert.assertEquals( + ProcedureType.ALTER_ENCODING_COMPRESSOR_PROCEDURE.getTypeCode(), byteBuffer.getShort()); + + final AlterEncodingCompressorProcedure deserializedProcedure = + new AlterEncodingCompressorProcedure(false); + deserializedProcedure.deserialize(byteBuffer); + + Assert.assertEquals(alterEncodingCompressorProcedure, deserializedProcedure); + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metedata/write/AlterEncodingCompressorNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metedata/write/AlterEncodingCompressorNode.java new file mode 100644 index 000000000000..2e4c711483ea --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metedata/write/AlterEncodingCompressorNode.java @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write; + +import org.apache.iotdb.commons.path.PathPatternTree; +import org.apache.iotdb.commons.utils.SerializeUtils; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor; +import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegionPlan; +import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanType; +import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanVisitor; + +import org.apache.tsfile.file.metadata.enums.CompressionType; +import org.apache.tsfile.file.metadata.enums.TSEncoding; +import org.apache.tsfile.utils.ReadWriteIOUtils; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.List; + +public class AlterEncodingCompressorNode extends PlanNode implements ISchemaRegionPlan { + + public static final AlterEncodingCompressorNode MOCK_INSTANCE = + new AlterEncodingCompressorNode(new PlanNodeId(""), null, false, null, null); + + private final PathPatternTree patternTree; + private final boolean ifExists; + private final TSEncoding encoding; + private final CompressionType compressionType; + + public AlterEncodingCompressorNode( + final PlanNodeId id, + final PathPatternTree patternTree, + final boolean ifExists, + final TSEncoding encoding, + final CompressionType compressionType) { + super(id); + this.patternTree = patternTree; + this.ifExists = ifExists; + this.encoding = encoding; + this.compressionType = compressionType; + } + + public PathPatternTree getPatternTree() { + return patternTree; + } + + public boolean isIfExists() { + return ifExists; + } + + public TSEncoding getEncoding() { + return encoding; + } + + public CompressionType getCompressionType() { + return compressionType; + } + + @Override + public List getChildren() { + return null; + } + + @Override + public void addChild(final PlanNode child) {} + + @Override + public PlanNode clone() { + return null; + } + + @Override + public int allowedChildCount() { + return 0; + } + + @Override + public List getOutputColumnNames() { + return null; + } + + @Override + public R accept(final PlanVisitor visitor, final C context) { + return visitor.visitAlterEncodingCompressor(this, context); + } + + @Override + protected void serializeAttributes(final ByteBuffer byteBuffer) { + PlanNodeType.ALTER_ENCODING_COMPRESSOR.serialize(byteBuffer); + patternTree.serialize(byteBuffer); + ReadWriteIOUtils.write(ifExists, byteBuffer); + ReadWriteIOUtils.write(SerializeUtils.serializeNullable(encoding), byteBuffer); + ReadWriteIOUtils.write(SerializeUtils.serializeNullable(compressionType), byteBuffer); + } + + @Override + protected void serializeAttributes(final DataOutputStream stream) throws IOException { + PlanNodeType.ALTER_ENCODING_COMPRESSOR.serialize(stream); + patternTree.serialize(stream); + ReadWriteIOUtils.write(ifExists, stream); + ReadWriteIOUtils.write(SerializeUtils.serializeNullable(encoding), stream); + ReadWriteIOUtils.write(SerializeUtils.serializeNullable(compressionType), stream); + } + + public static AlterEncodingCompressorNode deserialize(final ByteBuffer byteBuffer) { + final PathPatternTree patternTree = PathPatternTree.deserialize(byteBuffer); + final boolean ifExists = ReadWriteIOUtils.readBoolean(byteBuffer); + final TSEncoding encoding = + SerializeUtils.deserializeEncodingNullable(ReadWriteIOUtils.readByte(byteBuffer)); + final CompressionType compressor = + SerializeUtils.deserializeCompressorNullable(ReadWriteIOUtils.readByte(byteBuffer)); + final PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer); + return new AlterEncodingCompressorNode(planNodeId, patternTree, ifExists, encoding, compressor); + } + + @Override + public SchemaRegionPlanType getPlanType() { + return SchemaRegionPlanType.ALTER_ENCODING_COMPRESSOR; + } + + @Override + public R accept(final SchemaRegionPlanVisitor visitor, final C context) { + return visitor.visitAlterEncodingCompressor(this, context); + } +} From 14bd96dc56d5c2f29a86226ccc6e43bff1a1ef50 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Fri, 7 Nov 2025 14:43:19 +0800 Subject: [PATCH 04/15] fix --- .../org/apache/iotdb/confignode/manager/ClusterManager.java | 2 +- .../db/queryengine/plan/planner/plan/node/PlanVisitor.java | 3 ++- .../plan/node/metedata/write/AlterEncodingCompressorNode.java | 2 +- .../statement/metadata/AlterEncodingCompressorStatement.java | 2 +- .../schemaregion/write/req/SchemaRegionWritePlanFactory.java | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterManager.java index e7d0dea48f80..0f79c50a49e8 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterManager.java @@ -62,7 +62,7 @@ public class ClusterManager { private final IManager configManager; private final ClusterInfo clusterInfo; - private static final String CONSENSUS_WRITE_ERROR = + public static final String CONSENSUS_WRITE_ERROR = "Failed in the write API executing the consensus layer due to: "; public ClusterManager(IManager configManager, ClusterInfo clusterInfo) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java index 496a66166c95..d8edd12d0959 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java @@ -16,9 +16,9 @@ * specific language governing permissions and limitations * under the License. */ + package org.apache.iotdb.db.queryengine.plan.planner.plan.node; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.CountSchemaMergeNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.DeviceSchemaFetchScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.DevicesCountNode; @@ -36,6 +36,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesCountNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesSchemaScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ActivateTemplateNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metedata/write/AlterEncodingCompressorNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metedata/write/AlterEncodingCompressorNode.java index 2e4c711483ea..688822ba5b5d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metedata/write/AlterEncodingCompressorNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metedata/write/AlterEncodingCompressorNode.java @@ -17,7 +17,7 @@ * under the License. */ -package org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write; +package org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write; import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.utils.SerializeUtils; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java index a8dd88841a43..ed67e2186128 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java @@ -89,7 +89,7 @@ public boolean isWithAudit() { } @Override - public List getPaths() { + public List getPaths() { return patternTree.getAllPathPatterns(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java index 58766fcf4e74..9d389681ab58 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/write/req/SchemaRegionWritePlanFactory.java @@ -21,7 +21,7 @@ import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegionPlan; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanType; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.impl.ActivateTemplateInClusterPlanImpl; From 8bcd0660a59e9764347f880849133add12e1901c Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Fri, 7 Nov 2025 14:44:23 +0800 Subject: [PATCH 05/15] fix --- .../db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java index 0d49df98dd83..09a939c77ee6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanVisitor.java @@ -19,7 +19,7 @@ package org.apache.iotdb.db.schemaengine.schemaregion; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.IActivateTemplateInClusterPlan; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.IAutoCreateDeviceMNodePlan; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.IChangeAliasPlan; From 531b88f04ae9dd88b3b979afe3bb333dc353be31 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Fri, 7 Nov 2025 15:45:45 +0800 Subject: [PATCH 06/15] Update AlterEncodingCompressorStatement.java --- .../AlterEncodingCompressorStatement.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java index ed67e2186128..c5715eb4dfcf 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java @@ -19,13 +19,20 @@ package org.apache.iotdb.db.queryengine.plan.statement.metadata; +import org.apache.iotdb.common.rpc.thrift.TSStatus; +import org.apache.iotdb.commons.auth.AuthException; +import org.apache.iotdb.commons.auth.entity.PrivilegeType; import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.path.PathPatternTree; +import org.apache.iotdb.commons.path.PathPatternTreeUtils; +import org.apache.iotdb.commons.utils.StatusUtils; +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; import org.apache.iotdb.db.queryengine.plan.statement.StatementType; import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor; +import org.apache.iotdb.rpc.TSStatusCode; import org.apache.tsfile.file.metadata.enums.CompressionType; import org.apache.tsfile.file.metadata.enums.TSEncoding; @@ -33,6 +40,8 @@ import java.util.List; import java.util.Objects; +import static org.apache.iotdb.db.auth.AuthorityChecker.getAuthorizedPathTree; + public class AlterEncodingCompressorStatement extends Statement implements IConfigStatement { private PathPatternTree patternTree; @@ -109,6 +118,29 @@ public boolean equals(final Object obj) { && Objects.equals(this.ifPermitted, that.ifPermitted); } + @Override + public TSStatus checkPermissionBeforeProcess(String userName) { + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()); + } + if (ifPermitted) { + try { + final PathPatternTree authTree = + getAuthorizedPathTree(userName, PrivilegeType.WRITE_SCHEMA.ordinal()); + setPatternTree( + PathPatternTreeUtils.intersectWithFullPathPrefixTree(getPatternTree(), authTree)); + return StatusUtils.OK; + } catch (final AuthException e) { + return new TSStatus(e.getCode().getStatusCode()); + } + } + return AuthorityChecker.getTSStatus( + AuthorityChecker.checkFullPathListPermission( + userName, getPaths(), PrivilegeType.WRITE_SCHEMA.ordinal()), + getPaths(), + PrivilegeType.WRITE_SCHEMA); + } + @Override public int hashCode() { return Objects.hash(patternTree, encoding, compressor, ifExists, ifPermitted); From a638a6f4f9c40cf378da5e6011cab21922e81942 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Fri, 7 Nov 2025 16:11:49 +0800 Subject: [PATCH 07/15] bishop-ger --- .../PipeAlterEncodingCompressorPlan.java | 15 +--------- .../confignode/manager/ConfigManager.java | 3 +- .../confignode/manager/ProcedureManager.java | 11 ++----- .../protocol/IoTDBConfigNodeReceiver.java | 30 +++++-------------- ...ConfigPhysicalPlanPatternParseVisitor.java | 5 ++-- .../AlterEncodingCompressorProcedure.java | 21 +++++-------- .../procedure/store/ProcedureFactory.java | 3 -- .../receiver/PipeEnrichedProcedureTest.java | 29 +----------------- .../AlterEncodingCompressorProcedureTest.java | 2 +- .../schemaregion/SchemaExecutionVisitor.java | 2 +- .../impl/DataNodeInternalRPCServiceImpl.java | 2 +- .../plan/analyze/AnalyzeVisitor.java | 2 +- .../executor/ClusterConfigTaskExecutor.java | 4 +-- .../config/executor/IConfigTaskExecutor.java | 1 - .../plan/planner/plan/node/PlanNodeType.java | 3 +- .../AlterEncodingCompressorStatement.java | 13 -------- .../schemaregion/ISchemaRegion.java | 2 +- .../impl/SchemaRegionMemoryImpl.java | 24 +++++++++------ .../impl/SchemaRegionPBTreeImpl.java | 2 +- .../visitor/SchemaRegionPlanDeserializer.java | 2 +- .../visitor/SchemaRegionPlanSerializer.java | 2 +- .../impl/mem/MTreeBelowSGMemoryImpl.java | 3 +- .../src/main/thrift/confignode.thrift | 3 +- 23 files changed, 51 insertions(+), 133 deletions(-) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java index bd31a7c57b2e..46819c7822e2 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java @@ -36,22 +36,17 @@ public class PipeAlterEncodingCompressorPlan extends ConfigPhysicalPlan { private ByteBuffer patternTreeBytes; private byte encoding; private byte compressor; - private boolean mayAlterAudit; public PipeAlterEncodingCompressorPlan() { super(ConfigPhysicalPlanType.PipeAlterEncodingCompressor); } public PipeAlterEncodingCompressorPlan( - final @Nonnull ByteBuffer patternTreeBytes, - final byte encoding, - final byte compressor, - final boolean mayAlterAudit) { + final @Nonnull ByteBuffer patternTreeBytes, final byte encoding, final byte compressor) { super(ConfigPhysicalPlanType.PipeAlterEncodingCompressor); this.patternTreeBytes = patternTreeBytes; this.encoding = encoding; this.compressor = compressor; - this.mayAlterAudit = mayAlterAudit; } public void setPatternTreeBytes(ByteBuffer patternTreeBytes) { @@ -71,14 +66,6 @@ public byte getCompressor() { return compressor; } - public void setMayAlterAudit(final boolean mayAlterAudit) { - this.mayAlterAudit = mayAlterAudit; - } - - public boolean isMayAlterAudit() { - return mayAlterAudit; - } - @Override protected void serializeImpl(final DataOutputStream stream) throws IOException { stream.writeShort(getType().getPlanType()); diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java index d52c1fa2fd8a..4069555234a9 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java @@ -2033,8 +2033,7 @@ public TSStatus alterEncodingCompressor(final TAlterEncodingCompressorReq req) { req.getEncoding(), req.getCompressor(), req.isIfExists(), - req.isIsGeneratedByPipe(), - req.isMayAlterAudit()); + req.isIsGeneratedByPipe()); } else { return status; } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java index ff828e514d7d..c2ba872924ef 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java @@ -259,8 +259,7 @@ public TSStatus alterEncodingCompressor( final byte encoding, final byte compressor, final boolean ifExists, - final boolean isGeneratedByPipe, - final boolean mayAlterAudit) { + final boolean isGeneratedByPipe) { AlterEncodingCompressorProcedure procedure = null; synchronized (this) { ProcedureType type; @@ -280,13 +279,7 @@ public TSStatus alterEncodingCompressor( if (procedure == null) { procedure = new AlterEncodingCompressorProcedure( - isGeneratedByPipe, - queryId, - patternTree, - ifExists, - encoding, - compressor, - mayAlterAudit); + isGeneratedByPipe, queryId, patternTree, ifExists, encoding, compressor); this.executor.submitProcedure(procedure); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java index 283f81883cca..906e1230c479 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/receiver/protocol/IoTDBConfigNodeReceiver.java @@ -36,8 +36,6 @@ import org.apache.iotdb.commons.pipe.sink.payload.thrift.request.PipeTransferCompressedReq; import org.apache.iotdb.commons.pipe.sink.payload.thrift.request.PipeTransferFileSealReqV1; import org.apache.iotdb.commons.pipe.sink.payload.thrift.request.PipeTransferFileSealReqV2; -import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant; -import org.apache.iotdb.commons.schema.table.Audit; import org.apache.iotdb.commons.schema.ttl.TTLCache; import org.apache.iotdb.commons.utils.StatusUtils; import org.apache.iotdb.confignode.conf.ConfigNodeDescriptor; @@ -91,6 +89,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.nio.ByteBuffer; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; @@ -273,14 +272,6 @@ private TSStatus checkPermission(final ConfigPhysicalPlan plan) throws IOExcepti PrivilegeType.WRITE_SCHEMA.ordinal()) .getStatus(); case PipeAlterEncodingCompressor: - // Judge here in the future - if (configManager - .checkUserPrivileges(username, new PrivilegeUnion(PrivilegeType.AUDIT)) - .getStatus() - .getCode() - != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - ((PipeAlterEncodingCompressorPlan) plan).setMayAlterAudit(false); - } if (skipIfNoPrivileges.get()) { final PathPatternTree pathPatternTree = PathPatternTree.deserialize( @@ -288,9 +279,6 @@ private TSStatus checkPermission(final ConfigPhysicalPlan plan) throws IOExcepti configManager .fetchAuthizedPatternTree(username, PrivilegeType.WRITE_SCHEMA.ordinal()) .getPathPatternTree())); - if (((PipeAlterEncodingCompressorPlan) plan).isMayAlterAudit()) { - pathPatternTree.appendPathPattern(Audit.TREE_MODEL_AUDIT_DATABASE_PATH_PATTERN, true); - } ((PipeAlterEncodingCompressorPlan) plan) .setPatternTreeBytes( PathPatternTreeUtils.intersectWithFullPathPrefixTree( @@ -303,12 +291,11 @@ private TSStatus checkPermission(final ConfigPhysicalPlan plan) throws IOExcepti return configManager .checkUserPrivileges( username, - new PrivilegeUnion( - new ArrayList<>( - PathPatternTree.deserialize( - ((PipeAlterEncodingCompressorPlan) plan).getPatternTreeBytes()) - .getAllPathPatterns()), - PrivilegeType.WRITE_SCHEMA)) + new ArrayList<>( + PathPatternTree.deserialize( + ((PipeAlterEncodingCompressorPlan) plan).getPatternTreeBytes()) + .getAllPathPatterns()), + PrivilegeType.WRITE_SCHEMA.ordinal()) .getStatus(); } case PipeDeleteLogicalView: @@ -477,14 +464,13 @@ private TSStatus executePlan(final ConfigPhysicalPlan plan) throws ConsensusExce return configManager .getProcedureManager() .alterEncodingCompressor( - queryId, + generatePseudoQueryId(), PathPatternTree.deserialize( ((PipeAlterEncodingCompressorPlan) plan).getPatternTreeBytes()), ((PipeAlterEncodingCompressorPlan) plan).getEncoding(), ((PipeAlterEncodingCompressorPlan) plan).getCompressor(), true, - shouldMarkAsPipeRequest.get(), - ((PipeAlterEncodingCompressorPlan) plan).isMayAlterAudit()); + shouldMarkAsPipeRequest.get()); case UpdateTriggerStateInTable: // TODO: Record complete message in trigger return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()); diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigPhysicalPlanPatternParseVisitor.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigPhysicalPlanPatternParseVisitor.java index 92e91b8b745f..dfddebba84a3 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigPhysicalPlanPatternParseVisitor.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/pipe/source/PipeConfigPhysicalPlanPatternParseVisitor.java @@ -257,7 +257,7 @@ public Optional visitPipeDeleteLogicalView( @Override public Optional visitPipeAlterEncodingCompressor( final PipeAlterEncodingCompressorPlan pipeAlterEncodingCompressorPlan, - final UnionIoTDBTreePattern pattern) { + final UnionIoTDBPipePattern pattern) { try { final PathPatternTree intersectedTree = pattern.getIntersection( @@ -267,8 +267,7 @@ public Optional visitPipeAlterEncodingCompressor( new PipeAlterEncodingCompressorPlan( intersectedTree.serialize(), pipeAlterEncodingCompressorPlan.getEncoding(), - pipeAlterEncodingCompressorPlan.getCompressor(), - pipeAlterEncodingCompressorPlan.isMayAlterAudit())) + pipeAlterEncodingCompressorPlan.getCompressor())) : Optional.empty(); } catch (final IOException e) { LOGGER.warn( diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java index a76e3494d051..c48ad78246ad 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java @@ -69,7 +69,6 @@ public class AlterEncodingCompressorProcedure private boolean ifExists; private byte encoding; private byte compressor; - private boolean mayAlterAudit; private transient ByteBuffer patternTreeBytes; private transient String requestMessage; @@ -84,15 +83,13 @@ public AlterEncodingCompressorProcedure( final PathPatternTree pathPatternTree, final boolean ifExists, final byte encoding, - final byte compressor, - final boolean mayAlterAudit) { + final byte compressor) { super(isGeneratedByPipe); this.queryId = queryId; setPatternTree(pathPatternTree); this.ifExists = ifExists; this.encoding = encoding; this.compressor = compressor; - this.mayAlterAudit = mayAlterAudit; } public String getQueryId() { @@ -147,7 +144,7 @@ protected Flow executeFromState( private void alterEncodingCompressorInSchemaRegion(final ConfigNodeProcedureEnv env) { final Map relatedSchemaRegionGroup = - env.getConfigManager().getRelatedSchemaRegionGroup(patternTree, mayAlterAudit); + env.getConfigManager().getRelatedSchemaRegionGroup(patternTree); if (relatedSchemaRegionGroup.isEmpty()) { if (!ifExists) { @@ -165,7 +162,7 @@ private void alterEncodingCompressorInSchemaRegion(final ConfigNodeProcedureEnv final DataNodeTSStatusTaskExecutor alterEncodingCompressorTask = new DataNodeTSStatusTaskExecutor( env, - env.getConfigManager().getRelatedSchemaRegionGroup(patternTree, mayAlterAudit), + env.getConfigManager().getRelatedSchemaRegionGroup(patternTree), false, CnToDnAsyncRequestType.ALTER_ENCODING_COMPRESSOR, ((dataNodeLocation, consensusGroupIdList) -> @@ -234,9 +231,9 @@ private void collectPayload4Pipe(final ConfigNodeProcedureEnv env) { isGeneratedByPipe ? new PipeEnrichedPlan( new PipeAlterEncodingCompressorPlan( - patternTreeBytes, encoding, compressor, mayAlterAudit)) + patternTreeBytes, encoding, compressor)) : new PipeAlterEncodingCompressorPlan( - patternTreeBytes, encoding, compressor, mayAlterAudit)); + patternTreeBytes, encoding, compressor)); } catch (final ConsensusException e) { LOGGER.warn(ClusterManager.CONSENSUS_WRITE_ERROR, e); result = new TSStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode()); @@ -282,7 +279,6 @@ public void serialize(final DataOutputStream stream) throws IOException { ReadWriteIOUtils.write(ifExists, stream); ReadWriteIOUtils.write(encoding, stream); ReadWriteIOUtils.write(compressor, stream); - ReadWriteIOUtils.write(mayAlterAudit, stream); } @Override @@ -293,7 +289,6 @@ public void deserialize(final ByteBuffer byteBuffer) { ifExists = ReadWriteIOUtils.readBoolean(byteBuffer); encoding = ReadWriteIOUtils.readByte(byteBuffer); compressor = ReadWriteIOUtils.readByte(byteBuffer); - mayAlterAudit = ReadWriteIOUtils.readBoolean(byteBuffer); } @Override @@ -310,8 +305,7 @@ public boolean equals(final Object o) { && this.isGeneratedByPipe == that.isGeneratedByPipe && this.patternTree.equals(that.patternTree) && this.encoding == that.encoding - && this.compressor == that.compressor - && this.mayAlterAudit == that.mayAlterAudit; + && this.compressor == that.compressor; } @Override @@ -325,7 +319,6 @@ public int hashCode() { patternTree, ifExists, encoding, - compressor, - mayAlterAudit); + compressor); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java index 53fbc35fd3c3..b5200a6bbc72 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java @@ -245,9 +245,6 @@ public Procedure create(ByteBuffer buffer) throws IOException { case PIPE_ENRICHED_ALTER_ENCODING_COMPRESSOR_PROCEDURE: procedure = new AlterEncodingCompressorProcedure(true); break; - case PIPE_ENRICHED_ALTER_ENCODING_COMPRESSOR_PROCEDURE: - procedure = new AlterEncodingCompressorProcedure(true); - break; case REMOVE_AI_NODE_PROCEDURE: procedure = new RemoveAINodeProcedure(); break; diff --git a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java index d8ec28091cda..59b5b65a4d40 100644 --- a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java +++ b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/pipe/receiver/PipeEnrichedProcedureTest.java @@ -374,34 +374,7 @@ public void alterEncodingCompressorTest() throws IllegalPathException, IOExcepti patternTree.constructTree(); final AlterEncodingCompressorProcedure alterEncodingCompressorProcedure = new AlterEncodingCompressorProcedure( - false, queryId, patternTree, false, (byte) 0, (byte) 0, false); - - final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); - alterEncodingCompressorProcedure.serialize(dataOutputStream); - - final ByteBuffer byteBuffer = ByteBuffer.wrap(byteArrayOutputStream.toByteArray()); - - Assert.assertEquals( - ProcedureType.ALTER_ENCODING_COMPRESSOR_PROCEDURE.getTypeCode(), byteBuffer.getShort()); - - final AlterEncodingCompressorProcedure deserializedProcedure = - new AlterEncodingCompressorProcedure(false); - deserializedProcedure.deserialize(byteBuffer); - - Assert.assertEquals(alterEncodingCompressorProcedure, deserializedProcedure); - } - - @Test - public void alterEncodingCompressorTest() throws IllegalPathException, IOException { - final String queryId = "1"; - final PathPatternTree patternTree = new PathPatternTree(); - patternTree.appendPathPattern(new PartialPath("root.sg1.**")); - patternTree.appendPathPattern(new PartialPath("root.sg2.*.s1")); - patternTree.constructTree(); - final AlterEncodingCompressorProcedure alterEncodingCompressorProcedure = - new AlterEncodingCompressorProcedure( - false, queryId, patternTree, false, (byte) 0, (byte) 0, false); + false, queryId, patternTree, false, (byte) 0, (byte) 0); final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); diff --git a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedureTest.java b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedureTest.java index b6f2541b2158..6da2fa55913a 100644 --- a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedureTest.java +++ b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedureTest.java @@ -42,7 +42,7 @@ public void serializeDeserializeTest() throws IllegalPathException, IOException patternTree.constructTree(); final AlterEncodingCompressorProcedure alterEncodingCompressorProcedure = new AlterEncodingCompressorProcedure( - false, queryId, patternTree, false, (byte) 0, (byte) 0, false); + false, queryId, patternTree, false, (byte) 0, (byte) 0); final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java index e1c5ce8be267..985611c032b9 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java @@ -33,8 +33,8 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ActivateTemplateNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java index 7d04b84cff81..bfb05e1f4a46 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java @@ -128,7 +128,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.load.LoadTsFilePieceNode; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.DeactivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.DeleteTimeSeriesNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java index dab316392058..1e0d45c32189 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java @@ -3244,7 +3244,7 @@ public Analysis visitShowTimeSeries( } @Override - public Analysis visitShowStorageGroup( + public Analysis visitShowDatabase( ShowDatabaseStatement showDatabaseStatement, MPPQueryContext context) { Analysis analysis = new Analysis(); analysis.setStatement(showDatabaseStatement); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java index dfc3aa8da73c..3f03e559a8ad 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -184,7 +184,6 @@ import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowTopicsTask; import org.apache.iotdb.db.queryengine.plan.expression.Expression; import org.apache.iotdb.db.queryengine.plan.expression.visitor.TransformToViewExpressionVisitor; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.view.AlterLogicalViewNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.view.AlterLogicalViewNode; import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterEncodingCompressorStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDatabaseStatement; @@ -2383,8 +2382,7 @@ public SettableFuture alterEncodingCompressor( ByteBuffer.wrap(byteArrayOutputStream.toByteArray()), SerializeUtils.serializeNullable(alterEncodingCompressorStatement.getEncoding()), SerializeUtils.serializeNullable(alterEncodingCompressorStatement.getCompressor()), - alterEncodingCompressorStatement.ifExists(), - alterEncodingCompressorStatement.isWithAudit()); + alterEncodingCompressorStatement.ifExists()); try (final ConfigNodeClient client = CLUSTER_DELETION_CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { TSStatus tsStatus; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java index bca5d7bbf87d..7a186238662e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java @@ -28,7 +28,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TThrottleQuotaResp; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.view.AlterLogicalViewNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.view.AlterLogicalViewNode; import org.apache.iotdb.db.queryengine.plan.statement.metadata.AlterEncodingCompressorStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.CountDatabaseStatement; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java index 30bcf0d44f0a..7959a6a060f5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java @@ -16,11 +16,11 @@ * specific language governing permissions and limitations * under the License. */ + package org.apache.iotdb.db.queryengine.plan.planner.plan.node; import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.load.LoadTsFilePieceNode; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.CountSchemaMergeNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.DeviceSchemaFetchScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.DevicesCountNode; @@ -39,6 +39,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesCountNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesSchemaScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ActivateTemplateNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java index c5715eb4dfcf..d6521d5fed79 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/AlterEncodingCompressorStatement.java @@ -49,7 +49,6 @@ public class AlterEncodingCompressorStatement extends Statement implements IConf private final CompressionType compressor; private final boolean ifExists; private final boolean ifPermitted; - private boolean withAudit = false; public AlterEncodingCompressorStatement( final PathPatternTree pathPatternTree, @@ -85,18 +84,6 @@ public boolean ifExists() { return ifExists; } - public boolean ifPermitted() { - return ifPermitted; - } - - public void setWithAudit(final boolean withAudit) { - this.withAudit = withAudit; - } - - public boolean isWithAudit() { - return withAudit; - } - @Override public List getPaths() { return patternTree.getAllPathPatterns(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java index 23822089999a..f5d08e17544a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java @@ -27,7 +27,7 @@ import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.exception.metadata.SchemaQuotaExceededException; import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.schemaengine.metric.ISchemaRegionMetric; import org.apache.iotdb.db.schemaengine.rescon.ISchemaRegionStatistics; import org.apache.iotdb.db.schemaengine.schemaregion.read.req.IShowDevicesPlan; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java index c587a5f0923c..14f6e2c28639 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java @@ -39,7 +39,7 @@ import org.apache.iotdb.db.exception.metadata.SchemaQuotaExceededException; import org.apache.iotdb.db.exception.metadata.SeriesOverflowException; import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode; import org.apache.iotdb.db.schemaengine.metric.ISchemaRegionMetric; import org.apache.iotdb.db.schemaengine.metric.SchemaRegionMemMetric; @@ -846,15 +846,21 @@ public void deleteTimeseriesInBlackList(final PathPatternTree patternTree) @Override public void alterEncodingCompressor(final AlterEncodingCompressorNode node) throws MetadataException { - boolean exist = false; - for (final PartialPath pathPattern : node.getPatternTree().getAllPathPatterns()) { - exist |= - mTree.alterEncodingCompressor(pathPattern, node.getEncoding(), node.getCompressionType()); - } - if (!exist) { - throw new PathNotExistException(node.getPatternTree().getAllPathPatterns().toString(), false); + try { + boolean exist = false; + for (final PartialPath pathPattern : node.getPatternTree().getAllPathPatterns()) { + exist |= + mtree.alterEncodingCompressor( + pathPattern, node.getEncoding(), node.getCompressionType()); + } + if (!exist) { + throw new PathNotExistException( + node.getPatternTree().getAllPathPatterns().toString(), false); + } + writeToMLog(node); + } catch (final IOException e) { + throw new MetadataException(e); } - writeToMLog(node); } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java index 2dba16eb93eb..b3b72d7f28ea 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java @@ -38,7 +38,7 @@ import org.apache.iotdb.db.exception.metadata.SchemaDirCreationFailureException; import org.apache.iotdb.db.exception.metadata.SchemaQuotaExceededException; import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.schemaengine.metric.ISchemaRegionMetric; import org.apache.iotdb.db.schemaengine.metric.SchemaRegionCachedMetric; import org.apache.iotdb.db.schemaengine.rescon.CachedSchemaRegionStatistics; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java index ec1a9272bfc1..26530541cfaf 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanDeserializer.java @@ -24,7 +24,7 @@ import org.apache.iotdb.commons.path.PathDeserializeUtil; import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegionPlan; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanType; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanVisitor; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java index d428187cabde..57378dd9d863 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/logfile/visitor/SchemaRegionPlanSerializer.java @@ -22,7 +22,7 @@ import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; -import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.AlterEncodingCompressorNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.write.AlterEncodingCompressorNode; import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegionPlan; import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanVisitor; import org.apache.iotdb.db.schemaengine.schemaregion.logfile.ISerializer; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java index 7c6c349a7e8f..02a87500faba 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java @@ -91,6 +91,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; +import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; @@ -659,7 +660,7 @@ protected void updateMeasurement(final IMeasurementMNode node) } node.setSchema( new MeasurementSchema( - schema.getMeasurementName(), + schema.getMeasurementId(), schema.getType(), Objects.nonNull(encoding) ? encoding : schema.getEncodingType(), Objects.nonNull(compressor) ? compressor : schema.getCompressor(), diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift index 29de878d6da2..d0ff35b40011 100644 --- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift +++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift @@ -796,8 +796,7 @@ struct TAlterEncodingCompressorReq { 3: required byte encoding 4: required byte compressor 5: required bool ifExists - 6: required bool mayAlterAudit - 7: optional bool isGeneratedByPipe + 6: optional bool isGeneratedByPipe } struct TDeleteTimeSeriesReq { From 5284c521e3b3aadb0468cc02c069ec24bdae8eae Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Mon, 10 Nov 2025 14:24:56 +0800 Subject: [PATCH 08/15] fix --- .../payload/PipeAlterEncodingCompressorPlan.java | 14 ++++++++++++++ .../schema/AlterEncodingCompressorProcedure.java | 7 +++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java index 46819c7822e2..05a64d79355f 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/pipe/payload/PipeAlterEncodingCompressorPlan.java @@ -81,6 +81,20 @@ protected void deserializeImpl(final ByteBuffer buffer) throws IOException { compressor = ReadWriteIOUtils.readByte(buffer); } + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final PipeAlterEncodingCompressorPlan that = (PipeAlterEncodingCompressorPlan) o; + return this.patternTreeBytes.equals(that.patternTreeBytes) + && this.encoding == that.encoding + && this.compressor == that.compressor; + } + @Override public int hashCode() { return Objects.hash(patternTreeBytes, encoding, compressor); diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java index c48ad78246ad..f63d39dab755 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java @@ -63,7 +63,8 @@ public class AlterEncodingCompressorProcedure extends StateMachineProcedure { - private static final Logger LOGGER = LoggerFactory.getLogger(AlterEncodingCompressorState.class); + private static final Logger LOGGER = + LoggerFactory.getLogger(AlterEncodingCompressorProcedure.class); private String queryId; private PathPatternTree patternTree; private boolean ifExists; @@ -293,7 +294,9 @@ public void deserialize(final ByteBuffer byteBuffer) { @Override public boolean equals(final Object o) { - if (this == o) return true; + if (this == o) { + return true; + } if (o == null || getClass() != o.getClass()) { return false; } From 8380d58563bafc37193e870af89eb22adcd1831d Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Mon, 10 Nov 2025 14:38:53 +0800 Subject: [PATCH 09/15] clear-audit --- .../IoTDBAlterEncodingCompressorIT.java | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java index 42c0275ab35b..402da25d28a8 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java @@ -143,17 +143,7 @@ public void alterEncodingAndCompressorTest() throws Exception { try { statement.execute( - "alter timeSeries root.vechile.wind.a, root.__audit.** set encoding=PLAIN, compressor=LZMA2"); - fail(); - } catch (final SQLException e) { - Assert.assertEquals( - "803: 'AUDIT' permission is needed to alter the encoding and compressor of database root.__audit", - e.getMessage()); - } - - try { - statement.execute( - "alter timeSeries if permitted root.vehicle.**, root.__audit.** set encoding=GORILLA, compressor=GZIP"); + "alter timeSeries if permitted root.vehicle.** set encoding=GORILLA, compressor=GZIP"); } catch (final SQLException e) { fail("Alter encoding & compressor shall not fail when no privileges if set if permitted"); } @@ -161,14 +151,6 @@ public void alterEncodingAndCompressorTest() throws Exception { try (final Connection connection = EnvFactory.getEnv().getConnection(); final Statement statement = connection.createStatement()) { - try (final ResultSet resultSet = - statement.executeQuery("SHOW TIMESERIES root.__audit.**._0.password")) { - while (resultSet.next()) { - assertEquals("PLAIN", resultSet.getString(5)); - assertEquals("LZMA2", resultSet.getString(6)); - } - } - try (final ResultSet resultSet = statement.executeQuery("SHOW TIMESERIES root.vehicle.wind.b")) { resultSet.next(); From b4c5aac0d9c5c51b30056adf62af8eae6a6bd512 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Mon, 10 Nov 2025 19:28:00 +0800 Subject: [PATCH 10/15] Changed the SQL of AlterEncodingCompressor statement & banned the "root" timeSeries & handled the empty intersection path & refactored the IT (#16725) --- .../IoTDBAlterEncodingCompressorIT.java | 52 +++++++++++++++---- .../apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 2 +- .../org/apache/iotdb/db/qp/sql/SqlLexer.g4 | 4 ++ .../executor/ClusterConfigTaskExecutor.java | 5 ++ .../queryengine/plan/parser/ASTVisitor.java | 3 ++ 5 files changed, 55 insertions(+), 11 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java index 402da25d28a8..434c1b8efde1 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java @@ -72,7 +72,15 @@ public void alterEncodingAndCompressorTest() throws Exception { statement.execute("create timeSeries root.vehicle.wind.a int32"); try { - statement.execute("alter timeSeries root.nonExist.** set encoding=PLAIN"); + statement.execute("alter timeSeries root set STORAGE_PROPERTIES encoding=PLAIN"); + fail(); + } catch (final SQLException e) { + Assert.assertEquals("701: The timeSeries shall not be root.", e.getMessage()); + } + + try { + statement.execute( + "alter timeSeries root.nonExist.** set STORAGE_PROPERTIES encoding=PLAIN"); fail(); } catch (final SQLException e) { Assert.assertEquals( @@ -81,41 +89,47 @@ public void alterEncodingAndCompressorTest() throws Exception { } try { - statement.execute("alter timeSeries if exists root.nonExist.** set encoding=PLAIN"); + statement.execute( + "alter timeSeries if exists root.nonExist.** set STORAGE_PROPERTIES encoding=PLAIN"); } catch (final SQLException e) { fail( "Alter encoding & compressor shall not fail when timeSeries not exists if set if exists"); } try { - statement.execute("alter timeSeries if exists root.vehicle.** set encoding=aaa"); + statement.execute( + "alter timeSeries if exists root.vehicle.** set STORAGE_PROPERTIES encoding=aaa"); fail(); } catch (final SQLException e) { Assert.assertEquals("701: Unsupported encoding: AAA", e.getMessage()); } try { - statement.execute("alter timeSeries if exists root.vehicle.** set compressor=aaa"); + statement.execute( + "alter timeSeries if exists root.vehicle.** set STORAGE_PROPERTIES compressor=aaa"); fail(); } catch (final SQLException e) { Assert.assertEquals("701: Unsupported compressor: AAA", e.getMessage()); } try { - statement.execute("alter timeSeries if exists root.vehicle.** set falseKey=aaa"); + statement.execute( + "alter timeSeries if exists root.vehicle.** set STORAGE_PROPERTIES falseKey=aaa"); fail(); } catch (final SQLException e) { Assert.assertEquals("701: property falsekey is unsupported yet.", e.getMessage()); } try { - statement.execute("alter timeSeries if exists root.vehicle.** set encoding=DICTIONARY"); + statement.execute( + "alter timeSeries if exists root.vehicle.** set STORAGE_PROPERTIES encoding=DICTIONARY"); fail(); } catch (final SQLException e) { Assert.assertTrue(e.getMessage().contains("encoding DICTIONARY does not support INT32")); } - statement.execute("alter timeSeries root.** set encoding=Plain, compressor=LZMA2"); + statement.execute( + "alter timeSeries root.** set STORAGE_PROPERTIES encoding=Plain, compressor=LZMA2"); try (final ResultSet resultSet = statement.executeQuery("SHOW TIMESERIES")) { while (resultSet.next()) { @@ -133,20 +147,38 @@ public void alterEncodingAndCompressorTest() throws Exception { EnvFactory.getEnv().getConnection("IoTDBUser", "!@#$!dfdfzvd343"); final Statement statement = connection.createStatement()) { try { - statement.execute("alter timeSeries root.vechile.** set encoding=PLAIN, compressor=LZMA2"); + statement.execute( + "alter timeSeries root.vehicle.** set STORAGE_PROPERTIES encoding=PLAIN, compressor=LZMA2"); fail(); } catch (final SQLException e) { Assert.assertEquals( - "803: No permissions for this operation, please add privilege WRITE_SCHEMA on [root.vechile.**]", + "803: No permissions for this operation, please add privilege WRITE_SCHEMA on [root.vehicle.**]", e.getMessage()); } try { statement.execute( - "alter timeSeries if permitted root.vehicle.** set encoding=GORILLA, compressor=GZIP"); + "alter timeSeries root.vehicle.wind.a, root.__audit.** set STORAGE_PROPERTIES encoding=PLAIN, compressor=LZMA2"); + fail(); + } catch (final SQLException e) { + Assert.assertEquals( + "803: 'AUDIT' permission is needed to alter the encoding and compressor of database root.__audit", + e.getMessage()); + } + + try { + statement.execute( + "alter timeSeries if permitted root.vehicle.** set STORAGE_PROPERTIES encoding=GORILLA, compressor=GZIP"); } catch (final SQLException e) { fail("Alter encoding & compressor shall not fail when no privileges if set if permitted"); } + + try { + statement.execute( + "alter timeSeries if permitted root.nonExist.** set STORAGE_PROPERTIES encoding=GORILLA, compressor=GZIP"); + } catch (final SQLException e) { + fail("Alter encoding & compressor shall not fail if the intersected paths are empty"); + } } try (final Connection connection = EnvFactory.getEnv().getConnection(); diff --git a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 index 36dc10048b3b..9b1f140f1907 100644 --- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 +++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 @@ -177,7 +177,7 @@ alterClause ; alterEncodingCompressor - : ALTER TIMESERIES (IF EXISTS)? (IF PERMITTED)? prefixPath (COMMA prefixPath)* SET attributePair (COMMA attributePair)* + : ALTER TIMESERIES (IF EXISTS)? (IF PERMITTED)? prefixPath (COMMA prefixPath)* SET STORAGE_PROPERTIES attributePair (COMMA attributePair)* ; aliasClause diff --git a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 index 1cccee25f6bc..20470adc5ead 100644 --- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 +++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 @@ -794,6 +794,10 @@ STOP : S T O P ; +STORAGE_PROPERTIES + : S T O R A G E '_' P R O P E R T I E S + ; + SUBSCRIPTION : S U B S C R I P T I O N ; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java index 3f03e559a8ad..58ec91a2a2f8 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -2369,6 +2369,11 @@ public SettableFuture alterEncodingCompressor( final String queryId, final AlterEncodingCompressorStatement alterEncodingCompressorStatement) { final SettableFuture future = SettableFuture.create(); + // Will only occur if no permission + if (alterEncodingCompressorStatement.getPatternTree().isEmpty()) { + future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); + return future; + } final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); final DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); try { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java index f37708c0a8c5..58f9eddffe4a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java @@ -656,6 +656,9 @@ public Statement visitAlterEncodingCompressor( } } + if (tree.isEmpty()) { + throw new SemanticException("The timeSeries shall not be root."); + } return new AlterEncodingCompressorStatement( tree, encoding, From 45645794db10ca2b3f400ec3bf07db37d0fdf606 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Mon, 10 Nov 2025 19:40:16 +0800 Subject: [PATCH 11/15] fix-herer --- .../org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java index 720cab5ace10..1ced28384ced 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java @@ -82,7 +82,7 @@ public void testPureSchemaInclusion() throws Exception { "create timeSeries root.ln.wf01.wt01.status with datatype=BOOLEAN,encoding=PLAIN", "ALTER timeSeries root.ln.wf01.wt01.status ADD TAGS tag3=v3", "ALTER timeSeries root.ln.wf01.wt01.status ADD ATTRIBUTES attr4=v4", - "ALTER timeSeries root.** set compressor=ZSTD"))) { + "ALTER timeSeries root.** set STORAGE_PROPERTIES compressor=ZSTD"))) { return; } From cd56a0016bd6ec3ca294c4474ff3d46f8c8847f7 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Mon, 10 Nov 2025 19:56:01 +0800 Subject: [PATCH 12/15] fix --- .../pipe/it/manual/IoTDBPipeInclusionIT.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java index 1ced28384ced..a86018371c4d 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java @@ -81,8 +81,7 @@ public void testPureSchemaInclusion() throws Exception { // banned "create timeSeries root.ln.wf01.wt01.status with datatype=BOOLEAN,encoding=PLAIN", "ALTER timeSeries root.ln.wf01.wt01.status ADD TAGS tag3=v3", - "ALTER timeSeries root.ln.wf01.wt01.status ADD ATTRIBUTES attr4=v4", - "ALTER timeSeries root.** set STORAGE_PROPERTIES compressor=ZSTD"))) { + "ALTER timeSeries root.ln.wf01.wt01.status ADD ATTRIBUTES attr4=v4"))) { return; } @@ -91,15 +90,24 @@ public void testPureSchemaInclusion() throws Exception { "show timeseries", "Timeseries,Alias,Database,DataType,Encoding,Compression,Tags,Attributes,Deadband,DeadbandParameters,ViewType,", Collections.singleton( - "root.ln.wf01.wt01.status,null,root.ln,BOOLEAN,PLAIN,ZSTD,{\"tag3\":\"v3\"},{\"attr4\":\"v4\"},null,null,BASE,")); + "root.ln.wf01.wt01.status,null,root.ln,BOOLEAN,PLAIN,LZ4,{\"tag3\":\"v3\"},{\"attr4\":\"v4\"},null,null,BASE,")); if (!TestUtils.tryExecuteNonQueriesWithRetry( senderEnv, Arrays.asList( - "insert into root.ln.wf01.wt01(time, status) values(now(), false)", "flush"))) { + "ALTER timeSeries root.** set STORAGE_PROPERTIES compressor=ZSTD", + "insert into root.ln.wf01.wt01(time, status) values(now(), false)", + "flush"))) { return; } + TestUtils.assertDataEventuallyOnEnv( + receiverEnv, + "show timeseries", + "Timeseries,Alias,Database,DataType,Encoding,Compression,Tags,Attributes,Deadband,DeadbandParameters,ViewType,", + Collections.singleton( + "root.ln.wf01.wt01.status,null,root.ln,BOOLEAN,PLAIN,ZSTD,{\"tag3\":\"v3\"},{\"attr4\":\"v4\"},null,null,BASE,")); + TestUtils.assertDataAlwaysOnEnv( receiverEnv, "select * from root.**", "Time,", Collections.emptySet()); } From 07ef11e16ef32d2951be443d74c5967741ae51e1 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Tue, 11 Nov 2025 10:01:58 +0800 Subject: [PATCH 13/15] fix --- .../db/it/schema/IoTDBAlterEncodingCompressorIT.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java index 434c1b8efde1..334660bbbe5b 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAlterEncodingCompressorIT.java @@ -156,16 +156,6 @@ public void alterEncodingAndCompressorTest() throws Exception { e.getMessage()); } - try { - statement.execute( - "alter timeSeries root.vehicle.wind.a, root.__audit.** set STORAGE_PROPERTIES encoding=PLAIN, compressor=LZMA2"); - fail(); - } catch (final SQLException e) { - Assert.assertEquals( - "803: 'AUDIT' permission is needed to alter the encoding and compressor of database root.__audit", - e.getMessage()); - } - try { statement.execute( "alter timeSeries if permitted root.vehicle.** set STORAGE_PROPERTIES encoding=GORILLA, compressor=GZIP"); From 04361a2280d50bc0f2ecba1ba722ea5ef77b0842 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Wed, 12 Nov 2025 10:44:05 +0800 Subject: [PATCH 14/15] partial --- .../impl/DataNodeInternalRPCServiceImpl.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java index bfb05e1f4a46..f8a850525c34 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java @@ -621,13 +621,21 @@ public TSStatus rollbackSchemaBlackList(TRollbackSchemaBlackListReq req) { @Override public TSStatus invalidateMatchedSchemaCache(TInvalidateMatchedSchemaCacheReq req) { DataNodeSchemaCache cache = DataNodeSchemaCache.getInstance(); - DataNodeSchemaLockManager.getInstance().takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION); - cache.takeWriteLock(); + if (req.needLock || !req.isSetNeedLock()) { + DataNodeSchemaLockManager.getInstance().takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION); + } try { - cache.invalidate(PathPatternTree.deserialize(req.pathPatternTree).getAllPathPatterns()); + cache.takeWriteLock(); + try { + cache.invalidate(PathPatternTree.deserialize(req.pathPatternTree).getAllPathPatterns()); + } finally { + cache.releaseWriteLock(); + } } finally { - cache.releaseWriteLock(); - DataNodeSchemaLockManager.getInstance().releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION); + if (req.needLock || !req.isSetNeedLock()) { + DataNodeSchemaLockManager.getInstance() + .releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION); + } } return RpcUtils.SUCCESS_STATUS; } From 4a5442143532174a645c2d1dac9107d46b323454 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Tue, 11 Nov 2025 19:26:28 +0800 Subject: [PATCH 15/15] Optimized the lock for encoding & compressor's invalidate cache (#16733) * fix * jr --- .../impl/schema/AlterEncodingCompressorProcedure.java | 2 +- .../procedure/impl/schema/DeleteTimeSeriesProcedure.java | 7 ++++--- .../thrift-datanode/src/main/thrift/datanode.thrift | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java index f63d39dab755..3bb41e509e10 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java @@ -127,7 +127,7 @@ protected Flow executeFromState( break; case CLEAR_CACHE: LOGGER.info("Invalidate cache of timeSeries {}", requestMessage); - invalidateCache(env, patternTreeBytes, requestMessage, this::setFailure); + invalidateCache(env, patternTreeBytes, requestMessage, this::setFailure, false); collectPayload4Pipe(env); return Flow.NO_MORE_STATE; default: diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java index 4372bef0e08c..f4e549a2800a 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java @@ -117,7 +117,7 @@ protected Flow executeFromState( } case CLEAN_DATANODE_SCHEMA_CACHE: LOGGER.info("Invalidate cache of timeSeries {}", requestMessage); - invalidateCache(env, patternTreeBytes, requestMessage, this::setFailure); + invalidateCache(env, patternTreeBytes, requestMessage, this::setFailure, true); setNextState(DeleteTimeSeriesState.DELETE_DATA); break; case DELETE_DATA: @@ -199,13 +199,14 @@ public static void invalidateCache( final ConfigNodeProcedureEnv env, final ByteBuffer patternTreeBytes, final String requestMessage, - final Consumer setFailure) { + final Consumer setFailure, + final boolean needLock) { final Map dataNodeLocationMap = env.getConfigManager().getNodeManager().getRegisteredDataNodeLocations(); final DataNodeAsyncRequestContext clientHandler = new DataNodeAsyncRequestContext<>( CnToDnAsyncRequestType.INVALIDATE_MATCHED_SCHEMA_CACHE, - new TInvalidateMatchedSchemaCacheReq(patternTreeBytes), + new TInvalidateMatchedSchemaCacheReq(patternTreeBytes).setNeedLock(needLock), dataNodeLocationMap); CnToDnInternalServiceAsyncRequestManager.getInstance().sendAsyncRequestWithRetry(clientHandler); final Map statusMap = clientHandler.getResponseMap(); diff --git a/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift b/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift index fd4a22c8a7b5..7e5c7c5b4e4b 100644 --- a/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift +++ b/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift @@ -359,6 +359,7 @@ struct TRollbackSchemaBlackListReq { struct TInvalidateMatchedSchemaCacheReq { 1: required binary pathPatternTree + 2: optional bool needLock } struct TFetchSchemaBlackListReq {