paultanay opened a new issue, #12654:
URL: https://github.com/apache/gravitino/issues/12654

   ### Version
   
   main branch
   
   ### Describe what's wrong
   
   In `AuthorizationUtils.getMetadataObjectLocation()`, resolving the storage 
location for a Fileset schema fails when the schema does not explicitly define 
a `location` property and inherits the catalog's default location.
   
   The fallback logic `else if 
(catalogObj.properties().containsKey(FILESET_CATALOG_LOCATION))` is nested 
inside `if (schema.properties().containsKey(FILESET_SCHEMA_LOCATION))`. Because 
a schema created without a custom location does not have the `"location"` key 
in `schema.properties()`, the outer condition evaluates to `false`, causing 
`getMetadataObjectLocation` to return an empty list `[]`.
   
   Consequently, authorization plugins (such as Apache Ranger) fail to generate 
or remove the corresponding storage path policies 
(`/catalogLocation/schemaName/*`) for inherited schemas.
   
   ### Error message and/or stacktrace
   
   ```text
   org.opentest4j.AssertionFailedError: expected: <1> but was: <0>
   ```
   
   ### How to reproduce
   
   1. Create a fileset catalog with property `location = "/warehouse/catalog"`.
   2. Create a schema in this catalog without setting an explicit `location` 
property in `schema.properties()`.
   3. Call `AuthorizationUtils.getMetadataObjectLocation(schemaIdent, 
Entity.EntityType.SCHEMA)`.
   4. The method returns `[]` instead of `["/warehouse/catalog/<schemaName>"]`.
   
   In unit test 
`TestAuthorizationUtils.testGetSchemaTypeMetadataObjectLocation`:
   ```java
   Mockito.when(schema.properties()).thenReturn(Collections.emptyMap());
   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);
   
   List<String> locations = AuthorizationUtils.getMetadataObjectLocation(
       NameIdentifier.of("catalog", "schema", "fileset"), 
Entity.EntityType.SCHEMA);
   Assertions.assertEquals(1, locations.size()); // Fails: expected <1> but was 
<0>
   ```
   
   ### Additional context
   
   Located in 
[`core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java`](https://github.com/apache/gravitino/blob/main/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java#L737-L753):
   
   ```java
   case FILESET:
     if ("fileset".equals(catalogObj.provider())) {
       if (schema.properties().containsKey(FILESET_SCHEMA_LOCATION)) {
         String schemaLocation = 
schema.properties().get(FILESET_SCHEMA_LOCATION);
         if (StringUtils.isNotBlank(schemaLocation)) {
           locations.add(schemaLocation);
         } else if 
(catalogObj.properties().containsKey(FILESET_CATALOG_LOCATION)) {
           String catalogLocation = 
catalogObj.properties().get(FILESET_CATALOG_LOCATION);
           if (StringUtils.isNotBlank(catalogLocation)) {
             schemaLocation = catalogLocation + "/" + schema.name();
             locations.add(schemaLocation);
           }
         } else {
           LOG.warn("Schema {} location is not found", ident);
         }
       }
     }
     break;
   ```
   
   The catalog fallback should be evaluated whenever the schema's explicit 
location is absent or blank, rather than being gated by 
`schema.properties().containsKey(FILESET_SCHEMA_LOCATION)`.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to