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) -> {