This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-20790 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit cc302e01796991ce539a674825db0580ebb7b2d0 Author: amashenkov <[email protected]> AuthorDate: Thu Jan 18 13:30:01 2024 +0300 Add catalog compaction for in-memory catalog objects. --- .../internal/catalog/CatalogManagerImpl.java | 9 +++++ .../internal/catalog/CatalogManagerSelfTest.java | 45 ++++++++++++++++++++++ 2 files changed, 54 insertions(+) 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 34f2a86585..e09848e836 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 @@ -329,6 +329,15 @@ public class CatalogManagerImpl extends AbstractEventProducer<CatalogEvent, Cata return saveUpdateAndWaitForActivation(new BulkUpdateProducer(List.copyOf(commands))); } + public void compactCatalog(long timestamp) { + Catalog catalog = catalogAt(timestamp); + + catalogByVer.headMap(catalog.version(), false).clear(); + catalogByTs.headMap(catalog.time(), false).clear(); + + // compactCatalogTo(catalog.version()); + } + private void registerCatalog(Catalog newCatalog) { catalogByVer.put(newCatalog.version(), newCatalog); catalogByTs.put(newCatalog.time(), newCatalog); 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 12c209aa3f..6f877b760a 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 @@ -43,6 +43,7 @@ import static org.apache.ignite.internal.catalog.commands.CatalogUtils.pkIndexNa import static org.apache.ignite.internal.catalog.commands.DefaultValue.constant; import static org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation.ASC_NULLS_LAST; import static org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation.DESC_NULLS_FIRST; +import static org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation.values; import static org.apache.ignite.internal.lang.IgniteStringFormatter.format; import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause; import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow; @@ -150,6 +151,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest { private static final String SCHEMA_NAME = DEFAULT_SCHEMA_NAME; private static final String ZONE_NAME = DEFAULT_ZONE_NAME; private static final String TABLE_NAME_2 = "myTable2"; + private static final String INDEX_NAME_2 = "myIndex2"; private static final String NEW_COLUMN_NAME = "NEWCOL"; private static final String NEW_COLUMN_NAME_2 = "NEWCOL2"; private static final int DFLT_TEST_PRECISION = 11; @@ -2165,6 +2167,49 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest { assertThat(((RenameTableEventParameters) eventParameters).newTableName(), is(tableDescriptor.name())); } + @Test + public void testCatalogCompaction() { + assertThat(manager.execute(simpleTable(TABLE_NAME)), willBe(nullValue())); + assertThat(manager.execute(simpleTable(TABLE_NAME_2)), willBe(nullValue())); + + long timestamp = clock.nowLong(); + Catalog catalog = manager.catalog(manager.latestCatalogVersion()); + + // Add more updates + assertThat(manager.execute(simpleIndex(TABLE_NAME, INDEX_NAME)), willBe(nullValue())); + assertThat(manager.execute(simpleIndex(TABLE_NAME, INDEX_NAME_2)), willBe(nullValue())); + + manager.compactCatalog(timestamp); + + assertEquals(catalog.version(), manager.earliestCatalogVersion()); + + assertNull(manager.catalog(catalog.version() - 1)); + assertNotNull(manager.catalog(catalog.version())); + + assertThrows(IllegalStateException.class, () -> manager.activeCatalogVersion(catalog.time() - 1)); + assertSame(catalog.version(), manager.activeCatalogVersion(catalog.time())); + assertSame(catalog.version(), manager.activeCatalogVersion(timestamp)); + } + + @Test + public void testEmptyCatalogCompaction() { + assertEquals(0, manager.latestCatalogVersion()); + + long timestamp = clock.nowLong(); + Catalog catalog = manager.catalog(manager.latestCatalogVersion()); + + manager.compactCatalog(timestamp); + + assertEquals(catalog.version(), manager.earliestCatalogVersion()); + + assertNull(manager.catalog(catalog.version() - 1)); + assertNotNull(manager.catalog(catalog.version())); + + assertThrows(IllegalStateException.class, () -> manager.activeCatalogVersion(catalog.time() - 1)); + assertSame(catalog.version(), manager.activeCatalogVersion(catalog.time())); + assertSame(catalog.version(), manager.activeCatalogVersion(timestamp)); + } + private CompletableFuture<Void> changeColumn( String tab, String col,
