This is an automated email from the ASF dual-hosted git repository.
mchades pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 7d876de6a8 [#10600] Improvement(core) : PostgreSQL model version GC
deletes using IDs from model_version_info (#10653)
7d876de6a8 is described below
commit 7d876de6a89f95fd5aef142f4c4d6b0491f99273
Author: Babu Mahesh <[email protected]>
AuthorDate: Sun Apr 5 17:28:39 2026 +0530
[#10600] Improvement(core) : PostgreSQL model version GC deletes using IDs
from model_version_info (#10653)
### What changes were proposed in this pull request?
The PostgreSQL provider was incorrectly querying the model_meta table
instead of the model_version_info table in the deletion subquery. This
change corrects the table reference.
### Why are the changes needed?
While deleting legacy model version information, the query should
evaluate the legacy range using model_version_info rather than
model_meta. Using the wrong table could lead to incorrect deletion
behavior.
Fixes: #10600
### How was this patch tested?
Added unit tests to validate the corrected query behavior.
---------
Co-authored-by: Babu Mahesh <[email protected]>
---
.../ModelVersionMetaPostgreSQLProvider.java | 2 +-
.../service/TestModelVersionMetaService.java | 73 ++++++++++++++++++++++
2 files changed, 74 insertions(+), 1 deletion(-)
diff --git
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/postgresql/ModelVersionMetaPostgreSQLProvider.java
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/postgresql/ModelVersionMetaPostgreSQLProvider.java
index d67767ed8e..10947e69f5 100644
---
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/postgresql/ModelVersionMetaPostgreSQLProvider.java
+++
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/postgresql/ModelVersionMetaPostgreSQLProvider.java
@@ -92,7 +92,7 @@ public class ModelVersionMetaPostgreSQLProvider extends
ModelVersionMetaBaseSQLP
return "DELETE FROM "
+ ModelVersionMetaMapper.TABLE_NAME
+ " WHERE id IN (SELECT id FROM "
- + ModelMetaMapper.TABLE_NAME
+ + ModelVersionMetaMapper.TABLE_NAME
+ " WHERE deleted_at > 0 AND deleted_at < #{legacyTimeline} LIMIT
#{limit})";
}
diff --git
a/core/src/test/java/org/apache/gravitino/storage/relational/service/TestModelVersionMetaService.java
b/core/src/test/java/org/apache/gravitino/storage/relational/service/TestModelVersionMetaService.java
index 2ab5b484b3..bc37a31cf1 100644
---
a/core/src/test/java/org/apache/gravitino/storage/relational/service/TestModelVersionMetaService.java
+++
b/core/src/test/java/org/apache/gravitino/storage/relational/service/TestModelVersionMetaService.java
@@ -23,12 +23,14 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.sql.SQLException;
+import java.time.Instant;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
+import org.apache.gravitino.Entity;
import org.apache.gravitino.NameIdentifier;
import org.apache.gravitino.Namespace;
import org.apache.gravitino.exceptions.IllegalNamespaceException;
@@ -970,6 +972,77 @@ public class TestModelVersionMetaService extends
TestJDBCBackend {
Assertions.assertEquals(updatedVersionAliases, altered.aliases());
}
+ @TestTemplate
+ void testDeleteModelVersionsByLegacyTimeline() throws IOException {
+ createParentEntities(METALAKE_NAME, CATALOG_NAME, SCHEMA_NAME, AUDIT_INFO);
+
+ // Create a model entity
+ ModelEntity modelEntity =
+ createModelEntity(
+ RandomIdGenerator.INSTANCE.nextId(),
+ MODEL_NS,
+ "model1",
+ "model1 comment",
+ 0,
+ properties,
+ AUDIT_INFO);
+
+ Assertions.assertDoesNotThrow(
+ () -> ModelMetaService.getInstance().insertModel(modelEntity, false));
+
+ // Create model version entities with aliases
+ ModelVersionEntity modelVersionEntity0 =
+ createModelVersionEntity(
+ modelEntity.nameIdentifier(),
+ 0,
+ ImmutableMap.of(ModelVersion.URI_NAME_UNKNOWN, "model_path_0"),
+ aliases,
+ "version 0 comment",
+ properties,
+ AUDIT_INFO);
+
+ ModelVersionEntity modelVersionEntity1 =
+ createModelVersionEntity(
+ modelEntity.nameIdentifier(),
+ 1,
+ ImmutableMap.of(ModelVersion.URI_NAME_UNKNOWN, "model_path_1"),
+ ImmutableList.of("alias3"),
+ "version 1 comment",
+ properties,
+ AUDIT_INFO);
+
+ Assertions.assertDoesNotThrow(
+ () ->
ModelVersionMetaService.getInstance().insertModelVersion(modelVersionEntity0));
+ Assertions.assertDoesNotThrow(
+ () ->
ModelVersionMetaService.getInstance().insertModelVersion(modelVersionEntity1));
+
+ // Soft delete the model (cascade deletes model versions)
+
Assertions.assertTrue(ModelMetaService.getInstance().deleteModel(modelEntity.nameIdentifier()));
+
+ // Verify model versions are soft deleted (cannot be retrieved)
+ Assertions.assertThrows(
+ NoSuchEntityException.class,
+ () ->
+ ModelVersionMetaService.getInstance()
+ .getModelVersionByIdentifier(
+ getModelVersionIdent(modelEntity.nameIdentifier(), 0)));
+ Assertions.assertThrows(
+ NoSuchEntityException.class,
+ () ->
+ ModelVersionMetaService.getInstance()
+ .getModelVersionByIdentifier(
+ getModelVersionIdent(modelEntity.nameIdentifier(), 1)));
+
+ // Hard delete legacy data for MODEL_VERSION entity type
+ int deletedCount =
+ backend.hardDeleteLegacyData(
+ Entity.EntityType.MODEL_VERSION, Instant.now().toEpochMilli() +
1000);
+
+ // Verify correct number of records deleted
+ // Expected: 2 model_version_info records + 3 model_version_alias_rel
records = 5 total
+ Assertions.assertEquals(5, deletedCount, "Should have deleted 5 legacy
records");
+ }
+
private NameIdentifier getModelVersionIdent(NameIdentifier modelIdent, int
version) {
List<String> parts = Lists.newArrayList(modelIdent.namespace().levels());
parts.add(modelIdent.name());