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,

Reply via email to