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 e917054b5f IGNITE-20530 Start building indexes for write-only indexes 
(#2704)
e917054b5f is described below

commit e917054b5f932eca2c393615b9a0125d2f54f29f
Author: Kirill Tkalenko <tkalkir...@yandex.ru>
AuthorDate: Wed Oct 18 10:36:06 2023 +0300

    IGNITE-20530 Start building indexes for write-only indexes (#2704)
---
 .../internal/index/IndexBuildController.java       |  3 +-
 .../internal/index/IndexBuildControllerTest.java   | 45 ++++++++++++++--
 .../ignite/internal/runner/app/TableTestUtils.java | 62 ----------------------
 .../ignite/internal/sql/api/ItSqlApiBaseTest.java  |  2 +-
 4 files changed, 42 insertions(+), 70 deletions(-)

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 55f751de2f..24778080bb 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
@@ -220,9 +220,8 @@ public class IndexBuildController implements 
IgniteComponent {
                 return;
             }
 
-            // TODO: IGNITE-20530 We only need to get write-only indexes
             for (CatalogIndexDescriptor indexDescriptor : 
catalogService.indexes(catalogVersion)) {
-                if (primaryReplicaId.tableId() == indexDescriptor.tableId()) {
+                if (!indexDescriptor.available() && primaryReplicaId.tableId() 
== indexDescriptor.tableId()) {
                     scheduleBuildIndex(primaryReplicaId, indexDescriptor, 
mvTableStorage);
                 }
             }
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 dca73259f9..f9edd68af9 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
@@ -32,6 +32,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -43,6 +44,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.ignite.internal.catalog.CatalogManager;
 import org.apache.ignite.internal.catalog.CatalogTestUtils;
 import org.apache.ignite.internal.catalog.commands.ColumnParams;
+import org.apache.ignite.internal.catalog.commands.MakeIndexAvailableCommand;
 import org.apache.ignite.internal.event.AbstractEventProducer;
 import org.apache.ignite.internal.hlc.HybridClock;
 import org.apache.ignite.internal.hlc.HybridClockImpl;
@@ -133,7 +135,7 @@ public class IndexBuildControllerTest extends 
BaseIgniteAbstractTest {
 
     @Test
     void testStartBuildIndexesOnIndexCreate() {
-        setPrimaryReplicaWitchExpireInOneSecond(PARTITION_ID, NODE_NAME, 
clock.now());
+        setPrimaryReplicaWhichExpiresInOneSecond(PARTITION_ID, NODE_NAME, 
clock.now());
 
         clearInvocations(indexBuilder);
 
@@ -146,7 +148,7 @@ public class IndexBuildControllerTest extends 
BaseIgniteAbstractTest {
     void testStartBuildIndexesOnPrimaryReplicaElected() {
         createIndex(INDEX_NAME);
 
-        setPrimaryReplicaWitchExpireInOneSecond(PARTITION_ID, NODE_NAME, 
clock.now());
+        setPrimaryReplicaWhichExpiresInOneSecond(PARTITION_ID, NODE_NAME, 
clock.now());
 
         verify(indexBuilder).scheduleBuildIndex(eq(tableId()), 
eq(PARTITION_ID), eq(indexId(INDEX_NAME)), any(), any(), eq(localNode));
 
@@ -173,21 +175,54 @@ public class IndexBuildControllerTest extends 
BaseIgniteAbstractTest {
 
     @Test
     void testStopBuildIndexesOnChangePrimaryReplica() {
-        setPrimaryReplicaWitchExpireInOneSecond(PARTITION_ID, NODE_NAME, 
clock.now());
-        setPrimaryReplicaWitchExpireInOneSecond(PARTITION_ID, NODE_NAME + 
"_other", clock.now());
+        setPrimaryReplicaWhichExpiresInOneSecond(PARTITION_ID, NODE_NAME, 
clock.now());
+        setPrimaryReplicaWhichExpiresInOneSecond(PARTITION_ID, NODE_NAME + 
"_other", clock.now());
 
         verify(indexBuilder).stopBuildingIndexes(tableId(), PARTITION_ID);
     }
 
+    @Test
+    void 
testStartBuildIndexesOnPrimaryReplicaElectedOnlyForRegisteredIndexes() {
+        createIndex(INDEX_NAME);
+
+        int indexId = indexId(INDEX_NAME);
+
+        makeIndexAvailable(indexId);
+
+        setPrimaryReplicaWhichExpiresInOneSecond(PARTITION_ID, NODE_NAME, 
clock.now());
+
+        verify(indexBuilder, never()).scheduleBuildIndex(
+                eq(tableId()),
+                eq(PARTITION_ID),
+                eq(indexId(INDEX_NAME)),
+                any(),
+                any(),
+                eq(localNode)
+        );
+
+        verify(indexBuilder).scheduleBuildIndex(
+                eq(tableId()),
+                eq(PARTITION_ID),
+                eq(indexId(pkIndexName(TABLE_NAME))),
+                any(),
+                any(),
+                eq(localNode)
+        );
+    }
+
     private void createIndex(String indexName) {
         createHashIndex(catalogManager, DEFAULT_SCHEMA_NAME, TABLE_NAME, 
indexName, List.of(COLUMN_NAME), false);
     }
 
+    private void makeIndexAvailable(int indexId) {
+        
assertThat(catalogManager.execute(MakeIndexAvailableCommand.builder().indexId(indexId).build()),
 willCompleteSuccessfully());
+    }
+
     private void dropIndex(String indexName) {
         TableTestUtils.dropIndex(catalogManager, DEFAULT_SCHEMA_NAME, 
indexName);
     }
 
-    private void setPrimaryReplicaWitchExpireInOneSecond(int partitionId, 
String leaseholder, HybridTimestamp startTime) {
+    private void setPrimaryReplicaWhichExpiresInOneSecond(int partitionId, 
String leaseholder, HybridTimestamp startTime) {
         CompletableFuture<ReplicaMeta> replicaMetaFuture = 
completedFuture(replicaMetaForOneSecond(leaseholder, startTime));
 
         assertThat(placementDriver.setPrimaryReplicaMeta(0, 
replicaId(partitionId), replicaMetaFuture), willCompleteSuccessfully());
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/TableTestUtils.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/TableTestUtils.java
deleted file mode 100644
index f8add797f0..0000000000
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/TableTestUtils.java
+++ /dev/null
@@ -1,62 +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.ignite.internal.runner.app;
-
-import static 
org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-import java.util.List;
-import org.apache.ignite.internal.catalog.CatalogCommand;
-import org.apache.ignite.internal.catalog.CatalogManager;
-import org.apache.ignite.internal.catalog.commands.ColumnParams;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommand;
-
-/**
- * Utils to manage tables inside tests.
- */
-// TODO: IGNITE-19502 - remove after switching to the Catalog.
-public class TableTestUtils {
-    /**
-     * Creates table in the catalog.
-     *
-     * @param catalogManager Catalog manager.
-     * @param schemaName Schema name.
-     * @param zoneName Zone name.
-     * @param tableName Table name.
-     * @param columns Table columns.
-     * @param pkColumns Primary key columns.
-     */
-    public static void createTable(
-            CatalogManager catalogManager,
-            String schemaName,
-            String zoneName,
-            String tableName,
-            List<ColumnParams> columns,
-            List<String> pkColumns
-    ) {
-        CatalogCommand command = CreateTableCommand.builder()
-                .schemaName(schemaName)
-                .zone(zoneName)
-                .tableName(tableName)
-                .columns(columns)
-                .primaryKeyColumns(pkColumns)
-                .build();
-
-        assertThat(catalogManager.execute(command), 
willCompleteSuccessfully());
-    }
-}
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlApiBaseTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlApiBaseTest.java
index 5f94a23702..2fabd673ee 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlApiBaseTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlApiBaseTest.java
@@ -91,7 +91,7 @@ public abstract class ItSqlApiBaseTest extends 
ClusterPerClassIntegrationTest {
     }
 
     @Test
-    @Disabled("https://issues.apache.org/jira/browse/IGNITE-20096";)
+    @Disabled("https://issues.apache.org/jira/browse/IGNITE-20671";)
     public void ddl() throws Exception {
         IgniteSql sql = igniteSql();
         Session ses = sql.createSession();

Reply via email to