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..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 { @@ -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 9bab3e1a8976..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 @@ -47,6 +47,20 @@ /** 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");