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());

Reply via email to