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 864c5a83068bb00b6983d4593986ff52fb390059 Author: amashenkov <[email protected]> AuthorDate: Wed Oct 15 17:38:52 2025 +0300 wip --- .../descriptors/CatalogTableDescriptor.java | 1 - ...ateTable.java => AbstractUpdateTableEntry.java} | 6 ++-- .../internal/catalog/storage/AlterColumnEntry.java | 4 +-- .../catalog/storage/AlterTablePropertiesEntry.java | 2 +- .../internal/catalog/storage/DropColumnsEntry.java | 4 +-- .../internal/catalog/storage/NewColumnsEntry.java | 4 +-- .../internal/catalog/storage/RenameTableEntry.java | 2 +- .../descriptors/CatalogTableDescriptorTest.java | 1 - .../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 | 39 +++++++++++++++++++--- .../exec/ExecutableTableRegistrySelfTest.java | 3 +- .../sql/engine/framework/TestBuilders.java | 1 + 16 files changed, 76 insertions(+), 30 deletions(-) diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java index 5a60bb825da..f7813f8dae0 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java @@ -470,7 +470,6 @@ public class CatalogTableDescriptor extends CatalogObjectDescriptor implements M } } - // TODO: https://issues.apache.org/jira/browse/IGNITE-26501 CatalogTableSchemaVersions newSchemaVersions = latestSchemaVersion == schemaVersions.latestVersion() ? schemaVersions : schemaVersions.append(new TableVersion(columns), latestSchemaVersion); diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/UpdateTable.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AbstractUpdateTableEntry.java similarity index 93% rename from modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/UpdateTable.java rename to modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AbstractUpdateTableEntry.java index 35ccda098e5..32f9f19ba40 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/UpdateTable.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AbstractUpdateTableEntry.java @@ -32,7 +32,7 @@ import org.apache.ignite.internal.hlc.HybridTimestamp; * This class declares an abstract method for creating a new table descriptor and * provides default implementation for applying the table descriptor changes to a catalog. */ -abstract class UpdateTable implements UpdateEntry { +abstract class AbstractUpdateTableEntry implements UpdateEntry { @Override public final Catalog applyUpdate(Catalog catalog, HybridTimestamp timestamp) { CatalogTableDescriptor table = tableOrThrow(catalog, tableId()); @@ -67,8 +67,8 @@ abstract class UpdateTable implements UpdateEntry { /** Returns table id for a table affected by an update table command. */ abstract int tableId(); - /** Returns a new schema version for provided {@link CatalogTableDescriptor}. */ - static int newSchemaVersion(CatalogTableDescriptor table) { + /** Returns the next schema version for provided {@link CatalogTableDescriptor}. */ + static int nextSchemaVersion(CatalogTableDescriptor table) { return table.latestSchemaVersion() + 1; } } diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AlterColumnEntry.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AlterColumnEntry.java index a58c30be0ff..85b5d84188f 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AlterColumnEntry.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AlterColumnEntry.java @@ -32,7 +32,7 @@ import org.apache.ignite.internal.tostring.S; /** * Describes a column replacement. */ -public class AlterColumnEntry extends UpdateTable implements Fireable { +public class AlterColumnEntry extends AbstractUpdateTableEntry implements Fireable { private final int tableId; private final CatalogTableColumnDescriptor column; @@ -81,7 +81,7 @@ public class AlterColumnEntry extends UpdateTable implements Fireable { .collect(toList()); return table.copyBuilder() - .latestSchemaVersion(newSchemaVersion(table)) + .latestSchemaVersion(nextSchemaVersion(table)) .columns(updatedTableColumns); } diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AlterTablePropertiesEntry.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AlterTablePropertiesEntry.java index 8b9d6f58665..42c78a54d5d 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AlterTablePropertiesEntry.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/AlterTablePropertiesEntry.java @@ -29,7 +29,7 @@ import org.jetbrains.annotations.Nullable; /** * Describes changing of table properties. */ -public class AlterTablePropertiesEntry extends UpdateTable implements Fireable { +public class AlterTablePropertiesEntry extends AbstractUpdateTableEntry implements Fireable { private final int tableId; private final @Nullable Double staleRowsFraction; diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/DropColumnsEntry.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/DropColumnsEntry.java index 9a5f1f464f7..769fac68257 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/DropColumnsEntry.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/DropColumnsEntry.java @@ -33,7 +33,7 @@ import org.apache.ignite.internal.tostring.S; /** * Describes dropping of columns. */ -public class DropColumnsEntry extends UpdateTable implements Fireable { +public class DropColumnsEntry extends AbstractUpdateTableEntry implements Fireable { private final int tableId; private final Set<String> columns; @@ -81,7 +81,7 @@ public class DropColumnsEntry extends UpdateTable implements Fireable { .collect(toList()); return table.copyBuilder() - .latestSchemaVersion(newSchemaVersion(table)) + .latestSchemaVersion(nextSchemaVersion(table)) .columns(updatedTableColumns); } diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/NewColumnsEntry.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/NewColumnsEntry.java index 121d20ab1e6..a6815794e34 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/NewColumnsEntry.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/NewColumnsEntry.java @@ -31,7 +31,7 @@ import org.apache.ignite.internal.util.CollectionUtils; /** * Describes addition of new columns. */ -public class NewColumnsEntry extends UpdateTable implements Fireable { +public class NewColumnsEntry extends AbstractUpdateTableEntry implements Fireable { private final int tableId; private final List<CatalogTableColumnDescriptor> descriptors; @@ -77,7 +77,7 @@ public class NewColumnsEntry extends UpdateTable implements Fireable { List<CatalogTableColumnDescriptor> updatedTableColumns = CollectionUtils.concat(table.columns(), descriptors); return table.copyBuilder() - .latestSchemaVersion(newSchemaVersion(table)) + .latestSchemaVersion(nextSchemaVersion(table)) .columns(updatedTableColumns); } diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/RenameTableEntry.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/RenameTableEntry.java index 532997a3e54..c64fe4df516 100644 --- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/RenameTableEntry.java +++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/RenameTableEntry.java @@ -25,7 +25,7 @@ import org.apache.ignite.internal.catalog.events.RenameTableEventParameters; import org.apache.ignite.internal.catalog.storage.serialization.MarshallableEntryType; /** Entry representing a rename of a table. */ -public class RenameTableEntry extends UpdateTable implements Fireable { +public class RenameTableEntry extends AbstractUpdateTableEntry implements Fireable { private final int tableId; private final String newTableName; diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java index 5254cde15cc..0a713657111 100644 --- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java +++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java @@ -97,7 +97,6 @@ class CatalogTableDescriptorTest { assertions.assertThat(descriptorV2.isPrimaryKeyColumn("pkCol")).isTrue(); assertions.assertThat(descriptorV2.latestSchemaVersion()).isEqualTo(2); - // TODO: https://issues.apache.org/jira/browse/IGNITE-26501 assertions.assertThat(descriptorV2.schemaVersions().latestVersion()).isEqualTo(2); assertions.assertThat(descriptorV2.storageProfile()).isEqualTo(CatalogService.DEFAULT_STORAGE_PROFILE); }); 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..2facf91e082 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,8 @@ 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..c956acdd87c 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,8 @@ 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),
