This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-19460 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit da3bb2a6decfef6220a8206a2d43b88fe6cceef6 Author: amashenkov <andrey.mashen...@gmail.com> AuthorDate: Thu May 18 12:37:38 2023 +0300 Add create/drop index events. --- .../internal/catalog/CatalogServiceImpl.java | 14 +++- .../internal/catalog/events/CatalogEvent.java | 8 ++- .../internal/catalog/CatalogServiceSelfTest.java | 80 +++++++++++++++++++--- 3 files changed, 91 insertions(+), 11 deletions(-) diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java index 5a780ec72a..7bd2965cbf 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java @@ -41,7 +41,9 @@ import org.apache.ignite.internal.catalog.descriptors.SchemaDescriptor; import org.apache.ignite.internal.catalog.descriptors.TableDescriptor; import org.apache.ignite.internal.catalog.events.CatalogEvent; import org.apache.ignite.internal.catalog.events.CatalogEventParameters; +import org.apache.ignite.internal.catalog.events.CreateIndexEventParameters; import org.apache.ignite.internal.catalog.events.CreateTableEventParameters; +import org.apache.ignite.internal.catalog.events.DropIndexEventParameters; import org.apache.ignite.internal.catalog.events.DropTableEventParameters; import org.apache.ignite.internal.catalog.storage.DropIndexEntry; import org.apache.ignite.internal.catalog.storage.DropTableEntry; @@ -125,7 +127,7 @@ public class CatalogServiceImpl extends Producer<CatalogEvent, CatalogEventParam /** {@inheritDoc} */ @Override public IndexDescriptor index(String indexName, long timestamp) { - return catalogAt(timestamp).schema(PUBLIC).index(indexName); + return catalogAt(timestamp).schema(CatalogService.PUBLIC).index(indexName); } /** {@inheritDoc} */ @@ -379,6 +381,11 @@ public class CatalogServiceImpl extends Producer<CatalogEvent, CatalogEventParam ArrayUtils.concat(schema.indexes(), ((NewIndexEntry) entry).descriptor()) ) ); + + eventFutures.add(fireEvent( + CatalogEvent.INDEX_CREATE, + new CreateIndexEventParameters(version, ((NewIndexEntry) entry).descriptor()) + )); } else if (entry instanceof DropIndexEntry) { int indexId = ((DropIndexEntry) entry).indexId(); @@ -394,6 +401,11 @@ public class CatalogServiceImpl extends Producer<CatalogEvent, CatalogEventParam Arrays.stream(schema.indexes()).filter(t -> t.id() != indexId).toArray(IndexDescriptor[]::new) ) ); + + eventFutures.add(fireEvent( + CatalogEvent.INDEX_DROP, + new DropIndexEventParameters(version, indexId) + )); } else if (entry instanceof ObjectIdGenUpdateEntry) { catalog = new Catalog( version, diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/events/CatalogEvent.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/events/CatalogEvent.java index d88347aeca..dfae89507b 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/events/CatalogEvent.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/events/CatalogEvent.java @@ -27,5 +27,11 @@ public enum CatalogEvent implements Event { TABLE_CREATE, /** This event is fired, when a table was dropped in Catalog. */ - TABLE_DROP + TABLE_DROP, + + /** This event is fired, when a index was created in Catalog. */ + INDEX_CREATE, + + /** This event is fired, when a index was dropped in Catalog. */ + INDEX_DROP } diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java index a108bd4e6b..a152c6abb0 100644 --- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java +++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java @@ -34,6 +34,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @@ -44,6 +45,7 @@ import org.apache.ignite.internal.catalog.commands.CreateIndexParams; import org.apache.ignite.internal.catalog.commands.CreateIndexParams.Type; import org.apache.ignite.internal.catalog.commands.CreateTableParams; import org.apache.ignite.internal.catalog.commands.DefaultValue; +import org.apache.ignite.internal.catalog.commands.DropIndexParams; import org.apache.ignite.internal.catalog.commands.DropTableParams; import org.apache.ignite.internal.catalog.descriptors.ColumnCollation; import org.apache.ignite.internal.catalog.descriptors.HashIndexDescriptor; @@ -52,7 +54,9 @@ import org.apache.ignite.internal.catalog.descriptors.SortedIndexDescriptor; import org.apache.ignite.internal.catalog.descriptors.TableDescriptor; import org.apache.ignite.internal.catalog.events.CatalogEvent; import org.apache.ignite.internal.catalog.events.CatalogEventParameters; +import org.apache.ignite.internal.catalog.events.CreateIndexEventParameters; import org.apache.ignite.internal.catalog.events.CreateTableEventParameters; +import org.apache.ignite.internal.catalog.events.DropIndexEventParameters; import org.apache.ignite.internal.catalog.events.DropTableEventParameters; import org.apache.ignite.internal.catalog.storage.ObjectIdGenUpdateEntry; import org.apache.ignite.internal.catalog.storage.UpdateLog; @@ -67,6 +71,7 @@ import org.apache.ignite.internal.vault.VaultManager; import org.apache.ignite.internal.vault.inmemory.InMemoryVaultService; import org.apache.ignite.lang.IgniteInternalException; import org.apache.ignite.lang.IndexAlreadyExistsException; +import org.apache.ignite.lang.IndexNotFoundException; import org.apache.ignite.lang.NodeStoppingException; import org.apache.ignite.lang.TableAlreadyExistsException; import org.apache.ignite.lang.TableNotFoundException; @@ -243,12 +248,14 @@ public class CatalogServiceSelfTest { } @Test - public void testDropTable() { + public void testDropTable() throws InterruptedException { assertThat(service.createTable(simpleTable(TABLE_NAME)), willBe((Object) null)); assertThat(service.createTable(simpleTable(TABLE_NAME_2)), willBe((Object) null)); long beforeDropTimestamp = System.currentTimeMillis(); + Thread.sleep(5); + DropTableParams dropTableParams = DropTableParams.builder().schemaName("PUBLIC").tableName(TABLE_NAME).build(); assertThat(service.dropTable(dropTableParams), willBe((Object) null)); @@ -477,8 +484,8 @@ public class CatalogServiceSelfTest { @Test public void testCreateTableEvents() { - CreateTableParams params = CreateTableParams.builder() - .schemaName("PUBLIC") + CreateTableParams createTableParams = CreateTableParams.builder() + .schemaName(CatalogService.PUBLIC) .tableName(TABLE_NAME) .ifTableExists(true) .zone("ZONE") @@ -491,25 +498,80 @@ public class CatalogServiceSelfTest { .colocationColumns(List.of("key2")) .build(); + DropTableParams dropTableparams = DropTableParams.builder().tableName(TABLE_NAME).build(); + EventListener<CatalogEventParameters> eventListener = Mockito.mock(EventListener.class); when(eventListener.notify(any(), any())).thenReturn(completedFuture(false)); service.listen(CatalogEvent.TABLE_CREATE, eventListener); service.listen(CatalogEvent.TABLE_DROP, eventListener); - CompletableFuture<Void> fut = service.createTable(params); + assertThat(service.createTable(createTableParams), willBe((Object) null)); + verify(eventListener).notify(any(CreateTableEventParameters.class), ArgumentMatchers.isNull()); - assertThat(fut, willBe((Object) null)); + assertThat(service.dropTable(dropTableparams), willBe((Object) null)); + verify(eventListener).notify(any(DropTableEventParameters.class), ArgumentMatchers.isNull()); - verify(eventListener).notify(any(CreateTableEventParameters.class), ArgumentMatchers.isNull()); + verifyNoMoreInteractions(eventListener); + } + + @Test + public void testCreateIndexEvents() { + CreateTableParams createTableParams = CreateTableParams.builder() + .schemaName(CatalogService.PUBLIC) + .tableName(TABLE_NAME) + .ifTableExists(true) + .zone("ZONE") + .columns(List.of( + new ColumnParams("key1", ColumnType.INT32, DefaultValue.constant(null), false), + new ColumnParams("key2", ColumnType.INT32, DefaultValue.constant(null), false), + new ColumnParams("val", ColumnType.INT32, DefaultValue.constant(null), true) + )) + .primaryKeyColumns(List.of("key1", "key2")) + .colocationColumns(List.of("key2")) + .build(); DropTableParams dropTableparams = DropTableParams.builder().tableName(TABLE_NAME).build(); - fut = service.dropTable(dropTableparams); + CreateIndexParams createIndexParams = CreateIndexParams.builder() + .schemaName(CatalogService.PUBLIC) + .indexName(INDEX_NAME) + .tableName(TABLE_NAME) + .ifIndexExists(true) + .type(Type.HASH) + .unique() + .columns(List.of("key2")) + .build(); - assertThat(fut, willBe((Object) null)); + DropIndexParams dropIndexParams = DropIndexParams.builder().indexName(INDEX_NAME).build(); + + EventListener<CatalogEventParameters> eventListener = Mockito.mock(EventListener.class); + when(eventListener.notify(any(), any())).thenReturn(completedFuture(false)); + + service.listen(CatalogEvent.INDEX_CREATE, eventListener); + service.listen(CatalogEvent.INDEX_DROP, eventListener); + + // Try to create index without table. + assertThat(service.createIndex(createIndexParams), willThrow(TableNotFoundException.class)); + verifyNoInteractions(eventListener); + + // Create table. + assertThat(service.createTable(createTableParams), willBe((Object) null)); + + // Create index. + assertThat(service.createIndex(createIndexParams), willBe((Object) null)); + verify(eventListener).notify(any(CreateIndexEventParameters.class), ArgumentMatchers.isNull()); + + // Drop index. + assertThat(service.dropIndex(dropIndexParams), willBe((Object) null)); + verify(eventListener).notify(any(DropIndexEventParameters.class), ArgumentMatchers.isNull()); + + // Drop table. + assertThat(service.dropTable(dropTableparams), willBe((Object) null)); + + // Try drop index once again. + assertThat(service.dropIndex(dropIndexParams), willThrow(IndexNotFoundException.class)); - verify(eventListener).notify(any(DropTableEventParameters.class), ArgumentMatchers.isNull()); verifyNoMoreInteractions(eventListener); }