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 7d674098ec [#8010] improvement: fix resource path enumeration to 
accumulate parent segments (#9371)
7d674098ec is described below

commit 7d674098ec5da625e920a22707f3c6bd5a186e29
Author: diydriller <[email protected]>
AuthorDate: Thu Dec 4 17:05:24 2025 +0900

    [#8010] improvement: fix resource path enumeration to accumulate parent 
segments (#9371)
    
    ### What changes were proposed in this pull request?
    
    This PR fixes the incorrect resource path enumeration logic in the GCS
    token provider by ensuring that multi-level paths accumulate parent
    segments correctly and include directory variants where applicable.
    
    ### Why are the changes needed?
    
    The previous implementation only accumulated full segments and did not
    include directory variants for intermediate segments
    
    Fix: https://github.com/apache/gravitino/issues/8010
    
    ### Does this PR introduce _any_ user-facing change?
    
    No new user-facing API is introduced.
    
    ### How was this patch tested?
    
    Use the test code written in the issue
---
 .../gravitino/gcs/credential/GCSTokenGenerator.java     | 15 ++++++++-------
 .../gravitino/gcs/credential/TestGCSTokenProvider.java  | 17 ++++++++++-------
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git 
a/bundles/gcp/src/main/java/org/apache/gravitino/gcs/credential/GCSTokenGenerator.java
 
b/bundles/gcp/src/main/java/org/apache/gravitino/gcs/credential/GCSTokenGenerator.java
index e4ce0b728f..3188a3d889 100644
--- 
a/bundles/gcp/src/main/java/org/apache/gravitino/gcs/credential/GCSTokenGenerator.java
+++ 
b/bundles/gcp/src/main/java/org/apache/gravitino/gcs/credential/GCSTokenGenerator.java
@@ -111,21 +111,22 @@ public class GCSTokenGenerator implements 
CredentialGenerator<GCSTokenCredential
 
   // "a/b/c" will get ["a", "a/", "a/b", "a/b/", "a/b/c"]
   static List<String> getAllResources(String resourcePath) {
+    if (resourcePath == null || resourcePath.isEmpty() || 
resourcePath.equals("/")) {
+      return Arrays.asList("");
+    }
     if (resourcePath.endsWith("/")) {
       resourcePath = resourcePath.substring(0, resourcePath.length() - 1);
     }
-    if (resourcePath.isEmpty()) {
-      return Arrays.asList("");
-    }
     Preconditions.checkArgument(
         !resourcePath.startsWith("/"), resourcePath + " should not start with 
/");
     List<String> parts = Arrays.asList(resourcePath.split("/"));
     List<String> results = new ArrayList<>();
-    String parent = "";
+    StringBuilder parent = new StringBuilder();
     for (int i = 0; i < parts.size() - 1; i++) {
-      results.add(parts.get(i));
-      parent += parts.get(i) + "/";
-      results.add(parent);
+      String part = parts.get(i);
+      results.add(parent + part);
+      parent.append(part).append("/");
+      results.add(parent.toString());
     }
     results.add(parent + parts.get(parts.size() - 1));
     return results;
diff --git 
a/bundles/gcp/src/test/java/org/apache/gravitino/gcs/credential/TestGCSTokenProvider.java
 
b/bundles/gcp/src/test/java/org/apache/gravitino/gcs/credential/TestGCSTokenProvider.java
index 1b3283bfae..8b6a722ad6 100644
--- 
a/bundles/gcp/src/test/java/org/apache/gravitino/gcs/credential/TestGCSTokenProvider.java
+++ 
b/bundles/gcp/src/test/java/org/apache/gravitino/gcs/credential/TestGCSTokenProvider.java
@@ -31,13 +31,16 @@ public class TestGCSTokenProvider {
   @Test
   void testGetAllResources() {
     Map<String, List<String>> checkResults =
-        ImmutableMap.of(
-            "a/b", Arrays.asList("a", "a/", "a/b"),
-            "a/b/", Arrays.asList("a", "a/", "a/b"),
-            "a", Arrays.asList("a"),
-            "a/", Arrays.asList("a"),
-            "", Arrays.asList(""),
-            "/", Arrays.asList(""));
+        ImmutableMap.<String, List<String>>builder()
+            .put("a/b", Arrays.asList("a", "a/", "a/b"))
+            .put("a/b/", Arrays.asList("a", "a/", "a/b"))
+            .put("a/b/c", Arrays.asList("a", "a/", "a/b", "a/b/", "a/b/c"))
+            .put("a/b/c/", Arrays.asList("a", "a/", "a/b", "a/b/", "a/b/c"))
+            .put("a", Arrays.asList("a"))
+            .put("a/", Arrays.asList("a"))
+            .put("", Arrays.asList(""))
+            .put("/", Arrays.asList(""))
+            .build();
 
     checkResults.forEach(
         (key, value) -> {

Reply via email to