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

lzljs3620320 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 c29b1621bd [core] Introduce paimon-api module for light rest api, part 
2 (#5607)
c29b1621bd is described below

commit c29b1621bd59ca69041afe15d88d8012af4d88f0
Author: Jingsong Lee <[email protected]>
AuthorDate: Thu May 15 16:46:58 2025 +0800

    [core] Introduce paimon-api module for light rest api, part 2 (#5607)
---
 docs/content/flink/sql-write.md                    |  1 -
 .../shortcodes/generated/core_configuration.html   |  6 --
 paimon-api/pom.xml                                 | 62 ++++++++++++++
 .../main/java/org/apache/paimon/CoreOptions.java   | 11 ---
 .../src/main/java/org/apache/paimon/Snapshot.java  | 30 -------
 .../java/org/apache/paimon/factories/Factory.java  |  0
 .../apache/paimon/factories/FactoryException.java  |  0
 .../org/apache/paimon/factories/FactoryUtil.java   |  0
 .../org/apache/paimon/partition/Partition.java     |  0
 .../paimon/partition/PartitionStatistics.java      |  0
 .../apache/paimon/rest/DefaultErrorHandler.java    |  0
 .../java/org/apache/paimon/rest/ErrorHandler.java  |  0
 .../rest/ExponentialHttpRetryInterceptor.java      |  0
 .../java/org/apache/paimon/rest/HttpClient.java    |  0
 .../org/apache/paimon/rest/LoggingInterceptor.java |  0
 .../paimon/rest/RESTCatalogInternalOptions.java    |  0
 .../org/apache/paimon/rest/RESTCatalogOptions.java |  0
 .../java/org/apache/paimon/rest/RESTClient.java    |  0
 .../org/apache/paimon/rest/RESTObjectMapper.java   |  0
 .../java/org/apache/paimon/rest/RESTResponse.java  |  0
 .../main/java/org/apache/paimon/rest/RESTUtil.java |  0
 .../java/org/apache/paimon/rest/ResourcePaths.java |  0
 .../org/apache/paimon/rest/auth/AuthProvider.java  |  0
 .../apache/paimon/rest/auth/AuthProviderEnum.java  |  0
 .../paimon/rest/auth/AuthProviderFactory.java      |  0
 .../paimon/rest/auth/BearTokenAuthProvider.java    |  0
 .../rest/auth/BearTokenAuthProviderFactory.java    |  0
 .../apache/paimon/rest/auth/DLFAuthProvider.java   |  3 +-
 .../paimon/rest/auth/DLFAuthProviderFactory.java   |  0
 .../apache/paimon/rest/auth/DLFAuthSignature.java  |  0
 .../apache/paimon/rest/auth/DLFECSTokenLoader.java |  0
 .../paimon/rest/auth/DLFECSTokenLoaderFactory.java |  0
 .../paimon/rest/auth/DLFLocalFileTokenLoader.java  |  4 +-
 .../rest/auth/DLFLocalFileTokenLoaderFactory.java  |  0
 .../java/org/apache/paimon/rest/auth/DLFToken.java |  0
 .../apache/paimon/rest/auth/DLFTokenLoader.java    |  0
 .../paimon/rest/auth/DLFTokenLoaderFactory.java    |  0
 .../apache/paimon/rest/auth/RESTAuthFunction.java  |  0
 .../apache/paimon/rest/auth/RESTAuthParameter.java |  0
 .../rest/exceptions/AlreadyExistsException.java    |  0
 .../rest/exceptions/BadRequestException.java       |  0
 .../paimon/rest/exceptions/ForbiddenException.java |  0
 .../rest/exceptions/NoSuchResourceException.java   |  0
 .../rest/exceptions/NotAuthorizedException.java    |  0
 .../rest/exceptions/NotImplementedException.java   |  0
 .../paimon/rest/exceptions/RESTException.java      |  0
 .../rest/exceptions/ServiceFailureException.java   |  0
 .../exceptions/ServiceUnavailableException.java    |  0
 .../paimon/rest/requests/AlterDatabaseRequest.java |  0
 .../paimon/rest/requests/AlterFunctionRequest.java |  0
 .../paimon/rest/requests/AlterViewRequest.java     |  0
 .../rest/requests/AuthTableQueryRequest.java       |  0
 .../rest/requests/BasePartitionsRequest.java       |  0
 .../paimon/rest/requests/CommitTableRequest.java   |  0
 .../paimon/rest/requests/CreateBranchRequest.java  |  0
 .../rest/requests/CreateFunctionRequest.java       |  0
 .../paimon/rest/requests/CreateViewRequest.java    |  0
 .../paimon/rest/requests/ForwardBranchRequest.java |  0
 .../rest/requests/MarkDonePartitionsRequest.java   |  0
 .../paimon/rest/requests/RenameTableRequest.java   |  0
 .../paimon/rest/requests/RollbackTableRequest.java |  0
 .../rest/responses/AlterDatabaseResponse.java      |  0
 .../paimon/rest/responses/AuditRESTResponse.java   |  0
 .../paimon/rest/responses/CommitTableResponse.java |  0
 .../paimon/rest/responses/ConfigResponse.java      |  0
 .../paimon/rest/responses/ErrorResponse.java       |  0
 .../paimon/rest/responses/GetDatabaseResponse.java |  0
 .../paimon/rest/responses/GetFunctionResponse.java |  0
 .../paimon/rest/responses/GetTableResponse.java    |  0
 .../rest/responses/GetTableSnapshotResponse.java   |  0
 .../rest/responses/GetTableTokenResponse.java      |  0
 .../paimon/rest/responses/GetViewResponse.java     |  0
 .../rest/responses/ListBranchesResponse.java       |  0
 .../rest/responses/ListDatabasesResponse.java      |  0
 .../rest/responses/ListFunctionsResponse.java      |  0
 .../rest/responses/ListPartitionsResponse.java     |  0
 .../rest/responses/ListTableDetailsResponse.java   |  0
 .../paimon/rest/responses/ListTablesResponse.java  |  0
 .../rest/responses/ListViewDetailsResponse.java    |  0
 .../paimon/rest/responses/ListViewsResponse.java   |  0
 .../paimon/rest/responses/PagedResponse.java       |  0
 .../org/apache/paimon/schema/SchemaSerializer.java |  0
 .../java/org/apache/paimon/schema/TableSchema.java | 23 ------
 .../main/java/org/apache/paimon/table/Instant.java |  0
 .../org/apache/paimon/table/TableSnapshot.java     |  0
 .../org/apache/paimon/utils/FileReadUtils.java     | 96 ++++++++++++++++++++++
 .../org/apache/paimon/utils/JsonDeserializer.java  |  0
 .../org/apache/paimon/utils/JsonSerdeUtil.java     |  0
 .../org/apache/paimon/utils/JsonSerializer.java    |  0
 .../org/apache/paimon/utils/SimpleHttpClient.java  | 93 +++++++++++++++++++++
 .../org/apache/paimon/utils/ThreadPoolUtils.java   |  0
 .../java/org/apache/paimon/utils/ThreadUtils.java  |  0
 paimon-api/src/main/resources/META-INF/NOTICE      | 10 +++
 .../services/org.apache.paimon.factories.Factory   | 19 +++++
 .../rest/ExponentialHttpRetryInterceptorTest.java  |  3 +-
 paimon-bundle/pom.xml                              | 18 ----
 paimon-core/pom.xml                                | 60 ++------------
 .../actions/HttpReportMarkDoneAction.java          | 62 ++------------
 .../actions/HttpReportMarkDoneException.java       | 33 --------
 .../org/apache/paimon/schema/SchemaManager.java    | 21 ++++-
 .../org/apache/paimon/utils/SnapshotManager.java   | 32 +++++++-
 .../services/org.apache.paimon.factories.Factory   |  4 -
 .../test/java/org/apache/paimon/TestFileStore.java |  2 +-
 .../org/apache/paimon/rest/HttpClientTest.java     | 56 ++-----------
 .../apache/paimon/table/SimpleTableTestBase.java   | 13 +--
 .../partition/HttpReportMarkDoneActionTest.java    |  5 --
 106 files changed, 361 insertions(+), 306 deletions(-)

diff --git a/docs/content/flink/sql-write.md b/docs/content/flink/sql-write.md
index f8cdf2fd86..cf468e7699 100644
--- a/docs/content/flink/sql-write.md
+++ b/docs/content/flink/sql-write.md
@@ -287,7 +287,6 @@ public class CustomPartitionMarkDoneAction implements 
PartitionMarkDoneAction {
 Paimon also support http-report partition mark done action, this action will 
report the partition to the remote http server.
 - partition.mark-done-action: http-report
 - partition.mark-done-action.http.url : Action will report the partition to 
the remote http server.
-- partition.mark-done-action.http.timeout : Http client connection timeout and 
default is 5s.
 - partition.mark-done-action.http.params : Http client request params in the 
request body json.
 
 Http Post request body :
diff --git a/docs/layouts/shortcodes/generated/core_configuration.html 
b/docs/layouts/shortcodes/generated/core_configuration.html
index b8d8471e09..8f357612bc 100644
--- a/docs/layouts/shortcodes/generated/core_configuration.html
+++ b/docs/layouts/shortcodes/generated/core_configuration.html
@@ -737,12 +737,6 @@ This config option does not affect the default filesystem 
metastore.</td>
             <td>String</td>
             <td>Http client request parameters will be written to the request 
body, this can only be used by http-report partition mark done action.</td>
         </tr>
-        <tr>
-            <td><h5>partition.mark-done-action.http.timeout</h5></td>
-            <td style="word-wrap: break-word;">5 s</td>
-            <td>Duration</td>
-            <td>Http client connection timeout, this can only be used by 
http-report partition mark done action.</td>
-        </tr>
         <tr>
             <td><h5>partition.mark-done-action.http.url</h5></td>
             <td style="word-wrap: break-word;">(none)</td>
diff --git a/paimon-api/pom.xml b/paimon-api/pom.xml
index 367e13f619..4e7fc57b0e 100644
--- a/paimon-api/pom.xml
+++ b/paimon-api/pom.xml
@@ -31,15 +31,47 @@ under the License.
     <name>Paimon : API</name>
 
     <dependencies>
+        <!-- Paimon Shade dependencies -->
         <dependency>
             <groupId>org.apache.paimon</groupId>
             <artifactId>paimon-shade-jackson-2</artifactId>
             
<version>${paimon.shade.jackson.version}-${paimon.shade.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.paimon</groupId>
+            <artifactId>paimon-shade-guava-30</artifactId>
+            
<version>${paimon.shade.guava.version}-${paimon.shade.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.paimon</groupId>
+            <artifactId>paimon-shade-caffeine-2</artifactId>
+            
<version>${paimon.shade.caffeine.version}-${paimon.shade.version}</version>
+        </dependency>
+
+        <!-- REST Catalog dependencies -->
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>${okhttp.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
         <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>test-jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
@@ -53,9 +85,31 @@ under the License.
                         <configuration>
                             <artifactSet>
                                 <includes combine.children="append">
+                                    <!-- Paimon Shade -->
                                     
<include>org.apache.paimon:paimon-shade-jackson-2</include>
+                                    
<include>org.apache.paimon:paimon-shade-guava-30</include>
+                                    
<include>org.apache.paimon:paimon-shade-caffeine-2</include>
+
+                                    <!-- okhttp3 -->
+                                    
<include>com.squareup.okhttp3:okhttp</include>
+                                    
<include>com.squareup.okio:okio-jvm</include>
+                                    
<include>org.jetbrains.kotlin:kotlin-stdlib</include>
                                 </includes>
                             </artifactSet>
+                            <relocations>
+                                <relocation>
+                                    <pattern>okhttp3</pattern>
+                                    
<shadedPattern>org.apache.paimon.shade.okhttp3</shadedPattern>
+                                </relocation>
+                                <relocation>
+                                    <pattern>kotlin</pattern>
+                                    
<shadedPattern>org.apache.paimon.shade.kotlin</shadedPattern>
+                                </relocation>
+                                <relocation>
+                                    <pattern>okio</pattern>
+                                    
<shadedPattern>org.apache.paimon.shade.okio</shadedPattern>
+                                </relocation>
+                            </relocations>
                             <filters>
                                 <!-- Another copy of the Apache license, which 
we don't need. -->
                                 <filter>
@@ -64,6 +118,14 @@ under the License.
                                         <exclude>META-INF/LICENSE.txt</exclude>
                                     </excludes>
                                 </filter>
+
+                                <!-- Exclude okhttp NOTICE. -->
+                                <filter>
+                                    <artifact>*</artifact>
+                                    <excludes>
+                                        
<exclude>okhttp3/internal/publicsuffix/NOTICE</exclude>
+                                    </excludes>
+                                </filter>
                             </filters>
                         </configuration>
                     </execution>
diff --git a/paimon-api/src/main/java/org/apache/paimon/CoreOptions.java 
b/paimon-api/src/main/java/org/apache/paimon/CoreOptions.java
index ae8e097bd3..bf4d1f5624 100644
--- a/paimon-api/src/main/java/org/apache/paimon/CoreOptions.java
+++ b/paimon-api/src/main/java/org/apache/paimon/CoreOptions.java
@@ -1297,13 +1297,6 @@ public class CoreOptions implements Serializable {
                     .withDescription(
                             "Mark done action will reports the partition to 
the remote http server, this can only be used by http-report partition mark 
done action.");
 
-    public static final ConfigOption<Duration> 
PARTITION_MARK_DONE_ACTION_TIMEOUT =
-            key("partition.mark-done-action.http.timeout")
-                    .durationType()
-                    .defaultValue(Duration.ofSeconds(5))
-                    .withDescription(
-                            "Http client connection timeout, this can only be 
used by http-report partition mark done action.");
-
     public static final ConfigOption<String> PARTITION_MARK_DONE_ACTION_PARAMS 
=
             key("partition.mark-done-action.http.params")
                     .stringType()
@@ -2427,10 +2420,6 @@ public class CoreOptions implements Serializable {
         return options.get(PARTITION_MARK_DONE_ACTION_URL);
     }
 
-    public Duration httpReportMarkDoneActionTimeout() {
-        return options.get(PARTITION_MARK_DONE_ACTION_TIMEOUT);
-    }
-
     public String httpReportMarkDoneActionParams() {
         return options.get(PARTITION_MARK_DONE_ACTION_PARAMS);
     }
diff --git a/paimon-core/src/main/java/org/apache/paimon/Snapshot.java 
b/paimon-api/src/main/java/org/apache/paimon/Snapshot.java
similarity index 92%
rename from paimon-core/src/main/java/org/apache/paimon/Snapshot.java
rename to paimon-api/src/main/java/org/apache/paimon/Snapshot.java
index 0a914cc678..fa4f527acc 100644
--- a/paimon-core/src/main/java/org/apache/paimon/Snapshot.java
+++ b/paimon-api/src/main/java/org/apache/paimon/Snapshot.java
@@ -19,8 +19,6 @@
 package org.apache.paimon;
 
 import org.apache.paimon.annotation.Public;
-import org.apache.paimon.fs.FileIO;
-import org.apache.paimon.fs.Path;
 import org.apache.paimon.utils.JsonSerdeUtil;
 
 import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonCreator;
@@ -31,8 +29,6 @@ import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonPro
 
 import javax.annotation.Nullable;
 
-import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.io.Serializable;
 import java.util.Map;
 import java.util.Objects;
@@ -480,30 +476,4 @@ public class Snapshot implements Serializable {
     public static Snapshot fromJson(String json) {
         return JsonSerdeUtil.fromJson(json, Snapshot.class);
     }
-
-    public static Snapshot fromPath(FileIO fileIO, Path path) {
-        try {
-            return tryFromPath(fileIO, path);
-        } catch (FileNotFoundException e) {
-            String errorMessage =
-                    String.format(
-                            "Snapshot file %s does not exist. "
-                                    + "It might have been expired by other 
jobs operating on this table. "
-                                    + "In this case, you can avoid concurrent 
modification issues by configuring "
-                                    + "write-only = true and use a dedicated 
compaction job, or configuring "
-                                    + "different expiration thresholds for 
different jobs.",
-                            path);
-            throw new RuntimeException(errorMessage, e);
-        }
-    }
-
-    public static Snapshot tryFromPath(FileIO fileIO, Path path) throws 
FileNotFoundException {
-        try {
-            return Snapshot.fromJson(fileIO.readFileUtf8(path));
-        } catch (FileNotFoundException e) {
-            throw e;
-        } catch (IOException e) {
-            throw new RuntimeException("Fails to read snapshot from path " + 
path, e);
-        }
-    }
 }
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/factories/Factory.java 
b/paimon-api/src/main/java/org/apache/paimon/factories/Factory.java
similarity index 100%
rename from paimon-common/src/main/java/org/apache/paimon/factories/Factory.java
rename to paimon-api/src/main/java/org/apache/paimon/factories/Factory.java
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/factories/FactoryException.java 
b/paimon-api/src/main/java/org/apache/paimon/factories/FactoryException.java
similarity index 100%
rename from 
paimon-common/src/main/java/org/apache/paimon/factories/FactoryException.java
rename to 
paimon-api/src/main/java/org/apache/paimon/factories/FactoryException.java
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/factories/FactoryUtil.java 
b/paimon-api/src/main/java/org/apache/paimon/factories/FactoryUtil.java
similarity index 100%
rename from 
paimon-common/src/main/java/org/apache/paimon/factories/FactoryUtil.java
rename to paimon-api/src/main/java/org/apache/paimon/factories/FactoryUtil.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/partition/Partition.java 
b/paimon-api/src/main/java/org/apache/paimon/partition/Partition.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/partition/Partition.java
rename to paimon-api/src/main/java/org/apache/paimon/partition/Partition.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/partition/PartitionStatistics.java
 b/paimon-api/src/main/java/org/apache/paimon/partition/PartitionStatistics.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/partition/PartitionStatistics.java
rename to 
paimon-api/src/main/java/org/apache/paimon/partition/PartitionStatistics.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/DefaultErrorHandler.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/DefaultErrorHandler.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/DefaultErrorHandler.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/DefaultErrorHandler.java
diff --git a/paimon-core/src/main/java/org/apache/paimon/rest/ErrorHandler.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/ErrorHandler.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/rest/ErrorHandler.java
rename to paimon-api/src/main/java/org/apache/paimon/rest/ErrorHandler.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/ExponentialHttpRetryInterceptor.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/ExponentialHttpRetryInterceptor.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/ExponentialHttpRetryInterceptor.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/ExponentialHttpRetryInterceptor.java
diff --git a/paimon-core/src/main/java/org/apache/paimon/rest/HttpClient.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/HttpClient.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/rest/HttpClient.java
rename to paimon-api/src/main/java/org/apache/paimon/rest/HttpClient.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/LoggingInterceptor.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/LoggingInterceptor.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/LoggingInterceptor.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/LoggingInterceptor.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalogInternalOptions.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/RESTCatalogInternalOptions.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalogInternalOptions.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/RESTCatalogInternalOptions.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalogOptions.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/RESTCatalogOptions.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalogOptions.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/RESTCatalogOptions.java
diff --git a/paimon-core/src/main/java/org/apache/paimon/rest/RESTClient.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/RESTClient.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/rest/RESTClient.java
rename to paimon-api/src/main/java/org/apache/paimon/rest/RESTClient.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/RESTObjectMapper.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/RESTObjectMapper.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/RESTObjectMapper.java
rename to paimon-api/src/main/java/org/apache/paimon/rest/RESTObjectMapper.java
diff --git a/paimon-core/src/main/java/org/apache/paimon/rest/RESTResponse.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/RESTResponse.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/rest/RESTResponse.java
rename to paimon-api/src/main/java/org/apache/paimon/rest/RESTResponse.java
diff --git a/paimon-core/src/main/java/org/apache/paimon/rest/RESTUtil.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/RESTUtil.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/rest/RESTUtil.java
rename to paimon-api/src/main/java/org/apache/paimon/rest/RESTUtil.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/ResourcePaths.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/ResourcePaths.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/rest/ResourcePaths.java
rename to paimon-api/src/main/java/org/apache/paimon/rest/ResourcePaths.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/AuthProvider.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/AuthProvider.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/AuthProvider.java
rename to paimon-api/src/main/java/org/apache/paimon/rest/auth/AuthProvider.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/AuthProviderEnum.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/AuthProviderEnum.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/AuthProviderEnum.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/AuthProviderEnum.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/AuthProviderFactory.java
 b/paimon-api/src/main/java/org/apache/paimon/rest/auth/AuthProviderFactory.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/AuthProviderFactory.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/AuthProviderFactory.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/BearTokenAuthProvider.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/BearTokenAuthProvider.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/BearTokenAuthProvider.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/BearTokenAuthProvider.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/BearTokenAuthProviderFactory.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/BearTokenAuthProviderFactory.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/BearTokenAuthProviderFactory.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/BearTokenAuthProviderFactory.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFAuthProvider.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFAuthProvider.java
similarity index 98%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFAuthProvider.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFAuthProvider.java
index 7eece82a92..9b50bb70ee 100644
--- a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFAuthProvider.java
+++ b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFAuthProvider.java
@@ -32,7 +32,6 @@ import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.Map;
 
-import static 
org.apache.paimon.rest.RESTCatalog.TOKEN_EXPIRATION_SAFE_TIME_MILLIS;
 import static org.apache.paimon.utils.Preconditions.checkNotNull;
 
 /** Auth provider for <b>Ali CLoud</b> DLF. */
@@ -40,6 +39,8 @@ public class DLFAuthProvider implements AuthProvider {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(DLFAuthProvider.class);
 
+    public static final long TOKEN_EXPIRATION_SAFE_TIME_MILLIS = 3_600_000L;
+
     public static final String DLF_AUTHORIZATION_HEADER_KEY = "Authorization";
     public static final String DLF_CONTENT_MD5_HEADER_KEY = "Content-MD5";
     public static final String DLF_CONTENT_TYPE_KEY = "Content-Type";
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFAuthProviderFactory.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFAuthProviderFactory.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFAuthProviderFactory.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFAuthProviderFactory.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFAuthSignature.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFAuthSignature.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFAuthSignature.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFAuthSignature.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFECSTokenLoader.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFECSTokenLoader.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFECSTokenLoader.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFECSTokenLoader.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFECSTokenLoaderFactory.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFECSTokenLoaderFactory.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFECSTokenLoaderFactory.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFECSTokenLoaderFactory.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFLocalFileTokenLoader.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFLocalFileTokenLoader.java
similarity index 93%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFLocalFileTokenLoader.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFLocalFileTokenLoader.java
index 22d0f4090d..9f772a668c 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFLocalFileTokenLoader.java
+++ 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFLocalFileTokenLoader.java
@@ -18,7 +18,7 @@
 
 package org.apache.paimon.rest.auth;
 
-import org.apache.paimon.utils.FileIOUtils;
+import org.apache.paimon.utils.FileReadUtils;
 
 import java.io.File;
 
@@ -48,7 +48,7 @@ public class DLFLocalFileTokenLoader implements 
DLFTokenLoader {
         Exception lastException = null;
         while (retry <= 5) {
             try {
-                String tokenStr = FileIOUtils.readFileUtf8(new 
File(tokenFilePath));
+                String tokenStr = FileReadUtils.readFileUtf8(new 
File(tokenFilePath));
                 return OBJECT_MAPPER.readValue(tokenStr, DLFToken.class);
             } catch (Exception e) {
                 lastException = e;
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFLocalFileTokenLoaderFactory.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFLocalFileTokenLoaderFactory.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFLocalFileTokenLoaderFactory.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFLocalFileTokenLoaderFactory.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFToken.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFToken.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFToken.java
rename to paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFToken.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFTokenLoader.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFTokenLoader.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFTokenLoader.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFTokenLoader.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFTokenLoaderFactory.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFTokenLoaderFactory.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/DLFTokenLoaderFactory.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFTokenLoaderFactory.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/RESTAuthFunction.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/RESTAuthFunction.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/RESTAuthFunction.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/RESTAuthFunction.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/auth/RESTAuthParameter.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/RESTAuthParameter.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/auth/RESTAuthParameter.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/auth/RESTAuthParameter.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/exceptions/AlreadyExistsException.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/exceptions/AlreadyExistsException.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/exceptions/AlreadyExistsException.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/exceptions/AlreadyExistsException.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/exceptions/BadRequestException.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/exceptions/BadRequestException.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/exceptions/BadRequestException.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/exceptions/BadRequestException.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/exceptions/ForbiddenException.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/exceptions/ForbiddenException.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/exceptions/ForbiddenException.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/exceptions/ForbiddenException.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/exceptions/NoSuchResourceException.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/exceptions/NoSuchResourceException.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/exceptions/NoSuchResourceException.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/exceptions/NoSuchResourceException.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/exceptions/NotAuthorizedException.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/exceptions/NotAuthorizedException.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/exceptions/NotAuthorizedException.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/exceptions/NotAuthorizedException.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/exceptions/NotImplementedException.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/exceptions/NotImplementedException.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/exceptions/NotImplementedException.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/exceptions/NotImplementedException.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/exceptions/RESTException.java
 b/paimon-api/src/main/java/org/apache/paimon/rest/exceptions/RESTException.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/exceptions/RESTException.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/exceptions/RESTException.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/exceptions/ServiceFailureException.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/exceptions/ServiceFailureException.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/exceptions/ServiceFailureException.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/exceptions/ServiceFailureException.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/exceptions/ServiceUnavailableException.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/exceptions/ServiceUnavailableException.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/exceptions/ServiceUnavailableException.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/exceptions/ServiceUnavailableException.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/AlterDatabaseRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/AlterDatabaseRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/AlterDatabaseRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/AlterDatabaseRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/AlterFunctionRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/AlterFunctionRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/AlterFunctionRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/AlterFunctionRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/AlterViewRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/AlterViewRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/AlterViewRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/AlterViewRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/AuthTableQueryRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/AuthTableQueryRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/AuthTableQueryRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/AuthTableQueryRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/BasePartitionsRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/BasePartitionsRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/BasePartitionsRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/BasePartitionsRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/CommitTableRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/CommitTableRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/CommitTableRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/CommitTableRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/CreateBranchRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/CreateBranchRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/CreateBranchRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/CreateBranchRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/CreateFunctionRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/CreateFunctionRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/CreateFunctionRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/CreateFunctionRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/CreateViewRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/CreateViewRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/CreateViewRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/CreateViewRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/ForwardBranchRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/ForwardBranchRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/ForwardBranchRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/ForwardBranchRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/MarkDonePartitionsRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/MarkDonePartitionsRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/MarkDonePartitionsRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/MarkDonePartitionsRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/RenameTableRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/RenameTableRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/RenameTableRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/RenameTableRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/requests/RollbackTableRequest.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/requests/RollbackTableRequest.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/requests/RollbackTableRequest.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/requests/RollbackTableRequest.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/AlterDatabaseResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/AlterDatabaseResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/AlterDatabaseResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/AlterDatabaseResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/AuditRESTResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/AuditRESTResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/AuditRESTResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/AuditRESTResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/CommitTableResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/CommitTableResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/CommitTableResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/CommitTableResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/ConfigResponse.java
 b/paimon-api/src/main/java/org/apache/paimon/rest/responses/ConfigResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/ConfigResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/ConfigResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/ErrorResponse.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/ErrorResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/ErrorResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/ErrorResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/GetDatabaseResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/GetDatabaseResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/GetDatabaseResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/GetDatabaseResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/GetFunctionResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/GetFunctionResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/GetFunctionResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/GetFunctionResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/GetTableResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/GetTableResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/GetTableResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/GetTableResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/GetTableSnapshotResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/GetTableSnapshotResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/GetTableSnapshotResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/GetTableSnapshotResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/GetTableTokenResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/GetTableTokenResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/GetTableTokenResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/GetTableTokenResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/GetViewResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/GetViewResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/GetViewResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/GetViewResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/ListBranchesResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/ListBranchesResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/ListBranchesResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/ListBranchesResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/ListDatabasesResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/ListDatabasesResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/ListDatabasesResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/ListDatabasesResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/ListFunctionsResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/ListFunctionsResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/ListFunctionsResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/ListFunctionsResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/ListPartitionsResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/ListPartitionsResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/ListPartitionsResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/ListPartitionsResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/ListTableDetailsResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/ListTableDetailsResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/ListTableDetailsResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/ListTableDetailsResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/ListTablesResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/ListTablesResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/ListTablesResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/ListTablesResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/ListViewDetailsResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/ListViewDetailsResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/ListViewDetailsResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/ListViewDetailsResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/ListViewsResponse.java
 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/ListViewsResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/ListViewsResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/ListViewsResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/rest/responses/PagedResponse.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/responses/PagedResponse.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/rest/responses/PagedResponse.java
rename to 
paimon-api/src/main/java/org/apache/paimon/rest/responses/PagedResponse.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/schema/SchemaSerializer.java 
b/paimon-api/src/main/java/org/apache/paimon/schema/SchemaSerializer.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/schema/SchemaSerializer.java
rename to 
paimon-api/src/main/java/org/apache/paimon/schema/SchemaSerializer.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/schema/TableSchema.java 
b/paimon-api/src/main/java/org/apache/paimon/schema/TableSchema.java
similarity index 93%
rename from paimon-core/src/main/java/org/apache/paimon/schema/TableSchema.java
rename to paimon-api/src/main/java/org/apache/paimon/schema/TableSchema.java
index e7a0dbd9f1..4701cdf517 100644
--- a/paimon-core/src/main/java/org/apache/paimon/schema/TableSchema.java
+++ b/paimon-api/src/main/java/org/apache/paimon/schema/TableSchema.java
@@ -19,8 +19,6 @@
 package org.apache.paimon.schema;
 
 import org.apache.paimon.CoreOptions;
-import org.apache.paimon.fs.FileIO;
-import org.apache.paimon.fs.Path;
 import org.apache.paimon.types.DataField;
 import org.apache.paimon.types.RowType;
 import org.apache.paimon.utils.JsonSerdeUtil;
@@ -29,10 +27,7 @@ import org.apache.paimon.utils.StringUtils;
 
 import javax.annotation.Nullable;
 
-import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.io.Serializable;
-import java.io.UncheckedIOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
@@ -341,24 +336,6 @@ public class TableSchema implements Serializable {
         return JsonSerdeUtil.fromJson(json, TableSchema.class);
     }
 
-    public static TableSchema fromPath(FileIO fileIO, Path path) {
-        try {
-            return tryFromPath(fileIO, path);
-        } catch (FileNotFoundException e) {
-            throw new RuntimeException(e.getMessage(), e);
-        }
-    }
-
-    public static TableSchema tryFromPath(FileIO fileIO, Path path) throws 
FileNotFoundException {
-        try {
-            return fromJson(fileIO.readFileUtf8(path));
-        } catch (FileNotFoundException e) {
-            throw e;
-        } catch (IOException e) {
-            throw new UncheckedIOException(e);
-        }
-    }
-
     public static TableSchema create(long schemaId, Schema schema) {
         List<DataField> fields = schema.fields();
         List<String> partitionKeys = schema.partitionKeys();
diff --git a/paimon-core/src/main/java/org/apache/paimon/table/Instant.java 
b/paimon-api/src/main/java/org/apache/paimon/table/Instant.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/table/Instant.java
rename to paimon-api/src/main/java/org/apache/paimon/table/Instant.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/table/TableSnapshot.java 
b/paimon-api/src/main/java/org/apache/paimon/table/TableSnapshot.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/table/TableSnapshot.java
rename to paimon-api/src/main/java/org/apache/paimon/table/TableSnapshot.java
diff --git 
a/paimon-api/src/main/java/org/apache/paimon/utils/FileReadUtils.java 
b/paimon-api/src/main/java/org/apache/paimon/utils/FileReadUtils.java
new file mode 100644
index 0000000000..a02ddfbced
--- /dev/null
+++ b/paimon-api/src/main/java/org/apache/paimon/utils/FileReadUtils.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.paimon.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.Channels;
+import java.nio.channels.SeekableByteChannel;
+import java.nio.file.Files;
+import java.util.Arrays;
+
+/** Utils for local filesystem. */
+public class FileReadUtils {
+
+    /**
+     * The maximum size of array to allocate for reading. See {@code 
MAX_BUFFER_SIZE} in {@link
+     * java.nio.file.Files} for more.
+     */
+    private static final int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
+
+    /** The size of the buffer used for reading. */
+    private static final int BUFFER_SIZE = 4096;
+
+    public static String readFileUtf8(File file) throws IOException {
+        return readFile(file, "UTF-8");
+    }
+
+    public static String readFile(File file, String charsetName) throws 
IOException {
+        byte[] bytes = readAllBytes(file.toPath());
+        return new String(bytes, charsetName);
+    }
+
+    public static byte[] readAllBytes(java.nio.file.Path path) throws 
IOException {
+        try (SeekableByteChannel channel = Files.newByteChannel(path);
+                InputStream in = Channels.newInputStream(channel)) {
+
+            long size = channel.size();
+            if (size > (long) MAX_BUFFER_SIZE) {
+                throw new OutOfMemoryError("Required array size too large");
+            }
+
+            return read(in, (int) size);
+        }
+    }
+
+    private static byte[] read(InputStream source, int initialSize) throws 
IOException {
+        int capacity = initialSize;
+        byte[] buf = new byte[capacity];
+        int nread = 0;
+        int n;
+
+        for (; ; ) {
+            // read to EOF which may read more or less than initialSize (eg: 
file
+            // is truncated while we are reading)
+            while ((n = source.read(buf, nread, Math.min(capacity - nread, 
BUFFER_SIZE))) > 0) {
+                nread += n;
+            }
+
+            // if last call to source.read() returned -1, we are done
+            // otherwise, try to read one more byte; if that failed we're done 
too
+            if (n < 0 || (n = source.read()) < 0) {
+                break;
+            }
+
+            // one more byte was read; need to allocate a larger buffer
+            if (capacity <= MAX_BUFFER_SIZE - capacity) {
+                capacity = Math.max(capacity << 1, BUFFER_SIZE);
+            } else {
+                if (capacity == MAX_BUFFER_SIZE) {
+                    throw new OutOfMemoryError("Required array size too 
large");
+                }
+                capacity = MAX_BUFFER_SIZE;
+            }
+            buf = Arrays.copyOf(buf, capacity);
+            buf[nread++] = (byte) n;
+        }
+        return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
+    }
+}
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/utils/JsonDeserializer.java 
b/paimon-api/src/main/java/org/apache/paimon/utils/JsonDeserializer.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/utils/JsonDeserializer.java
rename to paimon-api/src/main/java/org/apache/paimon/utils/JsonDeserializer.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/utils/JsonSerdeUtil.java 
b/paimon-api/src/main/java/org/apache/paimon/utils/JsonSerdeUtil.java
similarity index 100%
rename from paimon-core/src/main/java/org/apache/paimon/utils/JsonSerdeUtil.java
rename to paimon-api/src/main/java/org/apache/paimon/utils/JsonSerdeUtil.java
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/utils/JsonSerializer.java 
b/paimon-api/src/main/java/org/apache/paimon/utils/JsonSerializer.java
similarity index 100%
rename from 
paimon-core/src/main/java/org/apache/paimon/utils/JsonSerializer.java
rename to paimon-api/src/main/java/org/apache/paimon/utils/JsonSerializer.java
diff --git 
a/paimon-api/src/main/java/org/apache/paimon/utils/SimpleHttpClient.java 
b/paimon-api/src/main/java/org/apache/paimon/utils/SimpleHttpClient.java
new file mode 100644
index 0000000000..3a56da9e35
--- /dev/null
+++ b/paimon-api/src/main/java/org/apache/paimon/utils/SimpleHttpClient.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.paimon.utils;
+
+import okhttp3.Dispatcher;
+import okhttp3.Headers;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.time.Duration;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.SynchronousQueue;
+
+import static okhttp3.ConnectionSpec.CLEARTEXT;
+import static okhttp3.ConnectionSpec.COMPATIBLE_TLS;
+import static okhttp3.ConnectionSpec.MODERN_TLS;
+import static org.apache.paimon.utils.ThreadPoolUtils.createCachedThreadPool;
+
+/** A simple client to wrap okhttp3. */
+public class SimpleHttpClient implements Closeable {
+
+    private static final MediaType MEDIA_TYPE = 
MediaType.parse("application/json");
+
+    private final OkHttpClient client;
+
+    public SimpleHttpClient(String threadName) {
+        OkHttpClient.Builder builder =
+                new OkHttpClient.Builder()
+                        .dispatcher(
+                                new Dispatcher(
+                                        createCachedThreadPool(
+                                                1, threadName, new 
SynchronousQueue<>())))
+                        .retryOnConnectionFailure(true)
+                        .connectionSpecs(Arrays.asList(MODERN_TLS, 
COMPATIBLE_TLS, CLEARTEXT))
+                        .connectTimeout(Duration.ofMinutes(3))
+                        .readTimeout(Duration.ofMinutes(3));
+
+        this.client = builder.build();
+    }
+
+    public String post(String url, byte[] body, Map<String, String> headers) 
throws IOException {
+        RequestBody requestBody = RequestBody.create(body, MEDIA_TYPE);
+        Request request =
+                new Request.Builder()
+                        .url(url)
+                        .post(requestBody)
+                        .headers(Headers.of(headers))
+                        .build();
+        try (Response response = client.newCall(request).execute()) {
+            String responseBodyStr = response.body() != null ? 
response.body().string() : null;
+            if (!response.isSuccessful() || 
StringUtils.isNullOrWhitespaceOnly(responseBodyStr)) {
+                throw new RuntimeException(
+                        response.isSuccessful()
+                                ? "ResponseBody is null or empty."
+                                : String.format(
+                                        "Response is not successful, response 
is %s", response));
+            }
+            return responseBodyStr;
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        try {
+            client.dispatcher().cancelAll();
+            client.connectionPool().evictAll();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/utils/ThreadPoolUtils.java 
b/paimon-api/src/main/java/org/apache/paimon/utils/ThreadPoolUtils.java
similarity index 100%
rename from 
paimon-common/src/main/java/org/apache/paimon/utils/ThreadPoolUtils.java
rename to paimon-api/src/main/java/org/apache/paimon/utils/ThreadPoolUtils.java
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/utils/ThreadUtils.java 
b/paimon-api/src/main/java/org/apache/paimon/utils/ThreadUtils.java
similarity index 100%
rename from paimon-common/src/main/java/org/apache/paimon/utils/ThreadUtils.java
rename to paimon-api/src/main/java/org/apache/paimon/utils/ThreadUtils.java
diff --git a/paimon-api/src/main/resources/META-INF/NOTICE 
b/paimon-api/src/main/resources/META-INF/NOTICE
new file mode 100644
index 0000000000..e838c91216
--- /dev/null
+++ b/paimon-api/src/main/resources/META-INF/NOTICE
@@ -0,0 +1,10 @@
+paimon-api
+Copyright 2023-2025 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+This project bundles the following dependencies under the Apache Software 
License 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt)
+- com.squareup.okhttp3:okhttp:4.12.0
+- com.squareup.okio:okio-jvm:3.6.0
+- org.jetbrains.kotlin:kotlin-stdlib:1.8.21
diff --git 
a/paimon-api/src/main/resources/META-INF/services/org.apache.paimon.factories.Factory
 
b/paimon-api/src/main/resources/META-INF/services/org.apache.paimon.factories.Factory
new file mode 100644
index 0000000000..2db2e7652a
--- /dev/null
+++ 
b/paimon-api/src/main/resources/META-INF/services/org.apache.paimon.factories.Factory
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+org.apache.paimon.rest.auth.BearTokenAuthProviderFactory
+org.apache.paimon.rest.auth.DLFAuthProviderFactory
+org.apache.paimon.rest.auth.DLFLocalFileTokenLoaderFactory
+org.apache.paimon.rest.auth.DLFECSTokenLoaderFactory
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/rest/ExponentialHttpRetryInterceptorTest.java
 
b/paimon-api/src/test/java/org/apache/paimon/rest/ExponentialHttpRetryInterceptorTest.java
similarity index 98%
rename from 
paimon-core/src/test/java/org/apache/paimon/rest/ExponentialHttpRetryInterceptorTest.java
rename to 
paimon-api/src/test/java/org/apache/paimon/rest/ExponentialHttpRetryInterceptorTest.java
index 02e285b7e7..0217814ed3 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/rest/ExponentialHttpRetryInterceptorTest.java
+++ 
b/paimon-api/src/test/java/org/apache/paimon/rest/ExponentialHttpRetryInterceptorTest.java
@@ -21,7 +21,6 @@ package org.apache.paimon.rest;
 import okhttp3.Protocol;
 import okhttp3.Request;
 import okhttp3.Response;
-import org.apache.hc.core5.http.HttpHeaders;
 import org.junit.jupiter.api.Test;
 
 import javax.net.ssl.SSLException;
@@ -144,7 +143,7 @@ class ExponentialHttpRetryInterceptorTest {
                 .message("message")
                 .protocol(Protocol.HTTP_1_1)
                 .request(new Request.Builder().url("http://localhost";).build())
-                .addHeader(HttpHeaders.RETRY_AFTER, retryAfter)
+                .addHeader("Retry-After", retryAfter)
                 .build();
     }
 }
diff --git a/paimon-bundle/pom.xml b/paimon-bundle/pom.xml
index 3abaded69a..c3e2f9bb64 100644
--- a/paimon-bundle/pom.xml
+++ b/paimon-bundle/pom.xml
@@ -94,20 +94,6 @@ under the License.
                 </exclusion>
             </exclusions>
         </dependency>
-
-        <!-- other runtime dependencies -->
-
-        <dependency>
-            <groupId>org.apache.paimon</groupId>
-            <artifactId>paimon-shade-guava-30</artifactId>
-            
<version>${paimon.shade.guava.version}-${paimon.shade.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.paimon</groupId>
-            <artifactId>paimon-shade-caffeine-2</artifactId>
-            
<version>${paimon.shade.caffeine.version}-${paimon.shade.version}</version>
-        </dependency>
     </dependencies>
 
     <build>
@@ -125,10 +111,6 @@ under the License.
                         <configuration>
                             <artifactSet>
                                 <includes combine.children="append">
-                                    <!-- Paimon-shade -->
-                                    
<include>org.apache.paimon:paimon-shade-guava-30</include>
-                                    
<include>org.apache.paimon:paimon-shade-caffeine-2</include>
-
                                     <!-- Paimon -->
                                     
<include>org.apache.paimon:paimon-api</include>
                                     
<include>org.apache.paimon:paimon-common</include>
diff --git a/paimon-core/pom.xml b/paimon-core/pom.xml
index e06183c7da..de84203bdf 100644
--- a/paimon-core/pom.xml
+++ b/paimon-core/pom.xml
@@ -63,14 +63,6 @@ under the License.
             <scope>provided</scope>
         </dependency>
 
-        <!-- REST Catalog dependencies -->
-
-        <dependency>
-            <groupId>com.squareup.okhttp3</groupId>
-            <artifactId>okhttp</artifactId>
-            <version>${okhttp.version}</version>
-        </dependency>
-
         <!-- test dependencies -->
 
         <dependency>
@@ -224,6 +216,14 @@ under the License.
             <version>${okhttp.version}</version>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>${okhttp.version}</version>
+            <scope>test</scope>
+        </dependency>
+
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
@@ -268,50 +268,6 @@ under the License.
                     </execution>
                 </executions>
             </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>shade-paimon</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <filters>
-                                <filter>
-                                    <artifact>*</artifact>
-                                    <excludes>
-                                        
<exclude>okhttp3/internal/publicsuffix/NOTICE</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <artifactSet>
-                                <includes combine.children="append">
-                                    
<include>com.squareup.okhttp3:okhttp</include>
-                                    
<include>com.squareup.okio:okio-jvm</include>
-                                    
<include>org.jetbrains.kotlin:kotlin-stdlib</include>
-                                </includes>
-                            </artifactSet>
-                            <relocations>
-                                <relocation>
-                                    <pattern>okhttp3</pattern>
-                                    
<shadedPattern>org.apache.paimon.shade.okhttp3</shadedPattern>
-                                </relocation>
-                                <relocation>
-                                    <pattern>kotlin</pattern>
-                                    
<shadedPattern>org.apache.paimon.shade.kotlin</shadedPattern>
-                                </relocation>
-                                <relocation>
-                                    <pattern>okio</pattern>
-                                    
<shadedPattern>org.apache.paimon.shade.okio</shadedPattern>
-                                </relocation>
-                            </relocations>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
         </plugins>
     </build>
 </project>
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/partition/actions/HttpReportMarkDoneAction.java
 
b/paimon-core/src/main/java/org/apache/paimon/partition/actions/HttpReportMarkDoneAction.java
index 4b4f7b6895..37a90d2b83 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/partition/actions/HttpReportMarkDoneAction.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/partition/actions/HttpReportMarkDoneAction.java
@@ -22,6 +22,7 @@ import org.apache.paimon.CoreOptions;
 import org.apache.paimon.annotation.VisibleForTesting;
 import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.utils.Preconditions;
+import org.apache.paimon.utils.SimpleHttpClient;
 import org.apache.paimon.utils.StringUtils;
 
 import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonCreator;
@@ -32,33 +33,18 @@ import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.databind.Deseriali
 import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.databind.ObjectMapper;
 import 
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.databind.SerializationFeature;
 
-import okhttp3.Dispatcher;
-import okhttp3.Headers;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.RequestBody;
-import okhttp3.Response;
-
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Map;
-import java.util.concurrent.SynchronousQueue;
 
-import static okhttp3.ConnectionSpec.CLEARTEXT;
-import static okhttp3.ConnectionSpec.COMPATIBLE_TLS;
-import static okhttp3.ConnectionSpec.MODERN_TLS;
 import static org.apache.paimon.CoreOptions.PARTITION_MARK_DONE_ACTION_URL;
-import static org.apache.paimon.utils.ThreadPoolUtils.createCachedThreadPool;
 
 /** Report partition submission information to remote http server. */
 public class HttpReportMarkDoneAction implements PartitionMarkDoneAction {
 
-    private OkHttpClient client;
+    private SimpleHttpClient client;
     private String url;
     private ObjectMapper mapper;
-    private static final MediaType MEDIA_TYPE = 
MediaType.parse("application/json");
 
     private String tableName;
     private String location;
@@ -87,18 +73,7 @@ public class HttpReportMarkDoneAction implements 
PartitionMarkDoneAction {
         mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, 
false);
         mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
 
-        OkHttpClient.Builder builder =
-                new OkHttpClient.Builder()
-                        .dispatcher(
-                                new Dispatcher(
-                                        createCachedThreadPool(
-                                                1, THREAD_NAME, new 
SynchronousQueue<>())))
-                        .retryOnConnectionFailure(true)
-                        .connectionSpecs(Arrays.asList(MODERN_TLS, 
COMPATIBLE_TLS, CLEARTEXT))
-                        
.connectTimeout(options.httpReportMarkDoneActionTimeout())
-                        
.readTimeout(options.httpReportMarkDoneActionTimeout());
-
-        this.client = builder.build();
+        this.client = new SimpleHttpClient(THREAD_NAME);
     }
 
     @Override
@@ -121,12 +96,7 @@ public class HttpReportMarkDoneAction implements 
PartitionMarkDoneAction {
 
     @Override
     public void close() throws IOException {
-        try {
-            client.dispatcher().cancelAll();
-            client.connectionPool().evictAll();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+        client.close();
     }
 
     /** RestRequest only for HttpReportMarkDoneAction. */
@@ -205,27 +175,7 @@ public class HttpReportMarkDoneAction implements 
PartitionMarkDoneAction {
 
     public HttpReportMarkDoneResponse post(
             HttpReportMarkDoneRequest body, Map<String, String> headers) 
throws IOException {
-        RequestBody requestBody = 
RequestBody.create(mapper.writeValueAsBytes(body), MEDIA_TYPE);
-        Request request =
-                new Request.Builder()
-                        .url(url)
-                        .post(requestBody)
-                        .headers(Headers.of(headers))
-                        .build();
-        try (Response response = client.newCall(request).execute()) {
-            String responseBodyStr = response.body() != null ? 
response.body().string() : null;
-            if (!response.isSuccessful() || 
StringUtils.isNullOrWhitespaceOnly(responseBodyStr)) {
-                throw new HttpReportMarkDoneException(
-                        response.isSuccessful()
-                                ? "ResponseBody is null or empty."
-                                : String.format(
-                                        "Response is not successful, response 
is %s", response));
-            }
-            return mapper.readValue(responseBodyStr, 
HttpReportMarkDoneResponse.class);
-        } catch (HttpReportMarkDoneException e) {
-            throw e;
-        } catch (Exception e) {
-            throw new HttpReportMarkDoneException(e);
-        }
+        String responseBodyStr = this.client.post(url, 
mapper.writeValueAsBytes(body), headers);
+        return mapper.readValue(responseBodyStr, 
HttpReportMarkDoneResponse.class);
     }
 }
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/partition/actions/HttpReportMarkDoneException.java
 
b/paimon-core/src/main/java/org/apache/paimon/partition/actions/HttpReportMarkDoneException.java
deleted file mode 100644
index 56d1775754..0000000000
--- 
a/paimon-core/src/main/java/org/apache/paimon/partition/actions/HttpReportMarkDoneException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.paimon.partition.actions;
-
-/** Exception for {@link HttpReportMarkDoneAction}. */
-public class HttpReportMarkDoneException extends RuntimeException {
-
-    private static final long serialVersionUID = 1L;
-
-    public HttpReportMarkDoneException(Throwable e) {
-        super("Http request exception.", e);
-    }
-
-    public HttpReportMarkDoneException(String msg) {
-        super(msg);
-    }
-}
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/schema/SchemaManager.java 
b/paimon-core/src/main/java/org/apache/paimon/schema/SchemaManager.java
index f7af7b7c36..c31a3a616d 100644
--- a/paimon-core/src/main/java/org/apache/paimon/schema/SchemaManager.java
+++ b/paimon-core/src/main/java/org/apache/paimon/schema/SchemaManager.java
@@ -57,6 +57,7 @@ import 
org.apache.paimon.shade.guava30.com.google.common.collect.Maps;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.Serializable;
 import java.io.UncheckedIOException;
@@ -784,7 +785,7 @@ public class SchemaManager implements Serializable {
 
     /** Read schema for schema id. */
     public TableSchema schema(long id) {
-        return TableSchema.fromPath(fileIO, toSchemaPath(id));
+        return fromPath(fileIO, toSchemaPath(id));
     }
 
     /** Check if a schema exists. */
@@ -913,4 +914,22 @@ public class SchemaManager implements Serializable {
 
         return new Identifier(database, paths[paths.length - 1], branchName, 
null);
     }
+
+    public static TableSchema fromPath(FileIO fileIO, Path path) {
+        try {
+            return tryFromPath(fileIO, path);
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
+
+    public static TableSchema tryFromPath(FileIO fileIO, Path path) throws 
FileNotFoundException {
+        try {
+            return TableSchema.fromJson(fileIO.readFileUtf8(path));
+        } catch (FileNotFoundException e) {
+            throw e;
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
 }
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/utils/SnapshotManager.java 
b/paimon-core/src/main/java/org/apache/paimon/utils/SnapshotManager.java
index 09dcc567b3..6a4620ca02 100644
--- a/paimon-core/src/main/java/org/apache/paimon/utils/SnapshotManager.java
+++ b/paimon-core/src/main/java/org/apache/paimon/utils/SnapshotManager.java
@@ -124,7 +124,7 @@ public class SnapshotManager implements Serializable {
         Path path = snapshotPath(snapshotId);
         Snapshot snapshot = cache == null ? null : cache.getIfPresent(path);
         if (snapshot == null) {
-            snapshot = Snapshot.fromPath(fileIO, path);
+            snapshot = fromPath(fileIO, path);
             if (cache != null) {
                 cache.put(path, snapshot);
             }
@@ -136,7 +136,7 @@ public class SnapshotManager implements Serializable {
         Path path = snapshotPath(snapshotId);
         Snapshot snapshot = cache == null ? null : cache.getIfPresent(path);
         if (snapshot == null) {
-            snapshot = Snapshot.tryFromPath(fileIO, path);
+            snapshot = tryFromPath(fileIO, path);
             if (cache != null) {
                 cache.put(path, snapshot);
             }
@@ -541,7 +541,7 @@ public class SnapshotManager implements Serializable {
                 path -> {
                     try {
                         // do not pollution cache
-                        snapshots.add(Snapshot.tryFromPath(fileIO, path));
+                        snapshots.add(tryFromPath(fileIO, path));
                     } catch (FileNotFoundException ignored) {
                     }
                 },
@@ -724,4 +724,30 @@ public class SnapshotManager implements Serializable {
     public void commitEarliestHint(long snapshotId) throws IOException {
         HintFileUtils.commitEarliestHint(fileIO, snapshotId, 
snapshotDirectory());
     }
+
+    public static Snapshot fromPath(FileIO fileIO, Path path) {
+        try {
+            return tryFromPath(fileIO, path);
+        } catch (FileNotFoundException e) {
+            String errorMessage =
+                    String.format(
+                            "Snapshot file %s does not exist. "
+                                    + "It might have been expired by other 
jobs operating on this table. "
+                                    + "In this case, you can avoid concurrent 
modification issues by configuring "
+                                    + "write-only = true and use a dedicated 
compaction job, or configuring "
+                                    + "different expiration thresholds for 
different jobs.",
+                            path);
+            throw new RuntimeException(errorMessage, e);
+        }
+    }
+
+    public static Snapshot tryFromPath(FileIO fileIO, Path path) throws 
FileNotFoundException {
+        try {
+            return Snapshot.fromJson(fileIO.readFileUtf8(path));
+        } catch (FileNotFoundException e) {
+            throw e;
+        } catch (IOException e) {
+            throw new RuntimeException("Fails to read snapshot from path " + 
path, e);
+        }
+    }
 }
diff --git 
a/paimon-core/src/main/resources/META-INF/services/org.apache.paimon.factories.Factory
 
b/paimon-core/src/main/resources/META-INF/services/org.apache.paimon.factories.Factory
index bf6317e847..7f221e5172 100644
--- 
a/paimon-core/src/main/resources/META-INF/services/org.apache.paimon.factories.Factory
+++ 
b/paimon-core/src/main/resources/META-INF/services/org.apache.paimon.factories.Factory
@@ -38,7 +38,3 @@ 
org.apache.paimon.mergetree.compact.aggregate.factory.FieldSumAggFactory
 
org.apache.paimon.mergetree.compact.aggregate.factory.FieldThetaSketchAggFactory
 org.apache.paimon.rest.RESTCatalogFactory
 org.apache.paimon.iceberg.migrate.IcebergMigrateHadoopMetadataFactory
-org.apache.paimon.rest.auth.BearTokenAuthProviderFactory
-org.apache.paimon.rest.auth.DLFAuthProviderFactory
-org.apache.paimon.rest.auth.DLFLocalFileTokenLoaderFactory
-org.apache.paimon.rest.auth.DLFECSTokenLoaderFactory
diff --git a/paimon-core/src/test/java/org/apache/paimon/TestFileStore.java 
b/paimon-core/src/test/java/org/apache/paimon/TestFileStore.java
index 090bc58f35..8a2d2d28df 100644
--- a/paimon-core/src/test/java/org/apache/paimon/TestFileStore.java
+++ b/paimon-core/src/test/java/org/apache/paimon/TestFileStore.java
@@ -641,7 +641,7 @@ public class TestFileStore extends KeyValueFileStore {
         boolean changelogDecoupled = 
changelogManager.earliestLongLivedChangelogId() != null;
 
         Path snapshotPath = snapshotManager.snapshotPath(snapshotId);
-        Snapshot snapshot = Snapshot.fromPath(fileIO, snapshotPath);
+        Snapshot snapshot = SnapshotManager.fromPath(fileIO, snapshotPath);
 
         // snapshot file
         result.add(snapshotPath);
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/rest/HttpClientTest.java 
b/paimon-core/src/test/java/org/apache/paimon/rest/HttpClientTest.java
index dfdfe5f9b9..c80ae3fde0 100644
--- a/paimon-core/src/test/java/org/apache/paimon/rest/HttpClientTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/rest/HttpClientTest.java
@@ -27,33 +27,21 @@ import org.apache.paimon.rest.responses.ErrorResponse;
 
 import org.apache.paimon.shade.guava30.com.google.common.collect.ImmutableMap;
 
-import okhttp3.Headers;
-import okhttp3.Interceptor;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
 
 import java.io.IOException;
-import java.time.Duration;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
-import static okhttp3.ConnectionSpec.CLEARTEXT;
-import static okhttp3.ConnectionSpec.COMPATIBLE_TLS;
-import static okhttp3.ConnectionSpec.MODERN_TLS;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.spy;
 
 /** Test for {@link HttpClient}. */
 public class HttpClientTest {
@@ -170,7 +158,8 @@ public class HttpClientTest {
     @Test
     public void testDeleteWithDataSuccess() {
         server.enqueueResponse(mockResponseDataStr, 200);
-        assertDoesNotThrow(() -> httpClient.delete(MOCK_PATH, 
mockResponseData, restAuthFunction));
+        Assertions.assertDoesNotThrow(
+                () -> httpClient.delete(MOCK_PATH, mockResponseData, 
restAuthFunction));
     }
 
     @Test
@@ -186,7 +175,8 @@ public class HttpClientTest {
         HttpClient httpClient = new HttpClient(server.getBaseUrl());
         server.enqueueResponse(mockResponseDataStr, 429);
         server.enqueueResponse(mockResponseDataStr, 200);
-        assertDoesNotThrow(() -> httpClient.get(MOCK_PATH, MockRESTData.class, 
restAuthFunction));
+        Assertions.assertDoesNotThrow(
+                () -> httpClient.get(MOCK_PATH, MockRESTData.class, 
restAuthFunction));
     }
 
     @Test
@@ -209,42 +199,6 @@ public class HttpClientTest {
         assertEquals(restAuthParameter.parameters().get(queryKey), 
queryParameters.get(queryKey));
     }
 
-    @Test
-    public void testLoggingInterceptorWithRetry() throws IOException {
-        AtomicInteger retryCount = new AtomicInteger(0);
-        LoggingInterceptor loggingInterceptor = spy(new LoggingInterceptor());
-        doAnswer(
-                        invocation -> {
-                            retryCount.incrementAndGet();
-                            Object argument = invocation.getArguments()[0];
-                            Interceptor.Chain chain = (Interceptor.Chain) 
argument;
-                            return chain.proceed(chain.request());
-                        })
-                .when(loggingInterceptor)
-                .intercept(any());
-        OkHttpClient okHttpClient =
-                new OkHttpClient.Builder()
-                        .retryOnConnectionFailure(true)
-                        .connectionSpecs(Arrays.asList(MODERN_TLS, 
COMPATIBLE_TLS, CLEARTEXT))
-                        .addInterceptor(new ExponentialHttpRetryInterceptor(5))
-                        .addInterceptor(loggingInterceptor)
-                        .connectTimeout(Duration.ofMinutes(3))
-                        .readTimeout(Duration.ofMinutes(2))
-                        .build();
-        server.enqueueResponse(mockResponseDataStr, 429);
-        server.enqueueResponse(mockResponseDataStr, 429);
-        server.enqueueResponse(mockResponseDataStr, 200);
-        Request request =
-                new Request.Builder()
-                        .url(HttpClient.getRequestUrl(server.getBaseUrl(), 
MOCK_PATH, null))
-                        .get()
-                        .headers(Headers.of())
-                        .build();
-        Response response = okHttpClient.newCall(request).execute();
-        assertEquals(200, response.code());
-        assertEquals(3, retryCount.get());
-    }
-
     private Map<String, String> getParameters(String path) {
         String[] paths = path.split("\\?");
         if (paths.length == 1) {
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/table/SimpleTableTestBase.java 
b/paimon-core/src/test/java/org/apache/paimon/table/SimpleTableTestBase.java
index d8e89c30f6..27ac1efecd 100644
--- a/paimon-core/src/test/java/org/apache/paimon/table/SimpleTableTestBase.java
+++ b/paimon-core/src/test/java/org/apache/paimon/table/SimpleTableTestBase.java
@@ -1094,7 +1094,7 @@ public abstract class SimpleTableTestBase {
 
         // verify test-tag in test-branch is equal to snapshot 2
         Snapshot branchTag =
-                Snapshot.fromPath(
+                SnapshotManager.fromPath(
                         table.fileIO(),
                         
tagManager.copyWithBranch("test-branch").tagPath("test-tag"));
         assertThat(branchTag.equals(snapshot2)).isTrue();
@@ -1103,14 +1103,14 @@ public abstract class SimpleTableTestBase {
         SnapshotManager snapshotManager =
                 newSnapshotManager(table.fileIO(), table.location(), 
"test-branch");
         Snapshot branchSnapshot =
-                Snapshot.fromPath(table.fileIO(), 
snapshotManager.snapshotPath(2));
+                SnapshotManager.fromPath(table.fileIO(), 
snapshotManager.snapshotPath(2));
         assertThat(branchSnapshot.equals(snapshot2)).isTrue();
 
         // verify schema in test-branch is equal to schema 0
         SchemaManager schemaManager =
                 new SchemaManager(table.fileIO(), table.location(), 
"test-branch");
         TableSchema branchSchema =
-                TableSchema.fromPath(table.fileIO(), 
schemaManager.toSchemaPath(0));
+                SchemaManager.fromPath(table.fileIO(), 
schemaManager.toSchemaPath(0));
         TableSchema schema0 = schemaManager.schema(0);
         assertThat(branchSchema.equals(schema0)).isTrue();
     }
@@ -1267,16 +1267,17 @@ public abstract class SimpleTableTestBase {
         // verify snapshot in branch1 and main branch is same
         SnapshotManager snapshotManager = newSnapshotManager(table.fileIO(), 
table.location());
         Snapshot branchSnapshot =
-                Snapshot.fromPath(
+                SnapshotManager.fromPath(
                         table.fileIO(),
                         
snapshotManager.copyWithBranch(BRANCH_NAME).snapshotPath(2));
-        Snapshot snapshot = Snapshot.fromPath(table.fileIO(), 
snapshotManager.snapshotPath(2));
+        Snapshot snapshot =
+                SnapshotManager.fromPath(table.fileIO(), 
snapshotManager.snapshotPath(2));
         assertThat(branchSnapshot.equals(snapshot)).isTrue();
 
         // verify schema in branch1 and main branch is same
         SchemaManager schemaManager = new SchemaManager(table.fileIO(), 
table.location());
         TableSchema branchSchema =
-                TableSchema.fromPath(
+                SchemaManager.fromPath(
                         table.fileIO(), 
schemaManager.copyWithBranch(BRANCH_NAME).toSchemaPath(0));
         TableSchema schema0 = schemaManager.schema(0);
         assertThat(branchSchema.equals(schema0)).isTrue();
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/partition/HttpReportMarkDoneActionTest.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/partition/HttpReportMarkDoneActionTest.java
index dea8b1d47a..065591b9df 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/partition/HttpReportMarkDoneActionTest.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/partition/HttpReportMarkDoneActionTest.java
@@ -24,7 +24,6 @@ import org.apache.paimon.fs.local.LocalFileIO;
 import org.apache.paimon.options.Options;
 import org.apache.paimon.partition.actions.HttpReportMarkDoneAction;
 import 
org.apache.paimon.partition.actions.HttpReportMarkDoneAction.HttpReportMarkDoneRequest;
-import org.apache.paimon.partition.actions.HttpReportMarkDoneException;
 import org.apache.paimon.rest.TestHttpWebServer;
 import org.apache.paimon.schema.Schema;
 import org.apache.paimon.schema.SchemaManager;
@@ -49,7 +48,6 @@ import java.util.HashMap;
 import java.util.concurrent.TimeUnit;
 
 import static org.apache.paimon.CoreOptions.PARTITION_MARK_DONE_ACTION_PARAMS;
-import static org.apache.paimon.CoreOptions.PARTITION_MARK_DONE_ACTION_TIMEOUT;
 import static org.apache.paimon.CoreOptions.PARTITION_MARK_DONE_ACTION_URL;
 import static org.apache.paimon.utils.InternalRowUtilsTest.ROW_TYPE;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -130,13 +128,11 @@ public class HttpReportMarkDoneActionTest {
         // empty response.
         server.enqueueResponse("", 200);
         Assertions.assertThatThrownBy(() -> markDoneAction.markDone(partition))
-                .isInstanceOf(HttpReportMarkDoneException.class)
                 .hasMessageContaining("ResponseBody is null or empty.");
 
         // 400.
         server.enqueueResponse(successResponse, 400);
         Assertions.assertThatThrownBy(() -> markDoneAction.markDone(partition))
-                .isInstanceOf(HttpReportMarkDoneException.class)
                 .hasMessageContaining("Response is not successful");
     }
 
@@ -157,7 +153,6 @@ public class HttpReportMarkDoneActionTest {
     public static CoreOptions createCoreOptions() {
         HashMap<String, String> httpOptions = new HashMap<>();
         httpOptions.put(PARTITION_MARK_DONE_ACTION_URL.key(), 
server.getBaseUrl());
-        httpOptions.put(PARTITION_MARK_DONE_ACTION_TIMEOUT.key(), "2 s");
         if (params != null) {
             httpOptions.put(PARTITION_MARK_DONE_ACTION_PARAMS.key(), params);
         }


Reply via email to