This is an automated email from the ASF dual-hosted git repository. tkalkirill pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new 01820435ca IGNITE-20857 Returns a sorted list by index ID from a catalog (#2837) 01820435ca is described below commit 01820435ca35c29a228ea6fdc5f511861b7be023 Author: Kirill Tkalenko <tkalkir...@yandex.ru> AuthorDate: Thu Nov 16 16:41:13 2023 +0300 IGNITE-20857 Returns a sorted list by index ID from a catalog (#2837) --- .../apache/ignite/internal/catalog/Catalog.java | 39 ++++++++++ .../internal/catalog/CatalogManagerImpl.java | 5 ++ .../ignite/internal/catalog/CatalogService.java | 3 + .../internal/catalog/CatalogManagerSelfTest.java | 89 ++++++++++++++++++---- .../internal/index/IndexBuildController.java | 4 +- .../internal/table/distributed/TableManager.java | 3 +- 6 files changed, 125 insertions(+), 18 deletions(-) diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/Catalog.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/Catalog.java index f214260376..c7668e7eaa 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/Catalog.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/Catalog.java @@ -17,10 +17,18 @@ package org.apache.ignite.internal.catalog; +import static it.unimi.dsi.fastutil.ints.Int2ObjectMaps.unmodifiable; +import static java.util.Collections.unmodifiableList; +import static java.util.Comparator.comparingInt; + import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Function; @@ -59,10 +67,16 @@ public class Catalog { @IgniteToStringExclude private final Int2ObjectMap<CatalogSchemaDescriptor> schemasById; + @IgniteToStringExclude private final Int2ObjectMap<CatalogTableDescriptor> tablesById; + @IgniteToStringExclude private final Int2ObjectMap<CatalogIndexDescriptor> indexesById; + + @IgniteToStringExclude + private final Int2ObjectMap<List<CatalogIndexDescriptor>> indexesByTableId; + @IgniteToStringExclude private final Int2ObjectMap<CatalogZoneDescriptor> zonesById; @@ -96,6 +110,7 @@ public class Catalog { schemasById = schemas.stream().collect(toMapById()); tablesById = schemas.stream().flatMap(s -> Arrays.stream(s.tables())).collect(toMapById()); indexesById = schemas.stream().flatMap(s -> Arrays.stream(s.indexes())).collect(toMapById()); + indexesByTableId = unmodifiable(toIndexesByTableId(schemas)); zonesById = zones.stream().collect(toMapById()); } @@ -139,6 +154,10 @@ public class Catalog { return indexesById.values(); } + public List<CatalogIndexDescriptor> indexes(int tableId) { + return indexesByTableId.getOrDefault(tableId, List.of()); + } + public @Nullable CatalogZoneDescriptor zone(String name) { return zonesByName.get(name); } @@ -155,4 +174,24 @@ public class Catalog { public String toString() { return S.toString(this); } + + private static Int2ObjectMap<List<CatalogIndexDescriptor>> toIndexesByTableId(Collection<CatalogSchemaDescriptor> schemas) { + Int2ObjectMap<List<CatalogIndexDescriptor>> indexesByTableId = new Int2ObjectOpenHashMap<>(); + + for (CatalogSchemaDescriptor schema : schemas) { + for (CatalogIndexDescriptor index : schema.indexes()) { + indexesByTableId.computeIfAbsent(index.tableId(), indexes -> new ArrayList<>()).add(index); + } + } + + for (List<CatalogIndexDescriptor> indexes : indexesByTableId.values()) { + indexes.sort(comparingInt(CatalogIndexDescriptor::id)); + } + + for (Entry<List<CatalogIndexDescriptor>> entry : indexesByTableId.int2ObjectEntrySet()) { + entry.setValue(unmodifiableList(entry.getValue())); + } + + return indexesByTableId; + } } diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java index 3078ecae33..2903aa8a8a 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java @@ -230,6 +230,11 @@ public class CatalogManagerImpl extends AbstractEventProducer<CatalogEvent, Cata return catalog(catalogVersion).indexes(); } + @Override + public List<CatalogIndexDescriptor> indexes(int catalogVersion, int tableId) { + return catalog(catalogVersion).indexes(tableId); + } + @Override public @Nullable CatalogSchemaDescriptor schema(int version) { Catalog catalog = catalog(version); diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogService.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogService.java index b5b11d804c..11e6528a01 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogService.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogService.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.catalog; import java.util.Collection; +import java.util.List; import java.util.concurrent.CompletableFuture; import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor; @@ -67,6 +68,8 @@ public interface CatalogService extends EventProducer<CatalogEvent, CatalogEvent Collection<CatalogIndexDescriptor> indexes(int catalogVersion); + List<CatalogIndexDescriptor> indexes(int catalogVersion, int tableId); + @Nullable CatalogSchemaDescriptor schema(int version); @Nullable CatalogSchemaDescriptor schema(@Nullable String schemaName, int version); diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java index 4d1a3a3117..a8b3185757 100644 --- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java +++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java @@ -57,6 +57,7 @@ import static org.apache.ignite.sql.ColumnType.NULL; import static org.apache.ignite.sql.ColumnType.STRING; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.is; @@ -105,6 +106,7 @@ import org.apache.ignite.internal.catalog.commands.MakeIndexAvailableCommand; import org.apache.ignite.internal.catalog.commands.RenameZoneParams; import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor; +import org.apache.ignite.internal.catalog.descriptors.CatalogObjectDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogSortedIndexDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor; @@ -1778,20 +1780,6 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest { willThrowFast(CatalogValidationException.class)); } - - - private void createSomeTable(String tableName) { - assertThat( - manager.execute(createTableCommand( - tableName, - List.of(columnParams("key1", INT32), columnParams("val1", INT32)), - List.of("key1"), - List.of("key1") - )), - willCompleteSuccessfully() - ); - } - @Test void bulkCommandEitherAppliedAtomicallyOrDoesntAppliedAtAll() { String tableName1 = "TEST1"; @@ -1992,6 +1980,48 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest { assertThat(fireEventFuture, willCompleteSuccessfully()); } + @Test + void testGetIndexesForTables() { + String tableName0 = TABLE_NAME + 0; + String tableName1 = TABLE_NAME + 1; + + createSomeTable(tableName0); + createSomeTable(tableName1); + + createSomeIndex(tableName1, INDEX_NAME); + + int catalogVersion = manager.latestCatalogVersion(); + + // Let's check for a non-existent table. + assertThat(tableIndexIds(catalogVersion, Integer.MAX_VALUE), empty()); + + // Let's check for an existing tables. + int tableId0 = tableId(tableName0); + int tableId1 = tableId(tableName1); + + assertThat(tableIndexIds(catalogVersion, tableId0), hasItems(indexId(pkIndexName(tableName0)))); + assertThat(tableIndexIds(catalogVersion, tableId1), hasItems(indexId(pkIndexName(tableName1)), indexId(INDEX_NAME))); + } + + @Test + void testGetIndexesForTableInSortedOrderById() { + createSomeTable(TABLE_NAME); + + String indexName0 = INDEX_NAME + 0; + String indexName1 = INDEX_NAME + 1; + + createSomeIndex(TABLE_NAME, indexName0); + createSomeIndex(TABLE_NAME, indexName1); + + int indexId0 = indexId(pkIndexName(TABLE_NAME)); + int indexId1 = indexId(indexName0); + int indexId2 = indexId(indexName1); + + int catalogVersion = manager.latestCatalogVersion(); + + assertThat(tableIndexIds(catalogVersion, tableId(TABLE_NAME)), equalTo(List.of(indexId0, indexId1, indexId2))); + } + private CompletableFuture<Void> changeColumn( String tab, String col, @@ -2061,6 +2091,14 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest { return manager.schema(catalogVersion).index(indexName); } + private int tableId(String tableName) { + CatalogTableDescriptor table = manager.table(tableName, clock.nowLong()); + + assertNotNull(table, tableName); + + return table.id(); + } + private int indexId(String indexName) { CatalogIndexDescriptor index = manager.index(indexName, clock.nowLong()); @@ -2068,4 +2106,27 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest { return index.id(); } + + private void createSomeTable(String tableName) { + assertThat( + manager.execute(createTableCommand( + tableName, + List.of(columnParams("key1", INT32), columnParams("val1", INT32)), + List.of("key1"), + List.of("key1") + )), + willCompleteSuccessfully() + ); + } + + private void createSomeIndex(String tableName, String indexName) { + assertThat( + manager.execute(createHashIndexCommand(tableName, indexName, false, List.of("key1"))), + willCompleteSuccessfully() + ); + } + + private List<Integer> tableIndexIds(int catalogVersion, int tableId) { + return manager.indexes(catalogVersion, tableId).stream().map(CatalogObjectDescriptor::id).collect(toList()); + } } diff --git a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java index 4e1b2ae3ac..aefc4cd5c5 100644 --- a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java +++ b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java @@ -222,8 +222,8 @@ class IndexBuildController implements ManuallyCloseable { return; } - for (CatalogIndexDescriptor indexDescriptor : catalogService.indexes(catalogVersion)) { - if (!indexDescriptor.available() && primaryReplicaId.tableId() == indexDescriptor.tableId()) { + for (CatalogIndexDescriptor indexDescriptor : catalogService.indexes(catalogVersion, primaryReplicaId.tableId())) { + if (!indexDescriptor.available()) { scheduleBuildIndex(primaryReplicaId, indexDescriptor, mvTableStorage, enlistmentConsistencyToken(replicaMeta)); } } 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 19d2e1c3f9..ad38c485e2 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 @@ -2131,8 +2131,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent { } private int[] collectTableIndexIds(int tableId, int catalogVersion) { - return catalogService.indexes(catalogVersion).stream() - .filter(indexDescriptor -> indexDescriptor.tableId() == tableId) + return catalogService.indexes(catalogVersion, tableId).stream() .mapToInt(CatalogIndexDescriptor::id) .toArray(); }