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