From 86dea70d676eb50186c3ef452ee15b23db63cb1e Mon Sep 17 00:00:00 2001 From: tonymtu Date: Tue, 1 Sep 2026 17:34:23 +0800 Subject: [PATCH 1/2] [rest] Make RESTTokenFileIO cache maximum size configurable --- .../org/apache/paimon/rest/RESTTokenFileIO.java | 17 +++++++++++++++++ .../apache/paimon/rest/RESTTokenFileIOTest.java | 13 +++++++++++++ 2 files changed, 30 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 fb210dda435f..2d35aa9ce1b5 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 @@ -82,6 +82,23 @@ 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) { + 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 9bab3e1a8976..a0e36f2d14c5 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,19 @@ /** Tests for {@link RESTTokenFileIO}. */ class RESTTokenFileIOTest { + @Test + void testSetFileIOCacheMaximumSize() { + long originalMaximumSize = RESTTokenFileIO.fileIOCacheMaximumSize(); + try { + RESTTokenFileIO.setFileIOCacheMaximumSize(0); + assertThat(RESTTokenFileIO.fileIOCacheMaximumSize()).isZero(); + assertThatThrownBy(() -> RESTTokenFileIO.setFileIOCacheMaximumSize(-1)) + .isInstanceOf(IllegalArgumentException.class); + } finally { + RESTTokenFileIO.setFileIOCacheMaximumSize(originalMaximumSize); + } + } + @Test void testCreateBlobPresignedUrlRequiresBoundRootAndDelegates() throws IOException { Path tableRoot = new Path("oss://bucket/table"); From ec3d3128585471c2e43e21640b4b48c204e60e7b Mon Sep 17 00:00:00 2001 From: tonymtu Date: Wed, 2 Sep 2026 10:42:20 +0800 Subject: [PATCH 2/2] [rest] Reject non-positive RESTTokenFileIO cache size --- .../java/org/apache/paimon/rest/RESTTokenFileIO.java | 2 ++ .../java/org/apache/paimon/rest/RESTTokenFileIOTest.java | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) 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 2d35aa9ce1b5..a4312470007b 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.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 { @@ -84,6 +85,7 @@ public class RESTTokenFileIO implements FileIO { /** 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() 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 a0e36f2d14c5..4b64a682a764 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 @@ -51,10 +51,11 @@ class RESTTokenFileIOTest { void testSetFileIOCacheMaximumSize() { long originalMaximumSize = RESTTokenFileIO.fileIOCacheMaximumSize(); try { - RESTTokenFileIO.setFileIOCacheMaximumSize(0); - assertThat(RESTTokenFileIO.fileIOCacheMaximumSize()).isZero(); - assertThatThrownBy(() -> RESTTokenFileIO.setFileIOCacheMaximumSize(-1)) - .isInstanceOf(IllegalArgumentException.class); + 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); }