You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2025/10/15 14:39:09 UTC

(ignite-3) branch ignite-26501 created (now 4c02e3a45f5)

This is an automated email from the ASF dual-hosted git repository.

amashenkov pushed a change to branch ignite-26501
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


      at 4c02e3a45f5 wip

This branch includes the following new commits:

     new 4c02e3a45f5 wip

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(ignite-3) 01/01: wip

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

amashenkov pushed a commit to branch ignite-26501
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit 4c02e3a45f5bb43b11b3197697138a4f8c54b0c4
Author: amashenkov <am...@apache.org>
AuthorDate: Wed Oct 15 17:38:52 2025 +0300

    wip
---
 .../engine/exec/ExecutableTableRegistryImpl.java   | 16 ++++-----
 .../engine/schema/AbstractIgniteDataSource.java    | 11 ++++++-
 .../sql/engine/schema/IgniteDataSource.java        |  7 +++-
 .../sql/engine/schema/IgniteSystemViewImpl.java    |  2 +-
 .../sql/engine/schema/IgniteTableImpl.java         |  3 +-
 .../sql/engine/schema/SqlSchemaManagerImpl.java    | 38 +++++++++++++++++++---
 .../exec/ExecutableTableRegistrySelfTest.java      |  2 +-
 .../sql/engine/framework/TestBuilders.java         |  1 +
 8 files changed, 63 insertions(+), 17 deletions(-)

diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistryImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistryImpl.java
index da19f76b94e..146b2a0fbf8 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistryImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistryImpl.java
@@ -81,7 +81,7 @@ public class ExecutableTableRegistryImpl implements ExecutableTableRegistry {
     public ExecutableTable getTable(int catalogVersion, int tableId) {
         IgniteTable sqlTable = sqlSchemaManager.table(catalogVersion, tableId);
 
-        return tableCache.get(cacheKey(tableId, sqlTable.version()), (k) -> loadTable(sqlTable));
+        return tableCache.get(cacheKey(tableId, sqlTable.timestamp()), (k) -> loadTable(sqlTable));
     }
 
     private ExecutableTable loadTable(IgniteTable sqlTable) {
@@ -158,17 +158,17 @@ public class ExecutableTableRegistryImpl implements ExecutableTableRegistry {
         }
     }
 
-    private static CacheKey cacheKey(int tableId, int version) {
-        return new CacheKey(tableId, version);
+    private static CacheKey cacheKey(int tableId, long timestamp) {
+        return new CacheKey(tableId, timestamp);
     }
 
     private static class CacheKey {
         private final int tableId;
-        private final int tableVersion;
+        private final long timestamp;
 
-        CacheKey(int tableId, int tableVersion) {
+        CacheKey(int tableId, long timestamp) {
             this.tableId = tableId;
-            this.tableVersion = tableVersion;
+            this.timestamp = timestamp;
         }
 
         @Override
@@ -180,12 +180,12 @@ public class ExecutableTableRegistryImpl implements ExecutableTableRegistry {
                 return false;
             }
             CacheKey cacheKey = (CacheKey) o;
-            return tableVersion == cacheKey.tableVersion && tableId == cacheKey.tableId;
+            return timestamp == cacheKey.timestamp && tableId == cacheKey.tableId;
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(tableVersion, tableId);
+            return Objects.hash(timestamp, tableId);
         }
     }
 
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/AbstractIgniteDataSource.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/AbstractIgniteDataSource.java
index fe7ad0e27f3..c506fea4f10 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/AbstractIgniteDataSource.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/AbstractIgniteDataSource.java
@@ -50,16 +50,19 @@ public abstract class AbstractIgniteDataSource extends AbstractTable
 
     private final int version;
 
+    private final long timestamp;
+
     private final Statistic statistic;
 
     /** Constructor. */
-    public AbstractIgniteDataSource(String name, int id,  int version, TableDescriptor desc,
+    public AbstractIgniteDataSource(String name, int id,  int version, long timestamp, TableDescriptor desc,
             Statistic statistic) {
 
         this.id = id;
         this.name = name;
         this.desc = desc;
         this.version = version;
+        this.timestamp = timestamp;
         this.statistic = statistic;
     }
 
@@ -75,6 +78,12 @@ public abstract class AbstractIgniteDataSource extends AbstractTable
         return version;
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public long timestamp() {
+        return timestamp;
+    }
+
     /** {@inheritDoc} */
     @Override
     public String name() {
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteDataSource.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteDataSource.java
index 2cc76cf541c..837dde6c5d2 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteDataSource.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteDataSource.java
@@ -38,12 +38,17 @@ public interface IgniteDataSource extends TranslatableTable, Wrapper {
     int id();
 
     /**
-     * Returns the version of the table's schema.
+     * Returns the version of the table's schema. The version is bumped only, when table structure was modified (e.g. column added/dropped).
      *
      * @return the version of the table's schema.
      */
     int version();
 
+    /**
+     * Return table descriptor modification timestamp.
+     */
+    long timestamp();
+
     /**
      * Gets a name of the table.
      *
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteSystemViewImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteSystemViewImpl.java
index 41fc38d3213..6a72d34ece4 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteSystemViewImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteSystemViewImpl.java
@@ -37,7 +37,7 @@ public class IgniteSystemViewImpl extends AbstractIgniteDataSource implements Ig
 
     /** Constructor. */
     public IgniteSystemViewImpl(String name, int id, TableDescriptor desc) {
-        super(name, id, CatalogTableDescriptor.INITIAL_TABLE_VERSION, desc, new SystemViewStatistic(desc.distribution()));
+        super(name, id, CatalogTableDescriptor.INITIAL_TABLE_VERSION, 0L, desc, new SystemViewStatistic(desc.distribution()));
     }
 
     /** {@inheritDoc} */
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteTableImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteTableImpl.java
index af0b57c80be..ea51a2510a6 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteTableImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteTableImpl.java
@@ -57,6 +57,7 @@ public class IgniteTableImpl extends AbstractIgniteDataSource implements IgniteT
             String name,
             int id,
             int version,
+            long timestamp,
             TableDescriptor desc,
             ImmutableIntList keyColumns,
             Statistic statistic,
@@ -64,7 +65,7 @@ public class IgniteTableImpl extends AbstractIgniteDataSource implements IgniteT
             int partitions,
             int zoneId
     ) {
-        super(name, id, version, desc, statistic);
+        super(name, id, version, timestamp, desc, statistic);
 
         this.keyColumns = keyColumns;
         this.indexMap = indexMap;
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
index 1655be5bd86..c7a2a8da8b5 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
@@ -57,6 +57,7 @@ import org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescript
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
 import org.apache.ignite.internal.components.NodeProperties;
+import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.lang.IgniteInternalException;
 import org.apache.ignite.internal.schema.DefaultValueGenerator;
 import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Type;
@@ -87,7 +88,7 @@ public class SqlSchemaManagerImpl implements SqlSchemaManager {
      * Only data that included in a catalog table descriptor itself is up-to-date.
      * Table related information from other object is not reliable.
      */
-    private final Cache<Long, IgniteTableImpl> tableCache;
+    private final Cache<CacheKey, IgniteTableImpl> tableCache;
 
     /** Index cache by (indexId, indexStatus). */
     private final Cache<Long, IgniteIndex> indexCache;
@@ -187,7 +188,7 @@ public class SqlSchemaManagerImpl implements SqlSchemaManager {
                 throw new IgniteInternalException(Common.INTERNAL_ERR, "Table with given id not found: " + tableId);
             }
 
-            long tableKey = cacheKey(tableDescriptor.id(), tableDescriptor.latestSchemaVersion());
+            CacheKey tableKey = tableCacheKey(tableDescriptor.id(), tableDescriptor.updateTimestamp());
 
             IgniteTableImpl igniteTable = tableCache.get(tableKey, (x) -> {
                 TableDescriptor descriptor = createTableDescriptorForTable(catalog, tableDescriptor);
@@ -209,6 +210,10 @@ public class SqlSchemaManagerImpl implements SqlSchemaManager {
         return cacheKey | part2;
     }
 
+    private static CacheKey tableCacheKey(int tableId, HybridTimestamp modificationTimestamp) {
+        return new CacheKey(tableId, modificationTimestamp.longValue());
+    }
+
     private IgniteSchemas createRootSchema(Catalog catalog) {
         SchemaPlus rootSchema = Frameworks.createRootSchema(false);
 
@@ -229,7 +234,7 @@ public class SqlSchemaManagerImpl implements SqlSchemaManager {
 
         // Assemble sql-engine.TableDescriptors as they are required by indexes.
         for (CatalogTableDescriptor tableDescriptor : schemaDescriptor.tables()) {
-            long tableKey = cacheKey(tableDescriptor.id(), tableDescriptor.latestSchemaVersion());
+            CacheKey tableKey = tableCacheKey(tableDescriptor.id(), tableDescriptor.updateTimestamp());
 
             // Load cached table by (id, version)
             IgniteTableImpl igniteTable = tableCache.get(tableKey, (k) -> {
@@ -540,6 +545,7 @@ public class SqlSchemaManagerImpl implements SqlSchemaManager {
                 tableName,
                 tableId,
                 catalogTableDescriptor.latestSchemaVersion(),
+                catalogTableDescriptor.updateTimestamp().longValue(),
                 tableDescriptor,
                 primaryKeyColumns,
                 statistic,
@@ -549,6 +555,30 @@ public class SqlSchemaManagerImpl implements SqlSchemaManager {
         );
     }
 
+    private static class CacheKey {
+        final int id;
+        final long timestamp;
+
+        private CacheKey(int id, long timestamp) {
+            this.id = id;
+            this.timestamp = timestamp;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+            CacheKey cacheKey = (CacheKey) o;
+            return id == cacheKey.id && timestamp == cacheKey.timestamp;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(id, timestamp);
+        }
+    }
+
     private static class ActualIgniteTable extends AbstractIgniteDataSource implements IgniteTable {
 
         /** Cached table by id and version. */
@@ -558,7 +588,7 @@ public class SqlSchemaManagerImpl implements SqlSchemaManager {
         private final Map<String, IgniteIndex> indexMap;
 
         ActualIgniteTable(IgniteTableImpl igniteTable, Map<String, IgniteIndex> indexMap) {
-            super(igniteTable.name(), igniteTable.id(), igniteTable.version(), igniteTable.descriptor(), igniteTable.getStatistic());
+            super(igniteTable.name(), igniteTable.id(), igniteTable.version(), igniteTable.timestamp(), igniteTable.descriptor(), igniteTable.getStatistic());
 
             this.table = igniteTable;
             this.indexMap = indexMap;
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistrySelfTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistrySelfTest.java
index 57c237ebf21..3ea9ea900f1 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistrySelfTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistrySelfTest.java
@@ -156,7 +156,7 @@ public class ExecutableTableRegistrySelfTest extends BaseIgniteAbstractTest {
             when(schemaRegistry.schema(tableVersion)).thenReturn(schemaDescriptor);
 
             IgniteTable sqlTable = new IgniteTableImpl(
-                    "TBL1", tableId, tableVersion, descriptor, ImmutableIntList.of(0), new TestStatistic(1_000.0), Map.of(), 1, 10000
+                    "TBL1", tableId, tableVersion, tableVersion, descriptor, ImmutableIntList.of(0), new TestStatistic(1_000.0), Map.of(), 1, 10000
             );
 
             when(sqlSchemaManager.table(schemaVersion, tableId)).thenReturn(sqlTable);
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
index 51ec7069cb1..67184e438e2 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
@@ -1039,6 +1039,7 @@ public class TestBuilders {
                     Objects.requireNonNull(name),
                     tableId != null ? tableId : TABLE_ID_GEN.incrementAndGet(),
                     1,
+                    1L,
                     tableDescriptor,
                     findPrimaryKey(tableDescriptor, indexes.values()),
                     new TestStatistic(size),