This is an automated email from the ASF dual-hosted git repository. jmclean 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 53dd5cce3f [#7683]fix: fix fileset location resolution code (#7725) 53dd5cce3f is described below commit 53dd5cce3fcb9731c6684806ed8a6d92b6452c1f Author: Jackeyzhe <jackeyzh...@163.com> AuthorDate: Wed Jul 16 09:37:42 2025 +0800 [#7683]fix: fix fileset location resolution code (#7725) ### What changes were proposed in this pull request? Fix fileset location resolution code so that catalog-level locations are correctly read from the catalog properties instead of the schema properties. ### Why are the changes needed? Fix: #7683 ### Does this PR introduce _any_ user-facing change? no ### How was this patch tested? add a test which can cover the change code Co-authored-by: jackeyzhe <jackeyzh...@gmail.com> --- .../authorization/AuthorizationUtils.java | 2 +- .../authorization/TestAuthorizationUtils.java | 42 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java index 9037d660ed..ff0c220c1a 100644 --- a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java +++ b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java @@ -495,7 +495,7 @@ public class AuthorizationUtils { if (StringUtils.isNotBlank(schemaLocation)) { locations.add(schemaLocation); } else if (catalogObj.properties().containsKey(FILESET_CATALOG_LOCATION)) { - String catalogLocation = schema.properties().get(FILESET_CATALOG_LOCATION); + String catalogLocation = catalogObj.properties().get(FILESET_CATALOG_LOCATION); if (StringUtils.isNotBlank(catalogLocation)) { schemaLocation = catalogLocation + "/" + schema.name(); locations.add(schemaLocation); diff --git a/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java b/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java index 373785d539..3071e23f9a 100644 --- a/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java +++ b/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java @@ -18,6 +18,8 @@ */ package org.apache.gravitino.authorization; +import static org.apache.gravitino.Catalog.Type.FILESET; + import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import java.util.List; @@ -27,7 +29,9 @@ import org.apache.gravitino.Entity; import org.apache.gravitino.GravitinoEnv; import org.apache.gravitino.NameIdentifier; import org.apache.gravitino.Namespace; +import org.apache.gravitino.Schema; import org.apache.gravitino.catalog.CatalogDispatcher; +import org.apache.gravitino.catalog.SchemaDispatcher; import org.apache.gravitino.catalog.TableDispatcher; import org.apache.gravitino.exceptions.IllegalNameIdentifierException; import org.apache.gravitino.exceptions.IllegalNamespaceException; @@ -226,6 +230,7 @@ class TestAuthorizationUtils { TableDispatcher tableDispatcher = Mockito.mock(TableDispatcher.class); Catalog catalog = Mockito.mock(Catalog.class); Table table = Mockito.mock(Table.class); + AccessControlDispatcher accessControlDispatcher = Mockito.mock(AccessControlDispatcher.class); Mockito.when(table.properties()).thenReturn(ImmutableMap.of("location", "gs://bucket/1")); Mockito.when(catalog.provider()).thenReturn("hive"); @@ -234,6 +239,8 @@ class TestAuthorizationUtils { FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogDispatcher", catalogDispatcher, true); FieldUtils.writeField(GravitinoEnv.getInstance(), "tableDispatcher", tableDispatcher, true); + FieldUtils.writeField( + GravitinoEnv.getInstance(), "accessControlDispatcher", accessControlDispatcher, true); List<String> locations = AuthorizationUtils.getMetadataObjectLocation( @@ -247,4 +254,39 @@ class TestAuthorizationUtils { Assertions.assertEquals(1, locations.size()); Assertions.assertEquals("gs://bucket/1", locations.get(0)); } + + @Test + void testGetSchemaTypeMetadataObjectLocation() throws IllegalAccessException { + AccessControlDispatcher accessControlDispatcher = Mockito.mock(AccessControlDispatcher.class); + SchemaDispatcher schemaDispatcher = Mockito.mock(SchemaDispatcher.class); + CatalogDispatcher catalogDispatcher = Mockito.mock(CatalogDispatcher.class); + Catalog catalog = Mockito.mock(Catalog.class); + Schema schema = Mockito.mock(Schema.class); + + Mockito.when(schema.properties()).thenReturn(ImmutableMap.of("location", "")); + Mockito.when(schema.name()).thenReturn("testSchema"); + Mockito.when(catalog.properties()).thenReturn(ImmutableMap.of("location", "catalogLocation")); + Mockito.when(catalog.provider()).thenReturn("fileset"); + Mockito.when(catalog.type()).thenReturn(FILESET); + Mockito.when(schemaDispatcher.loadSchema(Mockito.any())).thenReturn(schema); + Mockito.when(catalogDispatcher.loadCatalog(Mockito.any())).thenReturn(catalog); + + FieldUtils.writeField( + GravitinoEnv.getInstance(), "accessControlDispatcher", accessControlDispatcher, true); + FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogDispatcher", catalogDispatcher, true); + FieldUtils.writeField(GravitinoEnv.getInstance(), "schemaDispatcher", schemaDispatcher, true); + + List<String> locations = + AuthorizationUtils.getMetadataObjectLocation( + NameIdentifier.of("catalog", "schema", "fileset"), Entity.EntityType.SCHEMA); + Assertions.assertEquals(1, locations.size()); + Assertions.assertEquals("catalogLocation/testSchema", locations.get(0)); + + Mockito.when(schema.properties()).thenReturn(ImmutableMap.of("location", "schemaLocation")); + locations = + AuthorizationUtils.getMetadataObjectLocation( + NameIdentifier.of("catalog", "schema", "fileset"), Entity.EntityType.SCHEMA); + Assertions.assertEquals(1, locations.size()); + Assertions.assertEquals("schemaLocation", locations.get(0)); + } }