This is an automated email from the ASF dual-hosted git repository.
Caideyipi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 61e405bbfdb Revert "Show pre-deleted table schemas and improve write
errors (#18626)" (#18762)
61e405bbfdb is described below
commit 61e405bbfdbe3033712fe4c472d9b9817c65eba2
Author: alpass163 <[email protected]>
AuthorDate: Tue Sep 29 17:38:59 2026 +0800
Revert "Show pre-deleted table schemas and improve write errors (#18626)"
(#18762)
This reverts commit 3b47945b3ceb0c3c25c1951a7afd3b2424fde3d5.
---
.../consensus/request/ConfigPhysicalPlan.java | 4 -
.../consensus/request/ConfigPhysicalPlanType.java | 1 -
.../table/RollbackPreAlterColumnDataTypePlan.java | 61 ----
.../manager/schema/ClusterSchemaManager.java | 40 +--
.../persistence/executor/ConfigPlanExecutor.java | 4 -
.../persistence/schema/ClusterSchemaInfo.java | 103 +-----
.../confignode/persistence/schema/ConfigMTree.java | 169 +---------
.../table/AlterTableColumnDataTypeProcedure.java | 78 +----
.../impl/schema/table/CreateTableProcedure.java | 16 +-
.../request/ConfigPhysicalPlanSerDeTest.java | 15 -
.../persistence/schema/ConfigMTreeTest.java | 77 +----
.../persistence/schema/TablePreDeleteTest.java | 368 ---------------------
.../AlterTableColumnDataTypeProcedureTest.java | 171 ----------
.../schema/table/CreateTableProcedureTest.java | 39 ---
.../iotdb/db/i18n/DataNodeSchemaMessages.java | 2 +
.../iotdb/db/i18n/DataNodeSchemaMessages.java | 2 +
.../config/executor/ClusterConfigTaskExecutor.java | 14 -
.../fetcher/TableHeaderSchemaValidator.java | 41 +--
.../db/schemaengine/table/DataNodeTableCache.java | 86 +----
.../plan/relational/analyzer/TreeViewTest.java | 5 -
.../fetcher/TableHeaderSchemaValidatorTest.java | 251 --------------
.../schemaengine/table/DataNodeTableCacheTest.java | 191 +----------
.../apache/iotdb/commons/i18n/CommonMessages.java | 6 -
.../apache/iotdb/commons/i18n/CommonMessages.java | 6 -
.../exception/table/ColumnInAlterException.java | 40 ---
.../exception/table/ColumnInDeletionException.java | 40 ---
.../exception/table/TableInDeletionException.java | 38 ---
27 files changed, 49 insertions(+), 1819 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 ff765a035b0..0d9ca912571 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
@@ -116,7 +116,6 @@ import
org.apache.iotdb.confignode.consensus.request.write.table.PreDeleteTableP
import
org.apache.iotdb.confignode.consensus.request.write.table.RenameTableColumnPlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackCreateTablePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreAlterColumnDataTypePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreDeleteTablePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
@@ -464,9 +463,6 @@ public abstract class ConfigPhysicalPlan implements
IConsensusRequest {
case PreAlterColumnDataType:
plan = new PreAlterColumnDataTypePlan();
break;
- case RollbackPreAlterColumnDataType:
- plan = new RollbackPreAlterColumnDataTypePlan();
- break;
case AlterColumnDataType:
plan = new AlterColumnDataTypePlan();
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 8abc88d5350..5d1381f3272 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
@@ -233,7 +233,6 @@ public enum ConfigPhysicalPlanType {
AlterColumnDataType((short) 878),
PreAlterColumnDataType((short) 879),
RollbackPreDeleteTable((short) 880),
- RollbackPreAlterColumnDataType((short) 881),
/** Deprecated types for sync, restored them for upgrade. */
@Deprecated
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/table/RollbackPreAlterColumnDataTypePlan.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/table/RollbackPreAlterColumnDataTypePlan.java
deleted file mode 100644
index bcb9fb4ca72..00000000000
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/table/RollbackPreAlterColumnDataTypePlan.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.table;
-
-import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType;
-
-import org.apache.tsfile.enums.TSDataType;
-
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-public class RollbackPreAlterColumnDataTypePlan extends
AbstractTableColumnPlan {
- private TSDataType newType;
-
- public RollbackPreAlterColumnDataTypePlan() {
- super(ConfigPhysicalPlanType.RollbackPreAlterColumnDataType);
- }
-
- public RollbackPreAlterColumnDataTypePlan(
- final String database,
- final String tableName,
- final String columnName,
- final TSDataType newType) {
- super(ConfigPhysicalPlanType.RollbackPreAlterColumnDataType, database,
tableName, columnName);
- this.newType = newType;
- }
-
- @Override
- protected void serializeImpl(final DataOutputStream stream) throws
IOException {
- super.serializeImpl(stream);
- stream.write(newType.serialize());
- }
-
- @Override
- protected void deserializeImpl(final ByteBuffer buffer) throws IOException {
- super.deserializeImpl(buffer);
- newType = TSDataType.deserializeFrom(buffer);
- }
-
- public TSDataType getNewType() {
- return newType;
- }
-}
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
index b55180e35f7..840be42d48c 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
@@ -24,7 +24,6 @@ import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.commons.conf.CommonDescriptor;
import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.exception.table.TableInDeletionException;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.path.PathPatternTree;
import org.apache.iotdb.commons.schema.SchemaConstant;
@@ -1541,34 +1540,13 @@ public class ClusterSchemaManager {
return clusterSchemaInfo.getTsTableIfExists(database, tableName);
}
- public boolean isColumnAlterCommitted(
- final String database,
- final String tableName,
- final String columnName,
- final TSDataType dataType)
- throws MetadataException {
- return clusterSchemaInfo.isColumnAlterCommitted(database, tableName,
columnName, dataType);
- }
-
- public Optional<TSDataType> getPreAlteredColumnType(
- final String database, final String tableName, final String columnName)
- throws MetadataException {
- return clusterSchemaInfo.getPreAlteredColumnType(database, tableName,
columnName);
- }
-
public synchronized Pair<TSStatus, TsTable>
tableColumnCheckForColumnExtension(
final String database,
final String tableName,
final List<TsTableColumnSchema> columnSchemaList,
final boolean isTableView)
throws MetadataException {
- final TsTable originalTable =
- clusterSchemaInfo.getTableForModification(
- database,
- tableName,
- columnSchemaList.stream()
- .map(TsTableColumnSchema::getColumnName)
- .toArray(String[]::new));
+ final TsTable originalTable = getTableIfExists(database,
tableName).orElse(null);
if (Objects.isNull(originalTable)) {
return new Pair<>(
@@ -1623,7 +1601,7 @@ public class ClusterSchemaManager {
final TSDataType dataType,
final boolean isGeneratedByPipe)
throws MetadataException {
- final TsTable originalTable =
clusterSchemaInfo.getTableForModification(database, tableName);
+ final TsTable originalTable = getTableIfExists(database,
tableName).orElse(null);
if (Objects.isNull(originalTable)) {
return new Pair<>(
@@ -1660,8 +1638,7 @@ public class ClusterSchemaManager {
final String newName,
final boolean isTableView)
throws MetadataException {
- final TsTable originalTable =
- clusterSchemaInfo.getTableForModification(database, tableName,
oldName, newName);
+ final TsTable originalTable = getTableIfExists(database,
tableName).orElse(null);
if (Objects.isNull(originalTable)) {
return new Pair<>(
@@ -1714,7 +1691,7 @@ public class ClusterSchemaManager {
final String newName,
final boolean isTableView)
throws MetadataException {
- final TsTable originalTable =
clusterSchemaInfo.getTableForModification(database, tableName);
+ final TsTable originalTable = getTableIfExists(database,
tableName).orElse(null);
if (Objects.isNull(originalTable)) {
return new Pair<>(
@@ -1730,12 +1707,7 @@ public class ClusterSchemaManager {
return result.get();
}
- final Optional<Pair<TsTable, TableNodeStatus>> targetTable =
- getTableAndStatusIfExists(database, newName);
- if (targetTable.isPresent() && targetTable.get().getRight() ==
TableNodeStatus.PRE_DELETE) {
- throw new TableInDeletionException(database, newName);
- }
- if (targetTable.isPresent()) {
+ if (getTableIfExists(database, newName).isPresent()) {
return new Pair<>(
RpcUtils.getStatus(
TSStatusCode.TABLE_ALREADY_EXISTS,
@@ -1804,7 +1776,7 @@ public class ClusterSchemaManager {
final Map<String, String> updatedProperties,
final boolean isTableView)
throws MetadataException {
- final TsTable originalTable =
clusterSchemaInfo.getTableForModification(database, tableName);
+ final TsTable originalTable = getTableIfExists(database,
tableName).orElse(null);
if (Objects.isNull(originalTable)) {
return new Pair<>(
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 f2d6ae80926..772f46baa31 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
@@ -134,7 +134,6 @@ import
org.apache.iotdb.confignode.consensus.request.write.table.PreDeleteTableP
import
org.apache.iotdb.confignode.consensus.request.write.table.RenameTableColumnPlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackCreateTablePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreAlterColumnDataTypePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreDeleteTablePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
@@ -616,9 +615,6 @@ public class ConfigPlanExecutor {
return clusterSchemaInfo.dropTable((CommitDeleteTablePlan)
physicalPlan);
case PreAlterColumnDataType:
return
clusterSchemaInfo.preAlterColumnDataType((PreAlterColumnDataTypePlan)
physicalPlan);
- case RollbackPreAlterColumnDataType:
- return clusterSchemaInfo.rollbackPreAlterColumnDataType(
- (RollbackPreAlterColumnDataTypePlan) physicalPlan);
case AlterColumnDataType:
return clusterSchemaInfo.commitAlterColumnDataType(
((AlterColumnDataTypePlan) physicalPlan));
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
index dc8106a76a6..1b9c880cd6a 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
@@ -27,9 +27,6 @@ import org.apache.iotdb.commons.conf.CommonDescriptor;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.exception.SemanticException;
-import org.apache.iotdb.commons.exception.table.ColumnInAlterException;
-import org.apache.iotdb.commons.exception.table.ColumnInDeletionException;
-import org.apache.iotdb.commons.exception.table.TableInDeletionException;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.path.PathPatternTree;
import org.apache.iotdb.commons.schema.table.TableNodeStatus;
@@ -37,7 +34,6 @@ import org.apache.iotdb.commons.schema.table.TableType;
import org.apache.iotdb.commons.schema.table.TreeViewSchema;
import org.apache.iotdb.commons.schema.table.TsTable;
import org.apache.iotdb.commons.schema.table.TsTableInternalRPCUtil;
-import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
import org.apache.iotdb.commons.schema.template.Template;
import org.apache.iotdb.commons.snapshot.SnapshotProcessor;
import org.apache.iotdb.commons.utils.PathUtils;
@@ -71,7 +67,6 @@ import
org.apache.iotdb.confignode.consensus.request.write.table.PreDeleteTableP
import
org.apache.iotdb.confignode.consensus.request.write.table.RenameTableColumnPlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackCreateTablePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreAlterColumnDataTypePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreDeleteTablePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
@@ -114,7 +109,6 @@ import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.tsfile.annotations.TableModel;
-import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.utils.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -1358,11 +1352,9 @@ public class ClusterSchemaInfo implements
SnapshotProcessor {
})
.collect(Collectors.toList())
: tableModelMTree
- .getAllTablesUnderSpecificDatabase(
+ .getAllUsingTablesUnderSpecificDatabase(
getQualifiedDatabasePartialPath(plan.getDatabase()))
.stream()
- .filter(pair -> pair.getRight() !=
TableNodeStatus.PRE_CREATE)
- .map(Pair::getLeft)
.map(
tsTable ->
new TTableInfo(
@@ -1455,7 +1447,7 @@ public class ClusterSchemaInfo implements
SnapshotProcessor {
}
return new DescTableResp(
StatusUtils.OK,
- tableModelMTree.getTableSchemaForDesc(databasePath,
plan.getTableName()),
+ tableModelMTree.getUsingTableSchema(databasePath,
plan.getTableName()),
null,
null);
} catch (final MetadataException e) {
@@ -1565,80 +1557,6 @@ public class ClusterSchemaInfo implements
SnapshotProcessor {
}
}
- public TsTable getTableForModification(
- final String database, final String tableName, final String...
columnNames)
- throws MetadataException {
- databaseReadWriteLock.readLock().lock();
- try {
- final PartialPath databasePath =
getQualifiedDatabasePartialPath(database);
- final Optional<Pair<TsTable, TableNodeStatus>> tableAndStatus =
- tableModelMTree.getTableAndStatusIfExists(databasePath, tableName);
- if (!tableAndStatus.isPresent()) {
- return null;
- }
- if (tableAndStatus.get().getRight() == TableNodeStatus.PRE_DELETE) {
- throw new TableInDeletionException(database, tableName);
- }
- final TableSchemaDetails details =
- tableModelMTree.getTableSchemaDetails(databasePath, tableName);
- for (final String columnName : columnNames) {
- if (details.preDeletedColumns.contains(columnName)) {
- throw new ColumnInDeletionException(database, tableName, columnName);
- }
- if (details.preAlteredColumns.containsKey(columnName)) {
- throw new ColumnInAlterException(database, tableName, columnName);
- }
- }
- return tableModelMTree.getTableSchemaForDataNode(databasePath,
tableName);
- } finally {
- databaseReadWriteLock.readLock().unlock();
- }
- }
-
- public boolean isColumnAlterCommitted(
- final String database,
- final String tableName,
- final String columnName,
- final TSDataType dataType)
- throws MetadataException {
- databaseReadWriteLock.readLock().lock();
- try {
- final PartialPath databasePath =
getQualifiedDatabasePartialPath(database);
- final Optional<Pair<TsTable, TableNodeStatus>> tableAndStatus =
- tableModelMTree.getTableAndStatusIfExists(databasePath, tableName);
- if (!tableAndStatus.isPresent()) {
- return false;
- }
- final TableSchemaDetails details =
- tableModelMTree.getTableSchemaDetails(databasePath, tableName);
- final TsTableColumnSchema columnSchema =
details.table.getColumnSchema(columnName);
- return !details.preAlteredColumns.containsKey(columnName)
- && columnSchema != null
- && columnSchema.getDataType() == dataType;
- } finally {
- databaseReadWriteLock.readLock().unlock();
- }
- }
-
- public Optional<TSDataType> getPreAlteredColumnType(
- final String database, final String tableName, final String columnName)
- throws MetadataException {
- databaseReadWriteLock.readLock().lock();
- try {
- final PartialPath databasePath =
getQualifiedDatabasePartialPath(database);
- if (!tableModelMTree.getTableAndStatusIfExists(databasePath,
tableName).isPresent()) {
- return Optional.empty();
- }
- return Optional.ofNullable(
- tableModelMTree
- .getTableSchemaDetails(databasePath, tableName)
- .preAlteredColumns
- .get(columnName));
- } finally {
- databaseReadWriteLock.readLock().unlock();
- }
- }
-
public TSStatus addTableColumn(final AddTableColumnPlan plan) {
return executeWithLock(
() -> {
@@ -1726,23 +1644,6 @@ public class ClusterSchemaInfo implements
SnapshotProcessor {
}
}
- public TSStatus rollbackPreAlterColumnDataType(final
RollbackPreAlterColumnDataTypePlan plan) {
- databaseReadWriteLock.writeLock().lock();
- try {
- tableModelMTree.rollbackPreAlterColumnDataType(
- getQualifiedDatabasePartialPath(plan.getDatabase()),
- plan.getTableName(),
- plan.getColumnName(),
- plan.getNewType());
- return RpcUtils.SUCCESS_STATUS;
- } catch (final MetadataException e) {
- LOGGER.warn(e.getMessage(), e);
- return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
- } finally {
- databaseReadWriteLock.writeLock().unlock();
- }
- }
-
public TSStatus commitAlterColumnDataType(AlterColumnDataTypePlan plan) {
databaseReadWriteLock.writeLock().lock();
try {
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
index 53dacbd7196..12f6a2baaa1 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
@@ -25,11 +25,8 @@ import
org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.exception.IoTDBException;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.exception.SemanticException;
-import org.apache.iotdb.commons.exception.table.ColumnInAlterException;
-import org.apache.iotdb.commons.exception.table.ColumnInDeletionException;
import org.apache.iotdb.commons.exception.table.ColumnNotExistsException;
import org.apache.iotdb.commons.exception.table.TableAlreadyExistsException;
-import org.apache.iotdb.commons.exception.table.TableInDeletionException;
import org.apache.iotdb.commons.exception.table.TableNotExistsException;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.path.PathPatternTree;
@@ -687,9 +684,6 @@ public class ConfigMTree {
tableNode.setTable(table);
tableNode.setStatus(TableNodeStatus.PRE_CREATE);
} else if (node instanceof ConfigTableNode) {
- if (((ConfigTableNode) node).getStatus() == TableNodeStatus.PRE_DELETE) {
- throw new TableInDeletionException(database.getFullPath(),
table.getTableName());
- }
throw new TableAlreadyExistsException(
database.getFullPath().substring(ROOT.length() + 1),
table.getTableName());
} else {
@@ -703,10 +697,6 @@ public class ConfigMTree {
final IConfigMNode databaseNode =
getDatabaseNodeByDatabasePath(database).getAsMNode();
final IConfigMNode node = databaseNode.getChild(table.getTableName());
if (Objects.nonNull(node)) {
- if (node instanceof ConfigTableNode
- && ((ConfigTableNode) node).getStatus() ==
TableNodeStatus.PRE_DELETE) {
- throw new TableInDeletionException(database.getFullPath(),
table.getTableName());
- }
if (!TreeViewSchema.isTreeViewTable(((ConfigTableNode)
node).getTable())) {
throw new TableAlreadyExistsException(
database.getFullPath().substring(ROOT.length() + 1),
table.getTableName());
@@ -784,7 +774,7 @@ public class ConfigMTree {
public void renameTable(final PartialPath database, final String tableName,
final String newName)
throws MetadataException {
final IConfigMNode databaseNode =
getDatabaseNodeByDatabasePath(database).getAsMNode();
- final ConfigTableNode tableNode = getTableNodeForModification(database,
tableName);
+ final ConfigTableNode tableNode = (ConfigTableNode)
databaseNode.getChild(tableName);
store.deleteChild(databaseNode, tableName);
tableNode.setName(newName);
store.addChild(databaseNode, newName, tableNode);
@@ -796,19 +786,7 @@ public class ConfigMTree {
final String oldName,
final String newName)
throws MetadataException {
- final ConfigTableNode tableNode = getTableNodeForModification(database,
tableName);
- if (tableNode.getPreDeletedColumns().contains(oldName)) {
- throw new ColumnInDeletionException(database.getFullPath(), tableName,
oldName);
- }
- if (tableNode.getPreDeletedColumns().contains(newName)) {
- throw new ColumnInDeletionException(database.getFullPath(), tableName,
newName);
- }
- if (tableNode.getPreAlteredColumns().containsKey(oldName)) {
- throw new ColumnInAlterException(database.getFullPath(), tableName,
oldName);
- }
- if (tableNode.getPreAlteredColumns().containsKey(newName)) {
- throw new ColumnInAlterException(database.getFullPath(), tableName,
newName);
- }
+ final ConfigTableNode tableNode = getTableNode(database, tableName);
tableNode.getTable().renameColumnSchema(oldName, newName);
}
@@ -818,7 +796,7 @@ public class ConfigMTree {
final String comment,
final boolean isView)
throws MetadataException {
- final TsTable table = getTableForModification(database, tableName);
+ final TsTable table = getTable(database, tableName);
final Optional<Pair<TSStatus, TsTable>> check =
ClusterSchemaManager.checkTable4View(database.getTailNode(), table,
isView);
if (check.isPresent()) {
@@ -838,8 +816,7 @@ public class ConfigMTree {
final @Nonnull String columnName,
final @Nullable String comment)
throws MetadataException {
- final ConfigTableNode node = getTableNodeForModification(database,
tableName);
- final TsTable table = node.getTable();
+ final TsTable table = getTable(database, tableName);
final TsTableColumnSchema columnSchema = table.getColumnSchema(columnName);
@@ -847,12 +824,6 @@ public class ConfigMTree {
throw new ColumnNotExistsException(
PathUtils.unQualifyDatabaseName(database.getFullPath()), tableName,
columnName);
}
- if (node.getPreDeletedColumns().contains(columnName)) {
- throw new ColumnInDeletionException(database.getFullPath(), tableName,
columnName);
- }
- if (node.getPreAlteredColumns().containsKey(columnName)) {
- throw new ColumnInAlterException(database.getFullPath(), tableName,
columnName);
- }
if (Objects.nonNull(comment)) {
columnSchema.getProps().put(TsTable.COMMENT_KEY, comment);
} else {
@@ -868,7 +839,7 @@ public class ConfigMTree {
child ->
child instanceof ConfigTableNode
&& ((ConfigTableNode)
child).getStatus().equals(TableNodeStatus.USING))
- .map(child -> getTableSchemaForDataNode((ConfigTableNode) child))
+ .map(child -> ((ConfigTableNode) child).getTable())
.collect(Collectors.toList());
}
@@ -898,7 +869,7 @@ public class ConfigMTree {
TsTable table =
((ConfigTableNode) child).getStatus() == TableNodeStatus.PRE_DELETE
? new PreDeleteTsTable(tableName)
- : getTableSchemaForDataNode((ConfigTableNode) child);
+ : ((ConfigTableNode) child).getTable();
result.put(tableName, table);
} else {
result.put(tableName, null);
@@ -968,13 +939,7 @@ public class ConfigMTree {
final String tableName,
final List<TsTableColumnSchema> columnSchemaList)
throws MetadataException {
- final TsTable table =
- getTableForModification(
- database,
- tableName,
- columnSchemaList.stream()
- .map(TsTableColumnSchema::getColumnName)
- .toArray(String[]::new));
+ final TsTable table = getTable(database, tableName);
columnSchemaList.forEach(table::addColumnSchema);
}
@@ -995,8 +960,7 @@ public class ConfigMTree {
throw new TableNotExistsException(
database.getFullPath().substring(ROOT.length() + 1), tableName);
}
- final ConfigTableNode tableNode = getTableNodeForModification(database,
tableName);
- final TsTable table = tableNode.getTable();
+ final TsTable table = ((ConfigTableNode)
databaseNode.getChild(tableName)).getTable();
tableProperties.forEach(
(k, v) -> {
if (Objects.nonNull(v)) {
@@ -1024,7 +988,7 @@ public class ConfigMTree {
final String columnName,
final boolean isView)
throws MetadataException, SemanticException {
- final ConfigTableNode node = getTableNodeForModification(database,
tableName);
+ final ConfigTableNode node = getTableNode(database, tableName);
final Optional<Pair<TSStatus, TsTable>> check =
ClusterSchemaManager.checkTable4View(database.getTailNode(),
node.getTable(), isView);
if (check.isPresent()) {
@@ -1042,10 +1006,6 @@ public class ConfigMTree {
throw new
SemanticException(ConfigNodeMessages.DROPPING_TAG_OR_TIME_COLUMN_IS_NOT_SUPPORTED);
}
- if (node.getPreAlteredColumns().containsKey(columnName)) {
- throw new ColumnInAlterException(database.getFullPath(), tableName,
columnName);
- }
-
node.addPreDeletedColumn(columnName);
return columnSchema.getColumnCategory() == TsTableColumnCategory.ATTRIBUTE;
}
@@ -1058,34 +1018,22 @@ public class ConfigMTree {
if (Objects.nonNull(table.getColumnSchema(columnName))) {
table.removeColumnSchema(columnName);
node.removePreDeletedColumn(columnName);
- node.removePreAlteredColumn(columnName);
}
}
public void preAlterColumnDataType(
PartialPath database, String tableName, String columnName, TSDataType
dataType)
throws MetadataException {
- final ConfigTableNode node = getTableNodeForModification(database,
tableName);
+ final ConfigTableNode node = getTableNode(database, tableName);
final TsTableColumnSchema columnSchema =
node.getTable().getColumnSchema(columnName);
if (Objects.isNull(columnSchema)) {
throw new ColumnNotExistsException(
PathUtils.unQualifyDatabaseName(database.getFullPath()), tableName,
columnName);
}
- if (node.getPreDeletedColumns().contains(columnName)) {
- throw new ColumnInDeletionException(database.getFullPath(), tableName,
columnName);
- }
if (columnSchema.getColumnCategory() != TsTableColumnCategory.FIELD) {
throw new
SemanticException(ConfigNodeMessages.CAN_ONLY_ALTER_DATATYPE_OF_FIELD_COLUMNS);
}
- if (node.getPreAlteredColumns().containsKey(columnName)) {
- final TSDataType currentType =
node.getPreAlteredColumns().get(columnName);
- if (currentType == dataType) {
- return;
- }
- throw new ColumnInAlterException(database.getFullPath(), tableName,
columnName);
- }
-
if (!MetadataUtils.canAlter(columnSchema.getDataType(), dataType)) {
throw new SemanticException(
String.format(
@@ -1100,19 +1048,8 @@ public class ConfigMTree {
public void commitAlterColumnDataType(
PartialPath database, String tableName, String columnName, TSDataType
dataType)
throws MetadataException {
- final IConfigMNode databaseNode =
getDatabaseNodeByDatabasePath(database).getAsMNode();
- if (!databaseNode.hasChild(tableName)) {
- return;
- }
- final IConfigMNode tableNode = databaseNode.getChild(tableName);
- if (!(tableNode instanceof ConfigTableNode)) {
- return;
- }
- final ConfigTableNode node = (ConfigTableNode) tableNode;
- if (!Objects.equals(node.getPreAlteredColumns().get(columnName),
dataType)) {
- return;
- }
- final TsTable table = node.getTable();
+ final ConfigTableNode node = getTableNode(database, tableName);
+ final TsTable table = getTable(database, tableName);
final TsTableColumnSchema columnSchema = table.getColumnSchema(columnName);
if (Objects.nonNull(columnSchema)) {
columnSchema.setDataType(dataType);
@@ -1121,68 +1058,20 @@ public class ConfigMTree {
fieldColumnSchema.setEncoding(
SchemaUtils.getDataTypeCompatibleEncoding(dataType,
fieldColumnSchema.getEncoding()));
}
- }
- node.removePreAlteredColumn(columnName);
- }
-
- public void rollbackPreAlterColumnDataType(
- final PartialPath database,
- final String tableName,
- final String columnName,
- final TSDataType dataType)
- throws MetadataException {
- final IConfigMNode databaseNode =
getDatabaseNodeByDatabasePath(database).getAsMNode();
- if (!databaseNode.hasChild(tableName)) {
- return;
- }
- final IConfigMNode tableNode = databaseNode.getChild(tableName);
- if (!(tableNode instanceof ConfigTableNode)) {
- return;
- }
- final ConfigTableNode node = (ConfigTableNode) tableNode;
- if (Objects.equals(node.getPreAlteredColumns().get(columnName), dataType))
{
node.removePreAlteredColumn(columnName);
}
}
- public TsTable getTableSchemaForDataNode(final PartialPath database, final
String tableName)
- throws MetadataException {
- return getTableSchemaForDataNode(getTableNode(database, tableName));
- }
-
- private TsTable getTableSchemaForDataNode(final ConfigTableNode node) {
- if (node.getPreDeletedColumns().isEmpty() &&
node.getPreAlteredColumns().isEmpty()) {
- return node.getTable();
- }
- // Cache reloads and later schema updates must not make a column writable
again while its
- // deletion is still pending. DESC uses the complete schema separately.
- final TsTable table = new TsTable(node.getTable());
- node.getPreDeletedColumns().forEach(table::removeColumnSchema);
- node.getPreAlteredColumns()
- .forEach(
- (columnName, dataType) -> {
- final TsTableColumnSchema columnSchema =
table.getColumnSchema(columnName);
- if (columnSchema == null) {
- return;
- }
- columnSchema.setDataType(dataType);
- if (columnSchema instanceof FieldColumnSchema) {
- final FieldColumnSchema fieldColumnSchema =
(FieldColumnSchema) columnSchema;
- fieldColumnSchema.setEncoding(
- SchemaUtils.getDataTypeCompatibleEncoding(
- dataType, fieldColumnSchema.getEncoding()));
- }
- });
- return table;
- }
-
- public TsTable getTableSchemaForDesc(final PartialPath database, final
String tableName)
+ public TsTable getUsingTableSchema(final PartialPath database, final String
tableName)
throws MetadataException {
final ConfigTableNode node = getTableNode(database, tableName);
- if (node.getPreAlteredColumns().isEmpty()) {
+ if (node.getPreDeletedColumns().isEmpty() &&
node.getPreAlteredColumns().isEmpty()) {
return node.getTable();
}
final TsTable newTable = new TsTable(node.getTable());
+ if (!node.getPreDeletedColumns().isEmpty()) {
+ node.getPreDeletedColumns().forEach(newTable::removeColumnSchema);
+ }
if (!node.getPreAlteredColumns().isEmpty()) {
node.getPreAlteredColumns()
.forEach(
@@ -1221,30 +1110,6 @@ public class ConfigMTree {
return getTableNode(database, tableName).getTable();
}
- private TsTable getTableForModification(
- final PartialPath database, final String tableName, final String...
columnNames)
- throws MetadataException {
- final ConfigTableNode node = getTableNodeForModification(database,
tableName);
- for (final String columnName : columnNames) {
- if (node.getPreDeletedColumns().contains(columnName)) {
- throw new ColumnInDeletionException(database.getFullPath(), tableName,
columnName);
- }
- if (node.getPreAlteredColumns().containsKey(columnName)) {
- throw new ColumnInAlterException(database.getFullPath(), tableName,
columnName);
- }
- }
- return node.getTable();
- }
-
- private ConfigTableNode getTableNodeForModification(
- final PartialPath database, final String tableName) throws
MetadataException {
- final ConfigTableNode node = getTableNode(database, tableName);
- if (node.getStatus() == TableNodeStatus.PRE_DELETE) {
- throw new TableInDeletionException(database.getFullPath(), tableName);
- }
- return node;
- }
-
public Optional<Pair<TsTable, TableNodeStatus>> getTableAndStatusIfExists(
final PartialPath database, final String tableName) throws
MetadataException {
final IConfigMNode databaseNode =
getDatabaseNodeByDatabasePath(database).getAsMNode();
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AlterTableColumnDataTypeProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AlterTableColumnDataTypeProcedure.java
index dd63a1ecaf0..12491f24a48 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AlterTableColumnDataTypeProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AlterTableColumnDataTypeProcedure.java
@@ -24,11 +24,9 @@ import org.apache.iotdb.commons.exception.IoTDBException;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.schema.table.TsTable;
import
org.apache.iotdb.confignode.consensus.request.write.table.AlterColumnDataTypePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreAlterColumnDataTypePlan;
import org.apache.iotdb.confignode.i18n.ProcedureMessages;
import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
-import org.apache.iotdb.confignode.procedure.impl.schema.SchemaUtils;
import
org.apache.iotdb.confignode.procedure.state.schema.AlterTableColumnDataTypeState;
import org.apache.iotdb.confignode.procedure.store.ProcedureType;
import org.apache.iotdb.rpc.TSStatusCode;
@@ -43,7 +41,6 @@ import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Objects;
-import java.util.Optional;
public class AlterTableColumnDataTypeProcedure
extends AbstractAlterOrDropTableProcedure<AlterTableColumnDataTypeState> {
@@ -159,25 +156,14 @@ public class AlterTableColumnDataTypeProcedure
new AlterColumnDataTypePlan(database, tableName, columnName,
dataType),
isGeneratedByPipe);
if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- // A consensus write may have been applied even when the client observed
a failure (for
- // example, a timeout after the leader committed the entry). Continue
with release when the
- // canonical CN schema already contains the requested type; rolling back
in that case would
- // leave DataNodes on an older schema than the CN.
- if (isColumnAlterCommitted(env)) {
- setNextState(AlterTableColumnDataTypeState.COMMIT_RELEASE);
- return;
- }
setFailure(new ProcedureException(new
IoTDBException(status.getMessage(), status.getCode())));
- return;
}
setNextState(AlterTableColumnDataTypeState.COMMIT_RELEASE);
}
@Override
protected boolean isRollbackSupported(final AlterTableColumnDataTypeState
state) {
- return state == AlterTableColumnDataTypeState.CHECK_AND_INVALIDATE_COLUMN
- || state == AlterTableColumnDataTypeState.PRE_RELEASE
- || state == AlterTableColumnDataTypeState.ALTER_TABLE_COLUMN_DATA_TYPE;
+ return false;
}
@Override
@@ -185,67 +171,7 @@ public class AlterTableColumnDataTypeProcedure
final ConfigNodeProcedureEnv configNodeProcedureEnv,
final AlterTableColumnDataTypeState alterTableColumnDataTypeState)
throws IOException, InterruptedException, ProcedureException {
- // COMMIT_RELEASE is irreversible: the CN schema has already been
committed and must not be
- // followed by a cache rollback if the procedure is aborted while
notifying DataNodes.
- if (alterTableColumnDataTypeState ==
AlterTableColumnDataTypeState.COMMIT_RELEASE) {
- return;
- }
- final Optional<TSDataType> pendingType =
getPreAlteredColumnType(configNodeProcedureEnv);
- if (pendingType.isPresent() && pendingType.get() != dataType) {
- // This rollback belongs to an older procedure. Leave a newer pre-alter
marker and its
- // DataNode cache entry untouched.
- return;
- }
- final boolean ownsPendingMarker = pendingType.isPresent();
- if (!ownsPendingMarker &&
isColumnAlterCommittedForRollback(configNodeProcedureEnv)) {
- return;
- }
- final TSStatus status =
- SchemaUtils.executeInConsensusLayer(
- new RollbackPreAlterColumnDataTypePlan(database, tableName,
columnName, dataType),
- configNodeProcedureEnv,
- LOGGER);
- if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- throw new ProcedureException(new IoTDBException(status.getMessage(),
status.getCode()));
- }
- if (alterTableColumnDataTypeState !=
AlterTableColumnDataTypeState.CHECK_AND_INVALIDATE_COLUMN
- && table != null
- && !getPreAlteredColumnType(configNodeProcedureEnv).isPresent()
- && (ownsPendingMarker ||
!isColumnAlterCommittedForRollback(configNodeProcedureEnv))) {
- rollbackPreRelease(configNodeProcedureEnv);
- }
- }
-
- private Optional<TSDataType> getPreAlteredColumnType(final
ConfigNodeProcedureEnv env)
- throws ProcedureException {
- try {
- return env.getConfigManager()
- .getClusterSchemaManager()
- .getPreAlteredColumnType(database, tableName, columnName);
- } catch (final MetadataException e) {
- throw new ProcedureException(e);
- }
- }
-
- private boolean isColumnAlterCommittedForRollback(final
ConfigNodeProcedureEnv env)
- throws ProcedureException {
- try {
- return env.getConfigManager()
- .getClusterSchemaManager()
- .isColumnAlterCommitted(database, tableName, columnName, dataType);
- } catch (final MetadataException e) {
- throw new ProcedureException(e);
- }
- }
-
- private boolean isColumnAlterCommitted(final ConfigNodeProcedureEnv env) {
- try {
- return env.getConfigManager()
- .getClusterSchemaManager()
- .isColumnAlterCommitted(database, tableName, columnName, dataType);
- } catch (final MetadataException e) {
- return false;
- }
+ // Do nothing
}
@Override
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedure.java
index 8c6596cfe9e..f2379ae1256 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedure.java
@@ -22,8 +22,6 @@ package
org.apache.iotdb.confignode.procedure.impl.schema.table;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.commons.exception.IoTDBException;
import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.exception.table.TableInDeletionException;
-import org.apache.iotdb.commons.schema.table.TableNodeStatus;
import org.apache.iotdb.commons.schema.table.TsTable;
import
org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeEnrichedPlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.CommitCreateTablePlan;
@@ -42,7 +40,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
import org.apache.iotdb.mpp.rpc.thrift.TUpdateTableReq;
import org.apache.iotdb.rpc.TSStatusCode;
-import org.apache.tsfile.utils.Pair;
import org.apache.tsfile.utils.ReadWriteIOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,7 +49,6 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Map;
import java.util.Objects;
-import java.util.Optional;
import static org.apache.iotdb.rpc.TSStatusCode.TABLE_ALREADY_EXISTS;
@@ -121,14 +117,10 @@ public class CreateTableProcedure
protected void checkTableExistence(final ConfigNodeProcedureEnv env) {
try {
- final Optional<Pair<TsTable, TableNodeStatus>> existingTable =
- env.getConfigManager()
- .getClusterSchemaManager()
- .getTableAndStatusIfExists(database, table.getTableName());
- if (existingTable.isPresent()) {
- if (existingTable.get().getRight() == TableNodeStatus.PRE_DELETE) {
- throw new TableInDeletionException(database, table.getTableName());
- }
+ if (env.getConfigManager()
+ .getClusterSchemaManager()
+ .getTableIfExists(database, table.getTableName())
+ .isPresent()) {
setFailure(
new ProcedureException(
new IoTDBException(
diff --git
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
index 1b9f4d55029..0e858589803 100644
---
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
+++
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
@@ -147,7 +147,6 @@ import
org.apache.iotdb.confignode.consensus.request.write.table.PreDeleteTableP
import
org.apache.iotdb.confignode.consensus.request.write.table.RenameTableColumnPlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RenameTablePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackCreateTablePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.RollbackPreAlterColumnDataTypePlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.SetTableCommentPlan;
import
org.apache.iotdb.confignode.consensus.request.write.table.SetTablePropertiesPlan;
@@ -1717,20 +1716,6 @@ public class ConfigPhysicalPlanSerDeTest {
alterColumnDataTypePlan.getNewType(),
alterColumnDataTypePlan1.getNewType());
}
- @Test
- public void RollbackPreAlterTableColumnDataTypePlanTest() throws IOException
{
- final RollbackPreAlterColumnDataTypePlan rollbackPlan =
- new RollbackPreAlterColumnDataTypePlan("database1", "table1", "field",
TSDataType.FLOAT);
- final RollbackPreAlterColumnDataTypePlan rollbackPlan1 =
- (RollbackPreAlterColumnDataTypePlan)
-
ConfigPhysicalPlan.Factory.create(rollbackPlan.serializeToByteBuffer());
- Assert.assertEquals(rollbackPlan.getDatabase(),
rollbackPlan1.getDatabase());
- Assert.assertEquals(rollbackPlan.getTableName(),
rollbackPlan1.getTableName());
- Assert.assertEquals(rollbackPlan.getColumnName(),
rollbackPlan1.getColumnName());
- Assert.assertEquals(rollbackPlan.getType(), rollbackPlan1.getType());
- Assert.assertEquals(rollbackPlan.getNewType(), rollbackPlan1.getNewType());
- }
-
@Test
public void AlterTableColumnDataTypePlanTest() throws IOException {
final AlterColumnDataTypePlan alterColumnDataTypePlan =
diff --git
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTreeTest.java
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTreeTest.java
index 318c957b825..c2519dcbfae 100644
---
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTreeTest.java
+++
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTreeTest.java
@@ -49,7 +49,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -361,10 +360,6 @@ public class ConfigMTreeTest {
root.preCreateTable(pathList[i], table);
root.commitCreateTable(pathList[i], tableName);
- if (i == 0) {
- Assert.assertTrue(root.preDeleteColumn(pathList[i], tableName, "Attr",
false));
- root.preAlterColumnDataType(pathList[i], tableName, "Measurement",
TSDataType.STRING);
- }
}
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
@@ -407,21 +402,8 @@ public class ConfigMTreeTest {
final TsTable table = tables.get(0);
assertEquals("table" + i, table.getTableName());
assertEquals(1, table.getTagNum());
- // These TsTables have no time column; the first table also hides its
pre-deleted attribute.
- assertEquals(i == 0 ? 2 : 3, table.getColumnNum());
- final ConfigMTree.TableSchemaDetails details =
- newTree.getTableSchemaDetails(pathList[i], table.getTableName());
- if (i == 0) {
- assertEquals(Collections.singleton("Attr"), details.preDeletedColumns);
- assertEquals(TSDataType.STRING,
details.preAlteredColumns.get("Measurement"));
- assertEquals(TSDataType.DOUBLE,
details.table.getColumnSchema("Measurement").getDataType());
- Assert.assertNotNull(details.table.getColumnSchema("Attr"));
- assertEquals(TSDataType.STRING,
table.getColumnSchema("Measurement").getDataType());
- Assert.assertNull(table.getColumnSchema("Attr"));
- } else {
- assertTrue(details.preDeletedColumns.isEmpty());
- assertTrue(details.preAlteredColumns.isEmpty());
- }
+ // currently, only construct the TsTable would not carry the time column
+ assertEquals(3, table.getColumnNum());
}
}
@@ -452,7 +434,7 @@ public class ConfigMTreeTest {
SchemaUtils.getDataTypeCompatibleEncoding(TSDataType.STRING,
TSEncoding.GORILLA);
Assert.assertNotEquals(TSEncoding.GORILLA, expectedEncoding);
- final TsTable preAlteredTable = root.getTableSchemaForDesc(database,
table.getTableName());
+ final TsTable preAlteredTable = root.getUsingTableSchema(database,
table.getTableName());
final FieldColumnSchema preAlteredField =
(FieldColumnSchema) preAlteredTable.getColumnSchema("measurement");
Assert.assertEquals(TSDataType.STRING, preAlteredField.getDataType());
@@ -461,7 +443,7 @@ public class ConfigMTreeTest {
root.commitAlterColumnDataType(
database, table.getTableName(), "measurement", TSDataType.STRING);
- final TsTable committedTable = root.getTableSchemaForDesc(database,
table.getTableName());
+ final TsTable committedTable = root.getUsingTableSchema(database,
table.getTableName());
final FieldColumnSchema committedField =
(FieldColumnSchema) committedTable.getColumnSchema("measurement");
Assert.assertEquals(TSDataType.STRING, committedField.getDataType());
@@ -471,57 +453,6 @@ public class ConfigMTreeTest {
root.getTableSchemaDetails(database,
table.getTableName()).preAlteredColumns.isEmpty());
}
- @Test
- public void testRollbackPreAlterColumnDataTypeOnlyClearsMatchingRequest()
throws Exception {
- root = new ConfigMTree(true);
-
- final PartialPath database = new PartialPath("root.sg");
- root.setStorageGroup(database);
- final IDatabaseMNode<IConfigMNode> databaseNode =
root.getDatabaseNodeByDatabasePath(database);
- databaseNode
- .getAsMNode()
- .getDatabaseSchema()
- .setName(PathUtils.unQualifyDatabaseName(database.getFullPath()));
- databaseNode.getAsMNode().getDatabaseSchema().setIsTableModel(true);
-
- final TsTable table = new TsTable("table1");
- table.addColumnSchema(new TagColumnSchema("id", TSDataType.STRING));
- table.addColumnSchema(
- new FieldColumnSchema(
- "measurement", TSDataType.DOUBLE, TSEncoding.GORILLA,
CompressionType.SNAPPY));
- root.preCreateTable(database, table);
- root.commitCreateTable(database, table.getTableName());
-
- root.preAlterColumnDataType(database, table.getTableName(), "measurement",
TSDataType.STRING);
- Assert.assertEquals(
- TSDataType.STRING,
- root.getTableSchemaForDataNode(database, table.getTableName())
- .getColumnSchema("measurement")
- .getDataType());
-
- // A stale rollback must not clear a newer request for a different target
type.
- root.rollbackPreAlterColumnDataType(
- database, table.getTableName(), "measurement", TSDataType.FLOAT);
- Assert.assertEquals(
- TSDataType.STRING,
- root.getTableSchemaDetails(database, table.getTableName())
- .preAlteredColumns
- .get("measurement"));
-
- root.rollbackPreAlterColumnDataType(
- database, table.getTableName(), "measurement", TSDataType.STRING);
- Assert.assertTrue(
- root.getTableSchemaDetails(database,
table.getTableName()).preAlteredColumns.isEmpty());
- // A delayed commit from the failed procedure must not apply after the
marker was rolled back.
- root.commitAlterColumnDataType(
- database, table.getTableName(), "measurement", TSDataType.STRING);
- Assert.assertEquals(
- TSDataType.DOUBLE,
- root.getTableSchemaForDataNode(database, table.getTableName())
- .getColumnSchema("measurement")
- .getDataType());
- }
-
@Test
public void testSetTemplate() throws MetadataException {
root.setStorageGroup(new PartialPath("root.a"));
diff --git
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/TablePreDeleteTest.java
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/TablePreDeleteTest.java
deleted file mode 100644
index 86b74ec00b6..00000000000
---
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/TablePreDeleteTest.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- * 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.persistence.schema;
-
-import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.exception.table.ColumnInAlterException;
-import org.apache.iotdb.commons.exception.table.ColumnInDeletionException;
-import org.apache.iotdb.commons.exception.table.TableInDeletionException;
-import org.apache.iotdb.commons.schema.table.TableNodeStatus;
-import org.apache.iotdb.commons.schema.table.TsTable;
-import org.apache.iotdb.commons.schema.table.TsTableInternalRPCUtil;
-import org.apache.iotdb.commons.schema.table.column.AttributeColumnSchema;
-import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema;
-import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
-import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType;
-import org.apache.iotdb.confignode.consensus.request.read.table.DescTablePlan;
-import org.apache.iotdb.confignode.consensus.request.read.table.FetchTablePlan;
-import org.apache.iotdb.confignode.consensus.request.read.table.ShowTablePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.database.DatabaseSchemaPlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.AddTableColumnPlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.AlterColumnDataTypePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.CommitCreateTablePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.CommitDeleteColumnPlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.CommitDeleteTablePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.PreAlterColumnDataTypePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.PreCreateTablePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.PreDeleteColumnPlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.PreDeleteTablePlan;
-import
org.apache.iotdb.confignode.consensus.request.write.table.SetTableColumnCommentPlan;
-import org.apache.iotdb.confignode.manager.IManager;
-import org.apache.iotdb.confignode.manager.schema.ClusterSchemaManager;
-import org.apache.iotdb.confignode.manager.schema.ClusterSchemaQuotaStatistics;
-import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
-import org.apache.iotdb.confignode.rpc.thrift.TDescTableResp;
-import org.apache.iotdb.confignode.rpc.thrift.TShowTableResp;
-import org.apache.iotdb.confignode.rpc.thrift.TTableInfo;
-import org.apache.iotdb.rpc.TSStatusCode;
-
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.file.metadata.enums.CompressionType;
-import org.apache.tsfile.file.metadata.enums.TSEncoding;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
-
-public class TablePreDeleteTest {
- private static final String DATABASE = "root.pre_delete_test";
- private static final String TABLE = "table1";
- private ClusterSchemaInfo schemaInfo;
- private ClusterSchemaManager schemaManager;
-
- @Before
- public void setUp() throws Exception {
- schemaInfo = new ClusterSchemaInfo();
- schemaManager =
- new ClusterSchemaManager(
- Mockito.mock(IManager.class),
- schemaInfo,
- Mockito.mock(ClusterSchemaQuotaStatistics.class));
- assertSuccess(
- schemaInfo.createDatabase(
- new DatabaseSchemaPlan(
- ConfigPhysicalPlanType.CreateDatabase,
- new TDatabaseSchema(DATABASE).setIsTableModel(true))));
- createTable(TABLE);
- }
-
- @After
- public void tearDown() {
- schemaInfo.clear();
- }
-
- @Test
- public void testShowTablesIncludesPreDeleteButNotPreCreate() {
- createTable("using_table");
- assertSuccess(
- schemaInfo.preCreateTable(new PreCreateTablePlan(DATABASE, new
TsTable("creating"))));
- assertSuccess(schemaInfo.preDeleteTable(new PreDeleteTablePlan(DATABASE,
TABLE)));
-
- final TShowTableResp basic =
- schemaInfo.showTables(new ShowTablePlan(DATABASE,
false)).convertToTShowTableResp();
- assertSuccess(basic.getStatus());
- assertEquals(
- Arrays.asList(TABLE, "using_table"),
- basic.getTableInfoList().stream()
- .map(TTableInfo::getTableName)
- .sorted()
- .collect(Collectors.toList()));
-
- final TShowTableResp details =
- schemaInfo.showTables(new ShowTablePlan(DATABASE,
true)).convertToTShowTableResp();
- final Map<String, Integer> states =
- details.getTableInfoList().stream()
- .collect(Collectors.toMap(TTableInfo::getTableName,
TTableInfo::getState));
- assertEquals(Integer.valueOf(TableNodeStatus.PRE_DELETE.ordinal()),
states.get(TABLE));
- assertEquals(Integer.valueOf(TableNodeStatus.PRE_CREATE.ordinal()),
states.get("creating"));
- assertEquals(Integer.valueOf(TableNodeStatus.USING.ordinal()),
states.get("using_table"));
-
- assertSuccess(schemaInfo.dropTable(new CommitDeleteTablePlan(DATABASE,
TABLE)));
- assertEquals(
- Collections.singletonList("using_table"),
- schemaInfo
- .showTables(new ShowTablePlan(DATABASE, false))
- .convertToTShowTableResp()
- .getTableInfoList()
- .stream()
- .map(TTableInfo::getTableName)
- .collect(Collectors.toList()));
- }
-
- @Test
- public void testDescRetainsPreDeletedColumnsAndAlteredTypes() {
- assertSuccess(schemaInfo.preDeleteColumn(new PreDeleteColumnPlan(DATABASE,
TABLE, "field")));
- assertSuccess(
- schemaInfo.preDeleteColumn(new PreDeleteColumnPlan(DATABASE, TABLE,
"attribute")));
- assertSuccess(
- schemaInfo.preAlterColumnDataType(
- new PreAlterColumnDataTypePlan(DATABASE, TABLE, "live",
TSDataType.INT64)));
-
- TDescTableResp basic = describe(false);
- TsTable table =
TsTableInternalRPCUtil.deserializeSingleTsTable(basic.getTableInfo());
- assertNotNull(table.getColumnSchema("field"));
- assertNotNull(table.getColumnSchema("attribute"));
- assertEquals(TSDataType.INT64,
table.getColumnSchema("live").getDataType());
- assertFalse(basic.isSetPreDeletedColumns());
-
- assertEquals(
- TSDataType.INT64,
-
schemaInfo.getAllUsingTables().get(DATABASE).get(0).getColumnSchema("live").getDataType());
-
- final TDescTableResp details = describe(true);
-
assertTrue(details.getPreDeletedColumns().containsAll(Arrays.asList("field",
"attribute")));
- assertEquals(
- Byte.valueOf(TSDataType.INT64.serialize()),
details.getPreAlteredColumns().get("live"));
-
- assertSuccess(
- schemaInfo.commitDeleteColumn(new CommitDeleteColumnPlan(DATABASE,
TABLE, "field")));
- table =
TsTableInternalRPCUtil.deserializeSingleTsTable(describe(false).getTableInfo());
- assertNull(table.getColumnSchema("field"));
-
- assertSuccess(schemaInfo.preDeleteTable(new PreDeleteTablePlan(DATABASE,
TABLE)));
- assertNotNull(
-
TsTableInternalRPCUtil.deserializeSingleTsTable(describe(false).getTableInfo())
- .getColumnSchema("attribute"));
- }
-
- @Test
- public void testColumnExtensionRejectsPreDeletedNames() throws Exception {
- for (final String column : Arrays.asList("field", "attribute")) {
- assertSuccess(schemaInfo.preDeleteColumn(new
PreDeleteColumnPlan(DATABASE, TABLE, column)));
- final List<TsTableColumnSchema> columns =
- new ArrayList<>(Arrays.asList(field("new_field"), field(column)));
- final ColumnInDeletionException exception =
- assertThrows(
- ColumnInDeletionException.class,
- () ->
- schemaManager.tableColumnCheckForColumnExtension(
- DATABASE, TABLE, columns, false));
- assertEquals(TSStatusCode.SEMANTIC_ERROR.getStatusCode(),
exception.getErrorCode());
- assertEquals(
- new ColumnInDeletionException(DATABASE, TABLE, column).getMessage(),
- exception.getMessage());
- assertEquals(2, columns.size());
- assertNull(
- schemaInfo
- .getTsTableIfExists(DATABASE, TABLE)
- .get()
- .getLeft()
- .getColumnSchema("new_field"));
- }
- assertEquals(
- TSStatusCode.COLUMN_ALREADY_EXISTS.getStatusCode(),
- schemaManager
- .tableColumnCheckForColumnExtension(
- DATABASE, TABLE, new
ArrayList<>(Collections.singletonList(field("live"))), false)
- .getLeft()
- .getCode());
-
- assertSuccess(
- schemaInfo.commitDeleteColumn(new CommitDeleteColumnPlan(DATABASE,
TABLE, "field")));
- assertSuccess(
- schemaManager
- .tableColumnCheckForColumnExtension(
- DATABASE, TABLE, new
ArrayList<>(Collections.singletonList(field("field"))), false)
- .getLeft());
- }
-
- @Test
- public void testPreAlterRejectsConflictingColumnOperations() throws
Exception {
- assertSuccess(
- schemaInfo.preAlterColumnDataType(
- new PreAlterColumnDataTypePlan(DATABASE, TABLE, "live",
TSDataType.INT64)));
- // Retrying the same target type is allowed so a stuck procedure can be
resumed.
- assertSuccess(
- schemaInfo.preAlterColumnDataType(
- new PreAlterColumnDataTypePlan(DATABASE, TABLE, "live",
TSDataType.INT64)));
-
- final TSStatus secondAlter =
- schemaInfo.preAlterColumnDataType(
- new PreAlterColumnDataTypePlan(DATABASE, TABLE, "live",
TSDataType.FLOAT));
- assertEquals(TSStatusCode.SEMANTIC_ERROR.getStatusCode(),
secondAlter.getCode());
- assertEquals(
- new ColumnInAlterException(DATABASE, TABLE, "live").getMessage(),
secondAlter.getMessage());
-
- final TSStatus delete =
- schemaInfo.preDeleteColumn(new PreDeleteColumnPlan(DATABASE, TABLE,
"live"));
- assertEquals(TSStatusCode.SEMANTIC_ERROR.getStatusCode(),
delete.getCode());
- assertEquals(
- new ColumnInAlterException(DATABASE, TABLE, "live").getMessage(),
delete.getMessage());
-
- assertThrows(
- ColumnInAlterException.class,
- () ->
- schemaManager.tableColumnCheckForColumnExtension(
- DATABASE, TABLE, new
ArrayList<>(Collections.singletonList(field("live"))), false));
- assertEquals(
- new ColumnInAlterException(DATABASE, TABLE, "live").getMessage(),
- schemaInfo
- .addTableColumn(
- new AddTableColumnPlan(
- DATABASE, TABLE, Collections.singletonList(field("live")),
false))
- .getMessage());
- assertEquals(
- new ColumnInAlterException(DATABASE, TABLE, "live").getMessage(),
- schemaInfo
- .setTableColumnComment(
- new SetTableColumnCommentPlan(DATABASE, TABLE, "live",
"comment"))
- .getMessage());
- assertThrows(
- ColumnInAlterException.class,
- () ->
- schemaManager.tableColumnCheckForColumnRenaming(
- DATABASE, TABLE, "live", "renamed", false));
- }
-
- @Test
- public void
testSameTypePreAlterIsNotReportedAsCommittedUntilMarkerIsCleared() throws
Exception {
- assertSuccess(
- schemaInfo.preAlterColumnDataType(
- new PreAlterColumnDataTypePlan(DATABASE, TABLE, "live",
TSDataType.INT32)));
- assertFalse(schemaInfo.isColumnAlterCommitted(DATABASE, TABLE, "live",
TSDataType.INT32));
-
- assertSuccess(
- schemaInfo.commitAlterColumnDataType(
- new AlterColumnDataTypePlan(DATABASE, TABLE, "live",
TSDataType.INT32)));
- assertTrue(schemaInfo.isColumnAlterCommitted(DATABASE, TABLE, "live",
TSDataType.INT32));
- }
-
- @Test
- public void testPreDeletedTableRejectsCreationAndColumnExtension() {
- assertSuccess(schemaInfo.preDeleteTable(new PreDeleteTablePlan(DATABASE,
TABLE)));
- final TSStatus create =
- schemaInfo.preCreateTable(new PreCreateTablePlan(DATABASE, new
TsTable(TABLE)));
- assertEquals(TSStatusCode.SEMANTIC_ERROR.getStatusCode(),
create.getCode());
- assertEquals(new TableInDeletionException(DATABASE, TABLE).getMessage(),
create.getMessage());
- final TableInDeletionException exception =
- assertThrows(
- TableInDeletionException.class,
- () ->
- schemaManager.tableColumnCheckForColumnExtension(
- DATABASE,
- TABLE,
- new
ArrayList<>(Collections.singletonList(field("new_field"))),
- false));
- assertEquals(create.getMessage(), exception.getMessage());
- }
-
- @Test
- public void testDataNodeSchemasExcludePreDeletedColumns() throws Exception {
- assertSuccess(schemaInfo.preDeleteColumn(new PreDeleteColumnPlan(DATABASE,
TABLE, "field")));
- assertSuccess(
- schemaInfo.preDeleteColumn(new PreDeleteColumnPlan(DATABASE, TABLE,
"attribute")));
-
- assertOnlyLiveColumns(schemaInfo.getAllUsingTables().get(DATABASE).get(0));
- final TsTable fetched =
- TsTableInternalRPCUtil.deserializeTsTableFetchResult(
- schemaInfo
- .fetchTables(
- new FetchTablePlan(
- Collections.singletonMap(DATABASE,
Collections.singleton(TABLE)),
- Collections.singleton(TableNodeStatus.USING)))
- .convertToTFetchTableResp()
- .getTableInfoMap())
- .get(DATABASE)
- .get(TABLE);
- assertOnlyLiveColumns(fetched);
-
- final TsTable expanded =
- schemaManager
- .tableColumnCheckForColumnExtension(
- DATABASE,
- TABLE,
- new ArrayList<>(Collections.singletonList(field("new_field"))),
- false)
- .getRight();
- assertOnlyLiveColumns(expanded);
- assertNotNull(expanded.getColumnSchema("new_field"));
-
- // Preparing a cache snapshot must not change the complete schema used by
DESC.
- final TsTable described =
-
TsTableInternalRPCUtil.deserializeSingleTsTable(describe(false).getTableInfo());
- assertNotNull(described.getColumnSchema("field"));
- assertNotNull(described.getColumnSchema("attribute"));
- }
-
- private static void assertOnlyLiveColumns(final TsTable table) {
- assertNotNull(table.getColumnSchema("live"));
- assertNull(table.getColumnSchema("field"));
- assertNull(table.getColumnSchema("attribute"));
- }
-
- private TDescTableResp describe(final boolean details) {
- final TDescTableResp resp =
- schemaInfo.descTable(new DescTablePlan(DATABASE, TABLE,
details)).convertToTDescTableResp();
- assertSuccess(resp.getStatus());
- return resp;
- }
-
- private void createTable(final String name) {
- final TsTable table = new TsTable(name);
- table.addColumnSchema(field("field"));
- table.addColumnSchema(field("live"));
- table.addColumnSchema(new AttributeColumnSchema("attribute",
TSDataType.STRING));
- assertSuccess(schemaInfo.preCreateTable(new PreCreateTablePlan(DATABASE,
table)));
- assertSuccess(schemaInfo.commitCreateTable(new
CommitCreateTablePlan(DATABASE, name)));
- }
-
- private static FieldColumnSchema field(final String name) {
- return new FieldColumnSchema(name, TSDataType.INT32, TSEncoding.RLE,
CompressionType.LZ4);
- }
-
- private static void assertSuccess(final TSStatus status) {
- assertEquals(
- status.getMessage(), TSStatusCode.SUCCESS_STATUS.getStatusCode(),
status.getCode());
- }
-}
diff --git
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AlterTableColumnDataTypeProcedureTest.java
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AlterTableColumnDataTypeProcedureTest.java
deleted file mode 100644
index 5634abbe6bf..00000000000
---
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AlterTableColumnDataTypeProcedureTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * 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.table;
-
-import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.schema.table.TsTable;
-import org.apache.iotdb.confignode.manager.ConfigManager;
-import org.apache.iotdb.confignode.manager.consensus.ConsensusManager;
-import org.apache.iotdb.confignode.manager.schema.ClusterSchemaManager;
-import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
-import
org.apache.iotdb.confignode.procedure.state.schema.AlterTableColumnDataTypeState;
-import org.apache.iotdb.rpc.TSStatusCode;
-
-import org.apache.tsfile.enums.TSDataType;
-import org.junit.Assert;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import java.lang.reflect.Method;
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-public class AlterTableColumnDataTypeProcedureTest {
-
- @Test
- public void commitReleaseIsNeverRolledBack() throws Exception {
- final AlterTableColumnDataTypeProcedure procedure =
- new AlterTableColumnDataTypeProcedure("database", "table", "query",
"value", null, false);
- procedure.table = new TsTable("table");
-
- // The commit state may be present on the rollback stack when an abort
races with cache
- // notification. It must not issue a rollback plan or touch DataNode
caches.
- procedure.rollbackState(null,
AlterTableColumnDataTypeState.COMMIT_RELEASE);
- }
-
- @Test
- public void rollbackClearsCnMarkerAfterProcedureRestartBeforeTableSnapshot()
throws Exception {
- final ConsensusManager consensusManager =
Mockito.mock(ConsensusManager.class);
- final ClusterSchemaManager schemaManager =
Mockito.mock(ClusterSchemaManager.class);
- final ConfigManager configManager = Mockito.mock(ConfigManager.class);
- final ConfigNodeProcedureEnv env =
Mockito.mock(ConfigNodeProcedureEnv.class);
- Mockito.when(env.getConfigManager()).thenReturn(configManager);
-
Mockito.when(configManager.getConsensusManager()).thenReturn(consensusManager);
-
Mockito.when(configManager.getClusterSchemaManager()).thenReturn(schemaManager);
- Mockito.when(consensusManager.write(Mockito.any()))
- .thenReturn(new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()));
- Mockito.when(
- schemaManager.isColumnAlterCommitted("database", "table", "value",
TSDataType.INT64))
- .thenReturn(false);
-
- final AlterTableColumnDataTypeProcedure procedure =
- new AlterTableColumnDataTypeProcedure(
- "database", "table", "query", "value", TSDataType.INT64, false);
-
- // The table snapshot is intentionally null, as it can be after a restart
that happened after
- // the pre-alter consensus entry was applied but before the procedure
persisted its snapshot.
- procedure.rollbackState(env,
AlterTableColumnDataTypeState.CHECK_AND_INVALIDATE_COLUMN);
-
- Mockito.verify(consensusManager).write(Mockito.any());
- }
-
- @Test
- public void sameTypePreAlterRollbackStillCleansDataNodeCache() throws
Exception {
- final ConsensusManager consensusManager =
Mockito.mock(ConsensusManager.class);
- final ClusterSchemaManager schemaManager =
Mockito.mock(ClusterSchemaManager.class);
- final ConfigManager configManager = Mockito.mock(ConfigManager.class);
- final ConfigNodeProcedureEnv env =
Mockito.mock(ConfigNodeProcedureEnv.class);
- Mockito.when(env.getConfigManager()).thenReturn(configManager);
-
Mockito.when(configManager.getConsensusManager()).thenReturn(consensusManager);
-
Mockito.when(configManager.getClusterSchemaManager()).thenReturn(schemaManager);
-
- final AtomicBoolean markerCleared = new AtomicBoolean(false);
- Mockito.when(schemaManager.getPreAlteredColumnType("database", "table",
"value"))
- .thenAnswer(
- invocation -> markerCleared.get() ? Optional.empty() :
Optional.of(TSDataType.INT64));
- Mockito.when(
- schemaManager.isColumnAlterCommitted("database", "table", "value",
TSDataType.INT64))
- .thenAnswer(invocation -> markerCleared.get());
- Mockito.when(consensusManager.write(Mockito.any()))
- .thenAnswer(
- invocation -> {
- markerCleared.set(true);
- return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
- });
-
- final TestAlterTableColumnDataTypeProcedure procedure =
- new TestAlterTableColumnDataTypeProcedure();
- procedure.table = new TsTable("table");
- procedure.rollbackState(env, AlterTableColumnDataTypeState.PRE_RELEASE);
-
- Assert.assertTrue(procedure.dataNodeRollbackCalled);
- }
-
- @Test
- public void staleRollbackDoesNotClearNewerPreAlter() throws Exception {
- final ConsensusManager consensusManager =
Mockito.mock(ConsensusManager.class);
- final ClusterSchemaManager schemaManager =
Mockito.mock(ClusterSchemaManager.class);
- final ConfigManager configManager = Mockito.mock(ConfigManager.class);
- final ConfigNodeProcedureEnv env =
Mockito.mock(ConfigNodeProcedureEnv.class);
- Mockito.when(env.getConfigManager()).thenReturn(configManager);
-
Mockito.when(configManager.getConsensusManager()).thenReturn(consensusManager);
-
Mockito.when(configManager.getClusterSchemaManager()).thenReturn(schemaManager);
- Mockito.when(schemaManager.getPreAlteredColumnType("database", "table",
"value"))
- .thenReturn(Optional.of(TSDataType.FLOAT));
-
- final TestAlterTableColumnDataTypeProcedure procedure =
- new TestAlterTableColumnDataTypeProcedure();
- procedure.table = new TsTable("table");
- procedure.rollbackState(env, AlterTableColumnDataTypeState.PRE_RELEASE);
-
- Mockito.verify(consensusManager, Mockito.never()).write(Mockito.any());
- Assert.assertFalse(procedure.dataNodeRollbackCalled);
- }
-
- @Test
- public void consensusFailureAfterCommitContinuesToCommitRelease() throws
Exception {
- final ClusterSchemaManager schemaManager =
Mockito.mock(ClusterSchemaManager.class);
- final ConfigManager configManager = Mockito.mock(ConfigManager.class);
- final ConfigNodeProcedureEnv env =
Mockito.mock(ConfigNodeProcedureEnv.class);
- Mockito.when(env.getConfigManager()).thenReturn(configManager);
-
Mockito.when(configManager.getClusterSchemaManager()).thenReturn(schemaManager);
-
- Mockito.when(schemaManager.executePlan(Mockito.any(), Mockito.eq(false)))
- .thenReturn(new
TSStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode()));
- Mockito.when(
- schemaManager.isColumnAlterCommitted("database", "table", "value",
TSDataType.INT64))
- .thenReturn(true);
-
- final AlterTableColumnDataTypeProcedure procedure =
- new AlterTableColumnDataTypeProcedure(
- "database", "table", "query", "value", TSDataType.INT64, false);
- final Method alterColumnDataType =
- AlterTableColumnDataTypeProcedure.class.getDeclaredMethod(
- "alterColumnDataType", ConfigNodeProcedureEnv.class);
- alterColumnDataType.setAccessible(true);
- alterColumnDataType.invoke(procedure, env);
-
- Assert.assertFalse(procedure.isFailed());
- }
-
- private static class TestAlterTableColumnDataTypeProcedure
- extends AlterTableColumnDataTypeProcedure {
- private boolean dataNodeRollbackCalled;
-
- private TestAlterTableColumnDataTypeProcedure() {
- super("database", "table", "query", "value", TSDataType.INT64, false);
- }
-
- @Override
- protected void rollbackPreRelease(final ConfigNodeProcedureEnv env) {
- dataNodeRollbackCalled = true;
- }
- }
-}
diff --git
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedureTest.java
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedureTest.java
index 0b9a118fd1a..fab1bfb2660 100644
---
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedureTest.java
+++
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedureTest.java
@@ -20,63 +20,24 @@
package org.apache.iotdb.confignode.procedure.impl.schema.table;
import org.apache.iotdb.commons.exception.IllegalPathException;
-import org.apache.iotdb.commons.exception.IoTDBException;
-import org.apache.iotdb.commons.exception.table.TableInDeletionException;
-import org.apache.iotdb.commons.schema.table.TableNodeStatus;
import org.apache.iotdb.commons.schema.table.TsTable;
import org.apache.iotdb.commons.schema.table.column.AttributeColumnSchema;
import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema;
import org.apache.iotdb.commons.schema.table.column.TagColumnSchema;
-import org.apache.iotdb.confignode.manager.ConfigManager;
-import org.apache.iotdb.confignode.manager.schema.ClusterSchemaManager;
-import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
import org.apache.iotdb.confignode.procedure.store.ProcedureType;
-import org.apache.iotdb.rpc.TSStatusCode;
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.utils.Pair;
import org.junit.Assert;
import org.junit.Test;
-import org.mockito.Mockito;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
-import java.util.Optional;
public class CreateTableProcedureTest {
- @Test
- public void testPreDeletedTableIsNotReportedAsAlreadyExisting() throws
Exception {
- final ConfigNodeProcedureEnv env =
Mockito.mock(ConfigNodeProcedureEnv.class);
- final ConfigManager configManager = Mockito.mock(ConfigManager.class);
- final ClusterSchemaManager schemaManager =
Mockito.mock(ClusterSchemaManager.class);
- Mockito.when(env.getConfigManager()).thenReturn(configManager);
-
Mockito.when(configManager.getClusterSchemaManager()).thenReturn(schemaManager);
- final TsTable table = new TsTable("table1");
- Mockito.when(schemaManager.getTableAndStatusIfExists("database1",
"table1"))
- .thenReturn(Optional.of(new Pair<>(table,
TableNodeStatus.PRE_DELETE)));
-
- final CreateTableProcedure procedure = new
CreateTableProcedure("database1", table, false);
- procedure.checkTableExistence(env);
-
- Assert.assertTrue(procedure.isFailed());
- Assert.assertTrue(procedure.getException().getCause() instanceof
TableInDeletionException);
- Assert.assertEquals(
- TSStatusCode.SEMANTIC_ERROR.getStatusCode(),
- ((IoTDBException) procedure.getException().getCause()).getErrorCode());
-
- Mockito.when(schemaManager.getTableAndStatusIfExists("database1",
"table1"))
- .thenReturn(Optional.of(new Pair<>(table, TableNodeStatus.USING)));
- final CreateTableProcedure duplicate = new
CreateTableProcedure("database1", table, false);
- duplicate.checkTableExistence(env);
- Assert.assertEquals(
- TSStatusCode.TABLE_ALREADY_EXISTS.getStatusCode(),
- ((IoTDBException) duplicate.getException().getCause()).getErrorCode());
- }
-
@Test
public void serializeDeserializeTest() throws IllegalPathException,
IOException {
final TsTable table = new TsTable("table1");
diff --git
a/iotdb-core/datanode/src/main/i18n/en/org/apache/iotdb/db/i18n/DataNodeSchemaMessages.java
b/iotdb-core/datanode/src/main/i18n/en/org/apache/iotdb/db/i18n/DataNodeSchemaMessages.java
index ef703af3f0e..dd1c4af94f6 100644
---
a/iotdb-core/datanode/src/main/i18n/en/org/apache/iotdb/db/i18n/DataNodeSchemaMessages.java
+++
b/iotdb-core/datanode/src/main/i18n/en/org/apache/iotdb/db/i18n/DataNodeSchemaMessages.java
@@ -584,6 +584,8 @@ public final class DataNodeSchemaMessages {
public static final String UPDATE_TABLE_BY_FETCH_WITH_DETAIL =
"Update table {}.{} by table fetch, {}";
public static final String UPDATE_TABLE_BY_FETCH = "Update table {}.{} by
table fetch.";
+ public static final String THE_TABLE_IS_IN_PRE_DELETE_STATE =
+ "The table %s.%s is in the pre-delete state. Please wait a few seconds.
If the table is still in this state, please drop it again.";
public static final String COMPARE_TABLE_ADDED = "Added table: ";
public static final String COMPARE_TABLE_REMOVED = "Removed table: ";
public static final String COMPARE_TABLE_NAME = "Table name: ";
diff --git
a/iotdb-core/datanode/src/main/i18n/zh/org/apache/iotdb/db/i18n/DataNodeSchemaMessages.java
b/iotdb-core/datanode/src/main/i18n/zh/org/apache/iotdb/db/i18n/DataNodeSchemaMessages.java
index f1ceaaa0470..411044b14af 100644
---
a/iotdb-core/datanode/src/main/i18n/zh/org/apache/iotdb/db/i18n/DataNodeSchemaMessages.java
+++
b/iotdb-core/datanode/src/main/i18n/zh/org/apache/iotdb/db/i18n/DataNodeSchemaMessages.java
@@ -578,6 +578,8 @@ public final class DataNodeSchemaMessages {
"尝试获取信号量以从 ConfigNode 获取表时被中断,已忽略。";
public static final String UPDATE_TABLE_BY_FETCH_WITH_DETAIL = "获取表 {}.{}
信息, {}";
public static final String UPDATE_TABLE_BY_FETCH = "通过表拉取更新表 {}.{}";
+ public static final String THE_TABLE_IS_IN_PRE_DELETE_STATE =
+ "表 %s.%s 处于预删除的状态,请稍等,如之后重试还是此状态,请输入sql再次删除";
public static final String COMPARE_TABLE_ADDED = "新增表:";
public static final String COMPARE_TABLE_REMOVED = "已移除表:";
public static final String COMPARE_TABLE_NAME = "表名:";
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 d7dd2abcb1d..7a3580fe66b 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
@@ -4830,20 +4830,6 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
return future;
}
- public Set<String> getPreDeletedColumns(final String database, final String
tableName) {
- try (final ConfigNodeClient configNodeClient =
-
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
- final TDescTableResp resp = configNodeClient.describeTable(database,
tableName, true);
- if (resp.getStatus().getCode() !=
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- throw new IoTDBRuntimeException(
- getTableErrorMessage(resp.getStatus(), database),
resp.getStatus().getCode());
- }
- return resp.isSetPreDeletedColumns() ? resp.getPreDeletedColumns() :
Collections.emptySet();
- } catch (final ClientManagerException | TException e) {
- throw new RuntimeException(e);
- }
- }
-
@Override
public SettableFuture<ConfigTaskResult> describeTable(
final String database,
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
index aeaf82e54f0..6a08427d82b 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java
@@ -24,7 +24,6 @@ import org.apache.iotdb.commons.exception.IoTDBException;
import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.exception.SemanticException;
-import org.apache.iotdb.commons.exception.table.ColumnInDeletionException;
import org.apache.iotdb.commons.i18n.QueryMessages;
import
org.apache.iotdb.commons.queryengine.plan.relational.metadata.ColumnSchema;
import
org.apache.iotdb.commons.queryengine.plan.relational.metadata.QualifiedObjectName;
@@ -72,7 +71,6 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
-import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
@@ -85,14 +83,11 @@ public class TableHeaderSchemaValidator {
private static final Logger LOGGER =
LoggerFactory.getLogger(TableHeaderSchemaValidator.class);
- private final ClusterConfigTaskExecutor configTaskExecutor;
+ private final ClusterConfigTaskExecutor configTaskExecutor =
+ ClusterConfigTaskExecutor.getInstance();
private TableHeaderSchemaValidator() {
- this(ClusterConfigTaskExecutor.getInstance());
- }
-
- TableHeaderSchemaValidator(final ClusterConfigTaskExecutor
configTaskExecutor) {
- this.configTaskExecutor = configTaskExecutor;
+ // do nothing
}
private static class TableHeaderSchemaValidatorHolder {
@@ -218,10 +213,6 @@ public class TableHeaderSchemaValidator {
boolean refreshed = false;
boolean noField = true;
- // Keep this cache scoped to the validation request. ConfigNode does not
notify DataNode when
- // DROP COLUMN commits, so a cross-request cache could reject a recreated
column as still
- // being deleted.
- Set<String> preDeletedColumns = null;
for (final ColumnSchema columnSchema : inputColumnList) {
TsTableColumnSchema existingColumn =
table.getColumnSchema(columnSchema.getName());
if (Objects.isNull(existingColumn)) {
@@ -234,12 +225,6 @@ public class TableHeaderSchemaValidator {
existingColumn = table.getColumnSchema(columnSchema.getName());
}
if (Objects.isNull(existingColumn)) {
- if (preDeletedColumns == null) {
- preDeletedColumns =
- configTaskExecutor.getPreDeletedColumns(database,
tableSchema.getTableName());
- }
- checkColumnNotPreDeleted(
- database, tableSchema.getTableName(), columnSchema.getName(),
preDeletedColumns);
// check arguments for column auto creation
if (columnSchema.getColumnCategory() == null) {
throw new SemanticException(
@@ -412,10 +397,6 @@ public class TableHeaderSchemaValidator {
boolean refreshed = false;
boolean noField = true;
boolean hasAttribute = false;
- // Keep this cache scoped to the validation request. ConfigNode does not
notify DataNode when
- // DROP COLUMN commits, so a cross-request cache could reject a recreated
column as still
- // being deleted.
- Set<String> preDeletedColumns = null;
// Track TAG column measurement indices for batch processing after
validation loop
// LinkedHashMap maintains insertion order, key is column name, value is
measurement index
@@ -451,12 +432,6 @@ public class TableHeaderSchemaValidator {
}
if (Objects.isNull(existingColumn)) {
- if (preDeletedColumns == null) {
- preDeletedColumns =
- configTaskExecutor.getPreDeletedColumns(database,
measurementInfo.getTableName());
- }
- checkColumnNotPreDeleted(
- database, measurementInfo.getTableName(), measurementName,
preDeletedColumns);
// Check arguments for column auto creation
if (category == null) {
throw new SemanticException(
@@ -564,16 +539,6 @@ public class TableHeaderSchemaValidator {
}
}
- private static void checkColumnNotPreDeleted(
- final String database,
- final String tableName,
- final String columnName,
- final Set<String> preDeletedColumns) {
- if (preDeletedColumns.contains(columnName)) {
- throw new SemanticException(new ColumnInDeletionException(database,
tableName, columnName));
- }
- }
-
private void autoCreateTableFromMeasurementInfo(
final MPPQueryContext context,
final String database,
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCache.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCache.java
index 39520259da1..23daf268206 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCache.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCache.java
@@ -26,7 +26,6 @@ import org.apache.iotdb.commons.consensus.ConfigRegionId;
import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
import
org.apache.iotdb.commons.exception.MetadataLeaseFencedException.LeaseFencedRetryPolicy;
import org.apache.iotdb.commons.exception.SemanticException;
-import org.apache.iotdb.commons.exception.table.TableInDeletionException;
import org.apache.iotdb.commons.schema.table.NonCommittableTsTable;
import org.apache.iotdb.commons.schema.table.PreDeleteTsTable;
import org.apache.iotdb.commons.schema.table.TableNodeStatus;
@@ -88,13 +87,6 @@ public class DataNodeTableCache implements ITableCache {
private final Map<String, Map<String, Pair<TsTable, Long>>> specialStatusMap
=
new ConcurrentHashMap<>();
- /**
- * The cache entry replaced by the latest pre-update. It lets a rollback
restore a schema that may
- * already have been promoted from {@code specialStatusMap} by a concurrent
fetch. A {@link
- * NonCommittableTsTable} value means that the previous schema is
unavailable after a restart.
- */
- private final Map<String, Map<String, TsTable>> previousTableMap = new
ConcurrentHashMap<>();
-
private final ReentrantReadWriteLock readWriteLock = new
ReentrantReadWriteLock();
private final Semaphore fetchTableSemaphore =
new Semaphore(
@@ -127,7 +119,6 @@ public class DataNodeTableCache implements ITableCache {
TsTableInternalRPCUtil.deserializeTableInitializationInfo(tableInitializationBytes);
final Map<String, List<TsTable>> usingMap = tableInfo.left;
final Map<String, List<TsTable>> specialStatusMap = tableInfo.right;
- previousTableMap.clear();
usingMap.forEach(
(key, value) ->
databaseTableMap.put(
@@ -150,19 +141,6 @@ public class DataNodeTableCache implements ITableCache {
table -> new Pair<>(table, 0L),
(v1, v2) -> v2,
ConcurrentHashMap::new))));
- specialStatusMap.forEach(
- (key, value) ->
- value.stream()
- .filter(NonCommittableTsTable.class::isInstance)
- .forEach(
- table ->
- previousTableMap
- .computeIfAbsent(
- PathUtils.unQualifyDatabaseName(key),
- database -> new ConcurrentHashMap<>())
- .put(
- table.getTableName(),
- new
NonCommittableTsTable(table.getTableName()))));
LOGGER.info(DataNodeSchemaMessages.INIT_TABLE_CACHE_SUCCESS);
} finally {
readWriteLock.writeLock().unlock();
@@ -205,14 +183,6 @@ public class DataNodeTableCache implements ITableCache {
readWriteLock.writeLock().lock();
try {
failIfMetadataLeaseFenced(LeaseFencedRetryPolicy.RETRY_UNTIL_SUCCESS);
- if (oldName == null && !(table instanceof PreDeleteTsTable)) {
- final TsTable previousTable = getTableFromCache(database,
table.getTableName());
- if (previousTable != null) {
- previousTableMap
- .computeIfAbsent(database, k -> new ConcurrentHashMap<>())
- .putIfAbsent(table.getTableName(), new TsTable(previousTable));
- }
- }
specialStatusMap
.computeIfAbsent(database, k -> new ConcurrentHashMap<>())
.compute(
@@ -269,47 +239,13 @@ public class DataNodeTableCache implements ITableCache {
failIfMetadataLeaseFenced(LeaseFencedRetryPolicy.RETRY_UNTIL_SUCCESS);
// if rollback the drop table procedure, do nothing,
// wait for triggering the action of pull table from CN
- final Map<String, Pair<TsTable, Long>> databaseSpecialStatusMap =
- specialStatusMap.get(database);
- final Pair<TsTable, Long> tableStatusPair =
- databaseSpecialStatusMap == null ? null :
databaseSpecialStatusMap.get(tableName);
- final TsTable table = tableStatusPair == null ? null :
tableStatusPair.getLeft();
- final TsTable previousTable =
- previousTableMap.containsKey(database)
- ? previousTableMap.get(database).get(tableName)
- : null;
+ final TsTable table = getTableFromSpecialStatusMap(database, tableName);
if (table instanceof PreDeleteTsTable) {
- removePreviousTable(database, tableName);
- return;
- }
- // A null pending value with no saved previous schema means commit
already consumed this
- // update. A delayed rollback must not evict the committed table.
- if (Objects.isNull(oldName) && table == null && previousTable == null) {
return;
}
removeTableFromSpecialStatusMap(database, tableName);
- removePreviousTable(database, tableName);
LOGGER.info(DataNodeSchemaMessages.ROLLBACK_UPDATE_TABLE_SUCCESS,
database, tableName);
- // A table fetched while the update was pending can already be in
databaseTableMap and the
- // special entry can consequently have a null left value. Restore the
snapshot captured at
- // PRE_UPDATE time, or evict the entry so the next lookup must fetch the
canonical CN schema.
- if (Objects.isNull(oldName) && tableStatusPair != null) {
- if (previousTable != null && !(previousTable instanceof
NonCommittableTsTable)) {
- databaseTableMap
- .computeIfAbsent(database, k -> new ConcurrentHashMap<>())
- .put(tableName, previousTable);
- } else if (databaseTableMap.containsKey(database)) {
- databaseTableMap.get(database).remove(tableName);
- }
- if (previousTable == null || previousTable instanceof
NonCommittableTsTable) {
- // The previous schema is unavailable after a restart or when this
was a newly-created
- // table. Keep a non-committable marker so getTable() fetches the
canonical CN state
- // instead of serving a stale entry or permanently treating the
cache as already handled.
- tableStatusPair.setLeft(new NonCommittableTsTable(tableName));
- }
- }
-
// If rename table
if (Objects.nonNull(oldName)) {
// Equals to commit update
@@ -377,15 +313,6 @@ public class DataNodeTableCache implements ITableCache {
});
}
- private void removePreviousTable(final String database, final String
tableName) {
- previousTableMap.computeIfPresent(
- database,
- (k, v) -> {
- v.remove(tableName);
- return v.isEmpty() ? null : v;
- });
- }
-
@Override
public void commitUpdateTable(
String database, final String tableName, final @Nullable String oldName)
{
@@ -403,7 +330,6 @@ public class DataNodeTableCache implements ITableCache {
if (Objects.nonNull(oldName)) {
removeTableFromSpecialStatusMap(database, oldName);
}
- removePreviousTable(database, tableName);
return;
}
// Cannot be committed, consider:
@@ -433,7 +359,6 @@ public class DataNodeTableCache implements ITableCache {
LOGGER.info(DataNodeSchemaMessages.COMMIT_UPDATE_TABLE_SUCCESS,
database, tableName);
}
removeTableFromSpecialStatusMap(database, tableName);
- removePreviousTable(database, tableName);
if (Objects.nonNull(oldName)) {
removeTableFromSpecialStatusMap(database, oldName);
LOGGER.info(DataNodeSchemaMessages.RENAME_OLD_TABLE_SUCCESS, database,
oldName);
@@ -449,7 +374,6 @@ public class DataNodeTableCache implements ITableCache {
databaseTableMap.get(database).remove(tableName);
}
removeTableFromSpecialStatusMap(database, tableName);
- removePreviousTable(database, tableName);
LOGGER.info(DataNodeSchemaMessages.COMMIT_DELETE_TABLE_SUCCESS, database,
tableName);
}
@@ -460,7 +384,6 @@ public class DataNodeTableCache implements ITableCache {
try {
databaseTableMap.remove(database);
specialStatusMap.remove(database);
- previousTableMap.remove(database);
instanceVersion.incrementAndGet();
} finally {
readWriteLock.writeLock().unlock();
@@ -478,7 +401,6 @@ public class DataNodeTableCache implements ITableCache {
try {
databaseTableMap.clear();
specialStatusMap.clear();
- previousTableMap.clear();
instanceVersion.incrementAndGet();
} finally {
readWriteLock.writeLock().unlock();
@@ -786,7 +708,11 @@ public class DataNodeTableCache implements ITableCache {
instanceVersion.incrementAndGet();
}
if (targetTableIsStillDeleting) {
- throw new SemanticException(new
TableInDeletionException(targetDatabase, targetTable));
+ throw new SemanticException(
+ String.format(
+ DataNodeSchemaMessages.THE_TABLE_IS_IN_PRE_DELETE_STATE,
+ targetDatabase,
+ targetTable));
}
} finally {
readWriteLock.writeLock().unlock();
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TreeViewTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TreeViewTest.java
index 68f2b7fc3f6..959bd4b9d6a 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TreeViewTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TreeViewTest.java
@@ -24,7 +24,6 @@ import org.apache.iotdb.commons.schema.table.TsTable;
import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan;
import org.apache.iotdb.db.queryengine.plan.relational.planner.PlanTester;
import
org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern;
-import org.apache.iotdb.db.schemaengine.lease.MetadataLeaseManager;
import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
import com.google.common.collect.ImmutableList;
@@ -66,8 +65,6 @@ public class TreeViewTest {
@Before
public void setup() {
- MetadataLeaseManager.getInstance().updateFenceThresholdMs(Long.MAX_VALUE);
- MetadataLeaseManager.getInstance().recoveryLeaseForTest(true);
TsTable tsTable = new TsTable(DEVICE_VIEW_TEST_TABLE);
tsTable.addProp(TsTable.TTL_PROPERTY, Long.MAX_VALUE + "");
tsTable.addProp(TreeViewSchema.TREE_PATH_PATTERN, "root.test" + ".**");
@@ -78,8 +75,6 @@ public class TreeViewTest {
@After
public void tearDown() {
DataNodeTableCache.getInstance().invalid(TREE_VIEW_DB);
- MetadataLeaseManager.getInstance().updateFenceThresholdMs(20_000);
- MetadataLeaseManager.getInstance().recoveryLeaseForTest(true);
}
@Test
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidatorTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidatorTest.java
deleted file mode 100644
index 354d21fa724..00000000000
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidatorTest.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * 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.relational.metadata.fetcher;
-
-import org.apache.iotdb.commons.exception.SemanticException;
-import org.apache.iotdb.commons.exception.table.ColumnInDeletionException;
-import
org.apache.iotdb.commons.queryengine.plan.relational.metadata.ColumnSchema;
-import
org.apache.iotdb.commons.queryengine.plan.relational.metadata.TableSchema;
-import org.apache.iotdb.commons.schema.table.InsertNodeMeasurementInfo;
-import org.apache.iotdb.commons.schema.table.TsTable;
-import org.apache.iotdb.commons.schema.table.column.AttributeColumnSchema;
-import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema;
-import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
-import org.apache.iotdb.db.conf.IoTDBConfig;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
-import org.apache.iotdb.db.queryengine.common.QueryId;
-import
org.apache.iotdb.db.queryengine.plan.analyze.lock.DataNodeSchemaLockManager;
-import
org.apache.iotdb.db.queryengine.plan.execution.config.executor.ClusterConfigTaskExecutor;
-import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
-import org.apache.iotdb.db.schemaengine.table.ITableCache;
-import org.apache.iotdb.rpc.TSStatusCode;
-
-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.common.type.TypeFactory;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
-
-public class TableHeaderSchemaValidatorTest {
- private static final String DATABASE = "pre_delete_write_test";
- private static final String TABLE = "table1";
- private final ITableCache cache = DataNodeTableCache.getInstance();
- private final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
- private final MPPQueryContext context = new MPPQueryContext(new
QueryId("pre_delete_write_test"));
- private ClusterConfigTaskExecutor executor;
- private TableHeaderSchemaValidator validator;
- private boolean autoCreateSchema;
- private boolean partialInsert;
-
- @Before
- public void setUp() {
- autoCreateSchema = config.isAutoCreateSchemaEnabled();
- partialInsert = config.isEnablePartialInsert();
- executor = Mockito.mock(ClusterConfigTaskExecutor.class);
- validator = new TableHeaderSchemaValidator(executor);
- cache.invalid(DATABASE);
- final TsTable table = new TsTable(TABLE);
- table.addColumnSchema(
- new FieldColumnSchema("live", TSDataType.INT32, TSEncoding.RLE,
CompressionType.LZ4));
- table.addColumnSchema(
- new FieldColumnSchema("field", TSDataType.INT32, TSEncoding.RLE,
CompressionType.LZ4));
- table.addColumnSchema(new AttributeColumnSchema("attribute",
TSDataType.STRING));
- cache.preUpdateTable(DATABASE, table, null);
- cache.commitUpdateTable(DATABASE, TABLE, null);
- // A DROP COLUMN invalidates the DataNode cache before removing ConfigNode
metadata.
- cache.invalid(DATABASE, TABLE, "field");
- cache.invalid(DATABASE, TABLE, "attribute");
- Mockito.when(executor.getPreDeletedColumns(DATABASE, TABLE))
- .thenReturn(new java.util.HashSet<>(Arrays.asList("field",
"attribute")));
- }
-
- @After
- public void tearDown() {
- DataNodeSchemaLockManager.getInstance().releaseReadLock(context);
- cache.invalid(DATABASE);
- config.setAutoCreateSchemaEnabled(autoCreateSchema);
- config.setEnablePartialInsert(partialInsert);
- }
-
- @Test
- public void testInsertReportsDeletionBeforeUnknownCategory() {
- for (final boolean autoCreate : new boolean[] {true, false}) {
- config.setAutoCreateSchemaEnabled(autoCreate);
- final InsertNodeMeasurementInfo measurements = measurements("field",
null);
- final SemanticException error =
- assertThrows(
- SemanticException.class,
- () ->
- validator.validateInsertNodeMeasurements(
- DATABASE, measurements, context, true, null, null));
- assertDeletion(error, "field");
- }
- }
-
- @Test
- public void testInsertRejectsPreDeletedAttribute() {
- final SemanticException error =
- assertThrows(
- SemanticException.class,
- () ->
- validator.validateInsertNodeMeasurements(
- DATABASE,
- measurements("attribute", TsTableColumnCategory.ATTRIBUTE),
- context,
- true,
- null,
- null));
- assertDeletion(error, "attribute");
- }
-
- @Test
- public void testTsFileLoadRejectsPreDeletedFieldAndAttribute() {
- for (final boolean autoCreate : new boolean[] {true, false}) {
- config.setAutoCreateSchemaEnabled(autoCreate);
- for (final String column : Arrays.asList("field", "attribute")) {
- final TableSchema tableSchema =
- new TableSchema(
- TABLE,
- Collections.singletonList(
- new ColumnSchema(
- column,
- TypeFactory.getType(
- column.equals("field") ? TSDataType.INT32 :
TSDataType.STRING),
- false,
- column.equals("field")
- ? TsTableColumnCategory.FIELD
- : TsTableColumnCategory.ATTRIBUTE)));
- final SemanticException error =
- assertThrows(
- SemanticException.class,
- () ->
- validator.validateTableHeaderSchema4TsFile(
- DATABASE, tableSchema, context, true, false, new
AtomicBoolean()));
- assertDeletion(error, column);
- }
- }
- }
-
- @Test
- public void testExistingColumnsDoNotFetchDeletionStatus() throws Exception {
- validator.validateInsertNodeMeasurements(
- DATABASE, measurements("live", TsTableColumnCategory.FIELD), context,
true, null, null);
- validator.validateTableHeaderSchema4TsFile(
- DATABASE,
- new TableSchema(
- TABLE,
- Collections.singletonList(
- new ColumnSchema(
- "live",
- TypeFactory.getType(TSDataType.INT32),
- false,
- TsTableColumnCategory.FIELD))),
- context,
- true,
- false,
- new AtomicBoolean());
- Mockito.verify(executor, Mockito.never())
- .getPreDeletedColumns(Mockito.anyString(), Mockito.anyString());
- }
-
- @Test
- public void testMissingColumnStillReportsUnknownCategory() {
- final SemanticException error =
- assertThrows(
- SemanticException.class,
- () ->
- validator.validateInsertNodeMeasurements(
- DATABASE, measurements("missing", null), context, true,
null, null));
- assertEquals(TSStatusCode.COLUMN_NOT_EXISTS.getStatusCode(),
error.getErrorCode());
- }
-
- @Test
- public void testMissingColumnsFetchDeletionStatusOnce() {
- config.setAutoCreateSchemaEnabled(false);
- config.setEnablePartialInsert(true);
- final InsertNodeMeasurementInfo measurements =
Mockito.mock(InsertNodeMeasurementInfo.class);
- Mockito.when(measurements.getTableName()).thenReturn(TABLE);
- Mockito.when(measurements.getMeasurementCount()).thenReturn(2);
- Mockito.when(measurements.getColumnCategories())
- .thenReturn(
- new TsTableColumnCategory[] {TsTableColumnCategory.FIELD,
TsTableColumnCategory.FIELD});
- Mockito.when(measurements.getMeasurementName(0)).thenReturn("missing1");
- Mockito.when(measurements.getMeasurementName(1)).thenReturn("missing2");
- validator.validateInsertNodeMeasurements(DATABASE, measurements, context,
true, null, null);
- Mockito.verify(executor).getPreDeletedColumns(DATABASE, TABLE);
- }
-
- @Test
- public void testTsFileMissingColumnsFetchDeletionStatusOnce() throws
Exception {
- config.setAutoCreateSchemaEnabled(false);
- config.setEnablePartialInsert(true);
- final TableSchema tableSchema =
- new TableSchema(
- TABLE,
- Arrays.asList(
- new ColumnSchema(
- "missing1",
- TypeFactory.getType(TSDataType.INT32),
- false,
- TsTableColumnCategory.FIELD),
- new ColumnSchema(
- "missing2",
- TypeFactory.getType(TSDataType.INT32),
- false,
- TsTableColumnCategory.FIELD)));
-
- validator.validateTableHeaderSchema4TsFile(
- DATABASE, tableSchema, context, true, false, new AtomicBoolean());
-
- Mockito.verify(executor).getPreDeletedColumns(DATABASE, TABLE);
- }
-
- private InsertNodeMeasurementInfo measurements(
- final String name, final TsTableColumnCategory category) {
- final InsertNodeMeasurementInfo measurements =
Mockito.mock(InsertNodeMeasurementInfo.class);
- Mockito.when(measurements.getTableName()).thenReturn(TABLE);
- Mockito.when(measurements.getMeasurementCount()).thenReturn(1);
- Mockito.when(measurements.getColumnCategories())
- .thenReturn(new TsTableColumnCategory[] {category});
- Mockito.when(measurements.getMeasurementName(0)).thenReturn(name);
- Mockito.when(measurements.getType(0)).thenReturn(TSDataType.INT32);
- return measurements;
- }
-
- private static void assertDeletion(final SemanticException error, final
String column) {
- assertEquals(TSStatusCode.SEMANTIC_ERROR.getStatusCode(),
error.getErrorCode());
- assertTrue(error.getCause() instanceof ColumnInDeletionException);
- assertEquals(
- new ColumnInDeletionException(DATABASE, TABLE, column).getMessage(),
- error.getCause().getMessage());
- }
-}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCacheTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCacheTest.java
index 78af8f3eee0..fd97da843bd 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCacheTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCacheTest.java
@@ -19,13 +19,7 @@
package org.apache.iotdb.db.schemaengine.table;
-import
org.apache.iotdb.commons.exception.MetadataLeaseFencedException.LeaseFencedRetryPolicy;
-import org.apache.iotdb.commons.exception.SemanticException;
-import org.apache.iotdb.commons.exception.table.TableInDeletionException;
-import org.apache.iotdb.commons.schema.table.NonCommittableTsTable;
-import org.apache.iotdb.commons.schema.table.PreDeleteTsTable;
import org.apache.iotdb.commons.schema.table.TsTable;
-import org.apache.iotdb.commons.schema.table.TsTableInternalRPCUtil;
import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema;
import org.apache.tsfile.enums.TSDataType;
@@ -35,18 +29,12 @@ import org.junit.Assert;
import org.junit.Test;
import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
import java.util.concurrent.Semaphore;
public class DataNodeTableCacheTest {
private static final String DATABASE = "interrupted_fetch_database";
private static final String TABLE_CACHE_TEST_DATABASE =
"root.table_cache_test";
- private static final String TABLE_CACHE_TEST_DATABASE_NAME =
"table_cache_test";
private static final String TABLE_NAME = "table1";
@Test
@@ -97,99 +85,7 @@ public class DataNodeTableCacheTest {
cache.rollbackUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
cache.commitUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
- Assert.assertFalse(
- cache
- .getTableSnapshot()
- .getOrDefault(TABLE_CACHE_TEST_DATABASE_NAME,
Collections.emptyMap())
- .containsKey(TABLE_NAME));
- } finally {
- cache.invalid(TABLE_CACHE_TEST_DATABASE);
- }
- }
-
- @Test
- public void rollbackAlteredTableRestoresOriginalSchema() throws Exception {
- final ITableCache cache = DataNodeTableCache.getInstance();
- cache.invalid(TABLE_CACHE_TEST_DATABASE);
- try {
- cache.preUpdateTable(TABLE_CACHE_TEST_DATABASE, createTable(TABLE_NAME),
null);
- cache.commitUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
-
- final TsTable alteredTable = createTable(TABLE_NAME);
- ((FieldColumnSchema)
alteredTable.getColumnSchema("s1")).setDataType(TSDataType.DOUBLE);
- cache.preUpdateTable(TABLE_CACHE_TEST_DATABASE, alteredTable, null);
-
- // A concurrent fetch may promote the pending table into the regular
cache before rollback.
- // Keep that path covered because rollback must still restore the
pre-update schema.
- final Method updateUsingTable =
- DataNodeTableCache.class.getDeclaredMethod(
- "updateUsingTable", Map.class, Map.class,
LeaseFencedRetryPolicy.class);
- updateUsingTable.setAccessible(true);
- final Map<String, Map<String, TsTable>> fetchedTables = new HashMap<>();
- fetchedTables.put(
- TABLE_CACHE_TEST_DATABASE, Collections.singletonMap(TABLE_NAME,
alteredTable));
- final Map<String, Map<String, Long>> previousVersions = new HashMap<>();
- previousVersions.put(
- TABLE_CACHE_TEST_DATABASE_NAME, Collections.singletonMap(TABLE_NAME,
1L));
- updateUsingTable.invoke(
- cache, fetchedTables, previousVersions,
LeaseFencedRetryPolicy.RETRY_UNTIL_SUCCESS);
-
- cache.rollbackUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
- Assert.assertEquals(
- TSDataType.INT32,
- cache
- .getTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME)
- .getColumnSchema("s1")
- .getDataType());
- } finally {
- cache.invalid(TABLE_CACHE_TEST_DATABASE);
- }
- }
-
- @Test
- public void delayedRollbackDoesNotEvictCommittedAlteredSchema() {
- final ITableCache cache = DataNodeTableCache.getInstance();
- cache.invalid(TABLE_CACHE_TEST_DATABASE);
- try {
- cache.preUpdateTable(TABLE_CACHE_TEST_DATABASE, createTable(TABLE_NAME),
null);
- cache.commitUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
-
- final TsTable alteredTable = createTable(TABLE_NAME);
- ((FieldColumnSchema)
alteredTable.getColumnSchema("s1")).setDataType(TSDataType.DOUBLE);
- cache.preUpdateTable(TABLE_CACHE_TEST_DATABASE, alteredTable, null);
- cache.commitUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
-
- cache.rollbackUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
- Assert.assertEquals(
- TSDataType.DOUBLE,
- cache
- .getTableSnapshot()
- .get(TABLE_CACHE_TEST_DATABASE_NAME)
- .get(TABLE_NAME)
- .getColumnSchema("s1")
- .getDataType());
- } finally {
- cache.invalid(TABLE_CACHE_TEST_DATABASE);
- }
- }
-
- @Test
- public void delayedRollbackDoesNotRestoreCommittedDeletedTable() {
- final ITableCache cache = DataNodeTableCache.getInstance();
- cache.invalid(TABLE_CACHE_TEST_DATABASE);
- try {
- cache.preUpdateTable(TABLE_CACHE_TEST_DATABASE, createTable(TABLE_NAME),
null);
- cache.commitUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
-
- cache.preUpdateTable(TABLE_CACHE_TEST_DATABASE, new
PreDeleteTsTable(TABLE_NAME), null);
- cache.commitUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
-
- cache.rollbackUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
- Assert.assertFalse(
- cache
- .getTableSnapshot()
- .getOrDefault(TABLE_CACHE_TEST_DATABASE_NAME,
Collections.emptyMap())
- .containsKey(TABLE_NAME));
+ Assert.assertNull(cache.getTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME,
false));
} finally {
cache.invalid(TABLE_CACHE_TEST_DATABASE);
}
@@ -215,97 +111,12 @@ public class DataNodeTableCacheTest {
}
}
- @Test
- public void rollbackAfterRestartEvictsUnknownPreviousSchema() {
- final ITableCache cache = DataNodeTableCache.getInstance();
- cache.invalid(TABLE_CACHE_TEST_DATABASE);
- try {
- final TsTable alteredTable = createTable(TABLE_NAME);
- ((FieldColumnSchema)
alteredTable.getColumnSchema("s1")).setDataType(TSDataType.DOUBLE);
- final byte[] initializationBytes =
- TsTableInternalRPCUtil.serializeTableInitializationInfo(
- Collections.singletonMap(
- TABLE_CACHE_TEST_DATABASE,
Collections.singletonList(alteredTable)),
- Collections.singletonMap(
- TABLE_CACHE_TEST_DATABASE,
- Collections.singletonList(new
NonCommittableTsTable(TABLE_NAME))));
- cache.init(initializationBytes);
-
- // A restart cannot retain the in-memory pre-update snapshot. Evict the
potentially stale
- // schema even if the recovered procedure repeats PRE_UPDATE, and fail
closed until the
- // canonical schema can be fetched from the CN.
- cache.preUpdateTable(TABLE_CACHE_TEST_DATABASE, alteredTable, null);
- cache.rollbackUpdateTable(TABLE_CACHE_TEST_DATABASE, TABLE_NAME, null);
- Assert.assertFalse(
- cache
- .getTableSnapshot()
- .getOrDefault(TABLE_CACHE_TEST_DATABASE_NAME,
Collections.emptyMap())
- .containsKey(TABLE_NAME));
- } finally {
- cache.invalid(TABLE_CACHE_TEST_DATABASE);
- }
- }
-
private Semaphore getFetchTableSemaphore(final ITableCache cache) throws
Exception {
final Field field =
DataNodeTableCache.class.getDeclaredField("fetchTableSemaphore");
field.setAccessible(true);
return (Semaphore) field.get(cache);
}
- @Test
- public void preDeletedTableRefreshReportsDeletionAndRecovers() throws
Exception {
- final ITableCache cache = DataNodeTableCache.getInstance();
- final Method updateDeleteTable =
- DataNodeTableCache.class.getDeclaredMethod(
- "updateDeleteTable",
- Map.class,
- String.class,
- String.class,
- LeaseFencedRetryPolicy.class);
- updateDeleteTable.setAccessible(true);
- final String database = "pre_delete_table_test";
- cache.invalid(database);
- try {
- cache.preUpdateTable(database, new PreDeleteTsTable(TABLE_NAME), null);
- final InvocationTargetException failure =
- Assert.assertThrows(
- InvocationTargetException.class,
- () ->
- updateDeleteTable.invoke(
- cache,
- Collections.singletonMap(
- database,
- Collections.singletonMap(TABLE_NAME, new
PreDeleteTsTable(TABLE_NAME))),
- database,
- TABLE_NAME,
- LeaseFencedRetryPolicy.RETRY_UNTIL_SUCCESS));
- Assert.assertTrue(failure.getCause() instanceof SemanticException);
- Assert.assertEquals(
- new TableInDeletionException(database, TABLE_NAME).getMessage(),
- failure.getCause().getCause().getMessage());
-
- updateDeleteTable.invoke(
- cache,
- Collections.singletonMap(
- database, Collections.singletonMap(TABLE_NAME,
createTable(TABLE_NAME))),
- database,
- TABLE_NAME,
- LeaseFencedRetryPolicy.RETRY_UNTIL_SUCCESS);
- Assert.assertNotNull(cache.getTableInWrite(database, TABLE_NAME));
-
- cache.preUpdateTable(database, new PreDeleteTsTable(TABLE_NAME), null);
- updateDeleteTable.invoke(
- cache,
- Collections.singletonMap(database,
Collections.singletonMap(TABLE_NAME, null)),
- database,
- TABLE_NAME,
- LeaseFencedRetryPolicy.RETRY_UNTIL_SUCCESS);
- Assert.assertNull(cache.getTableInWrite(database, TABLE_NAME));
- } finally {
- cache.invalid(database);
- }
- }
-
private TsTable createTable(final String tableName) {
final TsTable table = new TsTable(tableName);
table.addColumnSchema(
diff --git
a/iotdb-core/node-commons/src/main/i18n/en/org/apache/iotdb/commons/i18n/CommonMessages.java
b/iotdb-core/node-commons/src/main/i18n/en/org/apache/iotdb/commons/i18n/CommonMessages.java
index 806581d0e09..a05c8f9915a 100644
---
a/iotdb-core/node-commons/src/main/i18n/en/org/apache/iotdb/commons/i18n/CommonMessages.java
+++
b/iotdb-core/node-commons/src/main/i18n/en/org/apache/iotdb/commons/i18n/CommonMessages.java
@@ -335,10 +335,4 @@ public final class CommonMessages {
public static final String
EXCEPTION_SNAPSHOT_BUFFER_SIZE_MUST_NOT_EXCEED_ARG_BYTES_BUT_WAS_ARG_D1DA6F7E =
"Snapshot buffer size must not exceed %d bytes, but was %d.";
- public static final String
EXCEPTION_TABLE_ARG_ARG_IS_BEING_DELETED_PLEASE_WAIT_FOR_DELETION_TO_FINISH_OR_RETRY_DROP_TABLE_IF_IT_IS_STUCK_7E22D78F
=
- "Table '%s.%s' is being deleted. Please wait for deletion to finish, or
retry DROP TABLE if it is stuck.";
- public static final String
EXCEPTION_COLUMN_ARG_IN_TABLE_ARG_ARG_IS_BEING_DELETED_PLEASE_WAIT_FOR_DELETION_TO_FINISH_OR_RETRY_DROPPING_THE_COLUMN_IF_IT_IS_STUCK_875DAFFE
=
- "Column '%s' in table '%s.%s' is being deleted. Please wait for deletion
to finish, or retry dropping the column if it is stuck.";
- public static final String
EXCEPTION_COLUMN_ARG_IN_TABLE_ARG_ARG_IS_BEING_ALTERED_PLEASE_WAIT_FOR_ALTERATION_TO_FINISH_OR_RETRY_ALTERING_THE_COLUMN_IF_IT_IS_STUCK_11155B55
=
- "Column '%s' in table '%s.%s' is being altered. Please wait for
alteration to finish, or retry altering the column if it is stuck.";
}
diff --git
a/iotdb-core/node-commons/src/main/i18n/zh/org/apache/iotdb/commons/i18n/CommonMessages.java
b/iotdb-core/node-commons/src/main/i18n/zh/org/apache/iotdb/commons/i18n/CommonMessages.java
index 76ce8769aa1..c5c6290687e 100644
---
a/iotdb-core/node-commons/src/main/i18n/zh/org/apache/iotdb/commons/i18n/CommonMessages.java
+++
b/iotdb-core/node-commons/src/main/i18n/zh/org/apache/iotdb/commons/i18n/CommonMessages.java
@@ -232,10 +232,4 @@ public final class CommonMessages {
public static final String
EXCEPTION_SNAPSHOT_BUFFER_SIZE_MUST_NOT_EXCEED_ARG_BYTES_BUT_WAS_ARG_D1DA6F7E =
"快照缓冲区大小不得超过 %d 字节,但实际为 %d。";
- public static final String
EXCEPTION_TABLE_ARG_ARG_IS_BEING_DELETED_PLEASE_WAIT_FOR_DELETION_TO_FINISH_OR_RETRY_DROP_TABLE_IF_IT_IS_STUCK_7E22D78F
=
- "表 '%s.%s' 正在删除中。请等待删除完成;如果删除一直未完成,请重试 DROP TABLE。";
- public static final String
EXCEPTION_COLUMN_ARG_IN_TABLE_ARG_ARG_IS_BEING_DELETED_PLEASE_WAIT_FOR_DELETION_TO_FINISH_OR_RETRY_DROPPING_THE_COLUMN_IF_IT_IS_STUCK_875DAFFE
=
- "列 '%s'(位于表 '%s.%s')正在删除中。请等待删除完成;如果删除一直未完成,请重试删除该列。";
- public static final String
EXCEPTION_COLUMN_ARG_IN_TABLE_ARG_ARG_IS_BEING_ALTERED_PLEASE_WAIT_FOR_ALTERATION_TO_FINISH_OR_RETRY_ALTERING_THE_COLUMN_IF_IT_IS_STUCK_11155B55
=
- "列 '%s'(位于表 '%s.%s')正在修改中。请等待修改完成;如果修改一直未完成,请重试修改该列。";
}
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/table/ColumnInAlterException.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/table/ColumnInAlterException.java
deleted file mode 100644
index 20f24abe062..00000000000
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/table/ColumnInAlterException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.commons.exception.table;
-
-import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.i18n.CommonMessages;
-import org.apache.iotdb.commons.utils.PathUtils;
-import org.apache.iotdb.rpc.TSStatusCode;
-
-public class ColumnInAlterException extends MetadataException {
-
- public ColumnInAlterException(
- final String database, final String tableName, final String columnName) {
- super(
- String.format(
- CommonMessages
-
.EXCEPTION_COLUMN_ARG_IN_TABLE_ARG_ARG_IS_BEING_ALTERED_PLEASE_WAIT_FOR_ALTERATION_TO_FINISH_OR_RETRY_ALTERING_THE_COLUMN_IF_IT_IS_STUCK_11155B55,
- columnName,
- PathUtils.unQualifyDatabaseName(database),
- tableName),
- TSStatusCode.SEMANTIC_ERROR.getStatusCode());
- }
-}
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/table/ColumnInDeletionException.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/table/ColumnInDeletionException.java
deleted file mode 100644
index b3a6e60be09..00000000000
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/table/ColumnInDeletionException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.commons.exception.table;
-
-import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.i18n.CommonMessages;
-import org.apache.iotdb.commons.utils.PathUtils;
-import org.apache.iotdb.rpc.TSStatusCode;
-
-public class ColumnInDeletionException extends MetadataException {
-
- public ColumnInDeletionException(
- final String database, final String tableName, final String columnName) {
- super(
- String.format(
- CommonMessages
-
.EXCEPTION_COLUMN_ARG_IN_TABLE_ARG_ARG_IS_BEING_DELETED_PLEASE_WAIT_FOR_DELETION_TO_FINISH_OR_RETRY_DROPPING_THE_COLUMN_IF_IT_IS_STUCK_875DAFFE,
- columnName,
- PathUtils.unQualifyDatabaseName(database),
- tableName),
- TSStatusCode.SEMANTIC_ERROR.getStatusCode());
- }
-}
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/table/TableInDeletionException.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/table/TableInDeletionException.java
deleted file mode 100644
index 8ec7d18937c..00000000000
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/table/TableInDeletionException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.commons.exception.table;
-
-import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.i18n.CommonMessages;
-import org.apache.iotdb.commons.utils.PathUtils;
-import org.apache.iotdb.rpc.TSStatusCode;
-
-public class TableInDeletionException extends MetadataException {
-
- public TableInDeletionException(final String database, final String
tableName) {
- super(
- String.format(
- CommonMessages
-
.EXCEPTION_TABLE_ARG_ARG_IS_BEING_DELETED_PLEASE_WAIT_FOR_DELETION_TO_FINISH_OR_RETRY_DROP_TABLE_IF_IT_IS_STUCK_7E22D78F,
- PathUtils.unQualifyDatabaseName(database),
- tableName),
- TSStatusCode.SEMANTIC_ERROR.getStatusCode());
- }
-}