This is an automated email from the ASF dual-hosted git repository.

JingsongLi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new 4fff146773 [rest] Make RESTTokenFileIO cache maximum size configurable 
(#9528)
4fff146773 is described below

commit 4fff146773eda5138ab72587a764ce3078322f95
Author: tonymtu <[email protected]>
AuthorDate: Wed Sep 2 16:18:48 2026 +0800

    [rest] Make RESTTokenFileIO cache maximum size configurable (#9528)
---
 .../java/org/apache/paimon/rest/RESTTokenFileIO.java  | 19 +++++++++++++++++++
 .../org/apache/paimon/rest/RESTTokenFileIOTest.java   | 14 ++++++++++++++
 2 files changed, 33 insertions(+)

diff --git 
a/paimon-common/src/main/java/org/apache/paimon/rest/RESTTokenFileIO.java 
b/paimon-common/src/main/java/org/apache/paimon/rest/RESTTokenFileIO.java
index fb210dda43..a431247000 100644
--- a/paimon-common/src/main/java/org/apache/paimon/rest/RESTTokenFileIO.java
+++ b/paimon-common/src/main/java/org/apache/paimon/rest/RESTTokenFileIO.java
@@ -55,6 +55,7 @@ import static 
org.apache.paimon.options.CatalogOptions.FILE_IO_ALLOW_CACHE;
 import static org.apache.paimon.rest.RESTApi.TOKEN_EXPIRATION_SAFE_TIME_MILLIS;
 import static org.apache.paimon.rest.RESTCatalogOptions.DLF_OSS_ENDPOINT;
 import static org.apache.paimon.rest.RESTCatalogOptions.IO_CACHE_ENABLED;
+import static org.apache.paimon.utils.Preconditions.checkArgument;
 
 /** A {@link FileIO} to support getting token from REST Server. */
 public class RESTTokenFileIO implements FileIO {
@@ -82,6 +83,24 @@ public class RESTTokenFileIO implements FileIO {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(RESTTokenFileIO.class);
 
+    /** Sets the maximum number of cached FileIO instances. */
+    public static void setFileIOCacheMaximumSize(long maximumSize) {
+        checkArgument(maximumSize > 0, "Maximum cache size must be positive.");
+        FILE_IO_CACHE
+                .policy()
+                .eviction()
+                .orElseThrow(IllegalStateException::new)
+                .setMaximum(maximumSize);
+    }
+
+    static long fileIOCacheMaximumSize() {
+        return FILE_IO_CACHE
+                .policy()
+                .eviction()
+                .orElseThrow(IllegalStateException::new)
+                .getMaximum();
+    }
+
     private final CatalogContext catalogContext;
     private final Identifier identifier;
     private final Path path;
diff --git 
a/paimon-common/src/test/java/org/apache/paimon/rest/RESTTokenFileIOTest.java 
b/paimon-common/src/test/java/org/apache/paimon/rest/RESTTokenFileIOTest.java
index 9bab3e1a89..4b64a682a7 100644
--- 
a/paimon-common/src/test/java/org/apache/paimon/rest/RESTTokenFileIOTest.java
+++ 
b/paimon-common/src/test/java/org/apache/paimon/rest/RESTTokenFileIOTest.java
@@ -47,6 +47,20 @@ import static org.mockito.Mockito.when;
 /** Tests for {@link RESTTokenFileIO}. */
 class RESTTokenFileIOTest {
 
+    @Test
+    void testSetFileIOCacheMaximumSize() {
+        long originalMaximumSize = RESTTokenFileIO.fileIOCacheMaximumSize();
+        try {
+            RESTTokenFileIO.setFileIOCacheMaximumSize(2000);
+            
assertThat(RESTTokenFileIO.fileIOCacheMaximumSize()).isEqualTo(2000);
+            assertThatThrownBy(() -> 
RESTTokenFileIO.setFileIOCacheMaximumSize(0))
+                    .isInstanceOf(IllegalArgumentException.class)
+                    .hasMessage("Maximum cache size must be positive.");
+        } finally {
+            RESTTokenFileIO.setFileIOCacheMaximumSize(originalMaximumSize);
+        }
+    }
+
     @Test
     void testCreateBlobPresignedUrlRequiresBoundRootAndDelegates() throws 
IOException {
         Path tableRoot = new Path("oss://bucket/table");

Reply via email to