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 76060204b7 IGNITE-20788 Make primary key indexes immediately available
(#2793)
76060204b7 is described below
commit 76060204b71599706f6201447e69ce1cc772e1d1
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Mon Nov 6 14:00:26 2023 +0300
IGNITE-20788 Make primary key indexes immediately available (#2793)
---
.../catalog/commands/CreateTableCommand.java | 5 +-
.../internal/catalog/CatalogManagerSelfTest.java | 55 ++++++++++++++++++++++
.../index/IndexAvailabilityController.java | 4 ++
.../internal/index/IndexBuildController.java | 4 ++
.../index/IndexAvailabilityControllerTest.java | 18 +++++++
.../internal/index/IndexBuildControllerTest.java | 40 +++++++++++-----
6 files changed, 112 insertions(+), 14 deletions(-)
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
index a4cd3123af..4593514dce 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
@@ -39,6 +39,7 @@ import
org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor
import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.storage.MakeIndexAvailableEntry;
import org.apache.ignite.internal.catalog.storage.NewIndexEntry;
import org.apache.ignite.internal.catalog.storage.NewTableEntry;
import org.apache.ignite.internal.catalog.storage.ObjectIdGenUpdateEntry;
@@ -126,12 +127,14 @@ public class CreateTableCommand extends
AbstractTableCommand {
indexName,
tableId,
true,
- primaryKeyColumns
+ primaryKeyColumns,
+ true
);
return List.of(
new NewTableEntry(table, schemaName),
new NewIndexEntry(pkIndex, schemaName),
+ new MakeIndexAvailableEntry(pkIndexId),
new ObjectIdGenUpdateEntry(id - catalog.objectIdGenState())
);
}
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 577ec583ab..9a170b444e 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
@@ -247,6 +247,7 @@ public class CatalogManagerSelfTest extends
BaseCatalogManagerTest {
assertEquals(table.id(), pkIndex.tableId());
assertEquals(table.primaryKeyColumns(), pkIndex.columns());
assertTrue(pkIndex.unique());
+ assertTrue(pkIndex.available());
CatalogTableColumnDescriptor desc = table.columnDescriptor("key1");
assertNotNull(desc);
@@ -1935,6 +1936,60 @@ public class CatalogManagerSelfTest extends
BaseCatalogManagerTest {
assertThat(fireEventFuture, willCompleteSuccessfully());
}
+ @Test
+ void testPkAvailableIndexEvent() {
+ CompletableFuture<Integer> fireEventFuture = new CompletableFuture<>();
+
+ manager.listen(CatalogEvent.INDEX_AVAILABLE, (parameters, exception)
-> {
+ if (exception != null) {
+ fireEventFuture.completeExceptionally(exception);
+ } else {
+ try {
+
fireEventFuture.complete(((MakeIndexAvailableEventParameters)
parameters).indexId());
+ } catch (Throwable t) {
+ fireEventFuture.completeExceptionally(t);
+ }
+ }
+
+ return completedFuture(false);
+ });
+
+ String tableName = TABLE_NAME + "_new";
+
+ createSomeTable(tableName);
+
+ assertThat(fireEventFuture, willBe(notNullValue()));
+
+ assertEquals(indexId(pkIndexName(tableName)), fireEventFuture.join());
+ }
+
+ @Test
+ void testPkAvailableOnCreateIndexEvent() {
+ CompletableFuture<Void> fireEventFuture = new CompletableFuture<>();
+
+ manager.listen(CatalogEvent.INDEX_CREATE, (parameters, exception) -> {
+ if (exception != null) {
+ fireEventFuture.completeExceptionally(exception);
+ } else {
+ try {
+ CreateIndexEventParameters createIndexEventParameters =
(CreateIndexEventParameters) parameters;
+
+
assertTrue(createIndexEventParameters.indexDescriptor().available());
+
+ fireEventFuture.complete(null);
+ } catch (Throwable t) {
+ fireEventFuture.completeExceptionally(t);
+ }
+ }
+
+ return completedFuture(false);
+ });
+
+ createSomeTable(TABLE_NAME);
+
+ assertThat(fireEventFuture, willCompleteSuccessfully());
+ }
+
@Test
public void activationTimeIsStrictlyMonotonic() {
// Prepare schema changes.
diff --git
a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexAvailabilityController.java
b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexAvailabilityController.java
index 11150972bd..5862baf0dd 100644
---
a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexAvailabilityController.java
+++
b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexAvailabilityController.java
@@ -219,6 +219,10 @@ class IndexAvailabilityController implements
ManuallyCloseable {
private CompletableFuture<?> onIndexCreate(CreateIndexEventParameters
parameters) {
return inBusyLockAsync(busyLock, () -> {
+ if (parameters.indexDescriptor().available()) {
+ return completedFuture(null);
+ }
+
int indexId = parameters.indexDescriptor().id();
int partitions = getPartitionCountFromCatalog(catalogManager,
indexId, parameters.catalogVersion());
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 f568a46b2e..4e1b2ae3ac 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
@@ -147,6 +147,10 @@ class IndexBuildController implements ManuallyCloseable {
private CompletableFuture<?> onIndexCreate(CreateIndexEventParameters
parameters) {
return inBusyLockAsync(busyLock, () -> {
+ if (parameters.indexDescriptor().available()) {
+ return completedFuture(null);
+ }
+
var startBuildIndexFutures = new ArrayList<CompletableFuture<?>>();
for (TablePartitionId primaryReplicaId : primaryReplicaIds) {
diff --git
a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexAvailabilityControllerTest.java
b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexAvailabilityControllerTest.java
index 440b386273..045b1e8dab 100644
---
a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexAvailabilityControllerTest.java
+++
b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexAvailabilityControllerTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.index;
import static java.util.concurrent.CompletableFuture.completedFuture;
import static
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_SCHEMA_NAME;
import static
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_ZONE_NAME;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.pkIndexName;
import static
org.apache.ignite.internal.index.TestIndexManagementUtils.COLUMN_NAME;
import static
org.apache.ignite.internal.index.TestIndexManagementUtils.INDEX_NAME;
import static
org.apache.ignite.internal.index.TestIndexManagementUtils.NODE_NAME;
@@ -135,6 +136,23 @@ public class IndexAvailabilityControllerTest extends
BaseIgniteAbstractTest {
}
}
+ @Test
+ void testMetastoreKeysAfterTableCreate() throws Exception {
+ String tableName = TABLE_NAME + "_new";
+
+ createTable(catalogManager, tableName, COLUMN_NAME);
+
+ int indexId = indexId(pkIndexName(tableName));
+
+ awaitTillGlobalMetastoreRevisionIsApplied();
+
+ assertInProgressBuildIndexKeyAbsent(indexId);
+
+ for (int partitionId = 0; partitionId < partitions; partitionId++) {
+ assertPartitionBuildIndexKeyAbsent(indexId, partitionId);
+ }
+ }
+
@Test
void testMetastoreKeysAfterIndexCreateForOnlyOnePartition() throws
Exception {
changePartitionCountInCatalog(1);
diff --git
a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexBuildControllerTest.java
b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexBuildControllerTest.java
index 638c340bfe..59c77536a1 100644
---
a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexBuildControllerTest.java
+++
b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexBuildControllerTest.java
@@ -107,9 +107,9 @@ public class IndexBuildControllerTest extends
BaseIgniteAbstractTest {
catalogManager = CatalogTestUtils.createTestCatalogManager(NODE_NAME,
clock);
catalogManager.start();
- createTable(catalogManager, TABLE_NAME, COLUMN_NAME);
-
indexBuildController = new IndexBuildController(indexBuilder,
indexManager, catalogManager, clusterService, placementDriver, clock);
+
+ createTable(catalogManager, TABLE_NAME, COLUMN_NAME);
}
@AfterEach
@@ -154,8 +154,13 @@ public class IndexBuildControllerTest extends
BaseIgniteAbstractTest {
eq(LOCAL_NODE),
anyLong()
);
+ }
- verify(indexBuilder).scheduleBuildIndex(
+ @Test
+ void testNotStartBuildPkIndexesOnPrimaryReplicaElected() {
+ setPrimaryReplicaWhichExpiresInOneSecond(PARTITION_ID, NODE_NAME,
NODE_ID, clock.now());
+
+ verify(indexBuilder, never()).scheduleBuildIndex(
eq(tableId()),
eq(PARTITION_ID),
eq(indexId(pkIndexName(TABLE_NAME))),
@@ -166,6 +171,25 @@ public class IndexBuildControllerTest extends
BaseIgniteAbstractTest {
);
}
+ @Test
+ void testNotStartBuildPkIndexesForNewTable() {
+ setPrimaryReplicaWhichExpiresInOneSecond(PARTITION_ID, NODE_NAME,
NODE_ID, clock.now());
+
+ String tableName = TABLE_NAME + "_new";
+
+ createTable(catalogManager, tableName, COLUMN_NAME);
+
+ verify(indexBuilder, never()).scheduleBuildIndex(
+ eq(tableId()),
+ eq(PARTITION_ID),
+ eq(indexId(pkIndexName(tableName))),
+ any(),
+ any(),
+ eq(LOCAL_NODE),
+ anyLong()
+ );
+ }
+
@Test
void testStopBuildIndexesOnIndexDrop() {
createIndex(INDEX_NAME);
@@ -204,16 +228,6 @@ public class IndexBuildControllerTest extends
BaseIgniteAbstractTest {
eq(LOCAL_NODE),
anyLong()
);
-
- verify(indexBuilder).scheduleBuildIndex(
- eq(tableId()),
- eq(PARTITION_ID),
- eq(indexId(pkIndexName(TABLE_NAME))),
- any(),
- any(),
- eq(LOCAL_NODE),
- anyLong()
- );
}
private void createIndex(String indexName) {