This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-19942 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 0c2690164ce429cd325694d8b96a3d23c1965744 Author: amashenkov <andrey.mashen...@gmail.com> AuthorDate: Tue Jul 11 19:30:31 2023 +0300 Mirror Index changes from Config to Catalog --- .../internal/catalog/commands/CatalogUtils.java | 1 - .../apache/ignite/internal/index/IndexManager.java | 139 ++++++++++++++++++++- .../ignite/internal/index/IndexManagerTest.java | 90 +++++++++---- .../ignite/internal/index/ItIndexManagerTest.java | 23 ++-- .../runner/app/ItIgniteNodeRestartTest.java | 8 +- .../org/apache/ignite/internal/app/IgniteImpl.java | 2 +- .../sql/engine/exec/ddl/DdlCommandHandler.java | 2 +- .../engine/exec/ddl/DdlCommandHandlerWrapper.java | 37 +++--- .../sql/engine/exec/MockedStructuresTest.java | 17 ++- .../internal/table/distributed/TableManager.java | 8 +- .../table/distributed/TableManagerTest.java | 11 +- 11 files changed, 271 insertions(+), 67 deletions(-) diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java index d157cbaba2..7d53598e23 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java @@ -208,5 +208,4 @@ public class CatalogUtils { return 0; } } - } diff --git a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java index a9bbdf6c45..2944ef3f6e 100644 --- a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java +++ b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java @@ -36,6 +36,10 @@ import java.util.function.Function; import org.apache.ignite.configuration.NamedListView; import org.apache.ignite.configuration.notifications.ConfigurationNamedListListener; import org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent; +import org.apache.ignite.internal.catalog.CatalogManager; +import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams; +import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams; +import org.apache.ignite.internal.catalog.commands.DropIndexParams; import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation; import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogIndexColumnDescriptor; @@ -59,6 +63,7 @@ import org.apache.ignite.internal.schema.configuration.TableView; import org.apache.ignite.internal.schema.configuration.TablesConfiguration; import org.apache.ignite.internal.schema.configuration.TablesView; import org.apache.ignite.internal.schema.configuration.index.HashIndexChange; +import org.apache.ignite.internal.schema.configuration.index.SortedIndexChange; import org.apache.ignite.internal.schema.configuration.index.TableIndexChange; import org.apache.ignite.internal.schema.configuration.index.TableIndexConfiguration; import org.apache.ignite.internal.schema.configuration.index.TableIndexView; @@ -73,6 +78,7 @@ import org.apache.ignite.internal.util.IgniteSpinBusyLock; import org.apache.ignite.internal.util.StringUtils; import org.apache.ignite.lang.ErrorGroups; import org.apache.ignite.lang.ErrorGroups.Common; +import org.apache.ignite.lang.IgniteException; import org.apache.ignite.lang.IgniteInternalException; import org.apache.ignite.lang.IndexAlreadyExistsException; import org.apache.ignite.lang.IndexNotFoundException; @@ -96,6 +102,9 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp /** Table manager. */ private final TableManager tableManager; + /** Catalog manager. */ + private final CatalogManager catalogManager; + /** Busy lock to stop synchronously. */ private final IgniteSpinBusyLock busyLock = new IgniteSpinBusyLock(); @@ -106,17 +115,20 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp * Constructor. * * @param tablesCfg Tables and indexes configuration. + * @param catalogManager Catalog manager. * @param schemaManager Schema manager. * @param tableManager Table manager. */ public IndexManager( TablesConfiguration tablesCfg, + CatalogManager catalogManager, SchemaManager schemaManager, TableManager tableManager ) { this.tablesCfg = Objects.requireNonNull(tablesCfg, "tablesCfg"); this.schemaManager = Objects.requireNonNull(schemaManager, "schemaManager"); this.tableManager = tableManager; + this.catalogManager = catalogManager; } /** {@inheritDoc} */ @@ -142,8 +154,10 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp .toArray(String[]::new); String pkName = table.name() + "_PK"; + int pkId = table.tableId() + 1; - return createIndexAsync("PUBLIC", pkName, table.name(), false, + // Update config bypassing the Catalog, because PK has just been created in Catalog with the table. + return createIndexInternal(pkId, "PUBLIC", pkName, table.name(), false, change -> change.changeUniq(true).convert(HashIndexChange.class) .changeColumnNames(pkColumns) ); @@ -186,12 +200,104 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp * @param indexChange A consumer that suppose to change the configuration in order to provide description of an index. * @return A future represented the result of creation. */ + @Deprecated(forRemoval = true) public CompletableFuture<Boolean> createIndexAsync( String schemaName, String indexName, String tableName, boolean failIfExists, Consumer<TableIndexChange> indexChange + ) { + throw new UnsupportedOperationException("Method is no longer supported."); + } + + /** + * Creates sorted index from provided parameters. + */ + @Deprecated(forRemoval = true) + public CompletableFuture<Boolean> createSortedIndexAsync(CreateSortedIndexParams params) { + if (!busyLock.enterBusy()) { + return failedFuture(new NodeStoppingException()); + } + + try { + Consumer<TableIndexChange> indexChanger = tableIndexChange -> { + tableIndexChange.convert(SortedIndexChange.class).changeColumns(colsInit -> { + for (int i = 0; i < params.columns().size(); i++) { + String columnName = params.columns().get(i); + CatalogColumnCollation collation = params.collations().get(i); + //TODO: https://issues.apache.org/jira/browse/IGNITE-17563 Pass null ordering for columns. + colsInit.create(columnName, colInit -> colInit.changeAsc(collation.asc())); + } + }); + }; + + return catalogManager.createIndex(params) + .thenApply(ignore -> { + CatalogIndexDescriptor index = catalogManager.index(params.indexName(), Long.MAX_VALUE); + return index.id(); + }) + .thenCompose(indexId -> + createIndexInternal( + indexId, + params.schemaName(), + params.indexName(), + params.tableName(), + true, + indexChanger + ) + ); + } catch (Exception ex) { + return failedFuture(ex); + } finally { + busyLock.leaveBusy(); + } + } + + /** + * Creates hash index from provided parameters. + */ + @Deprecated(forRemoval = true) + public CompletableFuture<Boolean> createHashIndexAsync(CreateHashIndexParams params) { + if (!busyLock.enterBusy()) { + return failedFuture(new NodeStoppingException()); + } + + try { + Consumer<TableIndexChange> indexChanger = tableIndexChange -> { + tableIndexChange.convert(HashIndexChange.class) + .changeColumnNames(params.columns().toArray(STRING_EMPTY_ARRAY)); + }; + + return catalogManager.createIndex(params) + .thenApply(ignore -> { + CatalogIndexDescriptor index = catalogManager.index(params.indexName(), Long.MAX_VALUE); + return index.id(); + }) + .thenCompose(indexId -> + createIndexInternal( + indexId, + params.schemaName(), + params.indexName(), + params.tableName(), + true, + indexChanger + ) + ); + } catch (Exception ex) { + return failedFuture(ex); + } finally { + busyLock.leaveBusy(); + } + } + + private CompletableFuture<Boolean> createIndexInternal( + int indexId, + String schemaName, + String indexName, + String tableName, + boolean failIfExists, + Consumer<TableIndexChange> indexChange ) { if (!busyLock.enterBusy()) { return failedFuture(new NodeStoppingException()); @@ -224,8 +330,6 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp int tableId = tableCfg.id(); - int indexId = tablesChange.globalIdCounter() + 1; - tablesChange.changeGlobalIdCounter(indexId); Consumer<TableIndexChange> chg = indexChange.andThen(c -> c.changeTableId(tableId).changeId(indexId)); @@ -281,6 +385,33 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp String schemaName, String indexName, boolean failIfNotExists + ) { + throw new UnsupportedOperationException("Method is no longer supported."); + } + + /** + * Drops the index with a given parameters asynchronously. + */ + public CompletableFuture<Boolean> dropIndexAsync(DropIndexParams params) { + if (!busyLock.enterBusy()) { + throw new IgniteException(new NodeStoppingException()); + } + try { + CompletableFuture<Boolean> future = catalogManager.dropIndex(params) + .thenCompose(ignore -> dropIndexAsyncInternal(params.schemaName(), params.indexName(), true)); + + future.whenComplete((res, ex) -> ex.printStackTrace()); + + return future; + } finally { + busyLock.leaveBusy(); + } + } + + private CompletableFuture<Boolean> dropIndexAsyncInternal( + String schemaName, + String indexName, + boolean failIfNotExists ) { if (!busyLock.enterBusy()) { return failedFuture(new NodeStoppingException()); @@ -325,6 +456,8 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp }); return future; + } catch (Exception ex) { + return failedFuture(ex); } finally { busyLock.leaveBusy(); } diff --git a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java index 8230656614..40fb2c13f7 100644 --- a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java +++ b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java @@ -27,8 +27,10 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.notNullValue; import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -38,6 +40,12 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; +import org.apache.ignite.internal.catalog.CatalogManager; +import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams; +import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams; +import org.apache.ignite.internal.catalog.commands.DropIndexParams; +import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation; +import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor; import org.apache.ignite.internal.configuration.testframework.ConfigurationExtension; import org.apache.ignite.internal.configuration.testframework.InjectConfiguration; import org.apache.ignite.internal.configuration.tree.ConverterToMapVisitor; @@ -47,7 +55,6 @@ import org.apache.ignite.internal.index.event.IndexEventParameters; import org.apache.ignite.internal.schema.SchemaManager; import org.apache.ignite.internal.schema.configuration.ExtendedTableChange; import org.apache.ignite.internal.schema.configuration.TablesConfiguration; -import org.apache.ignite.internal.schema.configuration.index.SortedIndexChange; import org.apache.ignite.internal.schema.configuration.index.TableIndexView; import org.apache.ignite.internal.table.InternalTable; import org.apache.ignite.internal.table.TableImpl; @@ -104,7 +111,16 @@ public class IndexManagerTest { when(schManager.schemaRegistry(anyLong(), anyInt())).thenReturn(completedFuture(null)); - indexManager = new IndexManager(tablesConfig, schManager, tableManagerMock); + //TODO IGNITE-19082 drop mocked catalog manager. + CatalogManager catalogManager = mock(CatalogManager.class); + CatalogIndexDescriptor indexDescriptor = mock(CatalogIndexDescriptor.class); + when(catalogManager.createIndex(any(CreateHashIndexParams.class))).thenReturn(completedFuture(null)); + when(catalogManager.createIndex(any(CreateSortedIndexParams.class))).thenReturn(completedFuture(null)); + when(catalogManager.dropIndex(any())).thenReturn(completedFuture(null)); + when(catalogManager.index(anyString(), anyLong())).thenReturn(indexDescriptor); + when(indexDescriptor.id()).thenReturn(1); + + indexManager = new IndexManager(tablesConfig, catalogManager, schManager, tableManagerMock); indexManager.start(); assertThat( @@ -125,16 +141,14 @@ public class IndexManagerTest { void configurationChangedWhenCreateIsInvoked() { String indexName = "idx"; - assertThat(indexManager.createIndexAsync("sName", indexName, "tName", true, indexChange -> { - SortedIndexChange sortedIndexChange = indexChange.convert(SortedIndexChange.class); - - sortedIndexChange.changeColumns(columns -> { - columns.create("c1", columnChange -> columnChange.changeAsc(true)); - columns.create("c2", columnChange -> columnChange.changeAsc(false)); - }); - - sortedIndexChange.changeTableId(tableId()); - }), willCompleteSuccessfully()); + assertThat(indexManager.createSortedIndexAsync( + CreateSortedIndexParams.builder() + .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME) + .tableName("tName") + .indexName(indexName) + .columns(List.of("c1", "c2")) + .collations(List.of(CatalogColumnCollation.ASC_NULLS_LAST, CatalogColumnCollation.DESC_NULLS_FIRST)) + .build()), willCompleteSuccessfully()); var expected = List.of( Map.of( @@ -162,7 +176,24 @@ public class IndexManagerTest { @Test public void createIndexWithEmptyName() { assertThat( - indexManager.createIndexAsync("sName", "", "tName", true, indexChange -> {/* doesn't matter */}), + indexManager.createHashIndexAsync( + CreateHashIndexParams.builder() + .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME) + .tableName("tName") + .indexName("") + .columns(List.of("c1")) + .build()), + willThrowFast(IgniteInternalException.class, "Index name should be at least 1 character long") + ); + + assertThat( + indexManager.createSortedIndexAsync( + CreateSortedIndexParams.builder() + .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME) + .tableName("tName") + .indexName("") + .columns(List.of("c1")) + .build()), willThrowFast(IgniteInternalException.class, "Index name should be at least 1 character long") ); } @@ -170,8 +201,12 @@ public class IndexManagerTest { @Test public void dropNonExistingIndex() { assertThat( - indexManager.dropIndexAsync("sName", "nonExisting", true), - willThrowFast(IndexNotFoundException.class, "Index does not exist [name=\"sName\".\"nonExisting\"]") + indexManager.dropIndexAsync( + DropIndexParams.builder() + .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME) + .indexName("nonExisting") + .build()), + willThrowFast(IndexNotFoundException.class, "Index does not exist [name=\"PUBLIC\".\"nonExisting\"]") ); } @@ -194,15 +229,15 @@ public class IndexManagerTest { return completedFuture(true); }); - assertThat(indexManager.createIndexAsync("sName", indexName, "tName", true, indexChange -> { - SortedIndexChange sortedIndexChange = indexChange.convert(SortedIndexChange.class); - - sortedIndexChange.changeColumns(columns -> { - columns.create("c2", columnChange -> columnChange.changeAsc(true)); - }); - - sortedIndexChange.changeTableId(tableId()); - }), willCompleteSuccessfully()); + assertThat(indexManager.createSortedIndexAsync( + CreateSortedIndexParams.builder() + .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME) + .indexName(indexName) + .tableName("tName") + .columns(List.of("c2")) + .collations(List.of(CatalogColumnCollation.ASC_NULLS_LAST)) + .build()), + willCompleteSuccessfully()); List<Integer> indexIds = tablesConfig.indexes().value().stream() .map(TableIndexView::id) @@ -217,7 +252,12 @@ public class IndexManagerTest { assertThat(holder.get().tableId(), equalTo(tableId())); assertThat(holder.get().indexDescriptor().name(), equalTo(indexName)); - assertThat(indexManager.dropIndexAsync("sName", indexName, true), willCompleteSuccessfully()); + assertThat(indexManager.dropIndexAsync( + DropIndexParams.builder() + .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME) + .indexName(indexName) + .build()), + willCompleteSuccessfully()); assertThat(holder.get(), notNullValue()); assertThat(holder.get().indexId(), equalTo(indexId)); diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java index e511cac7c0..3c7eca2188 100644 --- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java +++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java @@ -23,12 +23,14 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.notNullValue; +import java.util.List; import java.util.concurrent.CompletableFuture; import org.apache.ignite.Ignite; import org.apache.ignite.internal.app.IgniteImpl; +import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams; +import org.apache.ignite.internal.catalog.commands.DropIndexParams; import org.apache.ignite.internal.index.event.IndexEvent; import org.apache.ignite.internal.index.event.IndexEventParameters; -import org.apache.ignite.internal.schema.configuration.index.HashIndexChange; import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest; import org.apache.ignite.internal.table.TableImpl; import org.apache.ignite.internal.testframework.WorkDirectoryExtension; @@ -68,12 +70,13 @@ public class ItIndexManagerTest extends ClusterPerClassIntegrationTest { CompletableFuture<IndexEventParameters> indexCreatedFuture = registerListener(indexManager, IndexEvent.CREATE); - await(indexManager.createIndexAsync( - "PUBLIC", - "INAME", - "TNAME", - true, - tableIndexChange -> tableIndexChange.convert(HashIndexChange.class).changeColumnNames("C3", "C2") + await(indexManager.createHashIndexAsync( + CreateHashIndexParams.builder() + .schemaName("PUBLIC") + .indexName("INAME") + .tableName("TNAME") + .columns(List.of("C3", "C2")) + .build() )); int createdIndexId; @@ -90,7 +93,11 @@ public class ItIndexManagerTest extends ClusterPerClassIntegrationTest { CompletableFuture<IndexEventParameters> indexDroppedFuture = registerListener(indexManager, IndexEvent.DROP); - await(indexManager.dropIndexAsync("PUBLIC", "INAME", true)); + await(indexManager.dropIndexAsync( + DropIndexParams.builder() + .schemaName("PUBLIC") + .indexName("INAME") + .build())); { IndexEventParameters params = await(indexDroppedFuture); diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java index 1b782195ce..00bf165d11 100644 --- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java +++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java @@ -386,7 +386,7 @@ public class ItIgniteNodeRestartTest extends BaseIgniteRestartTest { null ); - var indexManager = new IndexManager(tablesConfig, schemaManager, tableManager); + var indexManager = new IndexManager(tablesConfig, catalogManager, schemaManager, tableManager); SqlQueryProcessor qryEngine = new SqlQueryProcessor( registry, @@ -1205,9 +1205,9 @@ public class ItIgniteNodeRestartTest extends BaseIgniteRestartTest { */ private void createTableWithData(List<IgniteImpl> nodes, String name, int replicas, int partitions) { try (Session session = nodes.get(0).sql().createSession()) { - session.execute(null, - String.format("CREATE ZONE IF NOT EXISTS ZONE_%s WITH REPLICAS=%d, PARTITIONS=%d", name, replicas, partitions)); - session.execute(null, "CREATE TABLE IF NOT EXISTS " + name + session.execute(null, String.format("CREATE ZONE IF NOT EXISTS ZONE_%s WITH REPLICAS=%d, PARTITIONS=%d", + name.toUpperCase(), replicas, partitions)); + session.execute(null, "CREATE TABLE IF NOT EXISTS " + name.toUpperCase() + "(id INT PRIMARY KEY, name VARCHAR) WITH PRIMARY_ZONE='ZONE_" + name.toUpperCase() + "';"); for (int i = 0; i < 100; i++) { diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java index d38a1597e8..a9cd3b548b 100644 --- a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java +++ b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java @@ -550,7 +550,7 @@ public class IgniteImpl implements Ignite { distributionZoneManager ); - indexManager = new IndexManager(tablesConfig, schemaManager, distributedTblMgr); + indexManager = new IndexManager(tablesConfig, catalogManager, schemaManager, distributedTblMgr); qryEngine = new SqlQueryProcessor( registry, diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java index f56848c215..5760dc2a85 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java @@ -106,7 +106,7 @@ public class DdlCommandHandler { protected final TableManager tableManager; - private final IndexManager indexManager; + protected final IndexManager indexManager; private final DataStorageManager dataStorageManager; diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java index bb702d4566..7fbd884f9b 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java @@ -17,6 +17,9 @@ package org.apache.ignite.internal.sql.engine.exec.ddl; +import static java.util.concurrent.CompletableFuture.failedFuture; +import static org.apache.ignite.lang.ErrorGroups.Sql.UNSUPPORTED_DDL_OPERATION_ERR; + import java.util.Objects; import java.util.concurrent.CompletableFuture; import org.apache.ignite.internal.catalog.CatalogManager; @@ -35,6 +38,7 @@ import org.apache.ignite.internal.sql.engine.prepare.ddl.DropIndexCommand; import org.apache.ignite.internal.sql.engine.prepare.ddl.DropTableCommand; import org.apache.ignite.internal.storage.DataStorageManager; import org.apache.ignite.internal.table.distributed.TableManager; +import org.apache.ignite.lang.IgniteInternalCheckedException; import org.apache.ignite.lang.IndexAlreadyExistsException; import org.apache.ignite.lang.IndexNotFoundException; import org.apache.ignite.lang.TableAlreadyExistsException; @@ -86,28 +90,25 @@ public class DdlCommandHandlerWrapper extends DdlCommandHandler { } else if (cmd instanceof AlterColumnCommand) { return catalogManager.alterColumn(DdlToCatalogCommandConverter.convert((AlterColumnCommand) cmd)) .handle(handleModificationResult(((AlterColumnCommand) cmd).ifTableExists(), TableNotFoundException.class)); - } + } else if (cmd instanceof CreateIndexCommand) { + AbstractIndexCommandParams params = DdlToCatalogCommandConverter.convert((CreateIndexCommand) cmd); - // Handle command in usual way. - CompletableFuture<Boolean> ddlCommandFuture = super.handle(cmd); + if (params instanceof CreateSortedIndexParams) { + return indexManager.createSortedIndexAsync((CreateSortedIndexParams) params) + .handle(handleModificationResult(((CreateIndexCommand) cmd).ifNotExists(), IndexAlreadyExistsException.class)); + } else if (params instanceof CreateHashIndexParams) { + return indexManager.createHashIndexAsync((CreateHashIndexParams) params) + .handle(handleModificationResult(((CreateIndexCommand) cmd).ifNotExists(), IndexAlreadyExistsException.class)); + } - if (cmd instanceof CreateIndexCommand) { - return ddlCommandFuture - .thenCompose(res -> { - AbstractIndexCommandParams params = DdlToCatalogCommandConverter.convert((CreateIndexCommand) cmd); - if (params instanceof CreateSortedIndexParams) { - return catalogManager.createIndex((CreateSortedIndexParams) params); - } else { - return catalogManager.createIndex((CreateHashIndexParams) params); - } - }).handle(handleModificationResult(((CreateIndexCommand) cmd).ifNotExists(), IndexAlreadyExistsException.class)); + return failedFuture(new IgniteInternalCheckedException(UNSUPPORTED_DDL_OPERATION_ERR, "Unsupported DDL operation [" + + "cmdName=" + cmd.getClass().getSimpleName() + "]")); } else if (cmd instanceof DropIndexCommand) { - return ddlCommandFuture - .thenCompose(res -> catalogManager.dropIndex(DdlToCatalogCommandConverter.convert((DropIndexCommand) cmd)) - .handle(handleModificationResult(((DropIndexCommand) cmd).ifNotExists(), IndexNotFoundException.class)) - ); + return indexManager.dropIndexAsync(DdlToCatalogCommandConverter.convert((DropIndexCommand) cmd)) + .handle(handleModificationResult(((DropIndexCommand) cmd).ifNotExists(), IndexNotFoundException.class)); } - return ddlCommandFuture; + // Handle other commands in usual way. + return super.handle(cmd); } } diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java index 9aa9471037..955a4223c2 100644 --- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java @@ -48,6 +48,9 @@ import java.util.function.Consumer; import java.util.function.LongFunction; import org.apache.ignite.internal.baseline.BaselineManager; import org.apache.ignite.internal.catalog.CatalogManager; +import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams; +import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams; +import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor; import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManager; import org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologySnapshot; @@ -284,11 +287,17 @@ public class MockedStructuresTest extends IgniteAbstractTest { //TODO IGNITE-19082 drop mocked catalog manager. catalogManager = mock(CatalogManager.class); - CatalogTableDescriptor descriptor = mock(CatalogTableDescriptor.class); - when(descriptor.id()).thenReturn(1); + CatalogTableDescriptor tableDescriptor = mock(CatalogTableDescriptor.class); + CatalogIndexDescriptor indexDescriptor = mock(CatalogIndexDescriptor.class); + when(tableDescriptor.id()).thenReturn(1); + when(indexDescriptor.id()).thenReturn(1); when(catalogManager.createTable(any())).thenReturn(completedFuture(null)); + when(catalogManager.createIndex(any(CreateHashIndexParams.class))).thenReturn(completedFuture(null)); + when(catalogManager.createIndex(any(CreateSortedIndexParams.class))).thenReturn(completedFuture(null)); when(catalogManager.dropTable(any())).thenReturn(completedFuture(null)); - when(catalogManager.table(anyString(), anyLong())).thenReturn(descriptor); + when(catalogManager.dropIndex(any())).thenReturn(completedFuture(null)); + when(catalogManager.table(anyString(), anyLong())).thenReturn(tableDescriptor); + when(catalogManager.index(anyString(), anyLong())).thenReturn(indexDescriptor); cmgMgr = mock(ClusterManagementGroupManager.class); @@ -304,7 +313,7 @@ public class MockedStructuresTest extends IgniteAbstractTest { tblManager = mockManagers(); - idxManager = new IndexManager(tblsCfg, schemaManager, tblManager); + idxManager = new IndexManager(tblsCfg, catalogManager, schemaManager, tblManager); idxManager.start(); diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java index 375a1fa542..6a7b8b7721 100644 --- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java +++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java @@ -1746,7 +1746,13 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp } } - /** See {@link #alterTableAsync(String, Function)} for details. */ + /** + * Alter table configuration. + * + * @see AlterTableAddColumnParams + * @see AlterTableDropColumnParams + */ + @Deprecated(forRemoval = true) private CompletableFuture<Void> alterTableAsyncInternal(String name, Function<TableChange, Boolean> tableChange) { CompletableFuture<Void> tblFut = new CompletableFuture<>(); diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java index 883c0bf771..83b5e6f5ff 100644 --- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java +++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java @@ -68,7 +68,10 @@ import org.apache.ignite.internal.affinity.AffinityUtils; import org.apache.ignite.internal.baseline.BaselineManager; import org.apache.ignite.internal.catalog.CatalogManager; import org.apache.ignite.internal.catalog.commands.AlterTableAddColumnParams; +import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams; +import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams; import org.apache.ignite.internal.catalog.commands.DropTableParams; +import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor; import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManager; @@ -861,10 +864,16 @@ public class TableManagerTest extends IgniteAbstractTest { //TODO IGNITE-19082 drop mocked catalog manager. CatalogManager catalogManager = mock(CatalogManager.class); CatalogTableDescriptor tableDescriptor = mock(CatalogTableDescriptor.class); + CatalogIndexDescriptor indexDescriptor = mock(CatalogIndexDescriptor.class); + when(tableDescriptor.id()).thenReturn(1); + when(indexDescriptor.id()).thenReturn(1); when(catalogManager.createTable(any())).thenReturn(completedFuture(null)); + when(catalogManager.createIndex(any(CreateHashIndexParams.class))).thenReturn(completedFuture(null)); + when(catalogManager.createIndex(any(CreateSortedIndexParams.class))).thenReturn(completedFuture(null)); when(catalogManager.dropTable(any())).thenReturn(completedFuture(null)); + when(catalogManager.dropIndex(any())).thenReturn(completedFuture(null)); when(catalogManager.table(anyString(), anyLong())).thenReturn(tableDescriptor); - when(tableDescriptor.id()).thenReturn(1); + when(catalogManager.index(anyString(), anyLong())).thenReturn(indexDescriptor); TableManager tableManager = new TableManager( "test",