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");