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) {

Reply via email to