You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fluss.apache.org by ja...@apache.org on 2025/08/25 11:26:04 UTC

(fluss) 01/02: [infra] Update project package name to org.apache.fluss

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

jark pushed a commit to branch ci-rename-to-apache
in repository https://gitbox.apache.org/repos/asf/fluss.git

commit db12388ec392ff3797f74ddfed12607bc6775ef2
Author: Jark Wu <ja...@apache.org>
AuthorDate: Mon Aug 25 13:38:27 2025 +0800

    [infra] Update project package name to org.apache.fluss
    
    Co-authored-by: benjobs <be...@apache.org>
---
 .github/ISSUE_TEMPLATE/bug.yml                     |    4 +-
 .github/ISSUE_TEMPLATE/feature.yml                 |    4 +-
 .github/ISSUE_TEMPLATE/task.yml                    |    4 +-
 .github/PULL_REQUEST_TEMPLATE.md                   |    2 +-
 fluss-client/pom.xml                               |   18 +-
 .../java/com/alibaba/fluss/client/Connection.java  |   62 -
 .../alibaba/fluss/client/ConnectionFactory.java    |   68 -
 .../com/alibaba/fluss/client/FlussConnection.java  |  213 ---
 .../java/com/alibaba/fluss/client/admin/Admin.java |  453 -----
 .../fluss/client/admin/CreateAclsResult.java       |   97 --
 .../alibaba/fluss/client/admin/DropAclsResult.java |  169 --
 .../fluss/client/admin/ListOffsetsResult.java      |   53 -
 .../com/alibaba/fluss/client/admin/OffsetSpec.java |   51 -
 .../fluss/client/lookup/AbstractLookupBatch.java   |   59 -
 .../fluss/client/lookup/AbstractLookupQuery.java   |   48 -
 .../com/alibaba/fluss/client/lookup/Lookup.java    |   99 --
 .../alibaba/fluss/client/lookup/LookupBatch.java   |   79 -
 .../alibaba/fluss/client/lookup/LookupClient.java  |  122 --
 .../alibaba/fluss/client/lookup/LookupQuery.java   |   48 -
 .../alibaba/fluss/client/lookup/LookupQueue.java   |  106 --
 .../alibaba/fluss/client/lookup/LookupResult.java  |   83 -
 .../alibaba/fluss/client/lookup/LookupType.java    |   27 -
 .../com/alibaba/fluss/client/lookup/Lookuper.java  |   44 -
 .../alibaba/fluss/client/lookup/PrefixLookup.java  |   51 -
 .../fluss/client/lookup/PrefixLookupBatch.java     |   78 -
 .../fluss/client/lookup/PrefixLookupQuery.java     |   48 -
 .../alibaba/fluss/client/lookup/TableLookup.java   |   66 -
 .../fluss/client/metadata/KvSnapshotMetadata.java  |   66 -
 .../alibaba/fluss/client/metadata/KvSnapshots.java |   90 -
 .../fluss/client/metadata/LakeSnapshot.java        |   76 -
 .../fluss/client/metrics/ScannerMetricGroup.java   |  135 --
 .../fluss/client/metrics/WriterMetricGroup.java    |  104 --
 .../com/alibaba/fluss/client/table/FlussTable.java |   93 -
 .../java/com/alibaba/fluss/client/table/Table.java |   75 -
 .../fluss/client/table/getter/PartitionGetter.java |   68 -
 .../alibaba/fluss/client/table/scanner/Scan.java   |   83 -
 .../fluss/client/table/scanner/ScanRecord.java     |   93 -
 .../fluss/client/table/scanner/TableScan.java      |  138 --
 .../client/table/scanner/batch/BatchScanUtils.java |  108 --
 .../client/table/scanner/batch/BatchScanner.java   |   53 -
 .../scanner/batch/KvSnapshotBatchScanner.java      |  223 ---
 .../table/scanner/batch/SnapshotFilesReader.java   |  163 --
 .../client/table/scanner/log/BucketScanStatus.java |   52 -
 .../client/table/scanner/log/CompletedFetch.java   |  258 ---
 .../table/scanner/log/CompletedPendingFetch.java   |   48 -
 .../table/scanner/log/DefaultCompletedFetch.java   |   51 -
 .../client/table/scanner/log/LogFetchBuffer.java   |  280 ---
 .../table/scanner/log/LogFetchCollector.java       |  292 ----
 .../fluss/client/table/scanner/log/LogScan.java    |   56 -
 .../fluss/client/table/scanner/log/LogScanner.java |  124 --
 .../client/table/scanner/log/LogScannerStatus.java |  104 --
 .../client/table/scanner/log/PendingFetch.java     |   33 -
 .../table/scanner/log/RemoteCompletedFetch.java    |   75 -
 .../table/scanner/log/RemoteLogDownloadFuture.java |   63 -
 .../table/scanner/log/RemotePendingFetch.java      |   97 --
 .../client/table/scanner/log/ScanRecords.java      |  116 --
 .../client/table/writer/AbstractTableWriter.java   |   99 --
 .../alibaba/fluss/client/table/writer/Append.java  |   37 -
 .../fluss/client/table/writer/AppendResult.java    |   32 -
 .../fluss/client/table/writer/AppendWriter.java    |   40 -
 .../client/table/writer/AppendWriterImpl.java      |   99 --
 .../fluss/client/table/writer/DeleteResult.java    |   32 -
 .../fluss/client/table/writer/TableAppend.java     |   41 -
 .../fluss/client/table/writer/TableUpsert.java     |   98 --
 .../fluss/client/table/writer/TableWriter.java     |   41 -
 .../alibaba/fluss/client/table/writer/Upsert.java  |   67 -
 .../fluss/client/table/writer/UpsertResult.java    |   32 -
 .../fluss/client/table/writer/UpsertWrite.java     |   75 -
 .../fluss/client/table/writer/UpsertWriter.java    |   49 -
 .../client/table/writer/UpsertWriterImpl.java      |  167 --
 .../client/token/DefaultSecurityTokenManager.java  |  185 --
 .../client/token/DefaultSecurityTokenProvider.java |   41 -
 .../fluss/client/token/SecurityTokenManager.java   |   28 -
 .../fluss/client/token/SecurityTokenProvider.java  |   31 -
 .../token/SecurityTokenReceiverRepository.java     |   93 -
 .../fluss/client/utils/ClientRpcMessageUtils.java  |  351 ----
 .../alibaba/fluss/client/utils/ClientUtils.java    |  135 --
 .../alibaba/fluss/client/utils/MetadataUtils.java  |  324 ----
 .../fluss/client/write/ArrowLogWriteBatch.java     |  139 --
 .../alibaba/fluss/client/write/BucketAssigner.java |   50 -
 .../fluss/client/write/DynamicBucketAssigner.java  |   36 -
 .../client/write/DynamicPartitionCreator.java      |  163 --
 .../write/DynamicWriteBatchSizeEstimator.java      |   90 -
 .../fluss/client/write/HashBucketAssigner.java     |   43 -
 .../fluss/client/write/IdempotenceBucketEntry.java |  190 --
 .../fluss/client/write/IdempotenceBucketMap.java   |  117 --
 .../fluss/client/write/IdempotenceManager.java     |  340 ----
 .../fluss/client/write/IncompleteBatches.java      |   77 -
 .../fluss/client/write/IndexedLogWriteBatch.java   |  140 --
 .../alibaba/fluss/client/write/KvWriteBatch.java   |  165 --
 .../fluss/client/write/ReadyWriteBatch.java        |   43 -
 .../client/write/RoundRobinBucketAssigner.java     |   64 -
 .../fluss/client/write/StaticBucketAssigner.java   |   51 -
 .../fluss/client/write/StickyBucketAssigner.java   |   99 --
 .../com/alibaba/fluss/client/write/WriteBatch.java |  288 ---
 .../alibaba/fluss/client/write/WriteCallback.java  |   33 -
 .../alibaba/fluss/client/write/WriteFormat.java    |   28 -
 .../alibaba/fluss/client/write/WriteRecord.java    |  181 --
 .../alibaba/fluss/client/write/WriterClient.java   |  344 ----
 .../java/org/apache/fluss/client/Connection.java   |   62 +
 .../org/apache/fluss/client/ConnectionFactory.java |   68 +
 .../org/apache/fluss/client/FlussConnection.java   |  213 +++
 .../java/org/apache/fluss/client/admin/Admin.java  |  453 +++++
 .../fluss/client/admin/CreateAclsResult.java       |   97 ++
 .../apache/fluss/client/admin/DropAclsResult.java  |  169 ++
 .../apache}/fluss/client/admin/FlussAdmin.java     |    0
 .../fluss/client/admin/ListOffsetsResult.java      |   53 +
 .../org/apache/fluss/client/admin/OffsetSpec.java  |   51 +
 .../fluss/client/lookup/AbstractLookupBatch.java   |   59 +
 .../fluss/client/lookup/AbstractLookupQuery.java   |   48 +
 .../org/apache/fluss/client/lookup/Lookup.java     |   99 ++
 .../apache/fluss/client/lookup/LookupBatch.java    |   79 +
 .../apache/fluss/client/lookup/LookupClient.java   |  122 ++
 .../apache/fluss/client/lookup/LookupQuery.java    |   48 +
 .../apache/fluss/client/lookup/LookupQueue.java    |  106 ++
 .../apache/fluss/client/lookup/LookupResult.java   |   83 +
 .../apache}/fluss/client/lookup/LookupSender.java  |    0
 .../org/apache/fluss/client/lookup/LookupType.java |   27 +
 .../org/apache/fluss/client/lookup/Lookuper.java   |   44 +
 .../fluss/client/lookup/PrefixKeyLookuper.java     |    0
 .../apache/fluss/client/lookup/PrefixLookup.java   |   51 +
 .../fluss/client/lookup/PrefixLookupBatch.java     |   78 +
 .../fluss/client/lookup/PrefixLookupQuery.java     |   48 +
 .../fluss/client/lookup/PrimaryKeyLookuper.java    |    0
 .../apache/fluss/client/lookup/TableLookup.java    |   66 +
 .../fluss/client/metadata/KvSnapshotMetadata.java  |   66 +
 .../apache/fluss/client/metadata/KvSnapshots.java  |   90 +
 .../apache/fluss/client/metadata/LakeSnapshot.java |   76 +
 .../fluss/client/metadata/MetadataUpdater.java     |    0
 .../fluss/client/metrics/ScannerMetricGroup.java   |  135 ++
 .../fluss/client/metrics/WriterMetricGroup.java    |  104 ++
 .../org/apache/fluss/client/table/FlussTable.java  |   93 +
 .../java/org/apache/fluss/client/table/Table.java  |   75 +
 .../fluss/client/table/getter/PartitionGetter.java |   68 +
 .../client/table/scanner/RemoteFileDownloader.java |    0
 .../apache/fluss/client/table/scanner/Scan.java    |   83 +
 .../fluss/client/table/scanner/ScanRecord.java     |   93 +
 .../fluss/client/table/scanner/TableScan.java      |  138 ++
 .../client/table/scanner/batch/BatchScanUtils.java |  108 ++
 .../client/table/scanner/batch/BatchScanner.java   |   53 +
 .../scanner/batch/KvSnapshotBatchScanner.java      |  223 +++
 .../table/scanner/batch/LimitBatchScanner.java     |    0
 .../table/scanner/batch/SnapshotFilesReader.java   |  163 ++
 .../client/table/scanner/log/BucketScanStatus.java |   52 +
 .../client/table/scanner/log/CompletedFetch.java   |  258 +++
 .../table/scanner/log/CompletedPendingFetch.java   |   48 +
 .../table/scanner/log/DefaultCompletedFetch.java   |   51 +
 .../client/table/scanner/log/LogFetchBuffer.java   |  280 +++
 .../table/scanner/log/LogFetchCollector.java       |  292 ++++
 .../fluss/client/table/scanner/log/LogFetcher.java |    0
 .../fluss/client/table/scanner/log/LogScan.java    |   56 +
 .../fluss/client/table/scanner/log/LogScanner.java |  124 ++
 .../client/table/scanner/log/LogScannerImpl.java   |    0
 .../client/table/scanner/log/LogScannerStatus.java |  104 ++
 .../client/table/scanner/log/PendingFetch.java     |   33 +
 .../table/scanner/log/RemoteCompletedFetch.java    |   75 +
 .../table/scanner/log/RemoteLogDownloadFuture.java |   63 +
 .../table/scanner/log/RemoteLogDownloader.java     |    0
 .../table/scanner/log/RemotePendingFetch.java      |   97 ++
 .../client/table/scanner/log/ScanRecords.java      |  116 ++
 .../client/table/writer/AbstractTableWriter.java   |   99 ++
 .../apache/fluss/client/table/writer/Append.java   |   37 +
 .../fluss/client/table/writer/AppendResult.java    |   32 +
 .../fluss/client/table/writer/AppendWriter.java    |   40 +
 .../client/table/writer/AppendWriterImpl.java      |   99 ++
 .../fluss/client/table/writer/DeleteResult.java    |   32 +
 .../fluss/client/table/writer/TableAppend.java     |   41 +
 .../fluss/client/table/writer/TableUpsert.java     |   98 ++
 .../fluss/client/table/writer/TableWriter.java     |   41 +
 .../apache/fluss/client/table/writer/Upsert.java   |   67 +
 .../fluss/client/table/writer/UpsertResult.java    |   32 +
 .../fluss/client/table/writer/UpsertWrite.java     |   75 +
 .../fluss/client/table/writer/UpsertWriter.java    |   49 +
 .../client/table/writer/UpsertWriterImpl.java      |  167 ++
 .../client/token/DefaultSecurityTokenManager.java  |  185 ++
 .../client/token/DefaultSecurityTokenProvider.java |   41 +
 .../fluss/client/token/SecurityTokenManager.java   |   28 +
 .../fluss/client/token/SecurityTokenProvider.java  |   31 +
 .../token/SecurityTokenReceiverRepository.java     |   93 +
 .../fluss/client/utils/ClientRpcMessageUtils.java  |  351 ++++
 .../org/apache/fluss/client/utils/ClientUtils.java |  135 ++
 .../apache/fluss/client/utils/MetadataUtils.java   |  324 ++++
 .../fluss/client/write/ArrowLogWriteBatch.java     |  139 ++
 .../apache/fluss/client/write/BucketAssigner.java  |   50 +
 .../fluss/client/write/DynamicBucketAssigner.java  |   36 +
 .../client/write/DynamicPartitionCreator.java      |  163 ++
 .../write/DynamicWriteBatchSizeEstimator.java      |   90 +
 .../fluss/client/write/HashBucketAssigner.java     |   43 +
 .../fluss/client/write/IdempotenceBucketEntry.java |  190 ++
 .../fluss/client/write/IdempotenceBucketMap.java   |  117 ++
 .../fluss/client/write/IdempotenceManager.java     |  340 ++++
 .../fluss/client/write/IncompleteBatches.java      |   77 +
 .../fluss/client/write/IndexedLogWriteBatch.java   |  140 ++
 .../apache/fluss/client/write/KvWriteBatch.java    |  165 ++
 .../apache/fluss/client/write/ReadyWriteBatch.java |   43 +
 .../fluss/client/write/RecordAccumulator.java      |    0
 .../client/write/RoundRobinBucketAssigner.java     |   64 +
 .../apache}/fluss/client/write/Sender.java         |    0
 .../fluss/client/write/StaticBucketAssigner.java   |   51 +
 .../fluss/client/write/StickyBucketAssigner.java   |   99 ++
 .../org/apache/fluss/client/write/WriteBatch.java  |  288 +++
 .../apache/fluss/client/write/WriteCallback.java   |   33 +
 .../org/apache/fluss/client/write/WriteFormat.java |   28 +
 .../org/apache/fluss/client/write/WriteRecord.java |  181 ++
 .../apache/fluss/client/write/WriterClient.java    |  344 ++++
 .../client/admin/ClientToServerITCaseBase.java     |  290 ---
 .../fluss/client/admin/FlussAdminITCase.java       | 1053 -----------
 .../fluss/client/lookup/LookupQueueTest.java       |   66 -
 .../fluss/client/metadata/MetadataUpdaterTest.java |  124 --
 .../client/metadata/TestingMetadataUpdater.java    |  167 --
 .../client/metrics/TestingScannerMetricGroup.java  |   35 -
 .../client/metrics/TestingWriterMetricGroup.java   |   32 -
 .../client/table/AutoPartitionedTableITCase.java   |  408 -----
 .../client/table/FlussFailServerTableITCase.java   |  157 --
 .../fluss/client/table/FlussLakeTableITCase.java   |  361 ----
 .../fluss/client/table/FlussTableITCase.java       | 1182 -------------
 .../fluss/client/table/PartitionedTableITCase.java |  261 ---
 .../fluss/client/table/scanner/ScanRecordTest.java |   45 -
 .../batch/KvSnapshotBatchScannerITCase.java        |  174 --
 .../scanner/log/DefaultCompletedFetchTest.java     |  257 ---
 .../table/scanner/log/LogFetchBufferTest.java      |  292 ----
 .../table/scanner/log/LogFetchCollectorTest.java   |  163 --
 .../client/table/scanner/log/LogFetcherTest.java   |  213 ---
 .../client/table/scanner/log/LogScannerITCase.java |  470 -----
 .../scanner/log/RemoteCompletedFetchTest.java      |  325 ----
 .../table/scanner/log/RemoteLogScannerITCase.java  |  280 ---
 .../client/table/scanner/log/ScanRecordsTest.java  |   60 -
 .../token/DefaultSecurityTokenManagerTest.java     |   90 -
 .../client/token/TestingSecurityTokenProvider.java |   69 -
 .../client/token/TestingSecurityTokenReceiver.java |   32 -
 .../write/DynamicWriteBatchSizeEstimatorTest.java  |   81 -
 .../fluss/client/write/HashBucketAssignerTest.java |  156 --
 .../client/write/IndexedLogWriteBatchTest.java     |  244 ---
 .../fluss/client/write/KvWriteBatchTest.java       |  248 ---
 .../fluss/client/write/RecordAccumulatorTest.java  |  669 -------
 .../com/alibaba/fluss/client/write/SenderTest.java |  809 ---------
 .../write/StickyStaticBucketAssignerTest.java      |  237 ---
 .../client/admin/ClientToServerITCaseBase.java     |  290 +++
 .../fluss/client/admin/FlussAdminITCase.java       | 1053 +++++++++++
 .../fluss/client/lookup/LookupQueueTest.java       |   66 +
 .../fluss/client/metadata/MetadataUpdaterTest.java |  124 ++
 .../client/metadata/TestingMetadataUpdater.java    |  167 ++
 .../client/metrics/TestingScannerMetricGroup.java  |   35 +
 .../client/metrics/TestingWriterMetricGroup.java   |   32 +
 .../security/acl/FlussAuthorizationITCase.java     |    0
 .../client/table/AutoPartitionedTableITCase.java   |  408 +++++
 .../client/table/FlussFailServerTableITCase.java   |  157 ++
 .../fluss/client/table/FlussLakeTableITCase.java   |  361 ++++
 .../fluss/client/table/FlussTableITCase.java       | 1182 +++++++++++++
 .../fluss/client/table/PartitionedTableITCase.java |  261 +++
 .../fluss/client/table/scanner/ScanRecordTest.java |   45 +
 .../batch/KvSnapshotBatchScannerITCase.java        |  174 ++
 .../scanner/log/DefaultCompletedFetchTest.java     |  257 +++
 .../table/scanner/log/LogFetchBufferTest.java      |  292 ++++
 .../table/scanner/log/LogFetchCollectorTest.java   |  163 ++
 .../client/table/scanner/log/LogFetcherTest.java   |  213 +++
 .../client/table/scanner/log/LogScannerITCase.java |  470 +++++
 .../scanner/log/RemoteCompletedFetchTest.java      |  325 ++++
 .../table/scanner/log/RemoteLogDownloaderTest.java |    0
 .../table/scanner/log/RemoteLogScannerITCase.java  |  280 +++
 .../client/table/scanner/log/ScanRecordsTest.java  |   60 +
 .../token/DefaultSecurityTokenManagerTest.java     |   90 +
 .../client/token/TestingSecurityTokenProvider.java |   69 +
 .../client/token/TestingSecurityTokenReceiver.java |   32 +
 .../fluss/client/write/ArrowLogWriteBatchTest.java |    0
 .../write/DynamicWriteBatchSizeEstimatorTest.java  |   81 +
 .../fluss/client/write/HashBucketAssignerTest.java |  156 ++
 .../client/write/IndexedLogWriteBatchTest.java     |  244 +++
 .../fluss/client/write/KvWriteBatchTest.java       |  248 +++
 .../fluss/client/write/RecordAccumulatorTest.java  |  669 +++++++
 .../org/apache/fluss/client/write/SenderTest.java  |  809 +++++++++
 .../write/StickyStaticBucketAssignerTest.java      |  237 +++
 ...om.alibaba.fluss.fs.token.SecurityTokenReceiver |    2 +-
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-common/pom.xml                               |    4 +-
 .../com/alibaba/fluss/annotation/Internal.java     |   31 -
 .../alibaba/fluss/annotation/PublicEvolving.java   |   32 -
 .../com/alibaba/fluss/annotation/PublicStable.java |   36 -
 .../alibaba/fluss/annotation/PublicUnstable.java   |   31 -
 .../fluss/annotation/VisibleForTesting.java        |   35 -
 .../alibaba/fluss/bucketing/BucketingFunction.java |   50 -
 .../fluss/bucketing/FlussBucketingFunction.java    |   43 -
 .../fluss/bucketing/PaimonBucketingFunction.java   |   28 -
 .../com/alibaba/fluss/cluster/BucketLocation.java  |  126 --
 .../java/com/alibaba/fluss/cluster/Cluster.java    |  326 ----
 .../java/com/alibaba/fluss/cluster/Endpoint.java   |  246 ---
 .../java/com/alibaba/fluss/cluster/ServerNode.java |  145 --
 .../java/com/alibaba/fluss/cluster/ServerType.java |   24 -
 .../alibaba/fluss/cluster/TabletServerInfo.java    |   59 -
 .../ArrowCompressionRatioEstimator.java            |   69 -
 .../fluss/compression/ArrowCompressionType.java    |   33 -
 .../compression/FlussLZ4BlockInputStream.java      |  306 ----
 .../compression/FlussLZ4BlockOutputStream.java     |  389 -----
 .../fluss/config/AutoPartitionTimeUnit.java        |   34 -
 .../com/alibaba/fluss/config/ConfigBuilder.java    |  244 ---
 .../com/alibaba/fluss/config/ConfigOption.java     |  270 ---
 .../com/alibaba/fluss/config/ConfigOptions.java    | 1692 ------------------
 .../com/alibaba/fluss/config/Configuration.java    |  748 --------
 .../alibaba/fluss/config/ConfigurationUtils.java   |  281 ---
 .../java/com/alibaba/fluss/config/FallbackKey.java |   77 -
 .../com/alibaba/fluss/config/FlussConfigUtils.java |   62 -
 .../alibaba/fluss/config/GlobalConfiguration.java  |  205 ---
 .../java/com/alibaba/fluss/config/MemorySize.java  |  417 -----
 .../java/com/alibaba/fluss/config/Password.java    |   71 -
 .../com/alibaba/fluss/config/ReadableConfig.java   |   54 -
 .../fluss/config/StructuredOptionsSplitter.java    |  210 ---
 .../java/com/alibaba/fluss/config/TableConfig.java |  118 --
 .../com/alibaba/fluss/exception/ApiException.java  |   45 -
 .../fluss/exception/AuthenticationException.java   |   35 -
 .../fluss/exception/AuthorizationException.java    |   31 -
 .../fluss/exception/BufferExhaustedException.java  |   36 -
 .../fluss/exception/CorruptMessageException.java   |   49 -
 .../fluss/exception/CorruptRecordException.java    |   48 -
 .../fluss/exception/CorruptSnapshotException.java  |   32 -
 .../exception/DatabaseAlreadyExistException.java   |   37 -
 .../fluss/exception/DatabaseNotEmptyException.java |   36 -
 .../fluss/exception/DatabaseNotExistException.java |   36 -
 .../fluss/exception/DisconnectException.java       |   35 -
 .../exception/DuplicateSequenceException.java      |   31 -
 .../exception/FencedLeaderEpochException.java      |   25 -
 .../exception/FencedTieringEpochException.java     |   26 -
 .../alibaba/fluss/exception/FetchException.java    |   42 -
 .../alibaba/fluss/exception/FlussException.java    |   58 -
 .../fluss/exception/FlussRuntimeException.java     |   59 -
 .../exception/IllegalConfigurationException.java   |   65 -
 .../exception/IndexOffsetOverflowException.java    |   36 -
 .../fluss/exception/InvalidBucketsException.java   |   28 -
 .../InvalidColumnProjectionException.java          |   35 -
 .../fluss/exception/InvalidConfigException.java    |   35 -
 .../exception/InvalidCoordinatorException.java     |   25 -
 .../fluss/exception/InvalidDatabaseException.java  |   44 -
 .../fluss/exception/InvalidMetadataException.java  |   43 -
 .../fluss/exception/InvalidOffsetException.java    |   40 -
 .../fluss/exception/InvalidPartitionException.java |   35 -
 .../fluss/exception/InvalidRecordException.java    |   39 -
 .../InvalidReplicationFactorException.java         |   35 -
 .../exception/InvalidRequiredAcksException.java    |   34 -
 .../exception/InvalidServerRackInfoException.java  |   28 -
 .../fluss/exception/InvalidTableException.java     |   44 -
 .../exception/InvalidTargetColumnException.java    |   33 -
 .../fluss/exception/InvalidTimestampException.java |   33 -
 .../exception/InvalidUpdateVersionException.java   |   29 -
 .../exception/KvSnapshotNotExistException.java     |   35 -
 .../fluss/exception/KvStorageException.java        |   53 -
 .../LakeStorageNotConfiguredException.java         |   35 -
 .../LakeTableSnapshotNotExistException.java        |   35 -
 .../exception/LeaderNotAvailableException.java     |   40 -
 .../exception/LogOffsetOutOfRangeException.java    |   40 -
 .../exception/LogRecordAppendFailedException.java  |   37 -
 .../LogSegmentOffsetOverflowException.java         |   36 -
 .../fluss/exception/LogStorageException.java       |   54 -
 .../alibaba/fluss/exception/NetworkException.java  |   44 -
 .../exception/NonPrimaryKeyTableException.java     |   36 -
 .../NotEnoughReplicasAfterAppendException.java     |   36 -
 .../exception/NotEnoughReplicasException.java      |   38 -
 .../exception/NotLeaderOrFollowerException.java    |   47 -
 .../exception/OperationNotAttemptedException.java  |   29 -
 .../exception/OutOfOrderSequenceException.java     |   34 -
 .../exception/PartitionAlreadyExistsException.java |   32 -
 .../exception/PartitionNotExistException.java      |   35 -
 .../fluss/exception/RecordTooLargeException.java   |   42 -
 .../exception/RemoteResourceNotFoundException.java |   43 -
 .../fluss/exception/RemoteStorageException.java    |   41 -
 .../RetriableAuthenticationException.java          |   29 -
 .../fluss/exception/RetriableException.java        |   36 -
 .../fluss/exception/SchemaNotExistException.java   |   37 -
 .../fluss/exception/SecurityDisabledException.java |   32 -
 .../fluss/exception/SecurityTokenException.java    |   39 -
 .../fluss/exception/StaleMetadataException.java    |   36 -
 .../alibaba/fluss/exception/StorageException.java  |   44 -
 .../exception/TableAlreadyExistException.java      |   37 -
 .../fluss/exception/TableNotExistException.java    |   36 -
 .../exception/TableNotPartitionedException.java    |   35 -
 .../alibaba/fluss/exception/TimeoutException.java  |   36 -
 .../fluss/exception/TooManyBucketsException.java   |   39 -
 .../exception/TooManyPartitionsException.java      |   35 -
 .../fluss/exception/TraversableOnceException.java  |   38 -
 .../fluss/exception/UnknownServerException.java    |   44 -
 .../exception/UnknownTableOrBucketException.java   |   47 -
 .../fluss/exception/UnknownWriterIdException.java  |   34 -
 .../exception/UnsupportedVersionException.java     |   40 -
 .../alibaba/fluss/exception/WakeupException.java   |   33 -
 .../alibaba/fluss/fs/ClosingFSDataInputStream.java |   92 -
 .../fluss/fs/ClosingFSDataOutputStream.java        |   92 -
 .../com/alibaba/fluss/fs/FSDataInputStream.java    |   53 -
 .../alibaba/fluss/fs/FSDataInputStreamWrapper.java |   97 --
 .../com/alibaba/fluss/fs/FSDataOutputStream.java   |  105 --
 .../fluss/fs/FSDataOutputStreamWrapper.java        |   72 -
 .../main/java/com/alibaba/fluss/fs/FileStatus.java |   49 -
 .../com/alibaba/fluss/fs/FileSystemPlugin.java     |   49 -
 .../com/alibaba/fluss/fs/FileSystemSafetyNet.java  |  122 --
 .../src/main/java/com/alibaba/fluss/fs/FsPath.java |  393 -----
 .../com/alibaba/fluss/fs/FsPathAndFileName.java    |   78 -
 .../alibaba/fluss/fs/PluginFileSystemWrapper.java  |  147 --
 .../fluss/fs/SafetyNetCloseableRegistry.java       |  238 ---
 .../fluss/fs/SafetyNetWrapperFileSystem.java       |  109 --
 .../fs/UnsupportedFileSystemSchemeException.java   |   45 -
 .../alibaba/fluss/fs/WrappingProxyCloseable.java   |   27 -
 .../fluss/fs/local/LocalDataInputStream.java       |   90 -
 .../fluss/fs/local/LocalDataOutputStream.java      |   93 -
 .../alibaba/fluss/fs/local/LocalFileStatus.java    |   78 -
 .../alibaba/fluss/fs/local/LocalFileSystem.java    |  285 ---
 .../fluss/fs/local/LocalFileSystemPlugin.java      |   40 -
 .../fluss/fs/local/LocalSecurityTokenReceiver.java |   35 -
 .../com/alibaba/fluss/fs/token/Credentials.java    |   44 -
 .../fluss/fs/token/ObtainedSecurityToken.java      |   66 -
 .../fluss/fs/token/SecurityTokenReceiver.java      |   35 -
 .../alibaba/fluss/fs/utils/FileDownloadSpec.java   |   47 -
 .../alibaba/fluss/fs/utils/FileDownloadUtils.java  |  191 --
 .../alibaba/fluss/lake/batch/ArrowRecordBatch.java |   28 -
 .../com/alibaba/fluss/lake/batch/RecordBatch.java  |   28 -
 .../lake/committer/CommittedLakeSnapshot.java      |   94 -
 .../fluss/lake/committer/CommitterInitContext.java |   38 -
 .../fluss/lake/committer/LakeCommitter.java        |   78 -
 .../fluss/lake/lakestorage/LakeCatalog.java        |   47 -
 .../fluss/lake/lakestorage/LakeStoragePlugin.java  |   46 -
 .../lake/serializer/SimpleVersionedSerializer.java |   60 -
 .../fluss/lake/writer/LakeTieringFactory.java      |   74 -
 .../com/alibaba/fluss/lake/writer/LakeWriter.java  |   50 -
 .../lake/writer/SupportsRecordBatchWrite.java      |   41 -
 .../fluss/lake/writer/WriterInitContext.java       |   73 -
 .../fluss/memory/AbstractPagedOutputView.java      |  333 ----
 .../java/com/alibaba/fluss/memory/InputView.java   |  164 --
 .../fluss/memory/LazyMemorySegmentPool.java        |  275 ---
 .../fluss/memory/ManagedPagedOutputView.java       |   50 -
 .../com/alibaba/fluss/memory/MemorySegment.java    | 1575 -----------------
 .../fluss/memory/MemorySegmentInputView.java       |  128 --
 .../fluss/memory/MemorySegmentOutputView.java      |  203 ---
 .../alibaba/fluss/memory/MemorySegmentPool.java    |   76 -
 .../fluss/memory/MemorySegmentWritable.java        |   38 -
 .../java/com/alibaba/fluss/memory/MemoryUtils.java |  125 --
 .../java/com/alibaba/fluss/memory/OutputView.java  |  143 --
 .../fluss/memory/PreAllocatedPagedOutputView.java  |   69 -
 .../fluss/memory/UnmanagedPagedOutputView.java     |   39 -
 .../com/alibaba/fluss/metadata/DataLakeFormat.java |   36 -
 .../alibaba/fluss/metadata/DatabaseDescriptor.java |  138 --
 .../com/alibaba/fluss/metadata/DatabaseInfo.java   |   60 -
 .../java/com/alibaba/fluss/metadata/KvFormat.java  |   54 -
 .../java/com/alibaba/fluss/metadata/LogFormat.java |   60 -
 .../alibaba/fluss/metadata/MergeEngineType.java    |   70 -
 .../com/alibaba/fluss/metadata/PartitionInfo.java  |   82 -
 .../com/alibaba/fluss/metadata/PartitionSpec.java  |   70 -
 .../alibaba/fluss/metadata/PhysicalTablePath.java  |  135 --
 .../fluss/metadata/ResolvedPartitionSpec.java      |  198 ---
 .../java/com/alibaba/fluss/metadata/Schema.java    |  520 ------
 .../com/alibaba/fluss/metadata/SchemaInfo.java     |   75 -
 .../com/alibaba/fluss/metadata/TableBucket.java    |  116 --
 .../alibaba/fluss/metadata/TableBucketReplica.java |   62 -
 .../alibaba/fluss/metadata/TableDescriptor.java    |  625 -------
 .../com/alibaba/fluss/metadata/TableException.java |   40 -
 .../java/com/alibaba/fluss/metadata/TableInfo.java |  418 -----
 .../com/alibaba/fluss/metadata/TablePartition.java |   79 -
 .../java/com/alibaba/fluss/metadata/TablePath.java |  191 --
 .../fluss/metadata/ValidationException.java        |   39 -
 .../com/alibaba/fluss/metrics/CharacterFilter.java |   42 -
 .../java/com/alibaba/fluss/metrics/Counter.java    |   61 -
 .../metrics/DescriptiveStatisticsHistogram.java    |   85 -
 .../DescriptiveStatisticsHistogramStatistics.java  |  221 ---
 .../main/java/com/alibaba/fluss/metrics/Gauge.java |   41 -
 .../java/com/alibaba/fluss/metrics/Histogram.java  |   58 -
 .../alibaba/fluss/metrics/HistogramStatistics.java |   82 -
 .../main/java/com/alibaba/fluss/metrics/Meter.java |   58 -
 .../java/com/alibaba/fluss/metrics/MeterView.java  |  142 --
 .../java/com/alibaba/fluss/metrics/Metric.java     |   30 -
 .../com/alibaba/fluss/metrics/MetricNames.java     |  170 --
 .../java/com/alibaba/fluss/metrics/MetricType.java |   33 -
 .../java/com/alibaba/fluss/metrics/MetricView.java |   34 -
 .../alibaba/fluss/metrics/MetricViewUpdater.java   |   97 --
 .../com/alibaba/fluss/metrics/NoOpCounter.java     |   46 -
 .../com/alibaba/fluss/metrics/SimpleCounter.java   |   70 -
 .../fluss/metrics/ThreadSafeSimpleCounter.java     |   75 -
 .../fluss/metrics/groups/AbstractMetricGroup.java  |  385 ----
 .../fluss/metrics/groups/FrontMetricGroup.java     |   44 -
 .../metrics/groups/GenericKeyMetricGroup.java      |   50 -
 .../fluss/metrics/groups/GenericMetricGroup.java   |   55 -
 .../metrics/groups/GenericValueMetricGroup.java    |   54 -
 .../alibaba/fluss/metrics/groups/MetricGroup.java  |  149 --
 .../fluss/metrics/groups/ProxyMetricGroup.java     |   97 --
 .../metrics/groups/ReporterScopedSettings.java     |   35 -
 .../fluss/metrics/registry/MetricRegistry.java     |   80 -
 .../fluss/metrics/registry/MetricRegistryImpl.java |  321 ----
 .../fluss/metrics/registry/NOPMetricRegistry.java  |   51 -
 .../fluss/metrics/reporter/MetricReporter.java     |   76 -
 .../metrics/reporter/MetricReporterPlugin.java     |   54 -
 .../metrics/reporter/ScheduledMetricReporter.java  |   43 -
 .../fluss/metrics/utils/MetricGroupUtils.java      |   33 -
 .../fluss/plugin/DirectoryBasedPluginFinder.java   |  116 --
 .../main/java/com/alibaba/fluss/plugin/Plugin.java |   45 -
 .../com/alibaba/fluss/plugin/PluginConfig.java     |   81 -
 .../com/alibaba/fluss/plugin/PluginDescriptor.java |   71 -
 .../com/alibaba/fluss/plugin/PluginFinder.java     |   37 -
 .../com/alibaba/fluss/plugin/PluginLoader.java     |  166 --
 .../com/alibaba/fluss/plugin/PluginManager.java    |   38 -
 .../java/com/alibaba/fluss/plugin/PluginUtils.java |   55 -
 .../java/com/alibaba/fluss/record/ChangeType.java  |  127 --
 .../com/alibaba/fluss/record/ChangeTypeVector.java |   74 -
 .../fluss/record/ChangeTypeVectorWriter.java       |   51 -
 .../com/alibaba/fluss/record/DefaultKvRecord.java  |  195 ---
 .../alibaba/fluss/record/DefaultKvRecordBatch.java |  320 ----
 .../alibaba/fluss/record/DefaultValueRecord.java   |   91 -
 .../fluss/record/DefaultValueRecordBatch.java      |  292 ----
 .../com/alibaba/fluss/record/FileChannelChunk.java |   49 -
 .../alibaba/fluss/record/FileLogInputStream.java   |  275 ---
 .../com/alibaba/fluss/record/FileLogRecords.java   |  534 ------
 .../com/alibaba/fluss/record/GenericRecord.java    |   57 -
 .../com/alibaba/fluss/record/IndexedLogRecord.java |  195 ---
 .../java/com/alibaba/fluss/record/KvRecord.java    |   56 -
 .../com/alibaba/fluss/record/KvRecordBatch.java    |  118 --
 .../alibaba/fluss/record/KvRecordBatchBuilder.java |  241 ---
 .../alibaba/fluss/record/KvRecordReadContext.java  |   42 -
 .../com/alibaba/fluss/record/LogInputStream.java   |   44 -
 .../java/com/alibaba/fluss/record/LogRecord.java   |   58 -
 .../fluss/record/LogRecordBatchIterator.java       |   54 -
 .../java/com/alibaba/fluss/record/LogRecords.java  |   44 -
 .../com/alibaba/fluss/record/MemoryLogRecords.java |  158 --
 .../fluss/record/MemoryLogRecordsArrowBuilder.java |  290 ---
 .../record/MemoryLogRecordsIndexedBuilder.java     |  246 ---
 .../fluss/record/MemorySegmentLogInputStream.java  |   64 -
 .../alibaba/fluss/record/TimestampAndOffset.java   |   61 -
 .../java/com/alibaba/fluss/record/ValueRecord.java |   45 -
 .../com/alibaba/fluss/record/ValueRecordBatch.java |   75 -
 .../fluss/record/ValueRecordReadContext.java       |   43 -
 .../fluss/record/bytesview/ByteBufBytesView.java   |   52 -
 .../fluss/record/bytesview/FlussFileRegion.java    |  157 --
 .../com/alibaba/fluss/record/send/ByteBufSend.java |   38 -
 .../alibaba/fluss/record/send/FileRegionSend.java  |   42 -
 .../com/alibaba/fluss/record/send/MultiSend.java   |   42 -
 .../java/com/alibaba/fluss/record/send/Send.java   |   34 -
 .../alibaba/fluss/remote/RemoteLogFetchInfo.java   |   72 -
 .../com/alibaba/fluss/remote/RemoteLogSegment.java |  224 ---
 .../com/alibaba/fluss/rocksdb/RocksDBHandle.java   |   99 --
 .../fluss/rocksdb/RocksDBOperationUtils.java       |  116 --
 .../fluss/rocksdb/RocksIteratorWrapper.java        |  129 --
 .../main/java/com/alibaba/fluss/row/BinaryRow.java |   35 -
 .../java/com/alibaba/fluss/row/BinarySection.java  |  128 --
 .../com/alibaba/fluss/row/BinarySegmentUtils.java  |  389 -----
 .../java/com/alibaba/fluss/row/BinaryString.java   | 1013 -----------
 .../main/java/com/alibaba/fluss/row/Decimal.java   |  240 ---
 .../java/com/alibaba/fluss/row/GenericRow.java     |  215 ---
 .../java/com/alibaba/fluss/row/InternalRow.java    |  284 ---
 .../com/alibaba/fluss/row/MemoryAwareGetters.java  |   36 -
 .../com/alibaba/fluss/row/NullAwareGetters.java    |   34 -
 .../java/com/alibaba/fluss/row/ProjectedRow.java   |  163 --
 .../java/com/alibaba/fluss/row/TimestampLtz.java   |  171 --
 .../java/com/alibaba/fluss/row/TimestampNtz.java   |  166 --
 .../fluss/row/arrow/ArrowWriterProvider.java       |   35 -
 .../fluss/row/columnar/BooleanColumnVector.java    |   26 -
 .../fluss/row/columnar/ByteColumnVector.java       |   26 -
 .../fluss/row/columnar/BytesColumnVector.java      |   48 -
 .../alibaba/fluss/row/columnar/ColumnVector.java   |   26 -
 .../alibaba/fluss/row/columnar/ColumnarRow.java    |  138 --
 .../fluss/row/columnar/DecimalColumnVector.java    |   27 -
 .../fluss/row/columnar/DoubleColumnVector.java     |   26 -
 .../fluss/row/columnar/FloatColumnVector.java      |   26 -
 .../fluss/row/columnar/IntColumnVector.java        |   26 -
 .../fluss/row/columnar/LongColumnVector.java       |   26 -
 .../fluss/row/columnar/ShortColumnVector.java      |   26 -
 .../row/columnar/TimestampLtzColumnVector.java     |   27 -
 .../row/columnar/TimestampNtzColumnVector.java     |   27 -
 .../fluss/row/columnar/VectorizedColumnBatch.java  |  105 --
 .../fluss/row/compacted/CompactedKeyWriter.java    |   48 -
 .../alibaba/fluss/row/compacted/CompactedRow.java  |  245 ---
 .../row/compacted/CompactedRowDeserializer.java    |   40 -
 .../fluss/row/compacted/CompactedRowReader.java    |  331 ----
 .../fluss/row/compacted/CompactedRowWriter.java    |  380 ----
 .../fluss/row/decode/CompactedRowDecoder.java      |   47 -
 .../fluss/row/decode/IndexedRowDecoder.java        |   43 -
 .../com/alibaba/fluss/row/decode/RowDecoder.java   |   58 -
 .../fluss/row/encode/CompactedKeyEncoder.java      |   86 -
 .../fluss/row/encode/CompactedRowEncoder.java      |   71 -
 .../fluss/row/encode/IndexedRowEncoder.java        |   73 -
 .../com/alibaba/fluss/row/encode/RowEncoder.java   |   82 -
 .../com/alibaba/fluss/row/encode/ValueDecoder.java |   63 -
 .../com/alibaba/fluss/row/encode/ValueEncoder.java |   41 -
 .../row/encode/paimon/PaimonBinaryRowWriter.java   |  442 -----
 .../fluss/row/encode/paimon/PaimonKeyEncoder.java  |   64 -
 .../com/alibaba/fluss/row/indexed/IndexedRow.java  |  485 ------
 .../fluss/row/indexed/IndexedRowReader.java        |  283 ---
 .../fluss/row/indexed/IndexedRowWriter.java        |  350 ----
 .../alibaba/fluss/rpc/messages/ErrorMessage.java   |   73 -
 .../fluss/security/acl/AccessControlEntry.java     |  109 --
 .../security/acl/AccessControlEntryFilter.java     |  126 --
 .../com/alibaba/fluss/security/acl/AclBinding.java |   75 -
 .../fluss/security/acl/AclBindingFilter.java       |   76 -
 .../alibaba/fluss/security/acl/FlussPrincipal.java |   86 -
 .../alibaba/fluss/security/acl/OperationType.java  |   64 -
 .../alibaba/fluss/security/acl/PermissionType.java |   55 -
 .../com/alibaba/fluss/security/acl/Resource.java   |   92 -
 .../alibaba/fluss/security/acl/ResourceFilter.java |   77 -
 .../alibaba/fluss/security/acl/ResourceType.java   |   88 -
 .../fluss/security/auth/AuthenticationFactory.java |  165 --
 .../fluss/security/auth/AuthenticationPlugin.java  |   50 -
 .../security/auth/ClientAuthenticationPlugin.java  |   40 -
 .../fluss/security/auth/ClientAuthenticator.java   |  108 --
 .../auth/PlainTextAuthenticationPlugin.java        |   85 -
 .../security/auth/ServerAuthenticationPlugin.java  |   43 -
 .../fluss/security/auth/ServerAuthenticator.java   |  110 --
 .../authenticator/SaslAuthenticationPlugin.java    |   45 -
 .../authenticator/SaslClientAuthenticator.java     |  125 --
 .../authenticator/SaslServerAuthenticator.java     |  153 --
 .../sasl/jaas/AuthenticateCallbackHandler.java     |   33 -
 .../security/auth/sasl/jaas/DefaultLogin.java      |   81 -
 .../fluss/security/auth/sasl/jaas/JaasConfig.java  |  152 --
 .../fluss/security/auth/sasl/jaas/JaasContext.java |  277 ---
 .../fluss/security/auth/sasl/jaas/Login.java       |   69 -
 .../security/auth/sasl/jaas/LoginManager.java      |  142 --
 .../auth/sasl/jaas/SaslClientCallbackHandler.java  |   90 -
 .../security/auth/sasl/jaas/SaslServerFactory.java |  114 --
 .../auth/sasl/plain/PlainAuthenticateCallback.java |   79 -
 .../security/auth/sasl/plain/PlainLoginModule.java |   77 -
 .../security/auth/sasl/plain/PlainSaslServer.java  |  206 ---
 .../auth/sasl/plain/PlainSaslServerProvider.java   |   49 -
 .../sasl/plain/PlainServerCallbackHandler.java     |   95 -
 .../java/com/alibaba/fluss/types/ArrayType.java    |  100 --
 .../java/com/alibaba/fluss/types/BigIntType.java   |   64 -
 .../java/com/alibaba/fluss/types/BinaryType.java   |  121 --
 .../java/com/alibaba/fluss/types/BooleanType.java  |   63 -
 .../java/com/alibaba/fluss/types/BytesType.java    |   63 -
 .../java/com/alibaba/fluss/types/CharType.java     |  120 --
 .../java/com/alibaba/fluss/types/DataField.java    |  121 --
 .../java/com/alibaba/fluss/types/DataType.java     |  172 --
 .../com/alibaba/fluss/types/DataTypeChecks.java    |  121 --
 .../fluss/types/DataTypeDefaultVisitor.java        |  126 --
 .../com/alibaba/fluss/types/DataTypeFamily.java    |   58 -
 .../java/com/alibaba/fluss/types/DataTypeRoot.java |  117 --
 .../com/alibaba/fluss/types/DataTypeVisitor.java   |   69 -
 .../java/com/alibaba/fluss/types/DataTypes.java    |  345 ----
 .../java/com/alibaba/fluss/types/DateType.java     |   67 -
 .../java/com/alibaba/fluss/types/DecimalType.java  |  128 --
 .../java/com/alibaba/fluss/types/DoubleType.java   |   63 -
 .../java/com/alibaba/fluss/types/FloatType.java    |   64 -
 .../main/java/com/alibaba/fluss/types/IntType.java |   63 -
 .../fluss/types/LocalZonedTimestampType.java       |  128 --
 .../main/java/com/alibaba/fluss/types/MapType.java |  110 --
 .../main/java/com/alibaba/fluss/types/RowType.java |  268 ---
 .../java/com/alibaba/fluss/types/SmallIntType.java |   63 -
 .../java/com/alibaba/fluss/types/StringType.java   |   65 -
 .../java/com/alibaba/fluss/types/TimeType.java     |  114 --
 .../com/alibaba/fluss/types/TimestampType.java     |  121 --
 .../java/com/alibaba/fluss/types/TinyIntType.java  |   63 -
 .../fluss/utils/AbstractAutoCloseableRegistry.java |  179 --
 .../com/alibaba/fluss/utils/AbstractIterator.java  |   95 -
 .../java/com/alibaba/fluss/utils/ArrayUtils.java   |  163 --
 .../alibaba/fluss/utils/AutoCloseableAsync.java    |   43 -
 .../alibaba/fluss/utils/AutoPartitionStrategy.java |   89 -
 .../fluss/utils/ByteBufferReadableChannel.java     |   75 -
 .../java/com/alibaba/fluss/utils/BytesUtils.java   |  161 --
 .../com/alibaba/fluss/utils/CloseableIterator.java |   59 -
 .../com/alibaba/fluss/utils/CloseableRegistry.java |   98 --
 .../com/alibaba/fluss/utils/CollectionUtils.java   |   58 -
 .../com/alibaba/fluss/utils/CopyOnWriteMap.java    |  147 --
 .../java/com/alibaba/fluss/utils/DecimalUtils.java |  141 --
 .../com/alibaba/fluss/utils/EncodingUtils.java     |   37 -
 .../com/alibaba/fluss/utils/ExceptionUtils.java    |  483 -----
 .../com/alibaba/fluss/utils/ExecutorUtils.java     |  104 --
 .../alibaba/fluss/utils/ExponentialBackoff.java    |   92 -
 .../fluss/utils/FatalExitExceptionHandler.java     |   56 -
 .../java/com/alibaba/fluss/utils/FileLock.java     |  145 --
 .../java/com/alibaba/fluss/utils/FileUtils.java    |  460 -----
 .../java/com/alibaba/fluss/utils/FlussPaths.java   |  721 --------
 .../main/java/com/alibaba/fluss/utils/IOUtils.java |  225 ---
 .../alibaba/fluss/utils/InstantiationUtils.java    |  342 ----
 .../java/com/alibaba/fluss/utils/MapUtils.java     |   57 -
 .../java/com/alibaba/fluss/utils/MathUtils.java    |  119 --
 .../fluss/utils/MemorySegmentWritableChannel.java  |   60 -
 .../com/alibaba/fluss/utils/MurmurHashUtils.java   |  138 --
 .../com/alibaba/fluss/utils/OperatingSystem.java   |  127 --
 .../utils/PagedMemorySegmentWritableChannel.java   |   68 -
 .../com/alibaba/fluss/utils/PartitionUtils.java    |  137 --
 .../com/alibaba/fluss/utils/Preconditions.java     |  229 ---
 .../java/com/alibaba/fluss/utils/Projection.java   |   89 -
 .../com/alibaba/fluss/utils/PropertiesUtils.java   |   69 -
 .../com/alibaba/fluss/utils/ProtoCodecUtils.java   |  294 ----
 .../alibaba/fluss/utils/SerializableObject.java    |   27 -
 .../com/alibaba/fluss/utils/SerializedValue.java   |  115 --
 .../java/com/alibaba/fluss/utils/StringUtils.java  |   55 -
 .../fluss/utils/TemporaryClassLoaderContext.java   |   82 -
 .../java/com/alibaba/fluss/utils/TimeUtils.java    |  238 ---
 .../java/com/alibaba/fluss/utils/TypeUtils.java    |   69 -
 .../com/alibaba/fluss/utils/UnionIterator.java     |  107 --
 .../java/com/alibaba/fluss/utils/UnsafeUtils.java  |   84 -
 .../com/alibaba/fluss/utils/VarLengthUtils.java    |  326 ----
 .../com/alibaba/fluss/utils/WrappingProxy.java     |   32 -
 .../alibaba/fluss/utils/WrappingProxyUtils.java    |   70 -
 .../java/com/alibaba/fluss/utils/clock/Clock.java  |   63 -
 .../com/alibaba/fluss/utils/clock/ManualClock.java |   69 -
 .../com/alibaba/fluss/utils/clock/SystemClock.java |   54 -
 .../utils/concurrent/ExecutorThreadFactory.java    |  176 --
 .../alibaba/fluss/utils/concurrent/Executors.java  |   46 -
 .../fluss/utils/concurrent/FlussScheduler.java     |  193 --
 .../fluss/utils/concurrent/FutureUtils.java        |  807 ---------
 .../alibaba/fluss/utils/concurrent/LockUtils.java  |   67 -
 .../alibaba/fluss/utils/concurrent/Scheduler.java  |   61 -
 .../fluss/utils/concurrent/ShutdownableThread.java |  116 --
 .../fluss/utils/concurrent/ThreadUtils.java        |   37 -
 .../com/alibaba/fluss/utils/crc/Checksums.java     |  115 --
 .../java/com/alibaba/fluss/utils/crc/Crc32C.java   |  164 --
 .../java/com/alibaba/fluss/utils/crc/Java.java     |   70 -
 .../alibaba/fluss/utils/crc/PureJavaCrc32C.java    |  631 -------
 .../alibaba/fluss/utils/function/BiFunction.java   |   42 -
 .../fluss/utils/function/CheckedSupplier.java      |   35 -
 .../fluss/utils/function/FunctionUtils.java        |   65 -
 .../utils/function/FunctionWithException.java      |   42 -
 .../alibaba/fluss/utils/function/QuadConsumer.java |   44 -
 .../utils/function/RunnableWithException.java      |   39 -
 .../utils/function/SupplierWithException.java      |   40 -
 .../fluss/utils/function/ThrowingConsumer.java     |   61 -
 .../fluss/utils/function/ThrowingRunnable.java     |   56 -
 .../alibaba/fluss/utils/json/JsonDeserializer.java |   26 -
 .../alibaba/fluss/utils/json/JsonSerializer.java   |   27 -
 .../fluss/utils/log/ByteBufferUnmapper.java        |  163 --
 .../fluss/utils/log/FairBucketStatusMap.java       |  157 --
 .../java/com/alibaba/fluss/utils/types/Either.java |  190 --
 .../java/com/alibaba/fluss/utils/types/Tuple.java  |   48 -
 .../java/com/alibaba/fluss/utils/types/Tuple2.java |  141 --
 .../java/org/apache/fluss/annotation/Internal.java |   31 +
 .../apache/fluss/annotation/PublicEvolving.java    |   32 +
 .../org/apache/fluss/annotation/PublicStable.java  |   36 +
 .../apache/fluss/annotation/PublicUnstable.java    |   31 +
 .../apache/fluss/annotation/VisibleForTesting.java |   35 +
 .../apache/fluss/bucketing/BucketingFunction.java  |   50 +
 .../fluss/bucketing/FlussBucketingFunction.java    |   43 +
 .../fluss/bucketing/IcebergBucketingFunction.java  |    0
 .../fluss/bucketing/PaimonBucketingFunction.java   |   28 +
 .../fluss/classloading/ComponentClassLoader.java   |    0
 .../org/apache/fluss/cluster/BucketLocation.java   |  126 ++
 .../java/org/apache/fluss/cluster/Cluster.java     |  326 ++++
 .../java/org/apache/fluss/cluster/Endpoint.java    |  246 +++
 .../java/org/apache/fluss/cluster/ServerNode.java  |  145 ++
 .../java/org/apache/fluss/cluster/ServerType.java  |   24 +
 .../org/apache/fluss/cluster/TabletServerInfo.java |   59 +
 .../fluss/compression/ArrowCompressionFactory.java |    0
 .../fluss/compression/ArrowCompressionInfo.java    |    0
 .../ArrowCompressionRatioEstimator.java            |   69 +
 .../fluss/compression/ArrowCompressionType.java    |   33 +
 .../compression/FlussLZ4BlockInputStream.java      |  306 ++++
 .../compression/FlussLZ4BlockOutputStream.java     |  389 +++++
 .../compression/Lz4ArrowCompressionCodec.java      |    0
 .../compression/ZstdArrowCompressionCodec.java     |    0
 .../apache/fluss/config/AutoPartitionTimeUnit.java |   34 +
 .../org/apache/fluss/config/ConfigBuilder.java     |  244 +++
 .../java/org/apache/fluss/config/ConfigOption.java |  270 +++
 .../org/apache/fluss/config/ConfigOptions.java     | 1692 ++++++++++++++++++
 .../org/apache/fluss/config/Configuration.java     |  748 ++++++++
 .../apache/fluss/config/ConfigurationUtils.java    |  281 +++
 .../java/org/apache/fluss/config/FallbackKey.java  |   77 +
 .../org/apache/fluss/config/FlussConfigUtils.java  |   62 +
 .../apache/fluss/config/GlobalConfiguration.java   |  205 +++
 .../java/org/apache/fluss/config/MemorySize.java   |  417 +++++
 .../java/org/apache/fluss/config/Password.java     |   71 +
 .../org/apache/fluss/config/ReadableConfig.java    |   54 +
 .../fluss/config/StructuredOptionsSplitter.java    |  210 +++
 .../java/org/apache/fluss/config/TableConfig.java  |  118 ++
 .../org/apache/fluss/exception/ApiException.java   |   45 +
 .../fluss/exception/AuthenticationException.java   |   35 +
 .../fluss/exception/AuthorizationException.java    |   31 +
 .../fluss/exception/BufferExhaustedException.java  |   36 +
 .../fluss/exception/CorruptMessageException.java   |   49 +
 .../fluss/exception/CorruptRecordException.java    |   48 +
 .../fluss/exception/CorruptSnapshotException.java  |   32 +
 .../exception/DatabaseAlreadyExistException.java   |   37 +
 .../fluss/exception/DatabaseNotEmptyException.java |   36 +
 .../fluss/exception/DatabaseNotExistException.java |   36 +
 .../fluss/exception/DisconnectException.java       |   35 +
 .../exception/DuplicateSequenceException.java      |   31 +
 .../exception/FencedLeaderEpochException.java      |   25 +
 .../exception/FencedTieringEpochException.java     |   26 +
 .../org/apache/fluss/exception/FetchException.java |   42 +
 .../org/apache/fluss/exception/FlussException.java |   58 +
 .../fluss/exception/FlussRuntimeException.java     |   59 +
 .../exception/IllegalConfigurationException.java   |   65 +
 .../exception/IndexOffsetOverflowException.java    |   36 +
 .../fluss/exception/InvalidBucketsException.java   |   28 +
 .../InvalidColumnProjectionException.java          |   35 +
 .../fluss/exception/InvalidConfigException.java    |   35 +
 .../exception/InvalidCoordinatorException.java     |   25 +
 .../fluss/exception/InvalidDatabaseException.java  |   44 +
 .../fluss/exception/InvalidMetadataException.java  |   43 +
 .../fluss/exception/InvalidOffsetException.java    |   40 +
 .../fluss/exception/InvalidPartitionException.java |   35 +
 .../fluss/exception/InvalidRecordException.java    |   39 +
 .../InvalidReplicationFactorException.java         |   35 +
 .../exception/InvalidRequiredAcksException.java    |   34 +
 .../exception/InvalidServerRackInfoException.java  |   28 +
 .../fluss/exception/InvalidTableException.java     |   44 +
 .../exception/InvalidTargetColumnException.java    |   33 +
 .../fluss/exception/InvalidTimestampException.java |   33 +
 .../exception/InvalidUpdateVersionException.java   |   29 +
 .../exception/KvSnapshotNotExistException.java     |   35 +
 .../apache/fluss/exception/KvStorageException.java |   53 +
 .../LakeStorageNotConfiguredException.java         |   35 +
 .../LakeTableSnapshotNotExistException.java        |   35 +
 .../exception/LeaderNotAvailableException.java     |   40 +
 .../exception/LogOffsetOutOfRangeException.java    |   40 +
 .../exception/LogRecordAppendFailedException.java  |   37 +
 .../LogSegmentOffsetOverflowException.java         |   36 +
 .../fluss/exception/LogStorageException.java       |   54 +
 .../apache/fluss/exception/NetworkException.java   |   44 +
 .../exception/NonPrimaryKeyTableException.java     |   36 +
 .../NotEnoughReplicasAfterAppendException.java     |   36 +
 .../exception/NotEnoughReplicasException.java      |   38 +
 .../exception/NotLeaderOrFollowerException.java    |   47 +
 .../exception/OperationNotAttemptedException.java  |   29 +
 .../exception/OutOfOrderSequenceException.java     |   34 +
 .../exception/PartitionAlreadyExistsException.java |   32 +
 .../exception/PartitionNotExistException.java      |   35 +
 .../fluss/exception/RecordTooLargeException.java   |   42 +
 .../exception/RemoteResourceNotFoundException.java |   43 +
 .../fluss/exception/RemoteStorageException.java    |   41 +
 .../RetriableAuthenticationException.java          |   29 +
 .../apache/fluss/exception/RetriableException.java |   36 +
 .../fluss/exception/SchemaNotExistException.java   |   37 +
 .../fluss/exception/SecurityDisabledException.java |   32 +
 .../fluss/exception/SecurityTokenException.java    |   39 +
 .../fluss/exception/StaleMetadataException.java    |   36 +
 .../apache/fluss/exception/StorageException.java   |   44 +
 .../exception/TableAlreadyExistException.java      |   37 +
 .../fluss/exception/TableNotExistException.java    |   36 +
 .../exception/TableNotPartitionedException.java    |   35 +
 .../apache/fluss/exception/TimeoutException.java   |   36 +
 .../fluss/exception/TooManyBucketsException.java   |   39 +
 .../exception/TooManyPartitionsException.java      |   35 +
 .../fluss/exception/TraversableOnceException.java  |   38 +
 .../fluss/exception/UnknownServerException.java    |   44 +
 .../exception/UnknownTableOrBucketException.java   |   47 +
 .../fluss/exception/UnknownWriterIdException.java  |   34 +
 .../exception/UnsupportedVersionException.java     |   40 +
 .../apache/fluss/exception/WakeupException.java    |   32 +
 .../apache/fluss/fs/ClosingFSDataInputStream.java  |   92 +
 .../apache/fluss/fs/ClosingFSDataOutputStream.java |   92 +
 .../org/apache/fluss/fs/FSDataInputStream.java     |   53 +
 .../apache/fluss/fs/FSDataInputStreamWrapper.java  |   97 ++
 .../org/apache/fluss/fs/FSDataOutputStream.java    |  105 ++
 .../apache/fluss/fs/FSDataOutputStreamWrapper.java |   72 +
 .../main/java/org/apache/fluss/fs/FileStatus.java  |   49 +
 .../apache}/fluss/fs/FileSystem.java               |    0
 .../java/org/apache/fluss/fs/FileSystemPlugin.java |   49 +
 .../org/apache/fluss/fs/FileSystemSafetyNet.java   |  122 ++
 .../src/main/java/org/apache/fluss/fs/FsPath.java  |  393 +++++
 .../org/apache/fluss/fs/FsPathAndFileName.java     |   78 +
 .../apache/fluss/fs/PluginFileSystemWrapper.java   |  147 ++
 .../fluss/fs/SafetyNetCloseableRegistry.java       |  238 +++
 .../fluss/fs/SafetyNetWrapperFileSystem.java       |  109 ++
 .../fs/UnsupportedFileSystemSchemeException.java   |   45 +
 .../apache/fluss/fs/WrappingProxyCloseable.java    |   27 +
 .../fluss/fs/local/LocalDataInputStream.java       |   90 +
 .../fluss/fs/local/LocalDataOutputStream.java      |   93 +
 .../org/apache/fluss/fs/local/LocalFileStatus.java |   78 +
 .../org/apache/fluss/fs/local/LocalFileSystem.java |  285 +++
 .../fluss/fs/local/LocalFileSystemPlugin.java      |   40 +
 .../fluss/fs/local/LocalSecurityTokenReceiver.java |   35 +
 .../org/apache/fluss/fs/token/Credentials.java     |   44 +
 .../fluss/fs/token/CredentialsJsonSerde.java       |    0
 .../fluss/fs/token/ObtainedSecurityToken.java      |   66 +
 .../fluss/fs/token/SecurityTokenReceiver.java      |   35 +
 .../apache/fluss/fs/utils/FileDownloadSpec.java    |   47 +
 .../apache/fluss/fs/utils/FileDownloadUtils.java   |  191 ++
 .../apache/fluss/lake/batch/ArrowRecordBatch.java  |   28 +
 .../org/apache/fluss/lake/batch/RecordBatch.java   |   28 +
 .../apache}/fluss/lake/committer/BucketOffset.java |    0
 .../lake/committer/CommittedLakeSnapshot.java      |   94 +
 .../fluss/lake/committer/CommitterInitContext.java |   38 +
 .../apache/fluss/lake/committer/LakeCommitter.java |   78 +
 .../apache/fluss/lake/lakestorage/LakeCatalog.java |   47 +
 .../fluss/lake/lakestorage/LakeStorage.java        |    0
 .../fluss/lake/lakestorage/LakeStoragePlugin.java  |   46 +
 .../lake/lakestorage/LakeStoragePluginSetUp.java   |    0
 .../lake/lakestorage/PluginLakeStorageWrapper.java |    0
 .../lake/serializer/SimpleVersionedSerializer.java |   60 +
 .../fluss/lake/writer/LakeTieringFactory.java      |   74 +
 .../org/apache/fluss/lake/writer/LakeWriter.java   |   50 +
 .../lake/writer/SupportsRecordBatchWrite.java      |   41 +
 .../fluss/lake/writer/WriterInitContext.java       |   73 +
 .../fluss/memory/AbstractPagedOutputView.java      |  333 ++++
 .../java/org/apache/fluss/memory/InputView.java    |  164 ++
 .../apache/fluss/memory/LazyMemorySegmentPool.java |  275 +++
 .../fluss/memory/ManagedPagedOutputView.java       |   50 +
 .../org/apache/fluss/memory/MemorySegment.java     | 1575 +++++++++++++++++
 .../fluss/memory/MemorySegmentInputView.java       |  128 ++
 .../fluss/memory/MemorySegmentOutputView.java      |  203 +++
 .../org/apache/fluss/memory/MemorySegmentPool.java |   76 +
 .../apache/fluss/memory/MemorySegmentWritable.java |   38 +
 .../java/org/apache/fluss/memory/MemoryUtils.java  |  125 ++
 .../java/org/apache/fluss/memory/OutputView.java   |  143 ++
 .../fluss/memory/PreAllocatedPagedOutputView.java  |   69 +
 .../fluss/memory/UnmanagedPagedOutputView.java     |   39 +
 .../org/apache/fluss/metadata/DataLakeFormat.java  |   36 +
 .../apache/fluss/metadata/DatabaseDescriptor.java  |  138 ++
 .../org/apache/fluss/metadata/DatabaseInfo.java    |   60 +
 .../java/org/apache/fluss/metadata/KvFormat.java   |   54 +
 .../java/org/apache/fluss/metadata/LogFormat.java  |   60 +
 .../org/apache/fluss/metadata/MergeEngineType.java |   70 +
 .../org/apache/fluss/metadata/PartitionInfo.java   |   82 +
 .../org/apache/fluss/metadata/PartitionSpec.java   |   70 +
 .../apache/fluss/metadata/PhysicalTablePath.java   |  135 ++
 .../fluss/metadata/ResolvedPartitionSpec.java      |  198 +++
 .../java/org/apache/fluss/metadata/Schema.java     |  520 ++++++
 .../java/org/apache/fluss/metadata/SchemaInfo.java |   75 +
 .../org/apache/fluss/metadata/TableBucket.java     |  116 ++
 .../apache/fluss/metadata/TableBucketReplica.java  |   62 +
 .../org/apache/fluss/metadata/TableDescriptor.java |  625 +++++++
 .../org/apache/fluss/metadata/TableException.java  |   40 +
 .../java/org/apache/fluss/metadata/TableInfo.java  |  418 +++++
 .../org/apache/fluss/metadata/TablePartition.java  |   79 +
 .../java/org/apache/fluss/metadata/TablePath.java  |  191 ++
 .../apache/fluss/metadata/ValidationException.java |   39 +
 .../org/apache/fluss/metrics/CharacterFilter.java  |   42 +
 .../java/org/apache/fluss/metrics/Counter.java     |   61 +
 .../metrics/DescriptiveStatisticsHistogram.java    |   85 +
 .../DescriptiveStatisticsHistogramStatistics.java  |  221 +++
 .../main/java/org/apache/fluss/metrics/Gauge.java  |   41 +
 .../java/org/apache/fluss/metrics/Histogram.java   |   58 +
 .../apache/fluss/metrics/HistogramStatistics.java  |   82 +
 .../main/java/org/apache/fluss/metrics/Meter.java  |   58 +
 .../java/org/apache/fluss/metrics/MeterView.java   |  142 ++
 .../main/java/org/apache/fluss/metrics/Metric.java |   30 +
 .../java/org/apache/fluss/metrics/MetricNames.java |  170 ++
 .../java/org/apache/fluss/metrics/MetricType.java  |   33 +
 .../java/org/apache/fluss/metrics/MetricView.java  |   34 +
 .../apache/fluss/metrics/MetricViewUpdater.java    |   97 ++
 .../java/org/apache/fluss/metrics/NoOpCounter.java |   46 +
 .../org/apache/fluss/metrics/SimpleCounter.java    |   70 +
 .../fluss/metrics/ThreadSafeSimpleCounter.java     |   75 +
 .../fluss/metrics/groups/AbstractMetricGroup.java  |  385 ++++
 .../fluss/metrics/groups/FrontMetricGroup.java     |   44 +
 .../metrics/groups/GenericKeyMetricGroup.java      |   50 +
 .../fluss/metrics/groups/GenericMetricGroup.java   |   55 +
 .../metrics/groups/GenericValueMetricGroup.java    |   54 +
 .../apache/fluss/metrics/groups/MetricGroup.java   |  149 ++
 .../fluss/metrics/groups/ProxyMetricGroup.java     |   97 ++
 .../metrics/groups/ReporterScopedSettings.java     |   35 +
 .../fluss/metrics/registry/MetricRegistry.java     |   80 +
 .../fluss/metrics/registry/MetricRegistryImpl.java |  321 ++++
 .../fluss/metrics/registry/NOPMetricRegistry.java  |   51 +
 .../fluss/metrics/reporter/MetricReporter.java     |   76 +
 .../metrics/reporter/MetricReporterPlugin.java     |   54 +
 .../fluss/metrics/reporter/ReporterSetup.java      |    0
 .../metrics/reporter/ScheduledMetricReporter.java  |   43 +
 .../fluss/metrics/utils/MetricGroupUtils.java      |   33 +
 .../apache}/fluss/plugin/DefaultPluginManager.java |    0
 .../fluss/plugin/DirectoryBasedPluginFinder.java   |  116 ++
 .../main/java/org/apache/fluss/plugin/Plugin.java  |   45 +
 .../java/org/apache/fluss/plugin/PluginConfig.java |   81 +
 .../org/apache/fluss/plugin/PluginDescriptor.java  |   71 +
 .../java/org/apache/fluss/plugin/PluginFinder.java |   37 +
 .../java/org/apache/fluss/plugin/PluginLoader.java |  166 ++
 .../org/apache/fluss/plugin/PluginManager.java     |   38 +
 .../java/org/apache/fluss/plugin/PluginUtils.java  |   55 +
 .../apache}/fluss/record/BytesViewLogRecords.java  |    0
 .../java/org/apache/fluss/record/ChangeType.java   |  127 ++
 .../org/apache/fluss/record/ChangeTypeVector.java  |   74 +
 .../fluss/record/ChangeTypeVectorWriter.java       |   51 +
 .../org/apache/fluss/record/DefaultKvRecord.java   |  195 +++
 .../apache/fluss/record/DefaultKvRecordBatch.java  |  320 ++++
 .../fluss/record/DefaultLogRecordBatch.java        |    0
 .../apache/fluss/record/DefaultValueRecord.java    |   91 +
 .../fluss/record/DefaultValueRecordBatch.java      |  292 ++++
 .../org/apache/fluss/record/FileChannelChunk.java  |   49 +
 .../apache/fluss/record/FileLogInputStream.java    |  275 +++
 .../apache}/fluss/record/FileLogProjection.java    |    0
 .../org/apache/fluss/record/FileLogRecords.java    |  534 ++++++
 .../org/apache/fluss/record/GenericRecord.java     |   57 +
 .../org/apache/fluss/record/IndexedLogRecord.java  |  195 +++
 .../java/org/apache/fluss/record/KvRecord.java     |   56 +
 .../org/apache/fluss/record/KvRecordBatch.java     |  118 ++
 .../apache/fluss/record/KvRecordBatchBuilder.java  |  241 +++
 .../apache/fluss/record/KvRecordReadContext.java   |   42 +
 .../org/apache/fluss/record/LogInputStream.java    |   44 +
 .../java/org/apache/fluss/record/LogRecord.java    |   58 +
 .../apache}/fluss/record/LogRecordBatch.java       |    0
 .../fluss/record/LogRecordBatchIterator.java       |   54 +
 .../apache}/fluss/record/LogRecordReadContext.java |    0
 .../java/org/apache/fluss/record/LogRecords.java   |   44 +
 .../org/apache/fluss/record/MemoryLogRecords.java  |  158 ++
 .../fluss/record/MemoryLogRecordsArrowBuilder.java |  290 +++
 .../record/MemoryLogRecordsIndexedBuilder.java     |  246 +++
 .../fluss/record/MemorySegmentLogInputStream.java  |   64 +
 .../apache/fluss/record/TimestampAndOffset.java    |   61 +
 .../java/org/apache/fluss/record/ValueRecord.java  |   45 +
 .../org/apache/fluss/record/ValueRecordBatch.java  |   75 +
 .../fluss/record/ValueRecordReadContext.java       |   43 +
 .../fluss/record/bytesview/ByteBufBytesView.java   |   52 +
 .../apache}/fluss/record/bytesview/BytesView.java  |    0
 .../record/bytesview/FileRegionBytesView.java      |    0
 .../fluss/record/bytesview/FlussFileRegion.java    |  157 ++
 .../record/bytesview/MemorySegmentBytesView.java   |    0
 .../fluss/record/bytesview/MultiBytesView.java     |    0
 .../org/apache/fluss/record/send/ByteBufSend.java  |   38 +
 .../fluss/record/send/ByteBufWritableOutput.java   |    0
 .../apache/fluss/record/send/FileRegionSend.java   |   42 +
 .../org/apache/fluss/record/send/MultiSend.java    |   42 +
 .../java/org/apache/fluss/record/send/Send.java    |   34 +
 .../fluss/record/send/SendWritableOutput.java      |    0
 .../apache}/fluss/record/send/WritableOutput.java  |    0
 .../apache/fluss/remote/RemoteLogFetchInfo.java    |   72 +
 .../org/apache/fluss/remote/RemoteLogSegment.java  |  224 +++
 .../org/apache/fluss/rocksdb/RocksDBHandle.java    |   99 ++
 .../fluss/rocksdb/RocksDBOperationUtils.java       |  116 ++
 .../apache/fluss/rocksdb/RocksIteratorWrapper.java |  129 ++
 .../main/java/org/apache/fluss/row/BinaryRow.java  |   35 +
 .../java/org/apache/fluss/row/BinarySection.java   |  128 ++
 .../org/apache/fluss/row/BinarySegmentUtils.java   |  389 +++++
 .../java/org/apache/fluss/row/BinaryString.java    | 1013 +++++++++++
 .../main/java/org/apache/fluss/row/Decimal.java    |  240 +++
 .../main/java/org/apache/fluss/row/GenericRow.java |  215 +++
 .../java/org/apache/fluss/row/InternalRow.java     |  284 +++
 .../org/apache/fluss/row/MemoryAwareGetters.java   |   36 +
 .../org/apache/fluss/row/NullAwareGetters.java     |   34 +
 .../java/org/apache/fluss/row/ProjectedRow.java    |  163 ++
 .../java/org/apache/fluss/row/TimestampLtz.java    |  171 ++
 .../java/org/apache/fluss/row/TimestampNtz.java    |  166 ++
 .../apache}/fluss/row/arrow/ArrowReader.java       |    0
 .../apache}/fluss/row/arrow/ArrowWriter.java       |    0
 .../apache}/fluss/row/arrow/ArrowWriterPool.java   |    0
 .../fluss/row/arrow/ArrowWriterProvider.java       |   35 +
 .../row/arrow/vectors/ArrowBigIntColumnVector.java |    0
 .../row/arrow/vectors/ArrowBinaryColumnVector.java |    0
 .../arrow/vectors/ArrowBooleanColumnVector.java    |    0
 .../row/arrow/vectors/ArrowDateColumnVector.java   |    0
 .../arrow/vectors/ArrowDecimalColumnVector.java    |    0
 .../row/arrow/vectors/ArrowDoubleColumnVector.java |    0
 .../row/arrow/vectors/ArrowFloatColumnVector.java  |    0
 .../row/arrow/vectors/ArrowIntColumnVector.java    |    0
 .../arrow/vectors/ArrowSmallIntColumnVector.java   |    0
 .../row/arrow/vectors/ArrowTimeColumnVector.java   |    0
 .../vectors/ArrowTimestampLtzColumnVector.java     |    0
 .../vectors/ArrowTimestampNtzColumnVector.java     |    0
 .../arrow/vectors/ArrowTinyIntColumnVector.java    |    0
 .../arrow/vectors/ArrowVarBinaryColumnVector.java  |    0
 .../arrow/vectors/ArrowVarCharColumnVector.java    |    0
 .../fluss/row/arrow/writers/ArrowBigIntWriter.java |    0
 .../fluss/row/arrow/writers/ArrowBinaryWriter.java |    0
 .../row/arrow/writers/ArrowBooleanWriter.java      |    0
 .../fluss/row/arrow/writers/ArrowDateWriter.java   |    0
 .../row/arrow/writers/ArrowDecimalWriter.java      |    0
 .../fluss/row/arrow/writers/ArrowDoubleWriter.java |    0
 .../fluss/row/arrow/writers/ArrowFieldWriter.java  |    0
 .../fluss/row/arrow/writers/ArrowFloatWriter.java  |    0
 .../fluss/row/arrow/writers/ArrowIntWriter.java    |    0
 .../row/arrow/writers/ArrowSmallIntWriter.java     |    0
 .../fluss/row/arrow/writers/ArrowTimeWriter.java   |    0
 .../row/arrow/writers/ArrowTimestampLtzWriter.java |    0
 .../row/arrow/writers/ArrowTimestampNtzWriter.java |    0
 .../row/arrow/writers/ArrowTinyIntWriter.java      |    0
 .../row/arrow/writers/ArrowVarBinaryWriter.java    |    0
 .../row/arrow/writers/ArrowVarCharWriter.java      |    0
 .../fluss/row/columnar/BooleanColumnVector.java    |   26 +
 .../fluss/row/columnar/ByteColumnVector.java       |   26 +
 .../fluss/row/columnar/BytesColumnVector.java      |   48 +
 .../apache/fluss/row/columnar/ColumnVector.java    |   26 +
 .../org/apache/fluss/row/columnar/ColumnarRow.java |  138 ++
 .../fluss/row/columnar/DecimalColumnVector.java    |   27 +
 .../fluss/row/columnar/DoubleColumnVector.java     |   26 +
 .../fluss/row/columnar/FloatColumnVector.java      |   26 +
 .../apache/fluss/row/columnar/IntColumnVector.java |   26 +
 .../fluss/row/columnar/LongColumnVector.java       |   26 +
 .../fluss/row/columnar/ShortColumnVector.java      |   26 +
 .../row/columnar/TimestampLtzColumnVector.java     |   27 +
 .../row/columnar/TimestampNtzColumnVector.java     |   27 +
 .../fluss/row/columnar/VectorizedColumnBatch.java  |  105 ++
 .../fluss/row/compacted/CompactedKeyWriter.java    |   48 +
 .../apache/fluss/row/compacted/CompactedRow.java   |  245 +++
 .../row/compacted/CompactedRowDeserializer.java    |   40 +
 .../fluss/row/compacted/CompactedRowReader.java    |  331 ++++
 .../fluss/row/compacted/CompactedRowWriter.java    |  380 ++++
 .../fluss/row/decode/CompactedRowDecoder.java      |   47 +
 .../apache/fluss/row/decode/IndexedRowDecoder.java |   43 +
 .../org/apache/fluss/row/decode/RowDecoder.java    |   58 +
 .../fluss/row/encode/CompactedKeyEncoder.java      |   86 +
 .../fluss/row/encode/CompactedRowEncoder.java      |   71 +
 .../apache/fluss/row/encode/IndexedRowEncoder.java |   73 +
 .../apache}/fluss/row/encode/KeyEncoder.java       |    0
 .../org/apache/fluss/row/encode/RowEncoder.java    |   82 +
 .../org/apache/fluss/row/encode/ValueDecoder.java  |   63 +
 .../org/apache/fluss/row/encode/ValueEncoder.java  |   41 +
 .../row/encode/paimon/PaimonBinaryRowWriter.java   |  442 +++++
 .../fluss/row/encode/paimon/PaimonKeyEncoder.java  |   64 +
 .../org/apache/fluss/row/indexed/IndexedRow.java   |  485 ++++++
 .../apache/fluss/row/indexed/IndexedRowReader.java |  283 +++
 .../apache/fluss/row/indexed/IndexedRowWriter.java |  350 ++++
 .../apache}/fluss/rpc/messages/ApiMessage.java     |    0
 .../apache/fluss/rpc/messages/ErrorMessage.java    |   73 +
 .../fluss/security/acl/AccessControlEntry.java     |  109 ++
 .../security/acl/AccessControlEntryFilter.java     |  126 ++
 .../org/apache/fluss/security/acl/AclBinding.java  |   75 +
 .../fluss/security/acl/AclBindingFilter.java       |   76 +
 .../apache/fluss/security/acl/FlussPrincipal.java  |   86 +
 .../apache/fluss/security/acl/OperationType.java   |   64 +
 .../apache/fluss/security/acl/PermissionType.java  |   55 +
 .../org/apache/fluss/security/acl/Resource.java    |   92 +
 .../apache/fluss/security/acl/ResourceFilter.java  |   77 +
 .../apache/fluss/security/acl/ResourceType.java    |   88 +
 .../fluss/security/auth/AuthenticationFactory.java |  165 ++
 .../fluss/security/auth/AuthenticationPlugin.java  |   50 +
 .../security/auth/ClientAuthenticationPlugin.java  |   40 +
 .../fluss/security/auth/ClientAuthenticator.java   |  108 ++
 .../auth/PlainTextAuthenticationPlugin.java        |   85 +
 .../security/auth/ServerAuthenticationPlugin.java  |   43 +
 .../fluss/security/auth/ServerAuthenticator.java   |  110 ++
 .../authenticator/SaslAuthenticationPlugin.java    |   45 +
 .../authenticator/SaslClientAuthenticator.java     |  125 ++
 .../authenticator/SaslServerAuthenticator.java     |  153 ++
 .../sasl/jaas/AuthenticateCallbackHandler.java     |   33 +
 .../security/auth/sasl/jaas/DefaultLogin.java      |   81 +
 .../fluss/security/auth/sasl/jaas/JaasConfig.java  |  152 ++
 .../fluss/security/auth/sasl/jaas/JaasContext.java |  277 +++
 .../fluss/security/auth/sasl/jaas/Login.java       |   69 +
 .../security/auth/sasl/jaas/LoginManager.java      |  142 ++
 .../auth/sasl/jaas/SaslClientCallbackHandler.java  |   90 +
 .../security/auth/sasl/jaas/SaslServerFactory.java |  114 ++
 .../auth/sasl/plain/PlainAuthenticateCallback.java |   79 +
 .../security/auth/sasl/plain/PlainLoginModule.java |   77 +
 .../security/auth/sasl/plain/PlainSaslServer.java  |  206 +++
 .../auth/sasl/plain/PlainSaslServerProvider.java   |   49 +
 .../sasl/plain/PlainServerCallbackHandler.java     |   95 +
 .../java/org/apache/fluss/types/ArrayType.java     |  100 ++
 .../java/org/apache/fluss/types/BigIntType.java    |   64 +
 .../java/org/apache/fluss/types/BinaryType.java    |  121 ++
 .../java/org/apache/fluss/types/BooleanType.java   |   63 +
 .../java/org/apache/fluss/types/BytesType.java     |   63 +
 .../main/java/org/apache/fluss/types/CharType.java |  120 ++
 .../java/org/apache/fluss/types/DataField.java     |  121 ++
 .../main/java/org/apache/fluss/types/DataType.java |  172 ++
 .../org/apache/fluss/types/DataTypeChecks.java     |  121 ++
 .../apache/fluss/types/DataTypeDefaultVisitor.java |  126 ++
 .../org/apache/fluss/types/DataTypeFamily.java     |   58 +
 .../java/org/apache/fluss/types/DataTypeRoot.java  |  117 ++
 .../org/apache/fluss/types/DataTypeVisitor.java    |   69 +
 .../java/org/apache/fluss/types/DataTypes.java     |  345 ++++
 .../main/java/org/apache/fluss/types/DateType.java |   67 +
 .../java/org/apache/fluss/types/DecimalType.java   |  128 ++
 .../java/org/apache/fluss/types/DoubleType.java    |   63 +
 .../java/org/apache/fluss/types/FloatType.java     |   64 +
 .../main/java/org/apache/fluss/types/IntType.java  |   63 +
 .../fluss/types/LocalZonedTimestampType.java       |  128 ++
 .../main/java/org/apache/fluss/types/MapType.java  |  110 ++
 .../main/java/org/apache/fluss/types/RowType.java  |  268 +++
 .../java/org/apache/fluss/types/SmallIntType.java  |   63 +
 .../java/org/apache/fluss/types/StringType.java    |   65 +
 .../main/java/org/apache/fluss/types/TimeType.java |  114 ++
 .../java/org/apache/fluss/types/TimestampType.java |  121 ++
 .../java/org/apache/fluss/types/TinyIntType.java   |   63 +
 .../fluss/utils/AbstractAutoCloseableRegistry.java |  179 ++
 .../org/apache/fluss/utils/AbstractIterator.java   |   95 +
 .../java/org/apache/fluss/utils/ArrayUtils.java    |  163 ++
 .../apache}/fluss/utils/ArrowUtils.java            |    0
 .../org/apache/fluss/utils/AutoCloseableAsync.java |   43 +
 .../apache/fluss/utils/AutoPartitionStrategy.java  |   89 +
 .../apache}/fluss/utils/BinaryStringUtils.java     |    0
 .../fluss/utils/ByteBufferReadableChannel.java     |   75 +
 .../java/org/apache/fluss/utils/BytesUtils.java    |  161 ++
 .../org/apache/fluss/utils/CloseableIterator.java  |   59 +
 .../org/apache/fluss/utils/CloseableRegistry.java  |   98 ++
 .../org/apache/fluss/utils/CollectionUtils.java    |   58 +
 .../org/apache/fluss/utils/CopyOnWriteMap.java     |  147 ++
 .../apache}/fluss/utils/DateTimeUtils.java         |    0
 .../java/org/apache/fluss/utils/DecimalUtils.java  |  141 ++
 .../java/org/apache/fluss/utils/EncodingUtils.java |   37 +
 .../org/apache/fluss/utils/ExceptionUtils.java     |  483 +++++
 .../java/org/apache/fluss/utils/ExecutorUtils.java |  104 ++
 .../org/apache/fluss/utils/ExponentialBackoff.java |   92 +
 .../fluss/utils/FatalExitExceptionHandler.java     |   56 +
 .../main/java/org/apache/fluss/utils/FileLock.java |  145 ++
 .../java/org/apache/fluss/utils/FileUtils.java     |  460 +++++
 .../java/org/apache/fluss/utils/FlussPaths.java    |  722 ++++++++
 .../main/java/org/apache/fluss/utils/IOUtils.java  |  225 +++
 .../org/apache/fluss/utils/InstantiationUtils.java |  342 ++++
 .../main/java/org/apache/fluss/utils/MapUtils.java |   57 +
 .../java/org/apache/fluss/utils/MathUtils.java     |  119 ++
 .../fluss/utils/MemorySegmentWritableChannel.java  |   60 +
 .../org/apache/fluss/utils/MurmurHashUtils.java    |  138 ++
 .../apache}/fluss/utils/NetUtils.java              |    0
 .../org/apache/fluss/utils/OperatingSystem.java    |  127 ++
 .../utils/PagedMemorySegmentWritableChannel.java   |   68 +
 .../org/apache/fluss/utils/PartitionUtils.java     |  137 ++
 .../java/org/apache/fluss/utils/Preconditions.java |  229 +++
 .../java/org/apache/fluss/utils/Projection.java    |   89 +
 .../org/apache/fluss/utils/PropertiesUtils.java    |   69 +
 .../org/apache/fluss/utils/ProtoCodecUtils.java    |  294 ++++
 .../org/apache/fluss/utils/SerializableObject.java |   27 +
 .../org/apache/fluss/utils/SerializedValue.java    |  115 ++
 .../java/org/apache/fluss/utils/StringUtils.java   |   55 +
 .../fluss/utils/TemporaryClassLoaderContext.java   |   82 +
 .../java/org/apache/fluss/utils/TimeUtils.java     |  238 +++
 .../java/org/apache/fluss/utils/TypeUtils.java     |   69 +
 .../java/org/apache/fluss/utils/UnionIterator.java |  107 ++
 .../java/org/apache/fluss/utils/UnsafeUtils.java   |   84 +
 .../org/apache/fluss/utils/VarLengthUtils.java     |  326 ++++
 .../java/org/apache/fluss/utils/WrappingProxy.java |   32 +
 .../org/apache/fluss/utils/WrappingProxyUtils.java |   70 +
 .../java/org/apache/fluss/utils/clock/Clock.java   |   63 +
 .../org/apache/fluss/utils/clock/ManualClock.java  |   69 +
 .../org/apache/fluss/utils/clock/SystemClock.java  |   54 +
 .../utils/concurrent/ExecutorThreadFactory.java    |  176 ++
 .../apache/fluss/utils/concurrent/Executors.java   |   46 +
 .../fluss/utils/concurrent/FlussScheduler.java     |  193 ++
 .../apache/fluss/utils/concurrent/FutureUtils.java |  807 +++++++++
 .../apache/fluss/utils/concurrent/LockUtils.java   |   67 +
 .../apache/fluss/utils/concurrent/Scheduler.java   |   61 +
 .../fluss/utils/concurrent/ShutdownableThread.java |  116 ++
 .../apache/fluss/utils/concurrent/ThreadUtils.java |   37 +
 .../java/org/apache/fluss/utils/crc/Checksums.java |  115 ++
 .../java/org/apache/fluss/utils/crc/Crc32C.java    |  164 ++
 .../main/java/org/apache/fluss/utils/crc/Java.java |   70 +
 .../org/apache/fluss/utils/crc/PureJavaCrc32C.java |  631 +++++++
 .../apache/fluss/utils/function/BiFunction.java    |   42 +
 .../fluss/utils/function/CheckedSupplier.java      |   35 +
 .../apache/fluss/utils/function/FunctionUtils.java |   65 +
 .../utils/function/FunctionWithException.java      |   42 +
 .../apache/fluss/utils/function/QuadConsumer.java  |   44 +
 .../utils/function/RunnableWithException.java      |   39 +
 .../utils/function/SupplierWithException.java      |   40 +
 .../fluss/utils/function/ThrowingConsumer.java     |   61 +
 .../fluss/utils/function/ThrowingRunnable.java     |   56 +
 .../fluss/utils/json/BucketOffsetJsonSerde.java    |    0
 .../apache}/fluss/utils/json/ColumnJsonSerde.java  |    0
 .../fluss/utils/json/DataTypeJsonSerde.java        |    0
 .../utils/json/DatabaseDescriptorJsonSerde.java    |    0
 .../apache/fluss/utils/json/JsonDeserializer.java  |   26 +
 .../apache}/fluss/utils/json/JsonSerdeUtils.java   |    0
 .../apache/fluss/utils/json/JsonSerializer.java    |   27 +
 .../apache}/fluss/utils/json/SchemaJsonSerde.java  |    0
 .../fluss/utils/json/TableDescriptorJsonSerde.java |    0
 .../fluss/utils/json/TablePartitionJsonSerde.java  |    0
 .../apache/fluss/utils/log/ByteBufferUnmapper.java |  163 ++
 .../fluss/utils/log/FairBucketStatusMap.java       |  157 ++
 .../java/org/apache/fluss/utils/types/Either.java  |  190 ++
 .../java/org/apache/fluss/utils/types/Tuple.java   |   48 +
 .../java/org/apache/fluss/utils/types/Tuple2.java  |  141 ++
 ...om.alibaba.fluss.fs.token.SecurityTokenReceiver |   20 -
 ...libaba.fluss.security.auth.AuthenticationPlugin |   19 -
 ...org.apache.fluss.fs.token.SecurityTokenReceiver |   20 +
 ...apache.fluss.security.auth.AuthenticationPlugin |   19 +
 .../src/test/assembly/test-plugin-a-assembly.xml   |    4 +-
 .../src/test/assembly/test-plugin-b-assembly.xml   |    4 +-
 .../classloading/ComponentClassLoaderTest.java     |  296 ----
 .../alibaba/fluss/cluster/BucketLocationTest.java  |   60 -
 .../com/alibaba/fluss/cluster/EndpointTest.java    |  176 --
 .../com/alibaba/fluss/cluster/ServerNodeTest.java  |   51 -
 .../ArrowCompressionRatioEstimatorTest.java        |   67 -
 .../com/alibaba/fluss/config/ConfigOptionTest.java |  130 --
 .../alibaba/fluss/config/ConfigurationTest.java    |  502 ------
 .../alibaba/fluss/config/FlussConfigUtilsTest.java |   52 -
 .../com/alibaba/fluss/config/MemorySizeTest.java   |  237 ---
 .../StructuredOptionsSplitterEscapeTest.java       |   86 -
 .../config/StructuredOptionsSplitterTest.java      |  168 --
 .../fluss/fs/FileSystemBehaviorTestSuite.java      |  364 ----
 .../java/com/alibaba/fluss/fs/FileSystemTest.java  |  207 ---
 .../fluss/fs/SafetyNetCloseableRegistryTest.java   |  319 ----
 .../fluss/fs/SafetyNetWrapperFileSystemTest.java   |   64 -
 .../java/com/alibaba/fluss/fs/TestFileSystem.java  |  160 --
 .../fs/local/LocalFileSystemBehaviorTest.java      |   42 -
 .../fluss/fs/local/LocalFileSystemTest.java        |  380 ----
 .../fluss/fs/token/CredentialsJsonSerdeTest.java   |   60 -
 .../fluss/memory/CrossMemorySegmentTypeTest.java   |  272 ---
 .../fluss/memory/EndiannessAccessChecksTest.java   |  168 --
 .../fluss/memory/LazyMemorySegmentPoolTest.java    |  702 --------
 .../fluss/memory/MemorySegmentTestBase.java        | 1391 ---------------
 .../memory/OffHeapDirectMemorySegmentTest.java     |   70 -
 .../fluss/memory/OnHeapMemorySegmentTest.java      |  107 --
 .../fluss/memory/TestingMemorySegmentPool.java     |   80 -
 .../fluss/metadata/ResolvedPartitionSpecTest.java  |   65 -
 .../fluss/metadata/TableDescriptorTest.java        |  319 ----
 .../com/alibaba/fluss/metadata/TablePathTest.java  |   74 -
 .../DescriptiveStatisticsHistogramTest.java        |   95 -
 .../com/alibaba/fluss/metrics/MeterViewTest.java   |  106 --
 .../fluss/metrics/MetricViewUpdaterTest.java       |   85 -
 .../metrics/groups/AbstractMetricGroupTest.java    |  113 --
 .../fluss/metrics/groups/MetricGroupTest.java      |  389 -----
 .../metrics/registry/MetricRegistryImplTest.java   |  227 ---
 .../fluss/metrics/reporter/ReporterSetupTest.java  |  272 ---
 .../metrics/util/CollectingMetricsReporter.java    |   83 -
 .../fluss/metrics/util/DummyCharacterFilter.java   |   28 -
 .../fluss/metrics/util/MetricGroupUtilsTest.java   |   45 -
 .../metrics/util/MetricReporterTestUtils.java      |   51 -
 .../fluss/metrics/util/NOPMetricsGroup.java        |   34 -
 .../alibaba/fluss/metrics/util/TestHistogram.java  |  103 --
 .../com/alibaba/fluss/metrics/util/TestMeter.java  |   51 -
 .../fluss/metrics/util/TestMetricGroup.java        |  146 --
 .../alibaba/fluss/metrics/util/TestReporter.java   |   69 -
 .../plugin/DirectoryBasedPluginFinderTest.java     |  132 --
 .../com/alibaba/fluss/plugin/OtherTestSpi.java     |   23 -
 .../com/alibaba/fluss/plugin/PluginLoaderTest.java |  101 --
 .../com/alibaba/fluss/plugin/PluginTestBase.java   |   52 -
 .../java/com/alibaba/fluss/plugin/TestSpi.java     |   23 -
 .../fluss/plugin/jar/plugina/DynamicClassA.java    |   32 -
 .../fluss/plugin/jar/plugina/TestServiceA.java     |   39 -
 .../plugin/jar/pluginb/OtherTestServiceB.java      |   29 -
 .../fluss/plugin/jar/pluginb/TestServiceB.java     |   29 -
 .../com/alibaba/fluss/record/ChangeTypeTest.java   |   58 -
 .../fluss/record/DefaultKvRecordBatchTest.java     |   78 -
 .../alibaba/fluss/record/DefaultKvRecordTest.java  |  117 --
 .../fluss/record/DefaultLogRecordBatchTest.java    |  155 --
 .../fluss/record/FileLogInputStreamTest.java       |   63 -
 .../fluss/record/FileLogProjectionTest.java        |  299 ----
 .../alibaba/fluss/record/IndexedLogRecordTest.java |   86 -
 .../alibaba/fluss/record/KvRecordTestUtils.java    |  172 --
 .../java/com/alibaba/fluss/record/KvTestBase.java  |   52 -
 .../com/alibaba/fluss/record/LogRecordsTest.java   |  114 --
 .../java/com/alibaba/fluss/record/LogTestBase.java |  112 --
 .../alibaba/fluss/record/MemoryLogRecordsTest.java |   84 -
 .../record/MemorySegmentLogInputStreamTest.java    |   69 -
 .../java/com/alibaba/fluss/record/TestData.java    |  218 ---
 .../alibaba/fluss/row/BinarySegmentUtilsTest.java  |  126 --
 .../com/alibaba/fluss/row/BinaryStringTest.java    |  523 ------
 .../java/com/alibaba/fluss/row/DecimalTest.java    |  132 --
 .../java/com/alibaba/fluss/row/GenericRowTest.java |  153 --
 .../com/alibaba/fluss/row/InternalRowTest.java     |   63 -
 .../com/alibaba/fluss/row/ProjectedRowTest.java    |  162 --
 .../fluss/row/TestInternalRowGenerator.java        |  180 --
 .../com/alibaba/fluss/row/TimestampLtzTest.java    |  102 --
 .../com/alibaba/fluss/row/TimestampNtzTest.java    |   89 -
 .../row/compacted/CompactedRowWriterTest.java      |  172 --
 .../fluss/row/encode/CompactedKeyEncoderTest.java  |  181 --
 .../row/encode/paimon/PaimonKeyEncoderTest.java    |  126 --
 .../fluss/row/indexed/IndexedRowReaderTest.java    |  101 --
 .../alibaba/fluss/row/indexed/IndexedRowTest.java  |  219 ---
 .../auth/TestConflictingAuthenticationPlugin1.java |   41 -
 .../auth/TestConflictingAuthenticationPlugin2.java |   24 -
 .../auth/TestIdentifierAuthenticationPlugin.java   |   85 -
 .../security/auth/sasl/jaas/DigestLoginModule.java |   69 -
 .../security/auth/sasl/jaas/JaasContextTest.java   |  315 ----
 .../security/auth/sasl/jaas/LoginManagerTest.java  |  108 --
 .../security/auth/sasl/jaas/TestJaasConfig.java    |  136 --
 .../auth/sasl/plain/PlainSaslServerTest.java       |  138 --
 .../alibaba/fluss/testutils/InternalRowAssert.java |   78 -
 .../fluss/testutils/InternalRowListAssert.java     |   59 -
 .../alibaba/fluss/testutils/ListLogRecords.java    |   71 -
 .../alibaba/fluss/testutils/LogRecordAssert.java   |   63 -
 .../fluss/testutils/LogRecordBatchAssert.java      |  121 --
 .../alibaba/fluss/testutils/LogRecordsAssert.java  |   80 -
 .../com/alibaba/fluss/types/DataFieldTest.java     |   43 -
 .../alibaba/fluss/types/DataTypeChecksTest.java    |  127 --
 .../alibaba/fluss/types/DataTypeVisitorTest.java   |   88 -
 .../com/alibaba/fluss/types/DataTypesTest.java     |  698 --------
 .../utils/AbstractAutoCloseableRegistryTest.java   |  224 ---
 .../com/alibaba/fluss/utils/ArrayUtilsTest.java    |  127 --
 .../com/alibaba/fluss/utils/BytesUtilsTest.java    |   56 -
 .../alibaba/fluss/utils/CloseableRegistryTest.java |  165 --
 .../com/alibaba/fluss/utils/DateTimeUtilsTest.java |   90 -
 .../alibaba/fluss/utils/ExceptionUtilsTest.java    |  224 ---
 .../com/alibaba/fluss/utils/ExecutorUtilsTest.java |   53 -
 .../fluss/utils/ExponentialBackoffTest.java        |   59 -
 .../com/alibaba/fluss/utils/FileUtilsTest.java     |  155 --
 .../java/com/alibaba/fluss/utils/IOUtilsTest.java  |   89 -
 .../alibaba/fluss/utils/InstantiationUtilTest.java |   97 --
 .../com/alibaba/fluss/utils/MathUtilsTest.java     |   76 -
 .../java/com/alibaba/fluss/utils/NetUtilsTest.java |  184 --
 .../alibaba/fluss/utils/PartitionUtilsTest.java    |  151 --
 .../com/alibaba/fluss/utils/ProjectionTest.java    |   70 -
 .../alibaba/fluss/utils/SerializedValueTest.java   |   48 -
 .../com/alibaba/fluss/utils/StringUtilsTest.java   |   55 -
 .../utils/TemporaryClassLoaderContextTest.java     |   45 -
 .../com/alibaba/fluss/utils/TimeUtilsTest.java     |  167 --
 .../com/alibaba/fluss/utils/TypeUtilsTest.java     |   74 -
 .../com/alibaba/fluss/utils/UnionIteratorTest.java |  142 --
 .../alibaba/fluss/utils/VarLengthUtilsTest.java    |  125 --
 .../alibaba/fluss/utils/WrappingProxyUtilTest.java |   67 -
 .../fluss/utils/concurrent/ConjunctFutureTest.java |  261 ---
 .../concurrent/ExecutorThreadFactoryTest.java      |   82 -
 .../fluss/utils/concurrent/FutureUtilsTest.java    |  550 ------
 .../ManuallyTriggeredScheduledExecutor.java        |   45 -
 .../fluss/utils/concurrent/SchedulerTest.java      |   63 -
 .../utils/concurrent/ShutdownableThreadTest.java   |   46 -
 .../com/alibaba/fluss/utils/crc/Crc32CTest.java    |  138 --
 .../fluss/utils/function/FunctionUtilsTest.java    |   51 -
 .../fluss/utils/json/ColumnJsonSerdeTest.java      |   47 -
 .../fluss/utils/json/DataTypeJsonSerdeTest.java    |  146 --
 .../fluss/utils/json/SchemaJsonSerdeTest.java      |   87 -
 .../utils/json/TableDescriptorJsonSerdeTest.java   |   73 -
 .../utils/json/TablePartitionJsonSerdeTest.java    |   44 -
 .../fluss/utils/log/ByteBufferUnmapperTest.java    |   41 -
 .../fluss/utils/log/FairBucketStatusMapTest.java   |  203 ---
 .../com/alibaba/fluss/utils/types/EitherTest.java  |   57 -
 .../com/alibaba/fluss/utils/types/TupleTest.java   |   52 -
 .../classloading/ComponentClassLoaderTest.java     |  296 ++++
 .../apache/fluss/cluster/BucketLocationTest.java   |   60 +
 .../apache}/fluss/cluster/ClusterTest.java         |    0
 .../org/apache/fluss/cluster/EndpointTest.java     |  176 ++
 .../org/apache/fluss/cluster/ServerNodeTest.java   |   51 +
 .../compression/ArrowCompressionCodecTest.java     |    0
 .../ArrowCompressionRatioEstimatorTest.java        |   67 +
 .../org/apache/fluss/config/ConfigOptionTest.java  |  130 ++
 .../org/apache/fluss/config/ConfigurationTest.java |  502 ++++++
 .../apache/fluss/config/FlussConfigUtilsTest.java  |   52 +
 .../org/apache/fluss/config/MemorySizeTest.java    |  237 +++
 .../StructuredOptionsSplitterEscapeTest.java       |   86 +
 .../config/StructuredOptionsSplitterTest.java      |  168 ++
 .../fluss/fs/FileSystemBehaviorTestSuite.java      |  364 ++++
 .../java/org/apache/fluss/fs/FileSystemTest.java   |  207 +++
 .../fluss/fs/SafetyNetCloseableRegistryTest.java   |  319 ++++
 .../fluss/fs/SafetyNetWrapperFileSystemTest.java   |   64 +
 .../java/org/apache/fluss/fs/TestFileSystem.java   |  160 ++
 .../fs/local/LocalFileSystemBehaviorTest.java      |   42 +
 .../apache/fluss/fs/local/LocalFileSystemTest.java |  380 ++++
 .../fluss/fs/token/CredentialsJsonSerdeTest.java   |   60 +
 .../fluss/lake/lakestorage/LakeStorageTest.java    |    0
 .../fluss/memory/CrossMemorySegmentTypeTest.java   |  272 +++
 .../fluss/memory/EndiannessAccessChecksTest.java   |  168 ++
 .../fluss/memory/LazyMemorySegmentPoolTest.java    |  702 ++++++++
 .../apache/fluss/memory/MemorySegmentTestBase.java | 1391 +++++++++++++++
 .../memory/OffHeapDirectMemorySegmentTest.java     |   70 +
 .../fluss/memory/OnHeapMemorySegmentTest.java      |  107 ++
 .../fluss/memory/TestingMemorySegmentPool.java     |   80 +
 .../fluss/metadata/ResolvedPartitionSpecTest.java  |   65 +
 .../apache/fluss/metadata/TableDescriptorTest.java |  319 ++++
 .../org/apache/fluss/metadata/TablePathTest.java   |   74 +
 .../DescriptiveStatisticsHistogramTest.java        |   95 +
 .../org/apache/fluss/metrics/MeterViewTest.java    |  106 ++
 .../fluss/metrics/MetricViewUpdaterTest.java       |   85 +
 .../metrics/groups/AbstractMetricGroupTest.java    |  113 ++
 .../fluss/metrics/groups/MetricGroupTest.java      |  389 +++++
 .../metrics/registry/MetricRegistryImplTest.java   |  227 +++
 .../fluss/metrics/reporter/ReporterSetupTest.java  |  272 +++
 .../metrics/util/CollectingMetricsReporter.java    |   83 +
 .../fluss/metrics/util/DummyCharacterFilter.java   |   28 +
 .../fluss/metrics/util/MetricGroupUtilsTest.java   |   45 +
 .../metrics/util/MetricReporterTestUtils.java      |   51 +
 .../apache/fluss/metrics/util/NOPMetricsGroup.java |   34 +
 .../apache/fluss/metrics/util/TestHistogram.java   |  103 ++
 .../org/apache/fluss/metrics/util/TestMeter.java   |   51 +
 .../apache/fluss/metrics/util/TestMetricGroup.java |  146 ++
 .../apache/fluss/metrics/util/TestReporter.java    |   69 +
 .../fluss/plugin/DefaultPluginManagerTest.java     |    0
 .../plugin/DirectoryBasedPluginFinderTest.java     |  132 ++
 .../java/org/apache/fluss/plugin/OtherTestSpi.java |   23 +
 .../org/apache/fluss/plugin/PluginLoaderTest.java  |  101 ++
 .../org/apache/fluss/plugin/PluginTestBase.java    |   52 +
 .../test/java/org/apache/fluss/plugin/TestSpi.java |   23 +
 .../fluss/plugin/jar/plugina/DynamicClassA.java    |   32 +
 .../fluss/plugin/jar/plugina/TestServiceA.java     |   39 +
 .../plugin/jar/pluginb/OtherTestServiceB.java      |   29 +
 .../fluss/plugin/jar/pluginb/TestServiceB.java     |   29 +
 .../org/apache/fluss/record/ChangeTypeTest.java    |   58 +
 .../fluss/record/DefaultKvRecordBatchTest.java     |   78 +
 .../apache/fluss/record/DefaultKvRecordTest.java   |  117 ++
 .../fluss/record/DefaultLogRecordBatchTest.java    |  155 ++
 .../fluss/record/FileLogInputStreamTest.java       |   63 +
 .../apache/fluss/record/FileLogProjectionTest.java |  299 ++++
 .../apache}/fluss/record/FileLogRecordsTest.java   |    0
 .../apache/fluss/record/IndexedLogRecordTest.java  |   86 +
 .../org/apache/fluss/record/KvRecordTestUtils.java |  172 ++
 .../java/org/apache/fluss/record/KvTestBase.java   |   52 +
 .../org/apache/fluss/record/LogRecordsTest.java    |  114 ++
 .../java/org/apache/fluss/record/LogTestBase.java  |  112 ++
 .../record/MemoryLogRecordsArrowBuilderTest.java   |    0
 .../apache/fluss/record/MemoryLogRecordsTest.java  |   84 +
 .../record/MemorySegmentLogInputStreamTest.java    |   69 +
 .../java/org/apache/fluss/record/TestData.java     |  218 +++
 .../fluss/record/send/SendWritableOutputTest.java  |    0
 .../apache/fluss/row/BinarySegmentUtilsTest.java   |  126 ++
 .../org/apache/fluss/row/BinaryStringTest.java     |  523 ++++++
 .../java/org/apache/fluss/row/DecimalTest.java     |  132 ++
 .../java/org/apache/fluss/row/GenericRowTest.java  |  153 ++
 .../java/org/apache/fluss/row/InternalRowTest.java |   63 +
 .../org/apache/fluss/row/ProjectedRowTest.java     |  162 ++
 .../apache/fluss/row/TestInternalRowGenerator.java |  180 ++
 .../org/apache/fluss/row/TimestampLtzTest.java     |  102 ++
 .../org/apache/fluss/row/TimestampNtzTest.java     |   89 +
 .../fluss/row/arrow/ArrowReaderWriterTest.java     |    0
 .../fluss/row/arrow/ArrowWriterPoolTest.java       |    0
 .../row/compacted/CompactedRowWriterTest.java      |  172 ++
 .../fluss/row/encode/CompactedKeyEncoderTest.java  |  181 ++
 .../row/encode/paimon/PaimonKeyEncoderTest.java    |  126 ++
 .../fluss/row/indexed/IndexedRowReaderTest.java    |  101 ++
 .../apache/fluss/row/indexed/IndexedRowTest.java   |  219 +++
 .../security/auth/AuthenticationFactoryTest.java   |    0
 .../auth/TestConflictingAuthenticationPlugin1.java |   41 +
 .../auth/TestConflictingAuthenticationPlugin2.java |   24 +
 .../auth/TestIdentifierAuthenticationPlugin.java   |   85 +
 .../security/auth/sasl/jaas/DigestLoginModule.java |   69 +
 .../security/auth/sasl/jaas/JaasContextTest.java   |  315 ++++
 .../security/auth/sasl/jaas/LoginManagerTest.java  |  108 ++
 .../security/auth/sasl/jaas/TestJaasConfig.java    |  136 ++
 .../auth/sasl/plain/PlainSaslServerTest.java       |  138 ++
 .../apache}/fluss/testutils/ByteBufChannel.java    |    0
 .../apache}/fluss/testutils/DataTestUtils.java     |    0
 .../apache/fluss/testutils/InternalRowAssert.java  |   78 +
 .../fluss/testutils/InternalRowListAssert.java     |   59 +
 .../org/apache/fluss/testutils/ListLogRecords.java |   71 +
 .../apache/fluss/testutils/LogRecordAssert.java    |   63 +
 .../fluss/testutils/LogRecordBatchAssert.java      |  121 ++
 .../apache/fluss/testutils/LogRecordsAssert.java   |   80 +
 .../java/org/apache/fluss/types/DataFieldTest.java |   43 +
 .../org/apache/fluss/types/DataTypeChecksTest.java |  127 ++
 .../apache/fluss/types/DataTypeVisitorTest.java    |   88 +
 .../java/org/apache/fluss/types/DataTypesTest.java |  698 ++++++++
 .../utils/AbstractAutoCloseableRegistryTest.java   |  224 +++
 .../org/apache/fluss/utils/ArrayUtilsTest.java     |  127 ++
 .../apache}/fluss/utils/ArrowUtilsTest.java        |    0
 .../org/apache/fluss/utils/BytesUtilsTest.java     |   56 +
 .../apache/fluss/utils/CloseableRegistryTest.java  |  165 ++
 .../org/apache/fluss/utils/DateTimeUtilsTest.java  |   90 +
 .../org/apache/fluss/utils/ExceptionUtilsTest.java |  224 +++
 .../org/apache/fluss/utils/ExecutorUtilsTest.java  |   53 +
 .../apache/fluss/utils/ExponentialBackoffTest.java |   59 +
 .../java/org/apache/fluss/utils/FileUtilsTest.java |  155 ++
 .../java/org/apache/fluss/utils/IOUtilsTest.java   |   89 +
 .../apache/fluss/utils/InstantiationUtilTest.java  |   97 ++
 .../java/org/apache/fluss/utils/MathUtilsTest.java |   76 +
 .../java/org/apache/fluss/utils/NetUtilsTest.java  |  184 ++
 .../utils/ParentResourceBlockingClassLoader.java   |    0
 .../org/apache/fluss/utils/PartitionUtilsTest.java |  151 ++
 .../org/apache/fluss/utils/ProjectionTest.java     |   70 +
 .../apache}/fluss/utils/ProtoCodecUtilsTest.java   |    0
 .../apache/fluss/utils/SerializedValueTest.java    |   48 +
 .../org/apache/fluss/utils/StringUtilsTest.java    |   55 +
 .../utils/TemporaryClassLoaderContextTest.java     |   45 +
 .../java/org/apache/fluss/utils/TimeUtilsTest.java |  167 ++
 .../java/org/apache/fluss/utils/TypeUtilsTest.java |   74 +
 .../org/apache/fluss/utils/UnionIteratorTest.java  |  142 ++
 .../org/apache/fluss/utils/VarLengthUtilsTest.java |  125 ++
 .../apache/fluss/utils/WrappingProxyUtilTest.java  |   67 +
 .../fluss/utils/concurrent/ConjunctFutureTest.java |  261 +++
 .../concurrent/ExecutorThreadFactoryTest.java      |   82 +
 .../fluss/utils/concurrent/FutureUtilsTest.java    |  550 ++++++
 .../ManuallyTriggeredScheduledExecutor.java        |   45 +
 .../fluss/utils/concurrent/SchedulerTest.java      |   63 +
 .../utils/concurrent/ShutdownableThreadTest.java   |   46 +
 .../org/apache/fluss/utils/crc/Crc32CTest.java     |  138 ++
 .../fluss/utils/function/FunctionUtilsTest.java    |   51 +
 .../utils/json/BucketOffsetJsonSerdeTest.java      |    0
 .../fluss/utils/json/ColumnJsonSerdeTest.java      |   47 +
 .../fluss/utils/json/DataTypeJsonSerdeTest.java    |  146 ++
 .../fluss/utils/json/JsonSerdeTestBase.java        |    0
 .../fluss/utils/json/SchemaJsonSerdeTest.java      |   87 +
 .../utils/json/TableDescriptorJsonSerdeTest.java   |   73 +
 .../utils/json/TablePartitionJsonSerdeTest.java    |   44 +
 .../fluss/utils/log/ByteBufferUnmapperTest.java    |   41 +
 .../fluss/utils/log/FairBucketStatusMapTest.java   |  203 +++
 .../org/apache/fluss/utils/types/EitherTest.java   |   57 +
 .../org/apache/fluss/utils/types/TupleTest.java    |   52 +
 ...libaba.fluss.security.auth.AuthenticationPlugin |   19 -
 .../services/org.apache.fluss.fs.FileSystemPlugin  |   17 +
 ...apache.fluss.security.auth.AuthenticationPlugin |   19 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 .../plugin-a/com.alibaba.fluss.plugin.TestSpi      |   17 -
 .../plugin-a/org.apache.fluss.plugin.TestSpi       |   17 +
 .../plugin-b/com.alibaba.fluss.plugin.OtherTestSpi |   17 -
 .../plugin-b/com.alibaba.fluss.plugin.TestSpi      |   17 -
 .../plugin-b/org.apache.fluss.plugin.OtherTestSpi  |   17 +
 .../plugin-b/org.apache.fluss.plugin.TestSpi       |   17 +
 fluss-dist/pom.xml                                 |   18 +-
 .../java/com/alibaba/fluss/dist/DummyClass.java    |   21 -
 .../java/org/apache/fluss/dist/DummyClass.java     |   21 +
 fluss-dist/src/main/resources/bin/fluss-console.sh |    4 +-
 fluss-dist/src/main/resources/bin/fluss-daemon.sh  |    4 +-
 .../main/resources/conf/log4j-console.properties   |    2 +-
 .../src/main/resources/conf/log4j.properties       |    2 +-
 fluss-dist/src/main/resources/conf/logback.xml     |    2 +-
 fluss-filesystems/fluss-fs-gs/pom.xml              |   10 +-
 .../java/com/alibaba/fluss/fs/gs/GSFileSystem.java |   51 -
 .../alibaba/fluss/fs/gs/GSFileSystemPlugin.java    |   92 -
 .../java/org/apache/fluss/fs/gs/GSFileSystem.java  |   51 +
 .../org/apache/fluss/fs/gs/GSFileSystemPlugin.java |   92 +
 .../services/com.alibaba.fluss.fs.FileSystemPlugin |   17 -
 .../services/org.apache.fluss.fs.FileSystemPlugin  |   17 +
 .../fluss/fs/gs/GSFileSystemBehaviorITCase.java    |   12 +-
 .../com/alibaba/fluss/fs/gs/MockAuthServer.java    |    2 +-
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-filesystems/fluss-fs-hadoop-shaded/pom.xml   |   12 +-
 fluss-filesystems/fluss-fs-hadoop/pom.xml          |   10 +-
 .../fluss/fs/hdfs/HadoopDataInputStream.java       |  137 --
 .../fluss/fs/hdfs/HadoopDataOutputStream.java      |   67 -
 .../alibaba/fluss/fs/hdfs/HadoopFileStatus.java    |   64 -
 .../alibaba/fluss/fs/hdfs/HadoopFileSystem.java    |  134 --
 .../com/alibaba/fluss/fs/hdfs/HadoopFsPlugin.java  |  179 --
 .../fluss/fs/hdfs/HadoopSecurityTokenReceiver.java |   35 -
 .../alibaba/fluss/fs/hdfs/utils/HadoopUtils.java   |  191 --
 .../fluss/fs/hdfs/HadoopDataInputStream.java       |  137 ++
 .../fluss/fs/hdfs/HadoopDataOutputStream.java      |   67 +
 .../org/apache/fluss/fs/hdfs/HadoopFileStatus.java |   64 +
 .../org/apache/fluss/fs/hdfs/HadoopFileSystem.java |  134 ++
 .../org/apache/fluss/fs/hdfs/HadoopFsPlugin.java   |  179 ++
 .../fluss/fs/hdfs/HadoopSecurityTokenReceiver.java |   35 +
 .../apache/fluss/fs/hdfs/utils/HadoopUtils.java    |  191 ++
 .../services/com.alibaba.fluss.fs.FileSystemPlugin |   17 -
 ...om.alibaba.fluss.fs.token.SecurityTokenReceiver |   17 -
 .../services/org.apache.fluss.fs.FileSystemPlugin  |   17 +
 ...org.apache.fluss.fs.token.SecurityTokenReceiver |   17 +
 .../fluss/fs/hdfs/HadoopConfigLoadingTest.java     |    8 +-
 .../fluss/fs/hdfs/HadoopDataInputStreamTest.java   |    4 +-
 .../fluss/fs/hdfs/HadoopFreeFsPluginTest.java      |    6 +-
 .../com/alibaba/fluss/fs/hdfs/HadoopFreeTests.java |    6 +-
 .../alibaba/fluss/fs/hdfs/HadoopFsPluginTest.java  |    6 +-
 .../fs/hdfs/HadoopLocalFileSystemBehaviorTest.java |   10 +-
 .../alibaba/fluss/fs/hdfs/HdfsBehaviorTest.java    |   16 +-
 .../fluss/fs/hdfs/utils/HadoopUtilsTest.java       |   18 +-
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-filesystems/fluss-fs-oss/pom.xml             |   12 +-
 .../com/alibaba/fluss/fs/oss/OSSFileSystem.java    |   68 -
 .../alibaba/fluss/fs/oss/OSSFileSystemPlugin.java  |  171 --
 .../DynamicTemporaryOssCredentialsProvider.java    |   60 -
 .../fs/oss/token/OSSSecurityTokenProvider.java     |  107 --
 .../fs/oss/token/OSSSecurityTokenReceiver.java     |  108 --
 .../org/apache/fluss/fs/oss/OSSFileSystem.java     |   68 +
 .../apache/fluss/fs/oss/OSSFileSystemPlugin.java   |  171 ++
 .../DynamicTemporaryOssCredentialsProvider.java    |   60 +
 .../fs/oss/token/OSSSecurityTokenProvider.java     |  107 ++
 .../fs/oss/token/OSSSecurityTokenReceiver.java     |  108 ++
 .../services/com.alibaba.fluss.fs.FileSystemPlugin |   17 -
 ...om.alibaba.fluss.fs.token.SecurityTokenReceiver |   17 -
 .../services/org.apache.fluss.fs.FileSystemPlugin  |   17 +
 ...org.apache.fluss.fs.token.SecurityTokenReceiver |   17 +
 .../fluss/fs/oss/OSSFileSystemBehaviorITCase.java  |   64 -
 .../alibaba/fluss/fs/oss/OSSTestCredentials.java   |  139 --
 ...redentialsProviderFileSystemBehaviorITCase.java |   65 -
 .../OSSWithTokenFileSystemBehaviorBaseITCase.java  |   41 -
 .../oss/OSSWithTokenFileSystemBehaviorITCase.java  |   72 -
 .../fluss/fs/oss/OSSFileSystemBehaviorITCase.java  |   64 +
 .../apache/fluss/fs/oss/OSSTestCredentials.java    |  139 ++
 ...redentialsProviderFileSystemBehaviorITCase.java |   65 +
 .../OSSWithTokenFileSystemBehaviorBaseITCase.java  |   41 +
 .../oss/OSSWithTokenFileSystemBehaviorITCase.java  |   72 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-filesystems/fluss-fs-s3/pom.xml              |   10 +-
 .../alibaba/fluss/fs/s3/S3AFileSystemPlugin.java   |   27 -
 .../java/com/alibaba/fluss/fs/s3/S3FileSystem.java |   65 -
 .../alibaba/fluss/fs/s3/S3FileSystemPlugin.java    |  141 --
 .../DynamicTemporaryAWSCredentialsProvider.java    |   62 -
 .../fs/s3/token/S3ADelegationTokenReceiver.java    |   26 -
 .../fs/s3/token/S3DelegationTokenProvider.java     |  100 --
 .../fs/s3/token/S3DelegationTokenReceiver.java     |   98 --
 .../apache/fluss/fs/s3/S3AFileSystemPlugin.java    |   27 +
 .../java/org/apache/fluss/fs/s3/S3FileSystem.java  |   65 +
 .../org/apache/fluss/fs/s3/S3FileSystemPlugin.java |  141 ++
 .../DynamicTemporaryAWSCredentialsProvider.java    |   62 +
 .../fs/s3/token/S3ADelegationTokenReceiver.java    |   26 +
 .../fs/s3/token/S3DelegationTokenProvider.java     |  100 ++
 .../fs/s3/token/S3DelegationTokenReceiver.java     |   98 ++
 ...Plugin => org.apache.fluss.fs.FileSystemPlugin} |    0
 ...rg.apache.fluss.fs.token.SecurityTokenReceiver} |    0
 .../fluss/fs/s3/S3FileSystemBehaviorITCase.java    |   53 -
 .../com/alibaba/fluss/fs/s3/S3TestCredentials.java |  125 --
 .../fs/s3/S3WithTokenFileSystemBehaviorITCase.java |   74 -
 .../fluss/fs/s3/S3FileSystemBehaviorITCase.java    |   53 +
 .../org/apache/fluss/fs/s3/S3TestCredentials.java  |  125 ++
 .../fs/s3/S3WithTokenFileSystemBehaviorITCase.java |   74 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-filesystems/pom.xml                          |    2 +-
 fluss-flink/fluss-flink-1.18/pom.xml               |   22 +-
 .../org.apache.flink.table.factories.Factory       |    2 +-
 .../flink/catalog/Flink118CatalogFactoryTest.java  |   21 -
 .../fluss/flink/catalog/Flink118CatalogITCase.java |   21 -
 .../flink/catalog/Flink118TableFactoryTest.java    |   21 -
 .../fluss/flink/metrics/Flink118MetricsITCase.java |   21 -
 .../flink/procedure/Flink118ProcedureITCase.java   |   42 -
 .../security/acl/Flink118AuthorizationITCase.java  |   21 -
 .../fluss/flink/sink/Flink118TableSinkITCase.java  |   21 -
 .../source/Flink118TableSourceBatchITCase.java     |   21 -
 .../source/Flink118TableSourceFailOverITCase.java  |   21 -
 .../flink/source/Flink118TableSourceITCase.java    |   21 -
 .../flink/catalog/Flink118CatalogFactoryTest.java  |   21 +
 .../fluss/flink/catalog/Flink118CatalogITCase.java |   21 +
 .../flink/catalog/Flink118TableFactoryTest.java    |   21 +
 .../fluss/flink/metrics/Flink118MetricsITCase.java |   21 +
 .../flink/procedure/Flink118ProcedureITCase.java   |   42 +
 .../security/acl/Flink118AuthorizationITCase.java  |   21 +
 .../fluss/flink/sink/Flink118TableSinkITCase.java  |   21 +
 .../source/Flink118TableSourceBatchITCase.java     |   21 +
 .../source/Flink118TableSourceFailOverITCase.java  |   21 +
 .../flink/source/Flink118TableSourceITCase.java    |   21 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-flink/fluss-flink-1.19/pom.xml               |   22 +-
 .../org.apache.flink.table.factories.Factory       |    2 +-
 .../flink/catalog/Flink119CatalogFactoryTest.java  |   21 -
 .../fluss/flink/catalog/Flink119CatalogITCase.java |   21 -
 .../flink/catalog/Flink119TableFactoryTest.java    |   21 -
 .../fluss/flink/metrics/Flink119MetricsITCase.java |   21 -
 .../flink/procedure/Flink119ProcedureITCase.java   |   21 -
 .../security/acl/Flink119AuthorizationITCase.java  |   21 -
 .../fluss/flink/sink/Flink119TableSinkITCase.java  |   21 -
 .../source/Flink119TableSourceBatchITCase.java     |   21 -
 .../source/Flink119TableSourceFailOverITCase.java  |   21 -
 .../flink/source/Flink119TableSourceITCase.java    |   21 -
 .../flink/catalog/Flink119CatalogFactoryTest.java  |   21 +
 .../fluss/flink/catalog/Flink119CatalogITCase.java |   21 +
 .../flink/catalog/Flink119TableFactoryTest.java    |   21 +
 .../fluss/flink/metrics/Flink119MetricsITCase.java |   21 +
 .../flink/procedure/Flink119ProcedureITCase.java   |   21 +
 .../security/acl/Flink119AuthorizationITCase.java  |   21 +
 .../fluss/flink/sink/Flink119TableSinkITCase.java  |   21 +
 .../source/Flink119TableSourceBatchITCase.java     |   21 +
 .../source/Flink119TableSourceFailOverITCase.java  |   21 +
 .../flink/source/Flink119TableSourceITCase.java    |   21 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-flink/fluss-flink-1.20/pom.xml               |   22 +-
 .../com/alibaba/fluss/flink/DummyClass120.java     |   21 -
 .../java/org/apache/fluss/flink/DummyClass120.java |   21 +
 .../org.apache.flink.table.factories.Factory       |    2 +-
 .../flink/catalog/Flink120CatalogFactoryTest.java  |   21 -
 .../fluss/flink/catalog/Flink120CatalogITCase.java |   21 -
 .../flink/catalog/Flink120TableFactoryTest.java    |   21 -
 .../fluss/flink/metrics/Flink120MetricsITCase.java |   21 -
 .../flink/procedure/Flink120ProcedureITCase.java   |   21 -
 .../security/acl/Flink120AuthorizationITCase.java  |   21 -
 .../fluss/flink/sink/Flink120TableSinkITCase.java  |   21 -
 .../source/Flink120TableSourceBatchITCase.java     |   21 -
 .../source/Flink120TableSourceFailOverITCase.java  |   21 -
 .../flink/source/Flink120TableSourceITCase.java    |   21 -
 .../flink/catalog/Flink120CatalogFactoryTest.java  |   21 +
 .../fluss/flink/catalog/Flink120CatalogITCase.java |   21 +
 .../flink/catalog/Flink120TableFactoryTest.java    |   21 +
 .../fluss/flink/metrics/Flink120MetricsITCase.java |   21 +
 .../flink/procedure/Flink120ProcedureITCase.java   |   21 +
 .../security/acl/Flink120AuthorizationITCase.java  |   21 +
 .../fluss/flink/sink/Flink120TableSinkITCase.java  |   21 +
 .../source/Flink120TableSourceBatchITCase.java     |   21 +
 .../source/Flink120TableSourceFailOverITCase.java  |   21 +
 .../flink/source/Flink120TableSourceITCase.java    |   21 +
 .../fluss/flink/catalog/Flink21CatalogITCase.java  |    4 +
 fluss-flink/fluss-flink-common/pom.xml             |   14 +-
 .../alibaba/fluss/flink/FlinkConnectorOptions.java |  170 --
 .../fluss/flink/catalog/FlinkCatalogFactory.java   |   68 -
 .../fluss/flink/catalog/FlinkCatalogOptions.java   |   33 -
 .../com/alibaba/fluss/flink/lake/LakeCatalog.java  |    4 +
 .../fluss/flink/lake/LakeRecordRecordEmitter.java  |   10 +
 .../fluss/flink/lake/LakeSplitGenerator.java       |   21 +
 .../flink/lake/LakeSplitStateInitializer.java      |   11 +
 .../alibaba/fluss/flink/lake/LakeTableFactory.java |    4 +
 .../fluss/flink/lake/reader/SortMergeReader.java   |   52 +
 .../flink/lake/state/LakeSnapshotSplitState.java   |    6 +
 .../alibaba/fluss/flink/metrics/FlinkCounter.java  |   55 -
 .../alibaba/fluss/flink/metrics/FlinkGauge.java    |   35 -
 .../fluss/flink/metrics/FlinkHistogram.java        |   93 -
 .../alibaba/fluss/flink/metrics/FlinkMeter.java    |   50 -
 .../fluss/flink/metrics/FlinkMetricRegistry.java   |  151 --
 .../flink/procedure/AbstractAclProcedure.java      |  140 --
 .../fluss/flink/procedure/AddAclProcedure.java     |   85 -
 .../fluss/flink/procedure/DropAclProcedure.java    |   76 -
 .../fluss/flink/procedure/ListAclProcedure.java    |  135 --
 .../fluss/flink/procedure/ProcedureBase.java       |   31 -
 .../fluss/flink/procedure/ProcedureManager.java    |   90 -
 .../alibaba/fluss/flink/row/FlinkAsFlussRow.java   |  135 --
 .../com/alibaba/fluss/flink/row/OperationType.java |   48 -
 .../com/alibaba/fluss/flink/row/RowWithOp.java     |  100 --
 .../alibaba/fluss/flink/sink/ChannelComputer.java  |   41 -
 .../flink/sink/FlinkRowDataChannelComputer.java    |  134 --
 .../com/alibaba/fluss/flink/sink/FlinkSink.java    |  221 ---
 .../fluss/flink/sink/FlinkStreamPartitioner.java   |   77 -
 .../alibaba/fluss/flink/sink/FlinkTableSink.java   |  385 ----
 .../com/alibaba/fluss/flink/sink/FlussSink.java    |   55 -
 .../alibaba/fluss/flink/sink/FlussSinkBuilder.java |  196 ---
 .../sink/serializer/FlussSerializationSchema.java  |   71 -
 .../serializer/RowDataSerializationSchema.java     |  120 --
 .../sink/serializer/SerializerInitContextImpl.java |   40 -
 .../fluss/flink/sink/writer/AppendSinkWriter.java  |   75 -
 .../fluss/flink/sink/writer/FlinkSinkWriter.java   |  258 ---
 .../fluss/flink/sink/writer/UpsertSinkWriter.java  |   91 -
 .../alibaba/fluss/flink/source/FlussSource.java    |  101 --
 .../fluss/flink/source/FlussSourceBuilder.java     |  305 ----
 .../deserializer/DeserializerInitContextImpl.java  |   57 -
 .../deserializer/FlussDeserializationSchema.java   |  107 --
 .../deserializer/RowDataDeserializationSchema.java |   94 -
 .../initializer/BucketOffsetsRetrieverImpl.java    |   90 -
 .../initializer/EarliestOffsetsInitializer.java    |   52 -
 .../initializer/LatestOffsetsInitializer.java      |   41 -
 .../initializer/NoStoppingOffsetsInitializer.java  |   42 -
 .../enumerator/initializer/OffsetsInitializer.java |  116 --
 .../initializer/SnapshotOffsetsInitializer.java    |   46 -
 .../initializer/TimestampOffsetsInitializer.java   |   46 -
 .../event/PartitionBucketsUnsubscribedEvent.java   |   66 -
 .../flink/source/event/PartitionsRemovedEvent.java |   48 -
 .../source/lookup/FlinkAsyncLookupFunction.java    |  229 ---
 .../flink/source/lookup/FlinkLookupFunction.java   |  182 --
 .../flink/source/lookup/LookupNormalizer.java      |  339 ----
 .../source/metrics/FlinkSourceReaderMetrics.java   |  129 --
 .../flink/source/reader/BoundedSplitReader.java    |  189 --
 .../source/reader/FlinkRecordsWithSplitIds.java    |  160 --
 .../flink/source/reader/MutableRecordAndPos.java   |   38 -
 .../fluss/flink/source/reader/RecordAndPos.java    |   92 -
 .../fluss/flink/source/reader/SplitScanner.java    |   33 -
 .../flink/source/split/HybridSnapshotLogSplit.java |  110 --
 .../source/split/HybridSnapshotLogSplitState.java  |   59 -
 .../alibaba/fluss/flink/source/split/LogSplit.java |  104 --
 .../fluss/flink/source/split/LogSplitState.java    |   46 -
 .../fluss/flink/source/split/SnapshotSplit.java    |   91 -
 .../fluss/flink/source/split/SourceSplitBase.java  |  120 --
 .../fluss/flink/source/split/SourceSplitState.java |   54 -
 .../FlussSourceEnumeratorStateSerializer.java      |  112 --
 .../flink/source/state/SourceEnumeratorState.java  |   77 -
 .../fluss/flink/tiering/LakeTieringJobBuilder.java |  115 --
 .../tiering/committer/CommittableMessage.java      |   35 -
 .../committer/CommittableMessageTypeInfo.java      |  144 --
 .../committer/TieringCommitOperatorFactory.java    |   63 -
 .../committer/TieringCommitterInitContext.java     |   37 -
 .../flink/tiering/event/FailedTieringEvent.java    |   43 -
 .../flink/tiering/event/FinishedTieringEvent.java  |   36 -
 .../tiering/source/TableBucketWriteResult.java     |   96 -
 .../source/TableBucketWriteResultEmitter.java      |   39 -
 .../source/TableBucketWriteResultSerializer.java   |  142 --
 .../source/TableBucketWriteResultTypeInfo.java     |  120 --
 .../flink/tiering/source/TieringSourceOptions.java |   37 -
 .../flink/tiering/source/TieringSourceReader.java  |   88 -
 .../flink/tiering/source/TieringSplitReader.java   |  544 ------
 .../tiering/source/TieringWriterInitContext.java   |   76 -
 .../source/enumerator/TieringSourceEnumerator.java |  468 -----
 .../tiering/source/split/TieringLogSplit.java      |  121 --
 .../tiering/source/split/TieringSnapshotSplit.java |  123 --
 .../flink/tiering/source/split/TieringSplit.java   |  138 --
 .../source/split/TieringSplitGenerator.java        |  326 ----
 .../source/split/TieringSplitSerializer.java       |  158 --
 .../source/state/TieringSourceEnumeratorState.java |   41 -
 .../TieringSourceEnumeratorStateSerializer.java    |   51 -
 .../tiering/source/state/TieringSplitState.java    |   60 -
 .../fluss/flink/utils/CatalogExceptionUtils.java   |   75 -
 .../fluss/flink/utils/CatalogPropertiesUtils.java  |  378 ----
 .../alibaba/fluss/flink/utils/DataLakeUtils.java   |   65 -
 .../flink/utils/FlinkConnectorOptionsUtils.java    |  156 --
 .../flink/utils/FlinkRowToFlussRowConverter.java   |  183 --
 .../fluss/flink/utils/FlinkTypeToFlussType.java    |  176 --
 .../com/alibaba/fluss/flink/utils/FlinkUtils.java  |   41 -
 .../flink/utils/FlussRowToFlinkRowConverter.java   |  154 --
 .../fluss/flink/utils/FlussTypeToFlinkType.java    |  177 --
 .../fluss/flink/utils/PojoToRowConverter.java      |  352 ----
 .../alibaba/fluss/flink/utils/PushdownUtils.java   |  458 -----
 .../com/alibaba/fluss/flink/utils/TimeFormats.java |   90 -
 .../alibaba/fluss/flink/utils/TimestampFormat.java |   38 -
 .../apache/fluss/flink/FlinkConnectorOptions.java  |  170 ++
 .../apache}/fluss/flink/catalog/FlinkCatalog.java  |    0
 .../fluss/flink/catalog/FlinkCatalogFactory.java   |   68 +
 .../fluss/flink/catalog/FlinkCatalogOptions.java   |   33 +
 .../fluss/flink/catalog/FlinkTableFactory.java     |    0
 .../apache/fluss/flink/metrics/FlinkCounter.java   |   55 +
 .../org/apache/fluss/flink/metrics/FlinkGauge.java |   35 +
 .../apache/fluss/flink/metrics/FlinkHistogram.java |   93 +
 .../org/apache/fluss/flink/metrics/FlinkMeter.java |   50 +
 .../fluss/flink/metrics/FlinkMetricRegistry.java   |  151 ++
 .../flink/procedure/AbstractAclProcedure.java      |  140 ++
 .../fluss/flink/procedure/AddAclProcedure.java     |   85 +
 .../fluss/flink/procedure/DropAclProcedure.java    |   76 +
 .../fluss/flink/procedure/ListAclProcedure.java    |  135 ++
 .../fluss/flink/procedure/ProcedureBase.java       |   31 +
 .../fluss/flink/procedure/ProcedureManager.java    |   90 +
 .../apache/fluss/flink/row/FlinkAsFlussRow.java    |  135 ++
 .../org/apache/fluss/flink/row/OperationType.java  |   48 +
 .../java/org/apache/fluss/flink/row/RowWithOp.java |  100 ++
 .../apache/fluss/flink/sink/ChannelComputer.java   |   41 +
 .../flink/sink/FlinkRowDataChannelComputer.java    |  134 ++
 .../org/apache/fluss/flink/sink/FlinkSink.java     |  221 +++
 .../fluss/flink/sink/FlinkStreamPartitioner.java   |   77 +
 .../apache/fluss/flink/sink/FlinkTableSink.java    |  385 ++++
 .../org/apache/fluss/flink/sink/FlussSink.java     |   55 +
 .../apache/fluss/flink/sink/FlussSinkBuilder.java  |  196 +++
 .../sink/serializer/FlussSerializationSchema.java  |   71 +
 .../serializer/RowDataSerializationSchema.java     |  120 ++
 .../sink/serializer/SerializerInitContextImpl.java |   40 +
 .../fluss/flink/sink/writer/AppendSinkWriter.java  |   75 +
 .../fluss/flink/sink/writer/FlinkSinkWriter.java   |  258 +++
 .../fluss/flink/sink/writer/UpsertSinkWriter.java  |   91 +
 .../apache}/fluss/flink/source/FlinkSource.java    |    0
 .../fluss/flink/source/FlinkTableSource.java       |    0
 .../org/apache/fluss/flink/source/FlussSource.java |  101 ++
 .../fluss/flink/source/FlussSourceBuilder.java     |  305 ++++
 .../deserializer/DeserializerInitContextImpl.java  |   57 +
 .../deserializer/FlussDeserializationSchema.java   |  107 ++
 .../JsonStringDeserializationSchema.java           |    0
 .../deserializer/RowDataDeserializationSchema.java |   94 +
 .../flink/source/emitter/FlinkRecordEmitter.java   |    0
 .../source/enumerator/FlinkSourceEnumerator.java   |    0
 .../initializer/BucketOffsetsRetrieverImpl.java    |   90 +
 .../initializer/EarliestOffsetsInitializer.java    |   52 +
 .../initializer/LatestOffsetsInitializer.java      |   41 +
 .../initializer/NoStoppingOffsetsInitializer.java  |   42 +
 .../enumerator/initializer/OffsetsInitializer.java |  116 ++
 .../initializer/SnapshotOffsetsInitializer.java    |   46 +
 .../initializer/TimestampOffsetsInitializer.java   |   46 +
 .../event/PartitionBucketsUnsubscribedEvent.java   |   66 +
 .../flink/source/event/PartitionsRemovedEvent.java |   48 +
 .../source/lookup/FlinkAsyncLookupFunction.java    |  229 +++
 .../flink/source/lookup/FlinkLookupFunction.java   |  182 ++
 .../flink/source/lookup/LookupNormalizer.java      |  339 ++++
 .../source/metrics/FlinkSourceReaderMetrics.java   |  129 ++
 .../flink/source/reader/BoundedSplitReader.java    |  189 ++
 .../source/reader/FlinkRecordsWithSplitIds.java    |  160 ++
 .../flink/source/reader/FlinkSourceReader.java     |    0
 .../source/reader/FlinkSourceSplitReader.java      |    0
 .../flink/source/reader/MutableRecordAndPos.java   |   38 +
 .../fluss/flink/source/reader/RecordAndPos.java    |   92 +
 .../fluss/flink/source/reader/SplitScanner.java    |   33 +
 .../reader/fetcher/FlinkSourceFetcherManager.java  |    0
 .../flink/source/split/HybridSnapshotLogSplit.java |  110 ++
 .../source/split/HybridSnapshotLogSplitState.java  |   59 +
 .../apache/fluss/flink/source/split/LogSplit.java  |  104 ++
 .../fluss/flink/source/split/LogSplitState.java    |   46 +
 .../fluss/flink/source/split/SnapshotSplit.java    |   91 +
 .../fluss/flink/source/split/SourceSplitBase.java  |  120 ++
 .../flink/source/split/SourceSplitSerializer.java  |    0
 .../fluss/flink/source/split/SourceSplitState.java |   54 +
 .../FlussSourceEnumeratorStateSerializer.java      |  112 ++
 .../flink/source/state/SourceEnumeratorState.java  |   77 +
 .../fluss/flink/tiering/LakeTieringJobBuilder.java |  115 ++
 .../tiering/committer/CommittableMessage.java      |   35 +
 .../committer/CommittableMessageTypeInfo.java      |  144 ++
 .../tiering/committer/FlussTableLakeSnapshot.java  |    0
 .../committer/FlussTableLakeSnapshotCommitter.java |    0
 .../tiering/committer/TieringCommitOperator.java   |    0
 .../committer/TieringCommitOperatorFactory.java    |   63 +
 .../committer/TieringCommitterInitContext.java     |   37 +
 .../flink/tiering/event/FailedTieringEvent.java    |   43 +
 .../flink/tiering/event/FinishedTieringEvent.java  |   36 +
 .../tiering/source/TableBucketWriteResult.java     |   96 +
 .../source/TableBucketWriteResultEmitter.java      |   39 +
 .../source/TableBucketWriteResultSerializer.java   |  142 ++
 .../source/TableBucketWriteResultTypeInfo.java     |  120 ++
 .../fluss/flink/tiering/source/TieringSource.java  |    0
 .../flink/tiering/source/TieringSourceOptions.java |   37 +
 .../flink/tiering/source/TieringSourceReader.java  |   88 +
 .../flink/tiering/source/TieringSplitReader.java   |  544 ++++++
 .../tiering/source/TieringWriterInitContext.java   |   76 +
 .../source/enumerator/TieringSourceEnumerator.java |  468 +++++
 .../tiering/source/split/TieringLogSplit.java      |  121 ++
 .../tiering/source/split/TieringSnapshotSplit.java |  123 ++
 .../flink/tiering/source/split/TieringSplit.java   |  138 ++
 .../source/split/TieringSplitGenerator.java        |  326 ++++
 .../source/split/TieringSplitSerializer.java       |  158 ++
 .../source/state/TieringSourceEnumeratorState.java |   41 +
 .../TieringSourceEnumeratorStateSerializer.java    |   51 +
 .../tiering/source/state/TieringSplitState.java    |   60 +
 .../fluss/flink/utils/CatalogExceptionUtils.java   |   75 +
 .../fluss/flink/utils/CatalogPropertiesUtils.java  |  378 ++++
 .../apache/fluss/flink/utils/DataLakeUtils.java    |   65 +
 .../flink/utils/FlinkConnectorOptionsUtils.java    |  156 ++
 .../fluss/flink/utils/FlinkConversions.java        |    0
 .../flink/utils/FlinkRowToFlussRowConverter.java   |  183 ++
 .../fluss/flink/utils/FlinkTypeToFlussType.java    |  176 ++
 .../org/apache/fluss/flink/utils/FlinkUtils.java   |   41 +
 .../flink/utils/FlussRowToFlinkRowConverter.java   |  154 ++
 .../flink/utils/FlussRowToJsonConverters.java      |    0
 .../fluss/flink/utils/FlussTypeToFlinkType.java    |  177 ++
 .../apache}/fluss/flink/utils/LakeSourceUtils.java |    0
 .../fluss/flink/utils/PojoToRowConverter.java      |  352 ++++
 .../apache/fluss/flink/utils/PushdownUtils.java    |  458 +++++
 .../org/apache/fluss/flink/utils/TimeFormats.java  |   90 +
 .../apache/fluss/flink/utils/TimestampFormat.java  |   38 +
 .../flink/catalog/FlinkCatalogFactoryTest.java     |  142 --
 .../fluss/flink/catalog/FlinkCatalogITCase.java    |  667 -------
 .../fluss/flink/catalog/FlinkCatalogTest.java      |  801 ---------
 .../fluss/flink/catalog/FlinkTableFactoryTest.java |  283 ---
 .../fluss/flink/catalog/TestSchemaResolver.java    |  139 --
 .../fluss/flink/metrics/FlinkMetricsITCase.java    |  200 ---
 .../flink/procedure/FlinkProcedureITCase.java      |  287 ---
 .../fluss/flink/row/FlinkAsFlussRowTest.java       |  156 --
 .../com/alibaba/fluss/flink/row/RowWithOpTest.java |  108 --
 .../sink/FlinkRowDataChannelComputerTest.java      |  122 --
 .../fluss/flink/sink/FlinkTableSinkITCase.java     | 1094 ------------
 .../fluss/flink/sink/FlussSinkBuilderTest.java     |  187 --
 .../alibaba/fluss/flink/sink/FlussSinkITCase.java  |  393 -----
 .../sink/serializer/OrderSerializationSchema.java  |   93 -
 .../serializer/OrderSerializationSchemaTest.java   |  161 --
 .../flink/sink/writer/FlinkSinkWriterTest.java     |  233 ---
 .../flink/sink/writer/MockWriterInitContext.java   |   38 -
 .../flink/source/FlinkTableSourceBatchITCase.java  |  439 -----
 .../source/FlinkTableSourceFailOverITCase.java     |  232 ---
 .../fluss/flink/source/FlussSourceBuilderTest.java |  306 ----
 .../fluss/flink/source/FlussSourceITCase.java      |  302 ----
 .../FlussDeserializationSchemaTest.java            |  265 ---
 .../RowDataDeserializationSchemaTest.java          |  173 --
 .../source/emitter/FlinkRecordEmitterTest.java     |  172 --
 .../enumerator/FlinkSourceEnumeratorTest.java      |  674 -------
 .../source/lookup/FlinkLookupFunctionTest.java     |  168 --
 .../metrics/FlinkSourceReaderMetricsTest.java      |   95 -
 .../source/reader/BoundedSplitReaderTest.java      |  139 --
 .../flink/source/reader/FlinkSourceReaderTest.java |  186 --
 .../source/reader/FlinkSourceSplitReaderTest.java  |  473 -----
 .../flink/source/reader/RecordAndPosTest.java      |   56 -
 .../source/split/SourceSplitSerializerTest.java    |   74 -
 .../state/SourceEnumeratorStateSerializerTest.java |   60 -
 .../flink/source/state/SourceSplitStateTest.java   |   97 --
 .../source/testutils/FlinkRowAssertionsUtils.java  |  125 --
 .../flink/source/testutils/MockDataUtils.java      |  146 --
 .../fluss/flink/source/testutils/Order.java        |  178 --
 .../testutils/OrderDeserializationSchema.java      |   99 --
 .../fluss/flink/source/testutils/OrderPartial.java |   68 -
 .../OrderPartialDeserializationSchema.java         |   58 -
 .../flink/source/testutils/RecordAndPosAssert.java |   62 -
 .../flink/tiering/TestingLakeTieringFactory.java   |  145 --
 .../fluss/flink/tiering/TestingWriteResult.java    |   32 -
 .../committer/CommittableMessageTypeInfoTest.java  |   34 -
 .../tiering/committer/TestingCommittable.java      |   36 -
 .../committer/TestingCommittableSerializer.java    |   57 -
 .../TableBucketWriteResultSerializerTest.java      |   77 -
 .../source/TableBucketWriteResultTypeInfoTest.java |   34 -
 .../source/TestingWriteResultSerializer.java       |   48 -
 .../tiering/source/TieringSplitReaderTest.java     |  370 ----
 .../flink/tiering/source/TieringTestBase.java      |  350 ----
 .../enumerator/TieringSourceEnumeratorTest.java    |  700 --------
 .../source/split/TieringSplitSerializerTest.java   |  110 --
 ...TieringSourceEnumeratorStateSerializerTest.java |   42 -
 .../source/state/TieringSplitStateTest.java        |   55 -
 .../fluss/flink/utils/CatalogTableTestUtils.java   |   85 -
 .../flink/utils/FlinkConnectorOptionsUtilTest.java |   61 -
 .../fluss/flink/utils/FlinkConversionsTest.java    |  290 ---
 .../utils/FlinkRowToFlussRowConverterTest.java     |   92 -
 .../alibaba/fluss/flink/utils/FlinkTestBase.java   |  309 ----
 .../utils/FlussRowToFlinkRowConverterTest.java     |   96 -
 .../fluss/flink/utils/PojoToRowConverterTest.java  |  478 -----
 .../flink/catalog/FlinkCatalogFactoryTest.java     |  142 ++
 .../fluss/flink/catalog/FlinkCatalogITCase.java    |  667 +++++++
 .../fluss/flink/catalog/FlinkCatalogTest.java      |  801 +++++++++
 .../fluss/flink/catalog/FlinkTableFactoryTest.java |  283 +++
 .../fluss/flink/catalog/TestSchemaResolver.java    |  139 ++
 .../fluss/flink/metrics/FlinkMetricsITCase.java    |  200 +++
 .../flink/procedure/FlinkProcedureITCase.java      |  287 +++
 .../fluss/flink/row/FlinkAsFlussRowTest.java       |  156 ++
 .../org/apache/fluss/flink/row/RowWithOpTest.java  |  108 ++
 .../security/acl/FlinkAuthorizationITCase.java     |    0
 .../sink/FlinkRowDataChannelComputerTest.java      |  122 ++
 .../fluss/flink/sink/FlinkTableSinkITCase.java     | 1094 ++++++++++++
 .../fluss/flink/sink/FlussSinkBuilderTest.java     |  187 ++
 .../apache/fluss/flink/sink/FlussSinkITCase.java   |  393 +++++
 .../sink/serializer/OrderSerializationSchema.java  |   93 +
 .../serializer/OrderSerializationSchemaTest.java   |  161 ++
 .../flink/sink/writer/FlinkSinkWriterTest.java     |  233 +++
 .../flink/sink/writer/MockWriterInitContext.java   |   38 +
 .../flink/source/FlinkTableSourceBatchITCase.java  |  439 +++++
 .../source/FlinkTableSourceFailOverITCase.java     |  232 +++
 .../fluss/flink/source/FlinkTableSourceITCase.java |    0
 .../fluss/flink/source/FlussSourceBuilderTest.java |  306 ++++
 .../fluss/flink/source/FlussSourceITCase.java      |  302 ++++
 .../FlussDeserializationSchemaTest.java            |  265 +++
 .../RowDataDeserializationSchemaTest.java          |  173 ++
 .../source/emitter/FlinkRecordEmitterTest.java     |  172 ++
 .../enumerator/FlinkSourceEnumeratorTest.java      |  674 +++++++
 .../source/lookup/FlinkLookupFunctionTest.java     |  168 ++
 .../metrics/FlinkSourceReaderMetricsTest.java      |   95 +
 .../source/reader/BoundedSplitReaderTest.java      |  139 ++
 .../flink/source/reader/FlinkSourceReaderTest.java |  186 ++
 .../source/reader/FlinkSourceSplitReaderTest.java  |  473 +++++
 .../flink/source/reader/RecordAndPosTest.java      |   56 +
 .../source/split/SourceSplitSerializerTest.java    |   74 +
 .../state/SourceEnumeratorStateSerializerTest.java |   60 +
 .../flink/source/state/SourceSplitStateTest.java   |   97 ++
 .../source/testutils/FlinkRowAssertionsUtils.java  |  125 ++
 .../flink/source/testutils/MockDataUtils.java      |  146 ++
 .../apache/fluss/flink/source/testutils/Order.java |  178 ++
 .../testutils/OrderDeserializationSchema.java      |   99 ++
 .../fluss/flink/source/testutils/OrderPartial.java |   68 +
 .../OrderPartialDeserializationSchema.java         |   58 +
 .../flink/source/testutils/RecordAndPosAssert.java |   62 +
 .../flink/tiering/TestingLakeTieringFactory.java   |  145 ++
 .../fluss/flink/tiering/TestingWriteResult.java    |   32 +
 .../committer/CommittableMessageTypeInfoTest.java  |   34 +
 .../FlussTableLakeSnapshotCommitterTest.java       |    0
 .../tiering/committer/TestingCommittable.java      |   36 +
 .../committer/TestingCommittableSerializer.java    |   57 +
 .../committer/TieringCommitOperatorTest.java       |    0
 .../TableBucketWriteResultSerializerTest.java      |   77 +
 .../source/TableBucketWriteResultTypeInfoTest.java |   34 +
 .../source/TestingWriteResultSerializer.java       |   48 +
 .../tiering/source/TieringSplitReaderTest.java     |  370 ++++
 .../flink/tiering/source/TieringTestBase.java      |  350 ++++
 .../enumerator/TieringSourceEnumeratorTest.java    |  700 ++++++++
 .../source/split/TieringSplitSerializerTest.java   |  110 ++
 ...TieringSourceEnumeratorStateSerializerTest.java |   42 +
 .../source/state/TieringSplitStateTest.java        |   55 +
 .../fluss/flink/utils/CatalogTableTestUtils.java   |   85 +
 .../flink/utils/FlinkConnectorOptionsUtilTest.java |   61 +
 .../fluss/flink/utils/FlinkConversionsTest.java    |  290 +++
 .../utils/FlinkRowToFlussRowConverterTest.java     |   92 +
 .../apache/fluss/flink/utils/FlinkTestBase.java    |  309 ++++
 .../utils/FlussRowToFlinkRowConverterTest.java     |   96 +
 .../fluss/flink/utils/PojoToRowConverterTest.java  |  478 +++++
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-flink/fluss-flink-tiering/pom.xml            |    6 +-
 .../flink/tiering/FlussLakeTieringEntrypoint.java  |   93 -
 .../flink/tiering/FlussLakeTieringEntrypoint.java  |   93 +
 fluss-flink/pom.xml                                |    2 +-
 fluss-jmh/pom.xml                                  |   12 +-
 .../fluss/jmh/ArrowReadableChannelBenchmark.java   |   26 +-
 .../fluss/jmh/ArrowWritableChannelBenchmark.java   |   22 +
 .../com/alibaba/fluss/jmh/LogScannerBenchmark.java |   38 +-
 .../alibaba/fluss/kafka/KafkaRequestHandler.java   |  246 ---
 .../fluss/kafka/KafkaChannelInitializer.java       |    0
 .../apache}/fluss/kafka/KafkaCommandDecoder.java   |    0
 .../apache}/fluss/kafka/KafkaProtocolPlugin.java   |    0
 .../apache}/fluss/kafka/KafkaRequest.java          |    0
 .../apache/fluss/kafka/KafkaRequestHandler.java    |  246 +++
 ...libaba.fluss.rpc.protocol.NetworkProtocolPlugin |   19 -
 ...apache.fluss.rpc.protocol.NetworkProtocolPlugin |   19 +
 .../com/alibaba/fluss/kafka/KafkaConfigsTest.java  |   56 -
 .../alibaba/fluss/kafka/KafkaRequestITCase.java    |  162 --
 .../fluss/kafka/TestingChannelHandlerContext.java  |  241 ---
 .../org/apache/fluss/kafka/KafkaConfigsTest.java   |   56 +
 .../fluss/kafka/KafkaRequestHandlerTest.java       |    0
 .../org/apache/fluss/kafka/KafkaRequestITCase.java |  162 ++
 .../fluss/kafka/TestingChannelHandlerContext.java  |  241 +++
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 .../fluss/lake/lance/tiering/LanceWriteResult.java |    4 +
 fluss-lake/fluss-lake-paimon/pom.xml               |   18 +-
 .../lake/paimon/FlussDataTypeToPaimonDataType.java |  169 --
 .../fluss/lake/paimon/PaimonLakeCatalog.java       |  197 ---
 .../fluss/lake/paimon/PaimonLakeStoragePlugin.java |   38 -
 .../lake/paimon/source/FlussRowAsPaimonRow.java    |   15 +
 .../lake/paimon/tiering/PaimonCatalogProvider.java |   44 -
 .../lake/paimon/tiering/PaimonCommittable.java     |   34 -
 .../tiering/PaimonCommittableSerializer.java       |   61 -
 .../paimon/tiering/PaimonLakeTieringFactory.java   |   63 -
 .../lake/paimon/tiering/PaimonLakeWriter.java      |  105 --
 .../lake/paimon/tiering/PaimonWriteResult.java     |   38 -
 .../tiering/PaimonWriteResultSerializer.java       |   58 -
 .../fluss/lake/paimon/tiering/RecordWriter.java    |   69 -
 .../paimon/tiering/append/AppendOnlyWriter.java    |   61 -
 .../paimon/tiering/mergetree/MergeTreeWriter.java  |   76 -
 .../lake/paimon/utils/PaimonRowAsFlussRow.java     |  141 --
 .../lake/paimon/FlussDataTypeToPaimonDataType.java |  169 ++
 .../fluss/lake/paimon/PaimonLakeCatalog.java       |  197 +++
 .../fluss/lake/paimon/PaimonLakeStorage.java       |    0
 .../fluss/lake/paimon/PaimonLakeStoragePlugin.java |   38 +
 .../paimon/tiering/FlussRecordAsPaimonRow.java     |    0
 .../lake/paimon/tiering/PaimonCatalogProvider.java |   44 +
 .../lake/paimon/tiering/PaimonCommittable.java     |   34 +
 .../tiering/PaimonCommittableSerializer.java       |   61 +
 .../lake/paimon/tiering/PaimonLakeCommitter.java   |    0
 .../paimon/tiering/PaimonLakeTieringFactory.java   |   63 +
 .../lake/paimon/tiering/PaimonLakeWriter.java      |  105 ++
 .../lake/paimon/tiering/PaimonWriteResult.java     |   38 +
 .../tiering/PaimonWriteResultSerializer.java       |   58 +
 .../fluss/lake/paimon/tiering/RecordWriter.java    |   69 +
 .../paimon/tiering/append/AppendOnlyWriter.java    |   61 +
 .../paimon/tiering/mergetree/MergeTreeWriter.java  |   76 +
 .../utils/FlussToPaimonPredicateConverter.java     |    0
 .../fluss/lake/paimon/utils/PaimonConversions.java |    0
 .../lake/paimon/utils/PaimonRowAsFlussRow.java     |  145 ++
 ...libaba.fluss.lake.lakestorage.LakeStoragePlugin |   19 -
 ...apache.fluss.lake.lakestorage.LakeStoragePlugin |   19 +
 .../lake/paimon/LakeEnabledTableCreateITCase.java  |  438 -----
 .../paimon/flink/FlinkUnionReadLogTableITCase.java |  250 ---
 .../flink/FlinkUnionReadPrimaryKeyTableITCase.java |  568 ------
 .../lake/paimon/flink/FlinkUnionReadTestBase.java  |   55 -
 .../paimon/tiering/FlussRecordAsPaimonRowTest.java |  166 --
 .../tiering/ReCreateSameTableAfterTieringTest.java |   85 -
 .../lake/paimon/LakeEnabledTableCreateITCase.java  |  438 +++++
 .../paimon/flink/FlinkUnionReadLogTableITCase.java |  250 +++
 .../flink/FlinkUnionReadPrimaryKeyTableITCase.java |  568 ++++++
 .../lake/paimon/flink/FlinkUnionReadTestBase.java  |   55 +
 .../testutils/FlinkPaimonTieringTestBase.java      |    0
 .../paimon/tiering/FlussRecordAsPaimonRowTest.java |  166 ++
 .../lake/paimon/tiering/PaimonTieringITCase.java   |    0
 .../lake/paimon/tiering/PaimonTieringTest.java     |    0
 .../tiering/ReCreateSameTableAfterTieringTest.java |   85 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-lake/pom.xml                                 |    2 +-
 fluss-metrics/fluss-metrics-jmx/pom.xml            |    8 +-
 .../com/alibaba/fluss/metrics/jmx/JMXReporter.java |  418 -----
 .../fluss/metrics/jmx/JMXReporterPlugin.java       |   39 -
 .../com/alibaba/fluss/metrics/jmx/JMXServer.java   |  167 --
 .../com/alibaba/fluss/metrics/jmx/JMXService.java  |  104 --
 .../org/apache/fluss/metrics/jmx/JMXReporter.java  |  418 +++++
 .../fluss/metrics/jmx/JMXReporterPlugin.java       |   39 +
 .../org/apache/fluss/metrics/jmx/JMXServer.java    |  167 ++
 .../org/apache/fluss/metrics/jmx/JMXService.java   |  104 ++
 ...aba.fluss.metrics.reporter.MetricReporterPlugin |   20 -
 ...che.fluss.metrics.reporter.MetricReporterPlugin |   20 +
 .../fluss/metrics/jmx/JMXReporterPluginTest.java   |   73 -
 .../alibaba/fluss/metrics/jmx/JMXReporterTest.java |  275 ---
 .../alibaba/fluss/metrics/jmx/JMXServerTest.java   |   95 -
 .../alibaba/fluss/metrics/jmx/JMXServiceTest.java  |   48 -
 .../fluss/metrics/jmx/JMXReporterPluginTest.java   |   73 +
 .../apache/fluss/metrics/jmx/JMXReporterTest.java  |  275 +++
 .../apache/fluss/metrics/jmx/JMXServerTest.java    |   95 +
 .../apache/fluss/metrics/jmx/JMXServiceTest.java   |   48 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-metrics/fluss-metrics-prometheus/pom.xml     |    8 +-
 .../metrics/prometheus/PrometheusReporter.java     |  406 -----
 .../prometheus/PrometheusReporterPlugin.java       |   49 -
 .../metrics/prometheus/PrometheusReporter.java     |  406 +++++
 .../prometheus/PrometheusReporterPlugin.java       |   49 +
 ...aba.fluss.metrics.reporter.MetricReporterPlugin |   20 -
 ...che.fluss.metrics.reporter.MetricReporterPlugin |   20 +
 .../PrometheusReporterDifferentLabelValueTest.java |  272 ---
 .../fluss/metrics/prometheus/TestUtils.java        |   48 -
 .../PrometheusReporterDifferentLabelValueTest.java |  272 +++
 .../metrics/prometheus/PrometheusReporterTest.java |    0
 .../apache/fluss/metrics/prometheus/TestUtils.java |   48 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-metrics/pom.xml                              |    2 +-
 fluss-protogen/fluss-protogen-generator/pom.xml    |    4 +-
 .../generator/generator/NameUtilities.java         |   77 -
 .../protogen/generator/generator/ProtoGen.java     |  133 --
 .../generator/ProtobufAbstractRepeated.java        |   47 -
 .../generator/generator/ProtobufBooleanField.java  |   46 -
 .../generator/generator/ProtobufBytesField.java    |  106 --
 .../protogen/generator/generator/ProtobufEnum.java |   69 -
 .../generator/generator/ProtobufEnumField.java     |   39 -
 .../generator/generator/ProtobufField.java         |  174 --
 .../generator/generator/ProtobufMessage.java       |  376 ----
 .../generator/generator/ProtobufMessageField.java  |  116 --
 .../generator/generator/ProtobufRecordsField.java  |  197 ---
 .../generator/ProtobufRepeatedBytesField.java      |  162 --
 .../generator/ProtobufRepeatedEnumField.java       |   60 -
 .../generator/ProtobufRepeatedMessageField.java    |  186 --
 .../generator/ProtobufRepeatedNumberField.java     |  208 ---
 .../generator/ProtobufRepeatedStringField.java     |  184 --
 .../generator/generator/ProtobufStringField.java   |  129 --
 .../generator/generator/RecordsFieldFinder.java    |   42 -
 .../generator/generator/NameUtilities.java         |   77 +
 .../generator/generator/ProtoCodeGenerator.java    |    0
 .../protogen/generator/generator/ProtoGen.java     |  133 ++
 .../protogen/generator/generator/ProtoGenUtil.java |    0
 .../generator/ProtobufAbstractRepeated.java        |   47 +
 .../generator/generator/ProtobufBooleanField.java  |   46 +
 .../generator/generator/ProtobufBytesField.java    |  106 ++
 .../protogen/generator/generator/ProtobufEnum.java |   69 +
 .../generator/generator/ProtobufEnumField.java     |   39 +
 .../generator/generator/ProtobufField.java         |  174 ++
 .../generator/generator/ProtobufMessage.java       |  376 ++++
 .../generator/generator/ProtobufMessageField.java  |  116 ++
 .../generator/generator/ProtobufNumberField.java   |    0
 .../generator/generator/ProtobufRecordsField.java  |  197 +++
 .../generator/ProtobufRepeatedBytesField.java      |  162 ++
 .../generator/ProtobufRepeatedEnumField.java       |   60 +
 .../generator/ProtobufRepeatedMessageField.java    |  186 ++
 .../generator/ProtobufRepeatedNumberField.java     |  208 +++
 .../generator/ProtobufRepeatedStringField.java     |  184 ++
 .../generator/generator/ProtobufStringField.java   |  129 ++
 .../generator/generator/RecordsFieldFinder.java    |   42 +
 fluss-protogen/fluss-protogen-maven-plugin/pom.xml |    4 +-
 .../fluss/protogen/maven/plugin/ProtoGenMojo.java  |  112 --
 .../fluss/protogen/maven/plugin/ProtoGenMojo.java  |  112 ++
 fluss-protogen/fluss-protogen-tests/pom.xml        |   10 +-
 .../fluss/protogen/benchmark/ProtoBenchmark.java   |    0
 .../fluss/protogen/benchmark/SimpleBenchmark.java  |    0
 .../benchmark/StringEncodingBenchmark.java         |    0
 .../src/main/proto/addressbook.proto               |    2 +-
 .../src/main/proto/bytes.proto                     |    2 +-
 .../src/main/proto/enums.proto                     |    2 +-
 .../src/main/proto/messages.proto                  |    2 +-
 .../src/main/proto/numbers.proto                   |    2 +-
 .../src/main/proto/point_frame.proto               |    2 +-
 .../src/main/proto/repeated_numbers.proto          |    2 +-
 .../src/main/proto/required.proto                  |    2 +-
 .../src/main/proto/strings.proto                   |    2 +-
 .../fluss/protogen/tests/AddressBookTest.java      |    0
 .../apache}/fluss/protogen/tests/BytesTest.java    |    0
 .../apache}/fluss/protogen/tests/EnumsTest.java    |    0
 .../apache}/fluss/protogen/tests/MessagesTest.java |    0
 .../apache}/fluss/protogen/tests/NumbersTest.java  |    0
 .../fluss/protogen/tests/RepeatedNumbersTest.java  |    0
 .../apache}/fluss/protogen/tests/RequiredTest.java |    0
 .../apache}/fluss/protogen/tests/StringsTest.java  |    0
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-protogen/pom.xml                             |    2 +-
 fluss-rpc/pom.xml                                  |   10 +-
 .../com/alibaba/fluss/rpc/GatewayClientProxy.java  |   82 -
 .../main/java/com/alibaba/fluss/rpc/RpcClient.java |   81 -
 .../com/alibaba/fluss/rpc/RpcGatewayService.java   |   88 -
 .../main/java/com/alibaba/fluss/rpc/RpcServer.java |   82 -
 .../fluss/rpc/entity/FetchLogResultForBucket.java  |  105 --
 .../fluss/rpc/entity/LimitScanResultForBucket.java |   72 -
 .../rpc/entity/ListOffsetsResultForBucket.java     |   78 -
 .../fluss/rpc/entity/LookupResultForBucket.java    |   47 -
 .../rpc/entity/PrefixLookupResultForBucket.java    |   48 -
 .../rpc/entity/ProduceLogResultForBucket.java      |   71 -
 .../fluss/rpc/entity/PutKvResultForBucket.java     |   42 -
 .../alibaba/fluss/rpc/entity/ResultForBucket.java  |  104 --
 .../fluss/rpc/entity/WriteResultForBucket.java     |   64 -
 .../alibaba/fluss/rpc/gateway/AdminGateway.java    |  109 --
 .../fluss/rpc/gateway/AdminReadOnlyGateway.java    |  190 --
 .../fluss/rpc/gateway/CoordinatorGateway.java      |   81 -
 .../fluss/rpc/gateway/TabletServerGateway.java     |  175 --
 .../fluss/rpc/metrics/ClientMetricGroup.java       |   55 -
 .../fluss/rpc/metrics/ConnectionMetricGroup.java   |  128 --
 .../fluss/rpc/netty/NettyChannelInitializer.java   |   60 -
 .../com/alibaba/fluss/rpc/netty/NettyUtils.java    |  121 --
 .../rpc/netty/client/ClientHandlerCallback.java    |   57 -
 .../fluss/rpc/netty/client/ServerApiVersions.java  |   93 -
 .../rpc/netty/server/FlussRequestHandler.java      |   86 -
 .../fluss/rpc/netty/server/RequestChannel.java     |   75 -
 .../fluss/rpc/netty/server/RequestHandler.java     |   34 -
 .../fluss/rpc/netty/server/RequestProcessor.java   |  117 --
 .../rpc/netty/server/RequestProcessorPool.java     |  129 --
 .../fluss/rpc/netty/server/RequestsMetrics.java    |  187 --
 .../alibaba/fluss/rpc/netty/server/RpcRequest.java |   30 -
 .../alibaba/fluss/rpc/netty/server/Session.java    |   65 -
 .../fluss/rpc/netty/server/ShutdownRequest.java    |   38 -
 .../com/alibaba/fluss/rpc/protocol/ApiError.java   |  154 --
 .../com/alibaba/fluss/rpc/protocol/ApiKeys.java    |  117 --
 .../com/alibaba/fluss/rpc/protocol/Errors.java     |  341 ----
 .../java/com/alibaba/fluss/rpc/protocol/RPC.java   |   35 -
 .../alibaba/fluss/rpc/protocol/RequestType.java    |   31 -
 .../alibaba/fluss/rpc/protocol/ResponseType.java   |   54 -
 .../org/apache/fluss/rpc/GatewayClientProxy.java   |   82 +
 .../main/java/org/apache/fluss/rpc/RpcClient.java  |   81 +
 .../apache}/fluss/rpc/RpcGateway.java              |    0
 .../org/apache/fluss/rpc/RpcGatewayService.java    |   88 +
 .../main/java/org/apache/fluss/rpc/RpcServer.java  |   82 +
 .../fluss/rpc/entity/FetchLogResultForBucket.java  |  105 ++
 .../fluss/rpc/entity/LimitScanResultForBucket.java |   72 +
 .../rpc/entity/ListOffsetsResultForBucket.java     |   78 +
 .../fluss/rpc/entity/LookupResultForBucket.java    |   47 +
 .../rpc/entity/PrefixLookupResultForBucket.java    |   48 +
 .../rpc/entity/ProduceLogResultForBucket.java      |   71 +
 .../fluss/rpc/entity/PutKvResultForBucket.java     |   42 +
 .../apache/fluss/rpc/entity/ResultForBucket.java   |  104 ++
 .../fluss/rpc/entity/WriteResultForBucket.java     |   64 +
 .../org/apache/fluss/rpc/gateway/AdminGateway.java |  109 ++
 .../fluss/rpc/gateway/AdminReadOnlyGateway.java    |  190 ++
 .../fluss/rpc/gateway/CoordinatorGateway.java      |   81 +
 .../fluss/rpc/gateway/TabletServerGateway.java     |  175 ++
 .../fluss/rpc/metrics/ClientMetricGroup.java       |   55 +
 .../fluss/rpc/metrics/ConnectionMetricGroup.java   |  128 ++
 .../fluss/rpc/netty/NettyChannelInitializer.java   |   60 +
 .../apache}/fluss/rpc/netty/NettyLogger.java       |    0
 .../apache}/fluss/rpc/netty/NettyMetrics.java      |    0
 .../org/apache/fluss/rpc/netty/NettyUtils.java     |  121 ++
 .../rpc/netty/client/ClientChannelInitializer.java |    0
 .../rpc/netty/client/ClientHandlerCallback.java    |   57 +
 .../fluss/rpc/netty/client/NettyClient.java        |    0
 .../fluss/rpc/netty/client/NettyClientHandler.java |    0
 .../fluss/rpc/netty/client/ServerApiVersions.java  |   93 +
 .../fluss/rpc/netty/client/ServerConnection.java   |    0
 .../rpc/netty/server/FlussProtocolPlugin.java      |    0
 .../fluss/rpc/netty/server/FlussRequest.java       |    0
 .../rpc/netty/server/FlussRequestHandler.java      |   86 +
 .../fluss/rpc/netty/server/NettyServer.java        |    0
 .../fluss/rpc/netty/server/NettyServerHandler.java |    0
 .../fluss/rpc/netty/server/RequestChannel.java     |   75 +
 .../fluss/rpc/netty/server/RequestHandler.java     |   34 +
 .../fluss/rpc/netty/server/RequestProcessor.java   |  117 ++
 .../rpc/netty/server/RequestProcessorPool.java     |  129 ++
 .../fluss/rpc/netty/server/RequestsMetrics.java    |  187 ++
 .../apache/fluss/rpc/netty/server/RpcRequest.java  |   30 +
 .../rpc/netty/server/ServerChannelInitializer.java |    0
 .../org/apache/fluss/rpc/netty/server/Session.java |   65 +
 .../fluss/rpc/netty/server/ShutdownRequest.java    |   38 +
 .../org/apache/fluss/rpc/protocol/ApiError.java    |  154 ++
 .../org/apache/fluss/rpc/protocol/ApiKeys.java     |  117 ++
 .../apache}/fluss/rpc/protocol/ApiManager.java     |    0
 .../apache}/fluss/rpc/protocol/ApiMethod.java      |    0
 .../java/org/apache/fluss/rpc/protocol/Errors.java |  341 ++++
 .../apache}/fluss/rpc/protocol/MessageCodec.java   |    0
 .../fluss/rpc/protocol/NetworkProtocolPlugin.java  |    0
 .../java/org/apache/fluss/rpc/protocol/RPC.java    |   35 +
 .../org/apache/fluss/rpc/protocol/RequestType.java |   31 +
 .../apache/fluss/rpc/protocol/ResponseType.java    |   54 +
 .../fluss/rpc/util/CommonRpcMessageUtils.java      |    0
 fluss-rpc/src/main/proto/FlussApi.proto            |    4 +-
 .../alibaba/fluss/rpc/TestingGatewayService.java   |   75 -
 .../fluss/rpc/TestingTabletGatewayService.java     |  244 ---
 .../rpc/metrics/TestingClientMetricGroup.java      |   34 -
 .../alibaba/fluss/rpc/netty/NettyMetricsTest.java  |  102 --
 .../rpc/netty/authenticate/AuthenticationTest.java |  271 ---
 .../authenticate/MutualAuthenticationPlugin.java   |  238 ---
 .../authenticate/SaslAuthenticationITCase.java     |  245 ---
 .../fluss/rpc/netty/client/NettyClientTest.java    |  254 ---
 .../rpc/netty/client/ServerApiVersionsTest.java    |   57 -
 .../fluss/rpc/netty/server/NettyServerTest.java    |   53 -
 .../rpc/netty/server/TestingRequestChannel.java    |   54 -
 .../alibaba/fluss/rpc/protocol/ApiErrorTest.java   |   85 -
 .../alibaba/fluss/rpc/protocol/ApiKeysTest.java    |   41 -
 .../alibaba/fluss/rpc/protocol/ApiManagerTest.java |  156 --
 .../apache/fluss/rpc/TestingGatewayService.java    |   75 +
 .../fluss/rpc/TestingTabletGatewayService.java     |  244 +++
 .../rpc/metrics/TestingClientMetricGroup.java      |   34 +
 .../apache/fluss/rpc/netty/NettyMetricsTest.java   |  102 ++
 .../rpc/netty/authenticate/AuthenticationTest.java |  271 +++
 .../authenticate/MutualAuthenticationPlugin.java   |  236 +++
 .../authenticate/SaslAuthenticationITCase.java     |  245 +++
 .../fluss/rpc/netty/client/NettyClientTest.java    |  254 +++
 .../rpc/netty/client/ServerApiVersionsTest.java    |   57 +
 .../rpc/netty/server/NettyServerHandlerTest.java   |    0
 .../fluss/rpc/netty/server/NettyServerTest.java    |   53 +
 .../rpc/netty/server/TestingRequestChannel.java    |   54 +
 .../apache/fluss/rpc/protocol/ApiErrorTest.java    |   85 +
 .../org/apache/fluss/rpc/protocol/ApiKeysTest.java |   41 +
 .../apache/fluss/rpc/protocol/ApiManagerTest.java  |  156 ++
 .../fluss/rpc/protocol/MessageCodecTest.java       |    0
 .../fluss/rpc/protocol/RequestChannelTest.java     |    0
 ...libaba.fluss.security.auth.AuthenticationPlugin |   18 -
 ...apache.fluss.security.auth.AuthenticationPlugin |   18 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-server/pom.xml                               |   12 +-
 .../com/alibaba/fluss/server/RpcServiceBase.java   |  696 --------
 .../alibaba/fluss/server/SequenceIDCounter.java    |   29 -
 .../alibaba/fluss/server/TabletManagerBase.java    |  254 ---
 .../server/authorizer/AbstractAuthorizer.java      |   94 -
 .../fluss/server/authorizer/AclCreateResult.java   |   54 -
 .../fluss/server/authorizer/AclDeleteResult.java   |   84 -
 .../alibaba/fluss/server/authorizer/Action.java    |   40 -
 .../server/authorizer/AuthorizationPlugin.java     |   44 -
 .../fluss/server/authorizer/Authorizer.java        |  111 --
 .../fluss/server/authorizer/AuthorizerLoader.java  |  114 --
 .../authorizer/DefaultAuthorizationPlugin.java     |   32 -
 .../fluss/server/cli/CommandLineOptions.java       |   47 -
 .../fluss/server/cli/CommandLineParser.java        |   59 -
 .../fluss/server/cli/ParserResultFactory.java      |   49 -
 .../fluss/server/cli/ServerConfiguration.java      |   59 -
 .../cli/ServerConfigurationParserFactory.java      |   57 -
 .../server/coordinator/AutoPartitionManager.java   |  494 ------
 .../coordinator/CompletedSnapshotStoreManager.java |  143 --
 .../coordinator/CoordinatorChannelManager.java     |  200 ---
 .../server/coordinator/CoordinatorContext.java     |  640 -------
 .../coordinator/CoordinatorRequestBatch.java       |  706 --------
 .../server/coordinator/CoordinatorService.java     |  653 -------
 .../coordinator/LakeTableTieringManager.java       |  540 ------
 .../server/coordinator/RemoteStorageCleaner.java   |   89 -
 .../fluss/server/coordinator/TableManager.java     |  317 ----
 .../coordinator/event/AccessContextEvent.java      |   49 -
 .../coordinator/event/AdjustIsrReceivedEvent.java  |   46 -
 .../coordinator/event/CommitKvSnapshotEvent.java   |   62 -
 .../event/CommitLakeTableSnapshotEvent.java        |   46 -
 .../event/CommitRemoteLogManifestEvent.java        |   60 -
 .../server/coordinator/event/CoordinatorEvent.java |   21 -
 .../coordinator/event/CreatePartitionEvent.java    |  105 --
 .../server/coordinator/event/CreateTableEvent.java |   75 -
 .../coordinator/event/DeadTabletServerEvent.java   |   56 -
 .../event/DeleteReplicaResponseReceivedEvent.java  |   37 -
 .../coordinator/event/DropPartitionEvent.java      |   79 -
 .../server/coordinator/event/DropTableEvent.java   |   79 -
 .../server/coordinator/event/EventManager.java     |   24 -
 .../server/coordinator/event/EventProcessor.java   |   23 -
 .../coordinator/event/FencedCoordinatorEvent.java  |   45 -
 .../coordinator/event/NewTabletServerEvent.java    |   58 -
 .../NotifyLeaderAndIsrResponseReceivedEvent.java   |   47 -
 .../event/ShutdownEventThreadEvent.java            |   21 -
 .../server/coordinator/statemachine/BaseState.java |   25 -
 .../coordinator/statemachine/BucketState.java      |   51 -
 .../ReplicaLeaderElectionAlgorithms.java           |   37 -
 .../coordinator/statemachine/ReplicaState.java     |   65 -
 .../statemachine/ReplicaStateMachine.java          |  480 -----
 .../server/entity/AdjustIsrResultForBucket.java    |   47 -
 .../server/entity/BatchRegisterLeadAndIsr.java     |   73 -
 .../fluss/server/entity/CommitKvSnapshotData.java  |   53 -
 .../server/entity/CommitLakeTableSnapshotData.java |   60 -
 .../server/entity/CommitRemoteLogManifestData.java |  127 --
 .../entity/DeleteReplicaResultForBucket.java       |   50 -
 .../alibaba/fluss/server/entity/FetchReqInfo.java  |  107 --
 .../fluss/server/entity/LakeBucketOffset.java      |   46 -
 .../fluss/server/entity/LakeTieringTableInfo.java  |   76 -
 .../server/entity/NotifyKvSnapshotOffsetData.java  |   59 -
 .../server/entity/NotifyLakeTableOffsetData.java   |   45 -
 .../server/entity/NotifyLeaderAndIsrData.java      |   88 -
 .../entity/NotifyLeaderAndIsrResultForBucket.java  |   38 -
 .../server/entity/NotifyRemoteLogOffsetsData.java  |   68 -
 .../entity/RegisterTableBucketLeadAndIsrInfo.java  |   61 -
 .../fluss/server/entity/StopReplicaData.java       |   53 -
 .../server/entity/StopReplicaResultForBucket.java  |   42 -
 .../server/exception/CorruptIndexException.java    |   33 -
 .../exception/EndpointNotAvailableException.java   |   25 -
 .../server/exception/FlussParseException.java      |   30 -
 .../server/exception/KvBuildingException.java      |   28 -
 .../com/alibaba/fluss/server/kv/KvBatchWriter.java |   38 -
 .../alibaba/fluss/server/kv/KvRecoverHelper.java   |  251 ---
 .../fluss/server/kv/KvSnapshotResource.java        |  136 --
 .../server/kv/partialupdate/PartialUpdater.java    |  156 --
 .../kv/partialupdate/PartialUpdaterCache.java      |   54 -
 .../fluss/server/kv/prewrite/KvPreWriteBuffer.java |  471 -----
 .../alibaba/fluss/server/kv/rocksdb/RocksDBKv.java |  209 ---
 .../fluss/server/kv/rocksdb/RocksDBKvBuilder.java  |  226 ---
 .../kv/rocksdb/RocksDBResourceContainer.java       |  368 ----
 .../kv/rocksdb/RocksDBWriteBatchWrapper.java       |  141 --
 .../server/kv/rowmerger/DefaultRowMerger.java      |  108 --
 .../server/kv/rowmerger/FirstRowRowMerger.java     |   60 -
 .../fluss/server/kv/rowmerger/RowMerger.java       |   89 -
 .../server/kv/rowmerger/VersionedRowMerger.java    |  127 --
 .../server/kv/snapshot/AsyncSnapshotCallable.java  |  180 --
 .../kv/snapshot/CompletedKvSnapshotCommitter.java  |   33 -
 .../server/kv/snapshot/CompletedSnapshot.java      |  196 ---
 .../kv/snapshot/CompletedSnapshotHandle.java       |  125 --
 .../kv/snapshot/CompletedSnapshotHandleStore.java  |   85 -
 .../server/kv/snapshot/CompletedSnapshotStore.java |  235 ---
 .../DefaultCompletedKvSnapshotCommitter.java       |   99 --
 .../server/kv/snapshot/DefaultSnapshotContext.java |  158 --
 .../fluss/server/kv/snapshot/KvFileHandle.java     |  101 --
 .../kv/snapshot/KvFileHandleAndLocalPath.java      |   80 -
 .../kv/snapshot/KvSnapshotDataDownloader.java      |   87 -
 .../server/kv/snapshot/KvSnapshotDataTransfer.java |   29 -
 .../server/kv/snapshot/KvSnapshotDataUploader.java |  163 --
 .../server/kv/snapshot/KvSnapshotDownloadSpec.java |   46 -
 .../fluss/server/kv/snapshot/KvSnapshotHandle.java |  158 --
 .../server/kv/snapshot/KvTabletSnapshotTarget.java |  255 ---
 .../kv/snapshot/PeriodicSnapshotManager.java       |  403 -----
 .../kv/snapshot/PlaceholderKvFileHandler.java      |   36 -
 .../kv/snapshot/RocksIncrementalSnapshot.java      |  364 ----
 .../server/kv/snapshot/SharedKvFileRegistry.java   |  231 ---
 .../kv/snapshot/SharedKvFileRegistryKey.java       |   74 -
 .../fluss/server/kv/snapshot/SnapshotContext.java  |   72 -
 .../server/kv/snapshot/SnapshotFileScope.java      |   31 -
 .../fluss/server/kv/snapshot/SnapshotLocation.java |  345 ----
 .../server/kv/snapshot/SnapshotResources.java      |   28 -
 .../fluss/server/kv/snapshot/SnapshotResult.java   |   59 -
 .../server/kv/snapshot/SnapshotResultSupplier.java |   36 -
 .../fluss/server/kv/snapshot/SnapshotRunner.java   |   86 -
 .../fluss/server/kv/snapshot/SnapshotsCleaner.java |  102 --
 .../ZooKeeperCompletedSnapshotHandleStore.java     |  124 --
 .../fluss/server/kv/wal/ArrowWalBuilder.java       |   71 -
 .../fluss/server/kv/wal/IndexWalBuilder.java       |   76 -
 .../alibaba/fluss/server/kv/wal/WalBuilder.java    |   34 -
 .../alibaba/fluss/server/log/FetchDataInfo.java    |   45 -
 .../alibaba/fluss/server/log/FetchIsolation.java   |   36 -
 .../com/alibaba/fluss/server/log/FetchParams.java  |  211 ---
 .../com/alibaba/fluss/server/log/IndexEntry.java   |   31 -
 .../alibaba/fluss/server/log/IndexSearchType.java  |   27 -
 .../com/alibaba/fluss/server/log/LazyIndex.java    |  239 ---
 .../alibaba/fluss/server/log/ListOffsetsParam.java |   82 -
 .../alibaba/fluss/server/log/LoadedLogOffsets.java |   73 -
 .../com/alibaba/fluss/server/log/LocalLog.java     |  664 -------
 .../alibaba/fluss/server/log/LogAppendInfo.java    |  172 --
 .../com/alibaba/fluss/server/log/LogLoader.java    |  166 --
 .../com/alibaba/fluss/server/log/LogManager.java   |  483 -----
 .../fluss/server/log/LogOffsetMetadata.java        |  150 --
 .../fluss/server/log/LogOffsetSnapshot.java        |   80 -
 .../com/alibaba/fluss/server/log/LogReadInfo.java  |   59 -
 .../com/alibaba/fluss/server/log/LogSegments.java  |  258 ---
 .../com/alibaba/fluss/server/log/LogTablet.java    | 1267 --------------
 .../alibaba/fluss/server/log/OffsetPosition.java   |   76 -
 .../com/alibaba/fluss/server/log/RollParams.java   |   47 -
 .../com/alibaba/fluss/server/log/SnapshotFile.java |   65 -
 .../alibaba/fluss/server/log/StorageAction.java    |   29 -
 .../alibaba/fluss/server/log/TimestampOffset.java  |   70 -
 .../alibaba/fluss/server/log/WriterAppendInfo.java |  109 --
 .../alibaba/fluss/server/log/WriterStateEntry.java |  157 --
 .../server/log/checkpoint/CheckpointFile.java      |  244 ---
 .../log/checkpoint/OffsetCheckpointFile.java       |  160 --
 .../server/log/remote/DefaultRemoteLogStorage.java |  340 ----
 .../server/log/remote/FsRemoteLogOutputStream.java |  217 ---
 .../fluss/server/log/remote/LogSegmentFiles.java   |  106 --
 .../fluss/server/log/remote/LogTieringTask.java    |  517 ------
 .../server/log/remote/RemoteLogIndexCache.java     |  722 --------
 .../fluss/server/log/remote/RemoteLogManager.java  |  379 ----
 .../fluss/server/log/remote/RemoteLogManifest.java |  141 --
 .../fluss/server/log/remote/RemoteLogStorage.java  |  164 --
 .../fluss/server/log/remote/RemoteLogTablet.java   |  363 ----
 .../fluss/server/metadata/BucketMetadata.java      |   93 -
 .../fluss/server/metadata/ClusterMetadata.java     |   78 -
 .../server/metadata/CoordinatorMetadataCache.java  |  119 --
 .../fluss/server/metadata/PartitionMetadata.java   |   70 -
 .../alibaba/fluss/server/metadata/ServerInfo.java  |  129 --
 .../fluss/server/metadata/ServerMetadataCache.java |   76 -
 .../server/metadata/ServerMetadataSnapshot.java    |  182 --
 .../fluss/server/metadata/TableMetadata.java       |   97 --
 .../server/metadata/TabletServerMetadataCache.java |  289 ---
 .../fluss/server/metrics/ServerMetricUtils.java    |  275 ---
 .../server/metrics/group/BucketMetricGroup.java    |   51 -
 .../metrics/group/CoordinatorMetricGroup.java      |   54 -
 .../metrics/group/PhysicalTableMetricGroup.java    |  404 -----
 .../metrics/group/TabletServerMetricGroup.java     |  145 --
 .../fluss/server/replica/AdjustIsrManager.java     |  203 ---
 .../fluss/server/replica/FollowerReplica.java      |  233 ---
 .../com/alibaba/fluss/server/replica/IsrState.java |  244 ---
 .../com/alibaba/fluss/server/replica/Replica.java  | 1842 --------------------
 .../fluss/server/replica/ReplicaManager.java       | 1597 -----------------
 .../server/replica/delay/DelayedFetchLog.java      |  242 ---
 .../server/replica/delay/DelayedOperation.java     |  132 --
 .../server/replica/delay/DelayedOperationKey.java  |   28 -
 .../replica/delay/DelayedOperationManager.java     |  368 ----
 .../replica/delay/DelayedTableBucketKey.java       |   58 -
 .../fluss/server/replica/delay/DelayedWrite.java   |  262 ---
 .../server/replica/fetcher/BucketFetchStatus.java  |   81 -
 .../fluss/server/replica/fetcher/DelayedItem.java  |   52 -
 .../server/replica/fetcher/FetchLogContext.java    |   43 -
 .../server/replica/fetcher/InitialFetchStatus.java |   87 -
 .../server/replica/fetcher/LeaderEndpoint.java     |   82 -
 .../replica/fetcher/RemoteLeaderEndpoint.java      |  218 ---
 .../replica/fetcher/ReplicaFetcherManager.java     |  307 ----
 .../alibaba/fluss/server/tablet/TabletService.java |  483 -----
 .../server/utils/ConfigurationParserUtils.java     |   66 -
 .../fluss/server/utils/FatalErrorHandler.java      |   34 -
 .../fluss/server/utils/LakeStorageUtils.java       |   63 -
 .../alibaba/fluss/server/utils/ResourceGuard.java  |  167 --
 .../fluss/server/utils/RpcGatewayManager.java      |  120 --
 .../fluss/server/utils/ServerRpcMessageUtils.java  | 1647 -----------------
 .../fluss/server/utils/ShutdownHookUtil.java       |  109 --
 .../alibaba/fluss/server/utils/SnapshotUtil.java   |   93 -
 .../fluss/server/utils/TableAssignmentUtils.java   |  316 ----
 .../server/utils/TableDescriptorValidation.java    |  292 ----
 .../fluss/server/utils/timer/DefaultTimer.java     |  129 --
 .../alibaba/fluss/server/utils/timer/Timer.java    |   60 -
 .../fluss/server/utils/timer/TimerTask.java        |   69 -
 .../fluss/server/utils/timer/TimerTaskEntry.java   |   76 -
 .../fluss/server/utils/timer/TimerTaskList.java    |  143 --
 .../fluss/server/utils/timer/TimingWheel.java      |  208 ---
 ...CuratorFrameworkWithUnhandledErrorListener.java |   52 -
 .../fluss/server/zk/data/BucketAssignment.java     |   66 -
 .../fluss/server/zk/data/BucketSnapshot.java       |   73 -
 .../fluss/server/zk/data/CoordinatorAddress.java   |   65 -
 .../fluss/server/zk/data/DatabaseRegistration.java |   96 -
 .../fluss/server/zk/data/LakeTableSnapshot.java    |  131 --
 .../alibaba/fluss/server/zk/data/LeaderAndIsr.java |  145 --
 .../fluss/server/zk/data/PartitionAssignment.java  |   66 -
 .../server/zk/data/RemoteLogManifestHandle.java    |   70 -
 .../alibaba/fluss/server/zk/data/ResourceAcl.java  |   60 -
 .../fluss/server/zk/data/TableAssignment.java      |   99 --
 .../fluss/server/zk/data/TableRegistration.java    |  194 ---
 .../server/zk/data/TabletServerRegistration.java   |   86 -
 .../com/alibaba/fluss/server/zk/data/ZkData.java   |  652 -------
 .../org/apache/fluss/server/RpcServiceBase.java    |  696 ++++++++
 .../org/apache/fluss/server/SequenceIDCounter.java |   29 +
 .../apache}/fluss/server/ServerBase.java           |    0
 .../org/apache/fluss/server/TabletManagerBase.java |  254 +++
 .../server/authorizer/AbstractAuthorizer.java      |   94 +
 .../fluss/server/authorizer/AclCreateResult.java   |   54 +
 .../fluss/server/authorizer/AclDeleteResult.java   |   84 +
 .../org/apache/fluss/server/authorizer/Action.java |   40 +
 .../server/authorizer/AuthorizationPlugin.java     |   44 +
 .../apache/fluss/server/authorizer/Authorizer.java |  111 ++
 .../fluss/server/authorizer/AuthorizerLoader.java  |  114 ++
 .../authorizer/DefaultAuthorizationPlugin.java     |   32 +
 .../fluss/server/authorizer/DefaultAuthorizer.java |    0
 .../ZkNodeChangeNotificationWatcher.java           |    0
 .../fluss/server/cli/CommandLineOptions.java       |   47 +
 .../apache/fluss/server/cli/CommandLineParser.java |   59 +
 .../fluss/server/cli/ParserResultFactory.java      |   49 +
 .../fluss/server/cli/ServerConfiguration.java      |   59 +
 .../cli/ServerConfigurationParserFactory.java      |   57 +
 .../server/coordinator/AutoPartitionManager.java   |  494 ++++++
 .../coordinator/CompletedSnapshotStoreManager.java |  143 ++
 .../coordinator/CoordinatorChannelManager.java     |  200 +++
 .../server/coordinator/CoordinatorContext.java     |  640 +++++++
 .../coordinator/CoordinatorEventProcessor.java     |    0
 .../coordinator/CoordinatorRequestBatch.java       |  706 ++++++++
 .../server/coordinator/CoordinatorServer.java      |    0
 .../server/coordinator/CoordinatorService.java     |  653 +++++++
 .../coordinator/LakeTableTieringManager.java       |  540 ++++++
 .../fluss/server/coordinator/MetadataManager.java  |    0
 .../server/coordinator/RemoteStorageCleaner.java   |   89 +
 .../fluss/server/coordinator/TableManager.java     |  317 ++++
 .../coordinator/event/AccessContextEvent.java      |   49 +
 .../coordinator/event/AdjustIsrReceivedEvent.java  |   46 +
 .../coordinator/event/CommitKvSnapshotEvent.java   |   62 +
 .../event/CommitLakeTableSnapshotEvent.java        |   46 +
 .../event/CommitRemoteLogManifestEvent.java        |   60 +
 .../server/coordinator/event/CoordinatorEvent.java |   21 +
 .../coordinator/event/CoordinatorEventManager.java |    0
 .../coordinator/event/CreatePartitionEvent.java    |  105 ++
 .../server/coordinator/event/CreateTableEvent.java |   75 +
 .../coordinator/event/DeadTabletServerEvent.java   |   56 +
 .../event/DeleteReplicaResponseReceivedEvent.java  |   37 +
 .../coordinator/event/DropPartitionEvent.java      |   79 +
 .../server/coordinator/event/DropTableEvent.java   |   79 +
 .../server/coordinator/event/EventManager.java     |   24 +
 .../server/coordinator/event/EventProcessor.java   |   23 +
 .../coordinator/event/FencedCoordinatorEvent.java  |   45 +
 .../coordinator/event/NewTabletServerEvent.java    |   58 +
 .../NotifyLeaderAndIsrResponseReceivedEvent.java   |   47 +
 .../event/ShutdownEventThreadEvent.java            |   21 +
 .../event/watcher/TableChangeWatcher.java          |    0
 .../event/watcher/TabletServerChangeWatcher.java   |    0
 .../server/coordinator/statemachine/BaseState.java |   25 +
 .../coordinator/statemachine/BucketState.java      |   51 +
 .../ReplicaLeaderElectionAlgorithms.java           |   37 +
 .../coordinator/statemachine/ReplicaState.java     |   65 +
 .../statemachine/ReplicaStateMachine.java          |  480 +++++
 .../statemachine/TableBucketStateMachine.java      |    0
 .../server/entity/AdjustIsrResultForBucket.java    |   47 +
 .../server/entity/BatchRegisterLeadAndIsr.java     |   73 +
 .../fluss/server/entity/CommitKvSnapshotData.java  |   53 +
 .../server/entity/CommitLakeTableSnapshotData.java |   60 +
 .../server/entity/CommitRemoteLogManifestData.java |  127 ++
 .../entity/DeleteReplicaResultForBucket.java       |   50 +
 .../apache/fluss/server/entity/FetchReqInfo.java   |  107 ++
 .../fluss/server/entity/LakeBucketOffset.java      |   46 +
 .../fluss/server/entity/LakeTieringTableInfo.java  |   76 +
 .../server/entity/NotifyKvSnapshotOffsetData.java  |   59 +
 .../server/entity/NotifyLakeTableOffsetData.java   |   45 +
 .../server/entity/NotifyLeaderAndIsrData.java      |   88 +
 .../entity/NotifyLeaderAndIsrResultForBucket.java  |   38 +
 .../server/entity/NotifyRemoteLogOffsetsData.java  |   68 +
 .../entity/RegisterTableBucketLeadAndIsrInfo.java  |   61 +
 .../fluss/server/entity/StopReplicaData.java       |   53 +
 .../server/entity/StopReplicaResultForBucket.java  |   42 +
 .../server/exception/CorruptIndexException.java    |   33 +
 .../exception/EndpointNotAvailableException.java   |   25 +
 .../server/exception/FlussParseException.java      |   30 +
 .../server/exception/KvBuildingException.java      |   28 +
 .../org/apache/fluss/server/kv/KvBatchWriter.java  |   38 +
 .../apache}/fluss/server/kv/KvManager.java         |    0
 .../apache/fluss/server/kv/KvRecoverHelper.java    |  251 +++
 .../apache/fluss/server/kv/KvSnapshotResource.java |  136 ++
 .../apache}/fluss/server/kv/KvTablet.java          |    0
 .../server/kv/partialupdate/PartialUpdater.java    |  156 ++
 .../kv/partialupdate/PartialUpdaterCache.java      |   54 +
 .../fluss/server/kv/prewrite/KvPreWriteBuffer.java |  471 +++++
 .../apache/fluss/server/kv/rocksdb/RocksDBKv.java  |  209 +++
 .../fluss/server/kv/rocksdb/RocksDBKvBuilder.java  |  226 +++
 .../kv/rocksdb/RocksDBResourceContainer.java       |  368 ++++
 .../kv/rocksdb/RocksDBWriteBatchWrapper.java       |  141 ++
 .../server/kv/rowmerger/DefaultRowMerger.java      |  108 ++
 .../server/kv/rowmerger/FirstRowRowMerger.java     |   60 +
 .../fluss/server/kv/rowmerger/RowMerger.java       |   89 +
 .../server/kv/rowmerger/VersionedRowMerger.java    |  127 ++
 .../server/kv/snapshot/AsyncSnapshotCallable.java  |  180 ++
 .../kv/snapshot/CompletedKvSnapshotCommitter.java  |   33 +
 .../server/kv/snapshot/CompletedSnapshot.java      |  196 +++
 .../kv/snapshot/CompletedSnapshotHandle.java       |  125 ++
 .../kv/snapshot/CompletedSnapshotHandleStore.java  |   85 +
 .../kv/snapshot/CompletedSnapshotJsonSerde.java    |    0
 .../server/kv/snapshot/CompletedSnapshotStore.java |  235 +++
 .../DefaultCompletedKvSnapshotCommitter.java       |   99 ++
 .../server/kv/snapshot/DefaultSnapshotContext.java |  158 ++
 .../fluss/server/kv/snapshot/KvFileHandle.java     |  101 ++
 .../kv/snapshot/KvFileHandleAndLocalPath.java      |   80 +
 .../kv/snapshot/KvSnapshotDataDownloader.java      |   87 +
 .../server/kv/snapshot/KvSnapshotDataTransfer.java |   29 +
 .../server/kv/snapshot/KvSnapshotDataUploader.java |  163 ++
 .../server/kv/snapshot/KvSnapshotDownloadSpec.java |   46 +
 .../fluss/server/kv/snapshot/KvSnapshotHandle.java |  158 ++
 .../server/kv/snapshot/KvTabletSnapshotTarget.java |  255 +++
 .../kv/snapshot/PeriodicSnapshotManager.java       |  403 +++++
 .../kv/snapshot/PlaceholderKvFileHandler.java      |   36 +
 .../kv/snapshot/RocksIncrementalSnapshot.java      |  364 ++++
 .../server/kv/snapshot/SharedKvFileRegistry.java   |  231 +++
 .../kv/snapshot/SharedKvFileRegistryKey.java       |   74 +
 .../fluss/server/kv/snapshot/SnapshotContext.java  |   72 +
 .../server/kv/snapshot/SnapshotFileScope.java      |   31 +
 .../fluss/server/kv/snapshot/SnapshotLocation.java |  345 ++++
 .../server/kv/snapshot/SnapshotResources.java      |   28 +
 .../fluss/server/kv/snapshot/SnapshotResult.java   |   59 +
 .../server/kv/snapshot/SnapshotResultSupplier.java |   36 +
 .../fluss/server/kv/snapshot/SnapshotRunner.java   |   86 +
 .../fluss/server/kv/snapshot/SnapshotsCleaner.java |  102 ++
 .../ZooKeeperCompletedSnapshotHandleStore.java     |  124 ++
 .../fluss/server/kv/wal/ArrowWalBuilder.java       |   71 +
 .../fluss/server/kv/wal/IndexWalBuilder.java       |   76 +
 .../org/apache/fluss/server/kv/wal/WalBuilder.java |   34 +
 .../apache}/fluss/server/log/AbstractIndex.java    |    0
 .../org/apache/fluss/server/log/FetchDataInfo.java |   45 +
 .../apache/fluss/server/log/FetchIsolation.java    |   36 +
 .../org/apache/fluss/server/log/FetchParams.java   |  211 +++
 .../org/apache/fluss/server/log/IndexEntry.java    |   31 +
 .../apache/fluss/server/log/IndexSearchType.java   |   27 +
 .../org/apache/fluss/server/log/LazyIndex.java     |  239 +++
 .../apache/fluss/server/log/ListOffsetsParam.java  |   82 +
 .../apache/fluss/server/log/LoadedLogOffsets.java  |   73 +
 .../java/org/apache/fluss/server/log/LocalLog.java |  664 +++++++
 .../org/apache/fluss/server/log/LogAppendInfo.java |  172 ++
 .../org/apache/fluss/server/log/LogLoader.java     |  166 ++
 .../org/apache/fluss/server/log/LogManager.java    |  483 +++++
 .../apache/fluss/server/log/LogOffsetMetadata.java |  150 ++
 .../apache/fluss/server/log/LogOffsetSnapshot.java |   80 +
 .../org/apache/fluss/server/log/LogReadInfo.java   |   59 +
 .../apache}/fluss/server/log/LogSegment.java       |    0
 .../org/apache/fluss/server/log/LogSegments.java   |  258 +++
 .../org/apache/fluss/server/log/LogTablet.java     | 1267 ++++++++++++++
 .../apache}/fluss/server/log/OffsetIndex.java      |    0
 .../apache/fluss/server/log/OffsetPosition.java    |   76 +
 .../org/apache/fluss/server/log/RollParams.java    |   47 +
 .../org/apache/fluss/server/log/SnapshotFile.java  |   65 +
 .../org/apache/fluss/server/log/StorageAction.java |   29 +
 .../apache}/fluss/server/log/TimeIndex.java        |    0
 .../apache/fluss/server/log/TimestampOffset.java   |   70 +
 .../apache/fluss/server/log/WriterAppendInfo.java  |  109 ++
 .../apache/fluss/server/log/WriterStateEntry.java  |  157 ++
 .../fluss/server/log/WriterStateManager.java       |    0
 .../server/log/checkpoint/CheckpointFile.java      |  244 +++
 .../log/checkpoint/OffsetCheckpointFile.java       |  160 ++
 .../server/log/remote/DefaultRemoteLogStorage.java |  340 ++++
 .../server/log/remote/FsRemoteLogOutputStream.java |  217 +++
 .../fluss/server/log/remote/LogSegmentFiles.java   |  106 ++
 .../fluss/server/log/remote/LogTieringTask.java    |  517 ++++++
 .../server/log/remote/RemoteLogIndexCache.java     |  722 ++++++++
 .../fluss/server/log/remote/RemoteLogManager.java  |  379 ++++
 .../fluss/server/log/remote/RemoteLogManifest.java |  141 ++
 .../log/remote/RemoteLogManifestJsonSerde.java     |    0
 .../fluss/server/log/remote/RemoteLogStorage.java  |  164 ++
 .../fluss/server/log/remote/RemoteLogTablet.java   |  363 ++++
 .../fluss/server/metadata/BucketMetadata.java      |   93 +
 .../fluss/server/metadata/ClusterMetadata.java     |   78 +
 .../server/metadata/CoordinatorMetadataCache.java  |  119 ++
 .../fluss/server/metadata/PartitionMetadata.java   |   70 +
 .../apache/fluss/server/metadata/ServerInfo.java   |  129 ++
 .../fluss/server/metadata/ServerMetadataCache.java |   76 +
 .../server/metadata/ServerMetadataSnapshot.java    |  182 ++
 .../fluss/server/metadata/TableMetadata.java       |   97 ++
 .../server/metadata/TabletServerMetadataCache.java |  289 +++
 .../fluss/server/metrics/ServerMetricUtils.java    |  275 +++
 .../server/metrics/group/BucketMetricGroup.java    |   51 +
 .../metrics/group/CoordinatorMetricGroup.java      |   54 +
 .../metrics/group/PhysicalTableMetricGroup.java    |  404 +++++
 .../metrics/group/TabletServerMetricGroup.java     |  145 ++
 .../fluss/server/replica/AdjustIsrManager.java     |  203 +++
 .../fluss/server/replica/FollowerReplica.java      |  233 +++
 .../org/apache/fluss/server/replica/IsrState.java  |  244 +++
 .../org/apache/fluss/server/replica/Replica.java   | 1842 ++++++++++++++++++++
 .../fluss/server/replica/ReplicaManager.java       | 1597 +++++++++++++++++
 .../server/replica/delay/DelayedFetchLog.java      |  242 +++
 .../server/replica/delay/DelayedOperation.java     |  132 ++
 .../server/replica/delay/DelayedOperationKey.java  |   28 +
 .../replica/delay/DelayedOperationManager.java     |  368 ++++
 .../replica/delay/DelayedTableBucketKey.java       |   58 +
 .../fluss/server/replica/delay/DelayedWrite.java   |  262 +++
 .../server/replica/fetcher/BucketFetchStatus.java  |   81 +
 .../fluss/server/replica/fetcher/DelayedItem.java  |   52 +
 .../server/replica/fetcher/FetchLogContext.java    |   43 +
 .../server/replica/fetcher/InitialFetchStatus.java |   87 +
 .../server/replica/fetcher/LeaderEndpoint.java     |   82 +
 .../replica/fetcher/RemoteLeaderEndpoint.java      |  218 +++
 .../replica/fetcher/ReplicaFetcherManager.java     |  307 ++++
 .../replica/fetcher/ReplicaFetcherThread.java      |    0
 .../apache}/fluss/server/tablet/TabletServer.java  |    0
 .../apache/fluss/server/tablet/TabletService.java  |  483 +++++
 .../server/utils/ConfigurationParserUtils.java     |   66 +
 .../fluss/server/utils/FatalErrorHandler.java      |   34 +
 .../fluss/server/utils/LakeStorageUtils.java       |   63 +
 .../apache/fluss/server/utils/ResourceGuard.java   |  167 ++
 .../fluss/server/utils/RpcGatewayManager.java      |  120 ++
 .../fluss/server/utils/ServerRpcMessageUtils.java  | 1647 +++++++++++++++++
 .../fluss/server/utils/ShutdownHookUtil.java       |  109 ++
 .../apache/fluss/server/utils/SnapshotUtil.java    |   93 +
 .../fluss/server/utils/TableAssignmentUtils.java   |  316 ++++
 .../server/utils/TableDescriptorValidation.java    |  292 ++++
 .../fluss/server/utils/timer/DefaultTimer.java     |  129 ++
 .../org/apache/fluss/server/utils/timer/Timer.java |   60 +
 .../apache/fluss/server/utils/timer/TimerTask.java |   69 +
 .../fluss/server/utils/timer/TimerTaskEntry.java   |   76 +
 .../fluss/server/utils/timer/TimerTaskList.java    |  143 ++
 .../fluss/server/utils/timer/TimingWheel.java      |  208 +++
 ...CuratorFrameworkWithUnhandledErrorListener.java |   52 +
 .../fluss/server/zk/ZkSequenceIDCounter.java       |    0
 .../apache}/fluss/server/zk/ZooKeeperClient.java   |    0
 .../apache}/fluss/server/zk/ZooKeeperUtils.java    |    0
 .../fluss/server/zk/data/BucketAssignment.java     |   66 +
 .../fluss/server/zk/data/BucketSnapshot.java       |   73 +
 .../server/zk/data/BucketSnapshotJsonSerde.java    |    0
 .../fluss/server/zk/data/CoordinatorAddress.java   |   65 +
 .../zk/data/CoordinatorAddressJsonSerde.java       |    0
 .../fluss/server/zk/data/DatabaseRegistration.java |   96 +
 .../zk/data/DatabaseRegistrationJsonSerde.java     |    0
 .../fluss/server/zk/data/LakeTableSnapshot.java    |  131 ++
 .../server/zk/data/LakeTableSnapshotJsonSerde.java |    0
 .../apache/fluss/server/zk/data/LeaderAndIsr.java  |  145 ++
 .../server/zk/data/LeaderAndIsrJsonSerde.java      |    0
 .../fluss/server/zk/data/PartitionAssignment.java  |   66 +
 .../zk/data/PartitionAssignmentJsonSerde.java      |    0
 .../server/zk/data/RemoteLogManifestHandle.java    |   70 +
 .../zk/data/RemoteLogManifestHandleJsonSerde.java  |    0
 .../apache/fluss/server/zk/data/ResourceAcl.java   |   60 +
 .../fluss/server/zk/data/ResourceAclJsonSerde.java |    0
 .../fluss/server/zk/data/TableAssignment.java      |   99 ++
 .../server/zk/data/TableAssignmentJsonSerde.java   |    0
 .../fluss/server/zk/data/TableRegistration.java    |  194 +++
 .../server/zk/data/TableRegistrationJsonSerde.java |    0
 .../server/zk/data/TabletServerRegistration.java   |   86 +
 .../zk/data/TabletServerRegistrationJsonSerde.java |    0
 .../org/apache/fluss/server/zk/data/ZkData.java    |  652 +++++++
 ...aba.fluss.server.authorizer.AuthorizationPlugin |   19 -
 ...che.fluss.server.authorizer.AuthorizationPlugin |   19 +
 .../com/alibaba/fluss/server/ServerITCaseBase.java |  153 --
 .../server/authorizer/DefaultAuthorizerTest.java   |  715 --------
 .../ZkNodeChangeNotificationWatcherTest.java       |  132 --
 .../ServerBaseConfigurationParserFactoryTest.java  |   73 -
 .../coordinator/AutoPartitionManagerTest.java      |  787 ---------
 .../CompletedSnapshotStoreManagerTest.java         |  223 ---
 .../coordinator/CoordinatorChannelManagerTest.java |  119 --
 .../coordinator/CoordinatorServerITCase.java       |   72 -
 .../server/coordinator/CoordinatorServerTest.java  |   72 -
 .../server/coordinator/CoordinatorTestUtils.java   |  109 --
 .../server/coordinator/LakeTableManagerITCase.java |  111 --
 .../coordinator/LakeTableTieringManagerTest.java   |  267 ---
 .../coordinator/LakeTieringHeartbeatITCase.java    |  332 ----
 .../coordinator/NotifyLeaderAndIsrITCase.java      |  114 --
 .../server/coordinator/StopReplicaITCase.java      |  200 ---
 .../server/coordinator/TableManagerITCase.java     |  801 ---------
 .../fluss/server/coordinator/TableManagerTest.java |  374 ----
 .../coordinator/TestCoordinatorChannelManager.java |   50 -
 .../server/coordinator/TestCoordinatorGateway.java |  317 ----
 .../coordinator/event/TestingEventManager.java     |   41 -
 .../event/watcher/TableChangeWatcherTest.java      |  236 ---
 .../watcher/TabletServerChangeWatcherTest.java     |  102 --
 .../statemachine/ReplicaStateMachineTest.java      |  308 ----
 .../com/alibaba/fluss/server/kv/KvManagerTest.java |  284 ---
 .../server/kv/prewrite/KvPreWriteBufferTest.java   |  234 ---
 .../fluss/server/kv/rocksdb/RocksDBExtension.java  |   84 -
 .../server/kv/rocksdb/RocksDBKvBuilderTest.java    |   71 -
 .../fluss/server/kv/rocksdb/RocksDBKvTest.java     |   67 -
 .../kv/rocksdb/RocksDBOperationsUtilsTest.java     |   64 -
 .../kv/rocksdb/RocksDBResourceContainerTest.java   |  194 ---
 .../kv/rowmerger/VersionedRowMergerTest.java       |  186 --
 .../snapshot/CompletedSnapshotJsonSerdeTest.java   |   94 -
 .../kv/snapshot/CompletedSnapshotStoreTest.java    |  251 ---
 .../server/kv/snapshot/CompletedSnapshotTest.java  |  191 --
 .../kv/snapshot/KvSnapshotDataDownloaderTest.java  |  169 --
 .../kv/snapshot/KvSnapshotDataUploaderTest.java    |  138 --
 .../kv/snapshot/KvTabletSnapshotTargetTest.java    |  470 -----
 .../kv/snapshot/PeriodicSnapshotManagerTest.java   |  261 ---
 .../kv/snapshot/RocksIncrementalSnapshotTest.java  |  197 ---
 .../kv/snapshot/SharedKvFileRegistryTest.java      |   95 -
 .../server/kv/snapshot/SnapshotLocationTest.java   |  114 --
 .../server/kv/snapshot/SnapshotsCleanerTest.java   |  165 --
 .../snapshot/TestCompletedSnapshotHandleStore.java |  103 --
 .../TestingCompletedKvSnapshotCommitter.java       |   88 -
 .../snapshot/TestingCompletedSnapshotHandle.java   |   49 -
 .../ZooKeeperCompletedSnapshotStoreTest.java       |  144 --
 .../alibaba/fluss/server/log/FetchParamsTest.java  |   57 -
 .../com/alibaba/fluss/server/log/LocalLogTest.java |  417 -----
 .../alibaba/fluss/server/log/LogManagerTest.java   |  313 ----
 .../alibaba/fluss/server/log/LogSegmentTest.java   |  452 -----
 .../alibaba/fluss/server/log/LogSegmentsTest.java  |  204 ---
 .../alibaba/fluss/server/log/LogTabletTest.java    |  627 -------
 .../com/alibaba/fluss/server/log/LogTestUtils.java |  113 --
 .../alibaba/fluss/server/log/OffsetIndexTest.java  |  226 ---
 .../alibaba/fluss/server/log/TimeIndexTest.java    |  156 --
 .../server/log/WriterSnapshotMapJsonSerdeTest.java |   54 -
 .../log/remote/CommitRemoteLogManifestITCase.java  |  134 --
 .../fluss/server/log/remote/RemoteLogITCase.java   |  217 ---
 .../server/log/remote/RemoteLogIndexCacheTest.java |  269 ---
 .../server/log/remote/RemoteLogManagerTest.java    |  537 ------
 .../log/remote/RemoteLogManifestJsonSerdeTest.java |  115 --
 .../fluss/server/log/remote/RemoteLogTTLTest.java  |   92 -
 .../server/log/remote/RemoteLogTabletTest.java     |  199 ---
 .../fluss/server/log/remote/RemoteLogTestBase.java |  156 --
 .../server/log/remote/TestingRemoteLogStorage.java |   47 -
 .../metadata/CoordinatorMetadataCacheTest.java     |   89 -
 .../server/metadata/MetadataUpdateITCase.java      |  516 ------
 .../metadata/TabletServerMetadataCacheTest.java    |  290 ---
 .../server/metrics/ServerMetricUtilsTest.java      |  312 ----
 .../server/metrics/group/TestingMetricGroups.java  |   42 -
 .../fluss/server/replica/AdjustIsrITCase.java      |  258 ---
 .../fluss/server/replica/AdjustIsrManagerTest.java |   59 -
 .../fluss/server/replica/AdjustIsrTest.java        |  147 --
 .../replica/CommitLakeTableSnapshotITCase.java     |  178 --
 .../fluss/server/replica/FollowerReplicaTest.java  |  148 --
 .../replica/HighWatermarkPersistenceTest.java      |  202 ---
 .../fluss/server/replica/KvSnapshotITCase.java     |  215 ---
 .../replica/NotifyReplicaLakeTableOffsetTest.java  |   91 -
 .../replica/RemoveOfflineReplicaFromIsrITCase.java |  152 --
 .../fluss/server/replica/ReplicaManagerTest.java   | 1810 -------------------
 .../alibaba/fluss/server/replica/ReplicaTest.java  |  629 -------
 .../fluss/server/replica/ReplicaTestBase.java      |  644 -------
 .../server/replica/delay/DelayedFetchLogTest.java  |  166 --
 .../server/replica/delay/DelayedOperationTest.java |  370 ----
 .../server/replica/delay/DelayedWriteTest.java     |  189 --
 .../replica/fetcher/RemoteLeaderEndpointTest.java  |  150 --
 .../replica/fetcher/ReplicaFetcherITCase.java      |  347 ----
 .../replica/fetcher/ReplicaFetcherManagerTest.java |  139 --
 .../replica/fetcher/ReplicaFetcherThreadTest.java  |  400 -----
 .../replica/fetcher/TestingLeaderEndpoint.java     |  137 --
 .../server/tablet/TabletServerFailOverITCase.java  |  188 --
 .../fluss/server/tablet/TabletServerITCase.java    |   74 -
 .../fluss/server/tablet/TabletServerTest.java      |   92 -
 .../fluss/server/tablet/TabletServiceITCase.java   |  953 ----------
 .../server/tablet/TestTabletServerGateway.java     |  410 -----
 .../fluss/server/testutils/KvTestUtils.java        |  195 ---
 .../server/testutils/PartitionMetadataAssert.java  |   51 -
 .../server/testutils/RpcMessageTestUtils.java      |  484 -----
 .../server/testutils/TableMetadataAssert.java      |   49 -
 .../testutils/TestingServerMetadataCache.java      |   70 -
 .../fluss/server/utils/AvailablePortExtension.java |   53 -
 .../server/utils/ConfigurationParserUtilsTest.java |  104 --
 .../fluss/server/utils/ResourceGuardTest.java      |  145 --
 .../fluss/server/utils/RpcGatewayManagerTest.java  |   70 -
 .../server/utils/TableAssignmentUtilsTest.java     |  629 -------
 .../fluss/server/utils/TestProcessBuilder.java     |  170 --
 .../fluss/server/utils/timer/DefaultTimerTest.java |  137 --
 .../server/utils/timer/TimerTaskListTest.java      |  106 --
 .../alibaba/fluss/server/zk/NOPErrorHandler.java   |   31 -
 .../fluss/server/zk/ZooKeeperTestUtils.java        |   74 -
 .../zk/data/BucketSnapshotJsonSerdeTest.java       |   44 -
 .../zk/data/LakeTableSnapshotJsonSerdeTest.java    |   97 --
 .../server/zk/data/LeaderAndIsrJsonSerdeTest.java  |   46 -
 .../zk/data/PartitionAssignmentJsonSerdeTest.java  |   48 -
 .../data/RemoteLogManifestHandleJsonSerdeTest.java |   47 -
 .../server/zk/data/ResourceAclJsonSerdeTest.java   |   72 -
 .../zk/data/TableAssignmentJsonSerdeTest.java      |   43 -
 .../alibaba/fluss/server/zk/data/ZkDataTest.java   |   64 -
 .../org/apache/fluss/server/ServerITCaseBase.java  |  153 ++
 .../apache}/fluss/server/ServerTestBase.java       |    0
 .../server/authorizer/DefaultAuthorizerTest.java   |  715 ++++++++
 .../ZkNodeChangeNotificationWatcherTest.java       |  132 ++
 .../ServerBaseConfigurationParserFactoryTest.java  |   73 +
 .../coordinator/AutoPartitionManagerTest.java      |  787 +++++++++
 .../CompletedSnapshotStoreManagerTest.java         |  223 +++
 .../coordinator/CoordinatorChannelManagerTest.java |  119 ++
 .../coordinator/CoordinatorEventProcessorTest.java |    0
 .../coordinator/CoordinatorServerITCase.java       |   72 +
 .../server/coordinator/CoordinatorServerTest.java  |   72 +
 .../server/coordinator/CoordinatorTestUtils.java   |  109 ++
 .../server/coordinator/LakeTableManagerITCase.java |  111 ++
 .../coordinator/LakeTableTieringManagerTest.java   |  267 +++
 .../coordinator/LakeTieringHeartbeatITCase.java    |  332 ++++
 .../coordinator/NotifyLeaderAndIsrITCase.java      |  114 ++
 .../server/coordinator/StopReplicaITCase.java      |  200 +++
 .../server/coordinator/TableManagerITCase.java     |  801 +++++++++
 .../fluss/server/coordinator/TableManagerTest.java |  374 ++++
 .../coordinator/TestCoordinatorChannelManager.java |   50 +
 .../server/coordinator/TestCoordinatorGateway.java |  317 ++++
 .../coordinator/event/TestingEventManager.java     |   41 +
 .../event/watcher/TableChangeWatcherTest.java      |  236 +++
 .../watcher/TabletServerChangeWatcherTest.java     |  102 ++
 .../statemachine/ReplicaStateMachineTest.java      |  308 ++++
 .../statemachine/TableBucketStateMachineTest.java  |    0
 .../org/apache/fluss/server/kv/KvManagerTest.java  |  284 +++
 .../apache}/fluss/server/kv/KvTabletTest.java      |    0
 .../server/kv/prewrite/KvPreWriteBufferTest.java   |  234 +++
 .../fluss/server/kv/rocksdb/RocksDBExtension.java  |   84 +
 .../server/kv/rocksdb/RocksDBKvBuilderTest.java    |   71 +
 .../fluss/server/kv/rocksdb/RocksDBKvTest.java     |   67 +
 .../kv/rocksdb/RocksDBOperationsUtilsTest.java     |   64 +
 .../kv/rocksdb/RocksDBResourceContainerTest.java   |  194 +++
 .../kv/rowmerger/VersionedRowMergerTest.java       |  186 ++
 .../snapshot/CompletedSnapshotJsonSerdeTest.java   |   94 +
 .../kv/snapshot/CompletedSnapshotStoreTest.java    |  251 +++
 .../server/kv/snapshot/CompletedSnapshotTest.java  |  191 ++
 .../kv/snapshot/KvSnapshotDataDownloaderTest.java  |  169 ++
 .../kv/snapshot/KvSnapshotDataUploaderTest.java    |  138 ++
 .../kv/snapshot/KvTabletSnapshotTargetTest.java    |  470 +++++
 .../kv/snapshot/PeriodicSnapshotManagerTest.java   |  261 +++
 .../kv/snapshot/RocksIncrementalSnapshotTest.java  |  197 +++
 .../kv/snapshot/SharedKvFileRegistryTest.java      |   95 +
 .../server/kv/snapshot/SnapshotLocationTest.java   |  114 ++
 .../server/kv/snapshot/SnapshotsCleanerTest.java   |  165 ++
 .../snapshot/TestCompletedSnapshotHandleStore.java |  103 ++
 .../TestingCompletedKvSnapshotCommitter.java       |   88 +
 .../snapshot/TestingCompletedSnapshotHandle.java   |   49 +
 .../ZooKeeperCompletedSnapshotStoreTest.java       |  144 ++
 .../fluss/server/kv/wal/ArrowWalBuilderTest.java   |    0
 .../lakehouse/TestingPaimonStoragePlugin.java      |    0
 .../fluss/server/log/AbstractIndexTest.java        |    0
 .../apache/fluss/server/log/FetchParamsTest.java   |   57 +
 .../org/apache/fluss/server/log/LocalLogTest.java  |  417 +++++
 .../apache/fluss/server/log/LogManagerTest.java    |  313 ++++
 .../apache/fluss/server/log/LogSegmentTest.java    |  452 +++++
 .../apache/fluss/server/log/LogSegmentsTest.java   |  204 +++
 .../org/apache/fluss/server/log/LogTabletTest.java |  627 +++++++
 .../org/apache/fluss/server/log/LogTestUtils.java  |  113 ++
 .../apache/fluss/server/log/OffsetIndexTest.java   |  226 +++
 .../org/apache/fluss/server/log/TimeIndexTest.java |  156 ++
 .../server/log/WriterSnapshotMapJsonSerdeTest.java |   54 +
 .../fluss/server/log/WriterStateManagerTest.java   |    0
 .../log/remote/CommitRemoteLogManifestITCase.java  |  134 ++
 .../log/remote/DefaultRemoteLogStorageTest.java    |    0
 .../fluss/server/log/remote/RemoteLogITCase.java   |  217 +++
 .../server/log/remote/RemoteLogIndexCacheTest.java |  269 +++
 .../server/log/remote/RemoteLogManagerTest.java    |  537 ++++++
 .../log/remote/RemoteLogManifestJsonSerdeTest.java |  115 ++
 .../fluss/server/log/remote/RemoteLogTTLTest.java  |   92 +
 .../server/log/remote/RemoteLogTabletTest.java     |  199 +++
 .../fluss/server/log/remote/RemoteLogTestBase.java |  156 ++
 .../server/log/remote/TestingRemoteLogStorage.java |   47 +
 .../metadata/CoordinatorMetadataCacheTest.java     |   89 +
 .../server/metadata/MetadataUpdateITCase.java      |  516 ++++++
 .../metadata/TabletServerMetadataCacheTest.java    |  290 +++
 .../server/metrics/ServerMetricUtilsTest.java      |  312 ++++
 .../server/metrics/group/TestingMetricGroups.java  |   42 +
 .../fluss/server/replica/AdjustIsrITCase.java      |  258 +++
 .../fluss/server/replica/AdjustIsrManagerTest.java |   59 +
 .../apache/fluss/server/replica/AdjustIsrTest.java |  147 ++
 .../replica/CommitLakeTableSnapshotITCase.java     |  178 ++
 .../fluss/server/replica/FollowerReplicaTest.java  |  148 ++
 .../replica/HighWatermarkPersistenceTest.java      |  202 +++
 .../server/replica/KvReplicaRestoreITCase.java     |    0
 .../fluss/server/replica/KvSnapshotITCase.java     |  215 +++
 .../replica/NotifyReplicaLakeTableOffsetTest.java  |   91 +
 .../replica/RemoveOfflineReplicaFromIsrITCase.java |  152 ++
 .../fluss/server/replica/ReplicaManagerTest.java   | 1810 +++++++++++++++++++
 .../apache/fluss/server/replica/ReplicaTest.java   |  629 +++++++
 .../fluss/server/replica/ReplicaTestBase.java      |  644 +++++++
 .../server/replica/delay/DelayedFetchLogTest.java  |  166 ++
 .../server/replica/delay/DelayedOperationTest.java |  370 ++++
 .../server/replica/delay/DelayedWriteTest.java     |  189 ++
 .../replica/fetcher/RemoteLeaderEndpointTest.java  |  150 ++
 .../replica/fetcher/ReplicaFetcherITCase.java      |  347 ++++
 .../replica/fetcher/ReplicaFetcherManagerTest.java |  139 ++
 .../replica/fetcher/ReplicaFetcherThreadTest.java  |  400 +++++
 .../replica/fetcher/TestingLeaderEndpoint.java     |  137 ++
 .../server/tablet/TabletServerFailOverITCase.java  |  188 ++
 .../fluss/server/tablet/TabletServerITCase.java    |   74 +
 .../fluss/server/tablet/TabletServerTest.java      |   92 +
 .../fluss/server/tablet/TabletServiceITCase.java   |  953 ++++++++++
 .../server/tablet/TestTabletServerGateway.java     |  410 +++++
 .../server/testutils/FlussClusterExtension.java    |    0
 .../apache/fluss/server/testutils/KvTestUtils.java |  195 +++
 .../server/testutils/PartitionMetadataAssert.java  |   51 +
 .../server/testutils/RpcMessageTestUtils.java      |  484 +++++
 .../server/testutils/TableMetadataAssert.java      |   49 +
 .../testutils/TestingServerMetadataCache.java      |   70 +
 .../fluss/server/utils/AvailablePortExtension.java |   53 +
 .../server/utils/ConfigurationParserUtilsTest.java |  104 ++
 .../fluss/server/utils/ResourceGuardTest.java      |  145 ++
 .../fluss/server/utils/RpcGatewayManagerTest.java  |   70 +
 .../server/utils/TableAssignmentUtilsTest.java     |  629 +++++++
 .../fluss/server/utils/TestProcessBuilder.java     |  170 ++
 .../fluss/server/utils/timer/DefaultTimerTest.java |  137 ++
 .../server/utils/timer/TimerTaskListTest.java      |  106 ++
 .../apache/fluss/server/zk/NOPErrorHandler.java    |   31 +
 .../fluss/server/zk/ZooKeeperClientTest.java       |    0
 .../fluss/server/zk/ZooKeeperExtension.java        |    0
 .../apache/fluss/server/zk/ZooKeeperTestUtils.java |   74 +
 .../zk/data/BucketSnapshotJsonSerdeTest.java       |   44 +
 .../zk/data/CoordinatorAddressJsonSerdeTest.java   |    0
 .../zk/data/DatabaseRegistrationJsonSerdeTest.java |    0
 .../zk/data/LakeTableSnapshotJsonSerdeTest.java    |   97 ++
 .../server/zk/data/LeaderAndIsrJsonSerdeTest.java  |   46 +
 .../zk/data/PartitionAssignmentJsonSerdeTest.java  |   48 +
 .../data/RemoteLogManifestHandleJsonSerdeTest.java |   47 +
 .../server/zk/data/ResourceAclJsonSerdeTest.java   |   72 +
 .../zk/data/TableAssignmentJsonSerdeTest.java      |   43 +
 .../zk/data/TableRegistrationJsonSerdeTest.java    |    0
 .../TabletServerRegistrationJsonSerdeTest.java     |    0
 .../apache/fluss/server/zk/data/ZkDataTest.java    |   64 +
 ...libaba.fluss.lake.lakestorage.LakeStoragePlugin |   19 -
 ...apache.fluss.lake.lakestorage.LakeStoragePlugin |   19 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 fluss-test-utils/pom.xml                           |    2 +-
 .../fluss/testutils/common/AllCallbackWrapper.java |   46 -
 .../fluss/testutils/common/CheckedThread.java      |  128 --
 .../fluss/testutils/common/ClassLoaderUtils.java   |   44 -
 .../fluss/testutils/common/CommonTestUtils.java    |  292 ----
 .../common/ContextClassLoaderExtension.java        |  130 --
 .../fluss/testutils/common/CustomExtension.java    |   49 -
 .../testutils/common/EachCallbackWrapper.java      |   46 -
 .../fluss/testutils/common/FlussAssertions.java    |  155 --
 .../common/FlussCompletableFutureAssert.java       |  130 --
 .../ManuallyTriggeredScheduledExecutorService.java |  335 ----
 .../fluss/testutils/common/OneShotLatch.java       |  136 --
 .../fluss/testutils/common/ScheduledTask.java      |  118 --
 .../testutils/common/TestExecutorExtension.java    |   54 -
 .../testutils/common/TestLoggerExtension.java      |   86 -
 .../testutils/junit/parameterized/Parameter.java   |   30 -
 .../parameterized/ParameterizedTestExtension.java  |  251 ---
 .../testutils/junit/parameterized/Parameters.java  |   30 -
 .../fluss/testutils/common/AllCallbackWrapper.java |   46 +
 .../fluss/testutils/common/CheckedThread.java      |  128 ++
 .../fluss/testutils/common/ClassLoaderUtils.java   |   44 +
 .../fluss/testutils/common/CommonTestUtils.java    |  292 ++++
 .../common/ContextClassLoaderExtension.java        |  130 ++
 .../fluss/testutils/common/CustomExtension.java    |   49 +
 .../testutils/common/EachCallbackWrapper.java      |   46 +
 .../fluss/testutils/common/FlussAssertions.java    |  155 ++
 .../common/FlussCompletableFutureAssert.java       |  130 ++
 .../ManuallyTriggeredScheduledExecutorService.java |  335 ++++
 .../fluss/testutils/common/OneShotLatch.java       |  136 ++
 .../fluss/testutils/common/ScheduledTask.java      |  118 ++
 .../testutils/common/TestExecutorExtension.java    |   54 +
 .../testutils/common/TestLoggerExtension.java      |   86 +
 .../testutils/junit/parameterized/Parameter.java   |   30 +
 .../parameterized/ParameterizedTestExtension.java  |  251 +++
 .../testutils/junit/parameterized/Parameters.java  |   30 +
 .../testutils/common/FlussAssertionsTest.java      |   35 -
 .../fluss/testutils/common/OneShotLatchTest.java   |   51 -
 .../junit/ParameterizedTestExtensionTest.java      |   45 -
 .../testutils/common/FlussAssertionsTest.java      |   35 +
 .../fluss/testutils/common/OneShotLatchTest.java   |   51 +
 .../junit/ParameterizedTestExtensionTest.java      |   45 +
 .../org.junit.jupiter.api.extension.Extension      |    2 +-
 pom.xml                                            |   18 +-
 tools/ci/fluss-ci-tools/pom.xml                    |    2 +-
 .../tools/ci/licensecheck/JarFileChecker.java      |  325 ----
 .../tools/ci/licensecheck/LicenseChecker.java      |   54 -
 .../tools/ci/licensecheck/NoticeFileChecker.java   |  404 -----
 .../ci/utils/dependency/DependencyParser.java      |  223 ---
 .../fluss/tools/ci/utils/deploy/DeployParser.java  |   70 -
 .../tools/ci/utils/notice/NoticeContents.java      |   41 -
 .../fluss/tools/ci/utils/notice/NoticeParser.java  |   91 -
 .../fluss/tools/ci/utils/shade/ShadeParser.java    |  109 --
 .../fluss/tools/ci/utils/shared/Dependency.java    |  134 --
 .../tools/ci/utils/shared/DependencyTree.java      |  122 --
 .../fluss/tools/ci/utils/shared/ParserUtils.java   |   73 -
 .../tools/ci/licensecheck/JarFileChecker.java      |  325 ++++
 .../tools/ci/licensecheck/LicenseChecker.java      |   54 +
 .../tools/ci/licensecheck/NoticeFileChecker.java   |  403 +++++
 .../ci/utils/dependency/DependencyParser.java      |  223 +++
 .../fluss/tools/ci/utils/deploy/DeployParser.java  |   70 +
 .../tools/ci/utils/notice/NoticeContents.java      |   41 +
 .../fluss/tools/ci/utils/notice/NoticeParser.java  |   91 +
 .../fluss/tools/ci/utils/shade/ShadeParser.java    |  109 ++
 .../fluss/tools/ci/utils/shared/Dependency.java    |  134 ++
 .../tools/ci/utils/shared/DependencyTree.java      |  122 ++
 .../fluss/tools/ci/utils/shared/ParserUtils.java   |   73 +
 .../tools/ci/licensecheck/JarFileCheckerTest.java  |  525 ------
 .../ci/licensecheck/NoticeFileCheckerTest.java     |  208 ---
 .../utils/dependency/DependencyParserCopyTest.java |  121 --
 .../utils/dependency/DependencyParserTreeTest.java |  148 --
 .../tools/ci/utils/deploy/DeployParserTest.java    |   56 -
 .../tools/ci/utils/notice/NoticeParserTest.java    |   92 -
 .../tools/ci/utils/shade/ShadeParserTest.java      |   95 -
 .../tools/ci/utils/shared/DependencyTreeTest.java  |   95 -
 .../tools/ci/licensecheck/JarFileCheckerTest.java  |  525 ++++++
 .../ci/licensecheck/NoticeFileCheckerTest.java     |  208 +++
 .../utils/dependency/DependencyParserCopyTest.java |  121 ++
 .../utils/dependency/DependencyParserTreeTest.java |  148 ++
 .../tools/ci/utils/deploy/DeployParserTest.java    |   56 +
 .../tools/ci/utils/notice/NoticeParserTest.java    |   92 +
 .../tools/ci/utils/shade/ShadeParserTest.java      |   95 +
 .../tools/ci/utils/shared/DependencyTreeTest.java  |   95 +
 tools/maven/checkstyle.xml                         |    4 +-
 tools/maven/suppressions.xml                       |    2 +-
 website/blog/2024-11-29-fluss-open-source.md       |    6 +-
 website/blog/2025-05-28-unveil-fluss-logo.md       |    4 +-
 website/blog/2025-06-01-partial-updates.md         |    2 +-
 website/blog/releases/0.6.md                       |    4 +-
 website/blog/releases/0.7.md                       |    2 +-
 website/community/dev/ide-setup.md                 |    4 +-
 .../community/how-to-contribute/contribute-code.md |    8 +-
 .../community/how-to-contribute/contribute-docs.md |    2 +-
 website/docs/apis/java-client.md                   |    4 +-
 website/docs/engine-flink/datastream.mdx           |   16 +-
 .../maintenance/observability/metric-reporters.md  |    4 +-
 .../tiered-storage/lakehouse-storage.md            |    6 +-
 website/docs/quickstart/security.md                |   16 +-
 website/src/pages/downloads.md                     |   42 +-
 3192 files changed, 201100 insertions(+), 200901 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml
index 6963fc48a..0a237e71e 100644
--- a/.github/ISSUE_TEMPLATE/bug.yml
+++ b/.github/ISSUE_TEMPLATE/bug.yml
@@ -28,10 +28,10 @@ body:
     attributes:
       label: Search before asking
       description: >
-        Please search [issues](https://github.com/alibaba/fluss/issues) to check if your issue has already been reported.
+        Please search [issues](https://github.com/apache/fluss/issues) to check if your issue has already been reported.
       options:
         - label: >
-            I searched in the [issues](https://github.com/alibaba/fluss/issues) and found nothing similar.
+            I searched in the [issues](https://github.com/apache/fluss/issues) and found nothing similar.
           required: true
   - type: dropdown
     attributes:
diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml
index 5fc951ee9..e12724ebe 100644
--- a/.github/ISSUE_TEMPLATE/feature.yml
+++ b/.github/ISSUE_TEMPLATE/feature.yml
@@ -28,10 +28,10 @@ body:
     attributes:
       label: Search before asking
       description: >
-        Please search [issues](https://github.com/alibaba/fluss/issues) to check if your issue has already been reported.
+        Please search [issues](https://github.com/apache/fluss/issues) to check if your issue has already been reported.
       options:
         - label: >
-            I searched in the [issues](https://github.com/alibaba/fluss/issues) and found nothing similar.
+            I searched in the [issues](https://github.com/apache/fluss/issues) and found nothing similar.
           required: true
   - type: textarea
     attributes:
diff --git a/.github/ISSUE_TEMPLATE/task.yml b/.github/ISSUE_TEMPLATE/task.yml
index b7fb3efef..65cee5b1e 100644
--- a/.github/ISSUE_TEMPLATE/task.yml
+++ b/.github/ISSUE_TEMPLATE/task.yml
@@ -28,10 +28,10 @@ body:
     attributes:
       label: Search before asking
       description: >
-        Please search [issues](https://github.com/alibaba/fluss/issues) to check if your issue has already been reported.
+        Please search [issues](https://github.com/apache/fluss/issues) to check if your issue has already been reported.
       options:
         - label: >
-            I searched in the [issues](https://github.com/alibaba/fluss/issues) and found nothing similar.
+            I searched in the [issues](https://github.com/apache/fluss/issues) and found nothing similar.
           required: true
   - type: textarea
     attributes:
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index a677c148f..238dab59f 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -3,7 +3,7 @@
 
 ## Contribution Checklist
 
-  - Make sure that the pull request corresponds to a [GitHub issue](https://github.com/alibaba/fluss/issues). Exceptions are made for typos in JavaDoc or documentation files, which need no issue.
+  - Make sure that the pull request corresponds to a [GitHub issue](https://github.com/apache/fluss/issues). Exceptions are made for typos in JavaDoc or documentation files, which need no issue.
 
   - Name the pull request in the format "[component] Title of the pull request", where *[component]* should be replaced by the name of the component being changed. Typically, this corresponds to the component label assigned to the issue (e.g., [kv], [log], [client], [flink]). Skip *[component]* if you are unsure about which is the best component.
 
diff --git a/fluss-client/pom.xml b/fluss-client/pom.xml
index 4b11c8da2..8f9544887 100644
--- a/fluss-client/pom.xml
+++ b/fluss-client/pom.xml
@@ -21,7 +21,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>com.alibaba.fluss</groupId>
+        <groupId>org.apache.fluss</groupId>
         <artifactId>fluss</artifactId>
         <version>0.8-SNAPSHOT</version>
     </parent>
@@ -32,33 +32,33 @@
 
     <dependencies>
         <dependency>
-            <groupId>com.alibaba.fluss</groupId>
+            <groupId>org.apache.fluss</groupId>
             <artifactId>fluss-common</artifactId>
             <version>${project.version}</version>
         </dependency>
 
         <dependency>
-            <groupId>com.alibaba.fluss</groupId>
+            <groupId>org.apache.fluss</groupId>
             <artifactId>fluss-rpc</artifactId>
             <version>${project.version}</version>
         </dependency>
 
         <dependency>
-            <groupId>com.alibaba.fluss</groupId>
+            <groupId>org.apache.fluss</groupId>
             <artifactId>fluss-metrics-jmx</artifactId>
             <version>${project.version}</version>
         </dependency>
 
         <!-- test dependency -->
         <dependency>
-            <groupId>com.alibaba.fluss</groupId>
+            <groupId>org.apache.fluss</groupId>
             <artifactId>fluss-server</artifactId>
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
 
         <dependency>
-            <groupId>com.alibaba.fluss</groupId>
+            <groupId>org.apache.fluss</groupId>
             <artifactId>fluss-server</artifactId>
             <version>${project.version}</version>
             <type>test-jar</type>
@@ -73,7 +73,7 @@
         </dependency>
 
         <dependency>
-            <groupId>com.alibaba.fluss</groupId>
+            <groupId>org.apache.fluss</groupId>
             <artifactId>fluss-common</artifactId>
             <version>${project.version}</version>
             <type>test-jar</type>
@@ -81,12 +81,12 @@
         </dependency>
 
         <dependency>
-            <groupId>com.alibaba.fluss</groupId>
+            <groupId>org.apache.fluss</groupId>
             <artifactId>fluss-test-utils</artifactId>
         </dependency>
 
         <dependency>
-            <groupId>com.alibaba.fluss</groupId>
+            <groupId>org.apache.fluss</groupId>
             <artifactId>fluss-rpc</artifactId>
             <version>${project.version}</version>
             <type>test-jar</type>
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/Connection.java b/fluss-client/src/main/java/com/alibaba/fluss/client/Connection.java
deleted file mode 100644
index d082e458b..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/Connection.java
+++ /dev/null
@@ -1,62 +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 com.alibaba.fluss.client;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.client.admin.Admin;
-import com.alibaba.fluss.client.table.Table;
-import com.alibaba.fluss.config.Configuration;
-import com.alibaba.fluss.metadata.TablePath;
-
-import javax.annotation.concurrent.ThreadSafe;
-
-/**
- * A cluster connection encapsulating lower level individual connections to actual Fluss servers.
- * Connections are instantiated through the {@link ConnectionFactory} class. The lifecycle of the
- * connection is managed by the caller, who has to {@link #close()} the connection to release the
- * resources. The connection object contains logic to find the Coordinator, locate table buckets out
- * on the cluster, keeps a cache of locations and then knows how to re-calibrate after they move.
- * The individual connections to servers, meta cache, etc. are all shared by the {@link Table} and
- * {@link Admin} instances obtained from this connection.
- *
- * <p>Connection creation is a heavy-weight operation. Connection implementations are thread-safe,
- * so that the client can create a connection once, and share it with different threads. {@code
- * Table} and {@link Admin} instances, on the other hand, are light-weight and are not thread-safe.
- * Typically, a single connection per client application is instantiated and every thread will
- * obtain its own {@link Table} instance. Caching or pooling of {@link Table} and {@link Admin} is
- * not recommended.
- *
- * @since 0.1
- */
-@PublicEvolving
-@ThreadSafe
-public interface Connection extends AutoCloseable {
-
-    /** Retrieve the configuration used to create this connection. */
-    Configuration getConfiguration();
-
-    /** Retrieve a new Admin client to administer a Fluss cluster. */
-    Admin getAdmin();
-
-    /** Retrieve a new Table client to operate data in table. */
-    Table getTable(TablePath tablePath);
-
-    /** Close the connection and release all resources. */
-    @Override
-    void close() throws Exception;
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/ConnectionFactory.java b/fluss-client/src/main/java/com/alibaba/fluss/client/ConnectionFactory.java
deleted file mode 100644
index 51a2208f9..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/ConnectionFactory.java
+++ /dev/null
@@ -1,68 +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 com.alibaba.fluss.client;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.client.admin.Admin;
-import com.alibaba.fluss.config.Configuration;
-import com.alibaba.fluss.metrics.registry.MetricRegistry;
-
-/**
- * A non-instantiable class that manages creation of {@link Connection}s. Managing the lifecycle of
- * the {@link Connection}s to the cluster is the responsibility of the caller. From a {@link
- * Connection}, {@link Admin} implementations are retrieved with {@link Connection#getAdmin()}.
- *
- * @since 0.1
- */
-@PublicEvolving
-public class ConnectionFactory {
-
-    private ConnectionFactory() {}
-
-    /**
-     * Creates a new {@link Connection} to the Fluss cluster. The given configuration at least needs
-     * to contain "bootstrap.servers" to discover the Fluss cluster. Here is a simple example:
-     *
-     * <pre>{@code
-     * Configuration conf = new Configuration();
-     * conf.setString("bootstrap.servers", "localhost:9092");
-     * Connection connection = ConnectionFactory.createConnection(conf);
-     * Admin admin = connection.getAdmin();
-     * try {
-     *    // Use the admin as needed, for a single operation and a single thread
-     *  } finally {
-     *    admin.close();
-     *    connection.close();
-     *  }
-     * }</pre>
-     */
-    public static Connection createConnection(Configuration conf) {
-        return new FlussConnection(conf);
-    }
-
-    /**
-     * Create a new {@link Connection} to the Fluss cluster with registering metrics to the given
-     * {@code metricRegistry}. It's mainly used for client to register metrics to external metrics
-     * system.
-     *
-     * <p>See more comments in method {@link #createConnection(Configuration)}
-     */
-    public static Connection createConnection(Configuration conf, MetricRegistry metricRegistry) {
-        return new FlussConnection(conf, metricRegistry);
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/FlussConnection.java b/fluss-client/src/main/java/com/alibaba/fluss/client/FlussConnection.java
deleted file mode 100644
index 837ecd905..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/FlussConnection.java
+++ /dev/null
@@ -1,213 +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 com.alibaba.fluss.client;
-
-import com.alibaba.fluss.client.admin.Admin;
-import com.alibaba.fluss.client.admin.FlussAdmin;
-import com.alibaba.fluss.client.lookup.LookupClient;
-import com.alibaba.fluss.client.metadata.MetadataUpdater;
-import com.alibaba.fluss.client.table.FlussTable;
-import com.alibaba.fluss.client.table.Table;
-import com.alibaba.fluss.client.table.scanner.RemoteFileDownloader;
-import com.alibaba.fluss.client.token.DefaultSecurityTokenManager;
-import com.alibaba.fluss.client.token.DefaultSecurityTokenProvider;
-import com.alibaba.fluss.client.token.SecurityTokenManager;
-import com.alibaba.fluss.client.token.SecurityTokenProvider;
-import com.alibaba.fluss.client.write.WriterClient;
-import com.alibaba.fluss.config.ConfigOptions;
-import com.alibaba.fluss.config.Configuration;
-import com.alibaba.fluss.exception.FlussRuntimeException;
-import com.alibaba.fluss.fs.FileSystem;
-import com.alibaba.fluss.metadata.TableInfo;
-import com.alibaba.fluss.metadata.TablePath;
-import com.alibaba.fluss.metrics.registry.MetricRegistry;
-import com.alibaba.fluss.rpc.GatewayClientProxy;
-import com.alibaba.fluss.rpc.RpcClient;
-import com.alibaba.fluss.rpc.gateway.AdminReadOnlyGateway;
-import com.alibaba.fluss.rpc.metrics.ClientMetricGroup;
-
-import java.time.Duration;
-import java.util.HashMap;
-import java.util.List;
-
-import static com.alibaba.fluss.client.utils.MetadataUtils.getOneAvailableTabletServerNode;
-import static com.alibaba.fluss.config.FlussConfigUtils.CLIENT_PREFIX;
-import static com.alibaba.fluss.utils.PropertiesUtils.extractPrefix;
-
-/** A connection to Fluss cluster, and holds the client session resources. */
-public final class FlussConnection implements Connection {
-    private final Configuration conf;
-    private final RpcClient rpcClient;
-    private final MetadataUpdater metadataUpdater;
-    private final MetricRegistry metricRegistry;
-    private final ClientMetricGroup clientMetricGroup;
-
-    private volatile WriterClient writerClient;
-    private volatile LookupClient lookupClient;
-    private volatile RemoteFileDownloader remoteFileDownloader;
-    private volatile SecurityTokenManager securityTokenManager;
-
-    FlussConnection(Configuration conf) {
-        this(conf, MetricRegistry.create(conf, null));
-    }
-
-    FlussConnection(Configuration conf, MetricRegistry metricRegistry) {
-        this.conf = conf;
-        // init Filesystem with configuration from FlussConnection,
-        // only pass options with 'client.fs.' prefix
-        FileSystem.initialize(
-                Configuration.fromMap(
-                        extractPrefix(new HashMap<>(conf.toMap()), CLIENT_PREFIX + "fs.")),
-                null);
-        // for client metrics.
-        setupClientMetricsConfiguration();
-        String clientId = conf.getString(ConfigOptions.CLIENT_ID);
-        this.metricRegistry = metricRegistry;
-        this.clientMetricGroup = new ClientMetricGroup(metricRegistry, clientId);
-        this.rpcClient = RpcClient.create(conf, clientMetricGroup, false);
-
-        // TODO this maybe remove after we introduce client metadata.
-        this.metadataUpdater = new MetadataUpdater(conf, rpcClient);
-        this.writerClient = null;
-    }
-
-    @Override
-    public Configuration getConfiguration() {
-        return conf;
-    }
-
-    @Override
-    public Admin getAdmin() {
-        return new FlussAdmin(rpcClient, metadataUpdater);
-    }
-
-    @Override
-    public Table getTable(TablePath tablePath) {
-        // force to update the table info from server to avoid stale data in cache
-        metadataUpdater.updateTableOrPartitionMetadata(tablePath, null);
-        TableInfo tableInfo = metadataUpdater.getTableInfoOrElseThrow(tablePath);
-        return new FlussTable(this, tablePath, tableInfo);
-    }
-
-    public RpcClient getRpcClient() {
-        return rpcClient;
-    }
-
-    public MetadataUpdater getMetadataUpdater() {
-        return metadataUpdater;
-    }
-
-    public ClientMetricGroup getClientMetricGroup() {
-        return clientMetricGroup;
-    }
-
-    public WriterClient getOrCreateWriterClient() {
-        if (writerClient == null) {
-            synchronized (this) {
-                if (writerClient == null) {
-                    writerClient =
-                            new WriterClient(
-                                    conf, metadataUpdater, clientMetricGroup, this.getAdmin());
-                }
-            }
-        }
-        return writerClient;
-    }
-
-    public LookupClient getOrCreateLookupClient() {
-        if (lookupClient == null) {
-            synchronized (this) {
-                if (lookupClient == null) {
-                    lookupClient = new LookupClient(conf, metadataUpdater);
-                }
-            }
-        }
-        return lookupClient;
-    }
-
-    public RemoteFileDownloader getOrCreateRemoteFileDownloader() {
-        if (remoteFileDownloader == null) {
-            synchronized (this) {
-                if (remoteFileDownloader == null) {
-                    remoteFileDownloader =
-                            new RemoteFileDownloader(
-                                    conf.getInt(ConfigOptions.REMOTE_FILE_DOWNLOAD_THREAD_NUM));
-                }
-                // access remote files requires setting up filesystem security token manager
-                if (securityTokenManager == null) {
-                    // prepare security token manager
-                    // create the admin read only gateway
-                    // todo: may add retry logic when no any available tablet server?
-                    AdminReadOnlyGateway gateway =
-                            GatewayClientProxy.createGatewayProxy(
-                                    () ->
-                                            getOneAvailableTabletServerNode(
-                                                    metadataUpdater.getCluster()),
-                                    rpcClient,
-                                    AdminReadOnlyGateway.class);
-                    SecurityTokenProvider securityTokenProvider =
-                            new DefaultSecurityTokenProvider(gateway);
-                    securityTokenManager =
-                            new DefaultSecurityTokenManager(conf, securityTokenProvider);
-                    try {
-                        securityTokenManager.start();
-                    } catch (Exception e) {
-                        throw new FlussRuntimeException("start security token manager failed", e);
-                    }
-                }
-            }
-        }
-        return remoteFileDownloader;
-    }
-
-    @Override
-    public void close() throws Exception {
-        if (writerClient != null) {
-            writerClient.close(Duration.ofMillis(Long.MAX_VALUE));
-        }
-
-        if (lookupClient != null) {
-            // timeout is Long.MAX_VALUE to make the pending get request
-            // to be processed
-            lookupClient.close(Duration.ofMillis(Long.MAX_VALUE));
-        }
-
-        if (remoteFileDownloader != null) {
-            remoteFileDownloader.close();
-        }
-
-        if (securityTokenManager != null) {
-            // todo: FLUSS-56910234 we don't have to wait until close fluss table
-            // to stop securityTokenManager
-            securityTokenManager.stop();
-        }
-
-        clientMetricGroup.close();
-        rpcClient.close();
-        metricRegistry.closeAsync().get();
-    }
-
-    private void setupClientMetricsConfiguration() {
-        boolean enableClientMetrics = conf.getBoolean(ConfigOptions.CLIENT_METRICS_ENABLED);
-        List<String> reporters = conf.get(ConfigOptions.METRICS_REPORTERS);
-        if (enableClientMetrics && (reporters == null || reporters.isEmpty())) {
-            // Client will use JMX reporter by default if not set.
-            conf.setString(ConfigOptions.METRICS_REPORTERS.key(), "jmx");
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/admin/Admin.java b/fluss-client/src/main/java/com/alibaba/fluss/client/admin/Admin.java
deleted file mode 100644
index 89bb7b455..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/admin/Admin.java
+++ /dev/null
@@ -1,453 +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 com.alibaba.fluss.client.admin;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.client.metadata.KvSnapshotMetadata;
-import com.alibaba.fluss.client.metadata.KvSnapshots;
-import com.alibaba.fluss.client.metadata.LakeSnapshot;
-import com.alibaba.fluss.cluster.ServerNode;
-import com.alibaba.fluss.config.ConfigOptions;
-import com.alibaba.fluss.exception.DatabaseAlreadyExistException;
-import com.alibaba.fluss.exception.DatabaseNotEmptyException;
-import com.alibaba.fluss.exception.DatabaseNotExistException;
-import com.alibaba.fluss.exception.InvalidDatabaseException;
-import com.alibaba.fluss.exception.InvalidPartitionException;
-import com.alibaba.fluss.exception.InvalidReplicationFactorException;
-import com.alibaba.fluss.exception.InvalidTableException;
-import com.alibaba.fluss.exception.KvSnapshotNotExistException;
-import com.alibaba.fluss.exception.NonPrimaryKeyTableException;
-import com.alibaba.fluss.exception.PartitionAlreadyExistsException;
-import com.alibaba.fluss.exception.PartitionNotExistException;
-import com.alibaba.fluss.exception.SchemaNotExistException;
-import com.alibaba.fluss.exception.TableAlreadyExistException;
-import com.alibaba.fluss.exception.TableNotExistException;
-import com.alibaba.fluss.exception.TableNotPartitionedException;
-import com.alibaba.fluss.exception.TooManyBucketsException;
-import com.alibaba.fluss.exception.TooManyPartitionsException;
-import com.alibaba.fluss.metadata.DatabaseDescriptor;
-import com.alibaba.fluss.metadata.DatabaseInfo;
-import com.alibaba.fluss.metadata.PartitionInfo;
-import com.alibaba.fluss.metadata.PartitionSpec;
-import com.alibaba.fluss.metadata.ResolvedPartitionSpec;
-import com.alibaba.fluss.metadata.SchemaInfo;
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.metadata.TableDescriptor;
-import com.alibaba.fluss.metadata.TableInfo;
-import com.alibaba.fluss.metadata.TablePath;
-import com.alibaba.fluss.security.acl.AclBinding;
-import com.alibaba.fluss.security.acl.AclBindingFilter;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-/**
- * The administrative client for Fluss, which supports managing and inspecting tables, servers,
- * configurations and ACLs.
- *
- * @since 0.1
- */
-@PublicEvolving
-public interface Admin extends AutoCloseable {
-
-    /** Get the current server node information. asynchronously. */
-    CompletableFuture<List<ServerNode>> getServerNodes();
-
-    /**
-     * Get the latest table schema of the given table asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist.
-     * </ul>
-     *
-     * @param tablePath the table path of the table.
-     */
-    CompletableFuture<SchemaInfo> getTableSchema(TablePath tablePath);
-
-    /**
-     * Get the specific table schema of the given table by schema id asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist.
-     *   <li>{@link SchemaNotExistException} if the schema does not exist.
-     * </ul>
-     *
-     * @param tablePath the table path of the table.
-     */
-    CompletableFuture<SchemaInfo> getTableSchema(TablePath tablePath, int schemaId);
-
-    /**
-     * Create a new database asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link DatabaseAlreadyExistException} if the database already exists and {@code
-     *       ignoreIfExists} is false.
-     * </ul>
-     *
-     * @param databaseName The name of the database to create.
-     * @param databaseDescriptor The descriptor of the database to create.
-     * @param ignoreIfExists Flag to specify behavior when a database with the given name already
-     *     exists: if set to false, throw a DatabaseAlreadyExistException, if set to true, do
-     *     nothing.
-     * @throws InvalidDatabaseException if the database name is invalid, e.g., contains illegal
-     *     characters, or exceeds the maximum length.
-     */
-    CompletableFuture<Void> createDatabase(
-            String databaseName, DatabaseDescriptor databaseDescriptor, boolean ignoreIfExists);
-
-    /**
-     * Get the database with the given database name asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link DatabaseNotExistException} if the database does not exist.
-     * </ul>
-     *
-     * @param databaseName The database name of the database.
-     */
-    CompletableFuture<DatabaseInfo> getDatabaseInfo(String databaseName);
-
-    /**
-     * Drop the database with the given name asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link DatabaseNotExistException} if the database does not exist and {@code
-     *       ignoreIfNotExists} is false.
-     *   <li>{@link DatabaseNotEmptyException} if the database is not empty and {@code cascade} is
-     *       false.
-     * </ul>
-     *
-     * @param databaseName The name of the database to delete.
-     * @param ignoreIfNotExists Flag to specify behavior when a database with the given name does
-     *     not exist: if set to false, throw a DatabaseNotExistException, if set to true, do
-     *     nothing.
-     * @param cascade Flag to specify whether to delete all tables in the database.
-     */
-    CompletableFuture<Void> dropDatabase(
-            String databaseName, boolean ignoreIfNotExists, boolean cascade);
-
-    /**
-     * Get whether database exists asynchronously.
-     *
-     * @param databaseName The name of the database to check.
-     */
-    CompletableFuture<Boolean> databaseExists(String databaseName);
-
-    /** List all databases in fluss cluster asynchronously. */
-    CompletableFuture<List<String>> listDatabases();
-
-    /**
-     * Create a new table asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link DatabaseNotExistException} if the database in the table path does not exist.
-     *   <li>{@link TableAlreadyExistException} if the table already exists and {@code
-     *       ignoreIfExists} is false.
-     *   <li>{@link InvalidReplicationFactorException} if the table's replication factor is larger
-     *       than the number of available tablet servers.
-     * </ul>
-     *
-     * @param tablePath The tablePath of the table.
-     * @param tableDescriptor The table to create.
-     * @throws InvalidTableException if the table name is invalid, e.g., contains illegal
-     *     characters, or exceeds the maximum length.
-     * @throws InvalidDatabaseException if the database name is invalid, e.g., contains illegal
-     *     characters, or exceeds the maximum length.
-     */
-    CompletableFuture<Void> createTable(
-            TablePath tablePath, TableDescriptor tableDescriptor, boolean ignoreIfExists)
-            throws InvalidTableException, InvalidDatabaseException;
-
-    /**
-     * Get the table with the given table path asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist.
-     * </ul>
-     *
-     * @param tablePath The table path of the table.
-     */
-    CompletableFuture<TableInfo> getTableInfo(TablePath tablePath);
-
-    /**
-     * Drop the table with the given table path asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist and {@code
-     *       ignoreIfNotExists} is false.
-     * </ul>
-     *
-     * @param tablePath The table path of the table.
-     * @param ignoreIfNotExists Flag to specify behavior when a table with the given name does not
-     *     exist: if set to false, throw a TableNotExistException, if set to true, do nothing.
-     */
-    CompletableFuture<Void> dropTable(TablePath tablePath, boolean ignoreIfNotExists);
-
-    /**
-     * Get whether table exists asynchronously.
-     *
-     * @param tablePath The table path of the table.
-     */
-    CompletableFuture<Boolean> tableExists(TablePath tablePath);
-
-    /**
-     * List all tables in the given database in fluss cluster asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link DatabaseNotExistException} if the database does not exist.
-     * </ul>
-     *
-     * @param databaseName The name of the database.
-     */
-    CompletableFuture<List<String>> listTables(String databaseName);
-
-    /**
-     * List all partitions in the given table in fluss cluster asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist.
-     *   <li>{@link TableNotPartitionedException} if the table is not partitioned.
-     * </ul>
-     *
-     * @param tablePath The path of the table.
-     */
-    CompletableFuture<List<PartitionInfo>> listPartitionInfos(TablePath tablePath);
-
-    /**
-     * List all partitions in fluss cluster that are under the given table and the given partial
-     * PartitionSpec asynchronously.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist.
-     *   <li>{@link TableNotPartitionedException} if the table is not partitioned.
-     *   <li>{@link InvalidPartitionException} if the input partition spec is invalid.
-     * </ul>
-     *
-     * @param tablePath The path of the table.
-     * @param partialPartitionSpec Part of table partition spec
-     */
-    CompletableFuture<List<PartitionInfo>> listPartitionInfos(
-            TablePath tablePath, PartitionSpec partialPartitionSpec);
-
-    /**
-     * Create a new partition for a partitioned table.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist.
-     *   <li>{@link TableNotPartitionedException} if the table is not partitioned.
-     *   <li>{@link PartitionAlreadyExistsException} if the partition already exists and {@code
-     *       ignoreIfExists} is false.
-     *   <li>{@link InvalidPartitionException} if the input partition spec is invalid.
-     *   <li>{@link TooManyPartitionsException} if the number of partitions is larger than the
-     *       maximum number of partitions of one table, see {@link ConfigOptions#MAX_PARTITION_NUM}.
-     *   <li>{@link TooManyBucketsException} if the number of buckets is larger than the maximum
-     *       number of buckets of one table, see {@link ConfigOptions#MAX_BUCKET_NUM}.
-     * </ul>
-     *
-     * @param tablePath The table path of the table.
-     * @param partitionSpec The partition spec to add.
-     * @param ignoreIfExists Flag to specify behavior when a partition with the given name already
-     *     exists: if set to false, throw a PartitionAlreadyExistsException, if set to true, do
-     *     nothing.
-     */
-    CompletableFuture<Void> createPartition(
-            TablePath tablePath, PartitionSpec partitionSpec, boolean ignoreIfExists);
-
-    /**
-     * Drop a partition from a partitioned table.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist.
-     *   <li>{@link TableNotPartitionedException} if the table is not partitioned.
-     *   <li>{@link PartitionNotExistException} if the partition not exists and {@code
-     *       ignoreIfExists} is false.
-     *   <li>{@link InvalidPartitionException} if the input partition spec is invalid.
-     * </ul>
-     *
-     * @param tablePath The table path of the table.
-     * @param partitionSpec The partition spec to drop.
-     * @param ignoreIfNotExists Flag to specify behavior when a partition with the given name does
-     *     not exist: if set to false, throw a PartitionNotExistException, if set to true, do
-     *     nothing.
-     */
-    CompletableFuture<Void> dropPartition(
-            TablePath tablePath, PartitionSpec partitionSpec, boolean ignoreIfNotExists);
-
-    /**
-     * Get the latest kv snapshots of the given table asynchronously. A kv snapshot is a snapshot of
-     * a bucket of a primary key table at a certain point in time. Therefore, there are at-most
-     * {@code N} snapshots for a primary key table, {@code N} is the number of buckets.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist.
-     *   <li>{@link NonPrimaryKeyTableException} if the table is not a primary key table.
-     *   <li>{@link PartitionNotExistException} if the table is partitioned, use {@link
-     *       #getLatestKvSnapshots(TablePath, String)} instead to get the latest kv snapshot of a
-     *       partition of a partitioned table.
-     *   <li>
-     * </ul>
-     *
-     * @param tablePath the table path of the table.
-     */
-    CompletableFuture<KvSnapshots> getLatestKvSnapshots(TablePath tablePath);
-
-    /**
-     * Get the latest kv snapshots of the given table partition asynchronously. A kv snapshot is a
-     * snapshot of a bucket of a primary key table at a certain point in time. Therefore, there are
-     * at-most {@code N} snapshots for a partition of a primary key table, {@code N} is the number
-     * of buckets.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist.
-     *   <li>{@link NonPrimaryKeyTableException} if the table is not a primary key table.
-     *   <li>{@link PartitionNotExistException} if the partition does not exist
-     *   <li>{@link TableNotPartitionedException} if the table is not partitioned, use {@link
-     *       #getLatestKvSnapshots(TablePath)} instead to get the latest kv snapshots for a
-     *       non-partitioned table.
-     * </ul>
-     *
-     * @param tablePath the table path of the table.
-     * @param partitionName the partition name, see {@link ResolvedPartitionSpec#getPartitionName}
-     *     for the format of the partition name.
-     */
-    CompletableFuture<KvSnapshots> getLatestKvSnapshots(TablePath tablePath, String partitionName);
-
-    /**
-     * Get the kv snapshot metadata of the given kv snapshot asynchronously. The kv snapshot
-     * metadata including the snapshot files for the kv tablet and the log offset for the changelog
-     * at the snapshot time.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link KvSnapshotNotExistException} if the snapshot does not exist.
-     * </ul>
-     *
-     * @param bucket the table bucket of the kv snapshot.
-     * @param snapshotId the snapshot id.
-     */
-    CompletableFuture<KvSnapshotMetadata> getKvSnapshotMetadata(
-            TableBucket bucket, long snapshotId);
-
-    /**
-     * Get table lake snapshot info of the given table asynchronously.
-     *
-     * <p>It'll get the latest snapshot for all the buckets of the table.
-     *
-     * <p>The following exceptions can be anticipated when calling {@code get()} on returned future.
-     *
-     * <ul>
-     *   <li>{@link TableNotExistException} if the table does not exist.
-     * </ul>
-     *
-     * @param tablePath the table path of the table.
-     */
-    CompletableFuture<LakeSnapshot> getLatestLakeSnapshot(TablePath tablePath);
-
-    /**
-     * List offset for the specified buckets. This operation enables to find the beginning offset,
-     * end offset as well as the offset matching a timestamp in buckets.
-     *
-     * @param tablePath the table path of the table.
-     * @param buckets the buckets to fetch offset.
-     * @param offsetSpec the offset spec to fetch.
-     */
-    ListOffsetsResult listOffsets(
-            TablePath tablePath, Collection<Integer> buckets, OffsetSpec offsetSpec);
-
-    /**
-     * List offset for the specified buckets. This operation enables to find the beginning offset,
-     * end offset as well as the offset matching a timestamp in buckets.
-     *
-     * @param tablePath the table path of the table.
-     * @param partitionName the partition name of the partition,see {@link
-     *     ResolvedPartitionSpec#getPartitionName} * for the format of the partition name.
-     * @param buckets the buckets to fetch offset.
-     * @param offsetSpec the offset spec to fetch.
-     */
-    ListOffsetsResult listOffsets(
-            TablePath tablePath,
-            String partitionName,
-            Collection<Integer> buckets,
-            OffsetSpec offsetSpec);
-
-    /**
-     * Retrieves ACL entries filtered by principal for the specified resource.
-     *
-     * <p>1. Validates the user has 'describe' permission on the resource. 2. Returns entries
-     * matching the principal if permitted; throws an exception otherwise.
-     *
-     * @return A CompletableFuture containing the filtered ACL entries.
-     */
-    CompletableFuture<Collection<AclBinding>> listAcls(AclBindingFilter aclBindingFilter);
-
-    /**
-     * Creates multiple ACL entries in a single atomic operation.
-     *
-     * <p>1. Validates the user has 'alter' permission on the resource. 2. Creates the ACL entries
-     * if valid and permitted.
-     *
-     * <p>Each entry in {@code aclBindings} must have a valid principal, operation and permission.
-     *
-     * @param aclBindings List of ACL entries to create.
-     * @return A CompletableFuture indicating completion of the operation.
-     */
-    CreateAclsResult createAcls(Collection<AclBinding> aclBindings);
-
-    /**
-     * Removes multiple ACL entries in a single atomic operation.
-     *
-     * <p>1. Validates the user has 'alter' permission on the resource. 2. Removes entries only if
-     * they exactly match the provided entries (principal, operation, permission). 3. Does not
-     * remove entries if any of the ACL entries do not exist.
-     *
-     * @param filters List of ACL entries to remove.
-     * @return A CompletableFuture indicating completion of the operation.
-     */
-    DropAclsResult dropAcls(Collection<AclBindingFilter> filters);
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/admin/CreateAclsResult.java b/fluss-client/src/main/java/com/alibaba/fluss/client/admin/CreateAclsResult.java
deleted file mode 100644
index c538f5f97..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/admin/CreateAclsResult.java
+++ /dev/null
@@ -1,97 +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 com.alibaba.fluss.client.admin;
-
-import com.alibaba.fluss.rpc.messages.PbCreateAclRespInfo;
-import com.alibaba.fluss.rpc.protocol.ApiError;
-import com.alibaba.fluss.security.acl.AclBinding;
-import com.alibaba.fluss.utils.MapUtils;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-
-import static com.alibaba.fluss.rpc.util.CommonRpcMessageUtils.toAclBinding;
-
-/**
- * Represents the result of a batch ACL operation, managing asynchronous completion of individual
- * ACL operations.
- *
- * <p>This class tracks the execution status of multiple ACL operations (e.g., create/drop) by
- * associating each {@link AclBinding} with its corresponding {@link CompletableFuture}. It
- * processes RPC responses to complete or fail individual futures based on server-side results.
- *
- * @since 0.6
- */
-public class CreateAclsResult {
-    private final Map<AclBinding, CompletableFuture<Void>> futures;
-
-    public CreateAclsResult(Collection<AclBinding> aclBindings) {
-        Map<AclBinding, CompletableFuture<Void>> futures = MapUtils.newConcurrentHashMap();
-        aclBindings.forEach(aclBinding -> futures.put(aclBinding, new CompletableFuture<>()));
-        this.futures = futures;
-    }
-
-    public CompletableFuture<Void> all() {
-        return CompletableFuture.allOf(futures.values().toArray(new CompletableFuture[0]));
-    }
-
-    /**
-     * Gets the map of ACL bindings to their associated futures.
-     *
-     * @return The map of ACL bindings to futures.
-     */
-    public Map<AclBinding, CompletableFuture<Void>> getFutures() {
-        return futures;
-    }
-
-    /**
-     * Completes individual futures based on RPC response information.
-     *
-     * <p>For each {@link PbCreateAclRespInfo} in the collection, Completes the future with success
-     * or failure based on the response's error code.
-     *
-     * @param pbAclRespInfos Collection of protobuf response messages containing ACL operation
-     *     results.
-     */
-    public void complete(List<PbCreateAclRespInfo> pbAclRespInfos) {
-        pbAclRespInfos.forEach(
-                pbAclRespInfo -> {
-                    AclBinding aclBinding = toAclBinding(pbAclRespInfo.getAcl());
-                    CompletableFuture<Void> future = futures.get(aclBinding);
-                    ApiError error = ApiError.fromErrorMessage(pbAclRespInfo);
-                    if (error.isFailure()) {
-                        future.completeExceptionally(error.exception());
-                    } else {
-                        future.complete(null);
-                    }
-                });
-    }
-
-    /**
-     * Marks all futures as exceptionally completed with the provided throwable.
-     *
-     * <p>This method propagates a common exception (e.g., network error) to all tracked futures.
-     *
-     * @param t The throwable to propagate to all futures
-     */
-    public void completeExceptionally(Throwable t) {
-        futures.values().forEach(future -> future.completeExceptionally(t));
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/admin/DropAclsResult.java b/fluss-client/src/main/java/com/alibaba/fluss/client/admin/DropAclsResult.java
deleted file mode 100644
index 80a84fd8c..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/admin/DropAclsResult.java
+++ /dev/null
@@ -1,169 +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 com.alibaba.fluss.client.admin;
-
-import com.alibaba.fluss.exception.ApiException;
-import com.alibaba.fluss.exception.UnknownServerException;
-import com.alibaba.fluss.rpc.messages.PbDropAclsFilterResult;
-import com.alibaba.fluss.rpc.messages.PbDropAclsMatchingAcl;
-import com.alibaba.fluss.rpc.protocol.ApiError;
-import com.alibaba.fluss.security.acl.AclBinding;
-import com.alibaba.fluss.security.acl.AclBindingFilter;
-import com.alibaba.fluss.utils.MapUtils;
-
-import javax.annotation.Nullable;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-
-import static com.alibaba.fluss.rpc.util.CommonRpcMessageUtils.toAclBinding;
-
-/** Represents the result of a drop ACLs operation. */
-public class DropAclsResult {
-
-    /** A class containing either the deleted ACL binding or an exception if the delete failed. */
-    public static class FilterResult {
-        private final AclBinding binding;
-        @Nullable private final ApiException exception;
-
-        FilterResult(AclBinding binding, @Nullable ApiException exception) {
-            this.binding = binding;
-            this.exception = exception;
-        }
-
-        /** Return the deleted ACL binding or null if there was an error. */
-        public AclBinding binding() {
-            return binding;
-        }
-
-        /** Return an exception if the ACL delete was not successful or null if it was. */
-        @Nullable
-        public ApiException exception() {
-            return exception;
-        }
-    }
-
-    /** A class containing the results of the delete ACLs operation. */
-    public static class FilterResults {
-        private final List<FilterResult> values;
-
-        FilterResults(List<FilterResult> values) {
-            this.values = values;
-        }
-
-        /** Return a list of delete ACLs results for a given filter. */
-        public List<FilterResult> values() {
-            return values;
-        }
-    }
-
-    private final Map<AclBindingFilter, CompletableFuture<FilterResults>> futures;
-
-    DropAclsResult(Collection<AclBindingFilter> filters) {
-        final Map<AclBindingFilter, CompletableFuture<DropAclsResult.FilterResults>> futures =
-                MapUtils.newConcurrentHashMap();
-        for (AclBindingFilter filter : filters) {
-            if (!futures.containsKey(filter)) {
-                futures.put(filter, new CompletableFuture<>());
-            }
-        }
-        this.futures = futures;
-    }
-
-    /**
-     * Return a future which succeeds only if all the ACLs deletions succeed, and which contains all
-     * the deleted ACLs. Note that it if the filters don't match any ACLs, this is not considered an
-     * error.
-     */
-    public CompletableFuture<Collection<AclBinding>> all() {
-        return CompletableFuture.allOf(futures.values().toArray(new CompletableFuture[0]))
-                .thenApply(v -> getAclBindings(futures));
-    }
-
-    private List<AclBinding> getAclBindings(
-            Map<AclBindingFilter, CompletableFuture<FilterResults>> futures) {
-        List<AclBinding> acls = new ArrayList<>();
-        for (CompletableFuture<FilterResults> value : futures.values()) {
-            FilterResults results;
-            try {
-                results = value.get();
-            } catch (Throwable e) {
-                // This should be unreachable, since the future returned by DeleteAclsResult#all ->
-                // CompletableFuture#allOf should have failed if any Future failed.
-                throw new IllegalStateException("DeleteAclsResult#all: internal error", e);
-            }
-            for (FilterResult result : results.values()) {
-                if (result.exception() != null) {
-                    throw result.exception();
-                }
-                acls.add(result.binding());
-            }
-        }
-        return acls;
-    }
-
-    public void completeExceptionally(Throwable t) {
-        futures.values().forEach(future -> future.completeExceptionally(t));
-    }
-
-    public void complete(List<PbDropAclsFilterResult> results) {
-        Iterator<PbDropAclsFilterResult> iter = results.iterator();
-        futures.forEach(
-                (bindingFilter, future) -> {
-                    if (!iter.hasNext()) {
-                        future.completeExceptionally(
-                                new UnknownServerException(
-                                        "The broker reported no deletion result for the given filter."));
-                    } else {
-                        PbDropAclsFilterResult filterResult = iter.next();
-                        ApiError error = ApiError.fromErrorMessage(filterResult);
-                        if (error.isFailure()) {
-                            future.completeExceptionally(error.exception());
-                        } else {
-                            List<FilterResult> filterResults = new ArrayList<>();
-                            for (PbDropAclsMatchingAcl matchingAcl :
-                                    filterResult.getMatchingAclsList()) {
-                                ApiError aclError = ApiError.fromErrorMessage(matchingAcl);
-                                AclBinding aclBinding = toAclBinding(matchingAcl.getAcl());
-                                if (aclError.isFailure()) {
-                                    filterResults.add(
-                                            new FilterResult(aclBinding, aclError.exception()));
-                                } else {
-                                    filterResults.add(
-                                            new FilterResult(
-                                                    toAclBinding(matchingAcl.getAcl()), null));
-                                }
-                            }
-                            future.complete(new FilterResults(filterResults));
-                        }
-                    }
-                });
-    }
-
-    /**
-     * Return a map from acl filters to futures which can be used to check the status of the
-     * deletions by each filter.
-     */
-    public Map<AclBindingFilter, CompletableFuture<FilterResults>> values() {
-        return futures;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/admin/ListOffsetsResult.java b/fluss-client/src/main/java/com/alibaba/fluss/client/admin/ListOffsetsResult.java
deleted file mode 100644
index 5b41f3aee..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/admin/ListOffsetsResult.java
+++ /dev/null
@@ -1,53 +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 com.alibaba.fluss.client.admin;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-
-/**
- * Result of list offsets request.
- *
- * @since 0.2
- */
-@PublicEvolving
-public class ListOffsetsResult {
-    private final Map<Integer, CompletableFuture<Long>> futures;
-
-    public ListOffsetsResult(Map<Integer, CompletableFuture<Long>> futures) {
-        this.futures = futures;
-    }
-
-    public CompletableFuture<Long> bucketResult(int bucket) {
-        return futures.get(bucket);
-    }
-
-    public CompletableFuture<Map<Integer, Long>> all() {
-        return CompletableFuture.allOf(futures.values().toArray(new CompletableFuture[0]))
-                .thenApply(
-                        v ->
-                                futures.entrySet().stream()
-                                        .collect(
-                                                Collectors.toMap(
-                                                        Map.Entry::getKey,
-                                                        e -> e.getValue().join())));
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/admin/OffsetSpec.java b/fluss-client/src/main/java/com/alibaba/fluss/client/admin/OffsetSpec.java
deleted file mode 100644
index a5fa7f8a6..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/admin/OffsetSpec.java
+++ /dev/null
@@ -1,51 +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 com.alibaba.fluss.client.admin;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-
-/**
- * Offset spec. Used for list offsets request.
- *
- * @since 0.2
- */
-@PublicEvolving
-public abstract class OffsetSpec {
-    public static final int LIST_EARLIEST_OFFSET = 0;
-    public static final int LIST_LATEST_OFFSET = 1;
-    public static final int LIST_OFFSET_FROM_TIMESTAMP = 2;
-
-    /** Earliest offset spec. */
-    public static class EarliestSpec extends OffsetSpec {}
-
-    /** latest offset spec. */
-    public static class LatestSpec extends OffsetSpec {}
-
-    /** timestamp offset spec. */
-    public static class TimestampSpec extends OffsetSpec {
-        private final long timestamp;
-
-        public TimestampSpec(long timestamp) {
-            this.timestamp = timestamp;
-        }
-
-        public long getTimestamp() {
-            return timestamp;
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/AbstractLookupBatch.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/AbstractLookupBatch.java
deleted file mode 100644
index 7dda386d9..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/AbstractLookupBatch.java
+++ /dev/null
@@ -1,59 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.metadata.TableBucket;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** An abstract lookup batch. */
-@Internal
-public abstract class AbstractLookupBatch<T> {
-
-    protected final List<AbstractLookupQuery<T>> lookups;
-    private final TableBucket tableBucket;
-
-    public AbstractLookupBatch(TableBucket tableBucket) {
-        this.lookups = new ArrayList<>();
-        this.tableBucket = tableBucket;
-    }
-
-    /** Complete the lookup operations using given values . */
-    public abstract void complete(List<T> values);
-
-    public void addLookup(AbstractLookupQuery<T> lookup) {
-        lookups.add(lookup);
-    }
-
-    public List<AbstractLookupQuery<T>> lookups() {
-        return lookups;
-    }
-
-    public TableBucket tableBucket() {
-        return tableBucket;
-    }
-
-    /** Complete the get operations with given exception. */
-    public void completeExceptionally(Exception exception) {
-        for (AbstractLookupQuery<T> lookup : lookups) {
-            lookup.future().completeExceptionally(exception);
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/AbstractLookupQuery.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/AbstractLookupQuery.java
deleted file mode 100644
index eacb71ed9..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/AbstractLookupQuery.java
+++ /dev/null
@@ -1,48 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.metadata.TableBucket;
-
-import java.util.concurrent.CompletableFuture;
-
-/** Abstract Class to represent a lookup operation. */
-@Internal
-public abstract class AbstractLookupQuery<T> {
-
-    private final TableBucket tableBucket;
-    private final byte[] key;
-
-    public AbstractLookupQuery(TableBucket tableBucket, byte[] key) {
-        this.tableBucket = tableBucket;
-        this.key = key;
-    }
-
-    public byte[] key() {
-        return key;
-    }
-
-    public TableBucket tableBucket() {
-        return tableBucket;
-    }
-
-    public abstract LookupType lookupType();
-
-    public abstract CompletableFuture<T> future();
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/Lookup.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/Lookup.java
deleted file mode 100644
index 58b8904dc..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/Lookup.java
+++ /dev/null
@@ -1,99 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Used to configure and create a {@link Lookuper} to lookup rows of a primary key table. The built
- * Lookuper can be a primary key lookuper that lookups by the primary key, or a prefix key lookup
- * that lookups by the prefix key of the primary key.
- *
- * <p>{@link Lookup} objects are immutable and can be shared between threads. Refinement methods,
- * like {@link #lookupBy}, create new Lookup instances.
- *
- * <p>Example1: Create a Primary Key Lookuper. Given a table with primary key column [k STRING].
- *
- * <pre>{@code
- * Lookuper lookuper = table.newLookup().createLookuper();
- * CompletableFuture<LookupResult> resultFuture = lookuper.lookup(GenericRow.of("key1"));
- * resultFuture.get().getRows().forEach(row -> {
- *    System.out.println(row);
- * });
- * }</pre>
- *
- * <p>Example2: Create a Prefix Key Lookuper. Given a table with primary key column [a INT, b
- * STRING, c BIGINT] and bucket key [a, b].
- *
- * <pre>{@code
- * Lookuper lookuper = table.newLookup().lookupBy("a", "b").createLookuper();
- * CompletableFuture<LookupResult> resultFuture = lookuper.lookup(GenericRow.of(1, "b1"));
- * resultFuture.get().getRows().forEach(row -> {
- *   System.out.println(row);
- * });
- * }</pre>
- *
- * @since 0.6
- */
-@PublicEvolving
-public interface Lookup {
-
-    /**
-     * Returns a new Lookup instance with the given lookup columns. By default, the lookup columns
-     * are the primary key columns of the table. The specified columns must be a prefix subset of
-     * the physical primary key columns (i.e., the primary key columns exclude partition columns).
-     *
-     * <p>Note: Currently, if you want to lookup with specified lookup columns (i.e., prefix key
-     * lookup), the table you created must both define the primary key and the bucket key, in
-     * addition, the lookup columns needs to be equals with bucket key, and to be a part of the
-     * primary key and must be a prefix of the primary key. For example, if a table has fields
-     * [a,b,c,d], and the primary key is set to [a, b, c], with the bucket key set to [a, b], then
-     * the schema of the lookup columns would also be [a, b]. This pattern can create a Prefix Key
-     * Lookuper lookup rows by prefix of the primary key.
-     *
-     * <p>TODO: currently, the interface only support bucket key as the prefix key to lookup.
-     * Generalize the prefix key lookup to support any prefix keys.
-     *
-     * <p>We also support prefix key lookup for partitioned tables. The schema of the lookup columns
-     * should contain partition fields and bucket key. In addition, the schema of the lookup columns
-     * excluded partition fields should be a prefix of primary key excluded partition fields.
-     *
-     * @param lookupColumnNames the specified columns to lookup by
-     */
-    Lookup lookupBy(List<String> lookupColumnNames);
-
-    /**
-     * @see #lookupBy(List) for more details.
-     * @param lookupColumnNames the specified columns to lookup by
-     */
-    default Lookup lookupBy(String... lookupColumnNames) {
-        return lookupBy(Arrays.asList(lookupColumnNames));
-    }
-
-    /**
-     * Creates a {@link Lookuper} instance to lookup rows of a primary key table by the specified
-     * lookup columns. By default, the lookup columns are the primary key columns, but can be
-     * changed with ({@link #lookupBy(List)}) method.
-     *
-     * @return the lookuper
-     */
-    Lookuper createLookuper();
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupBatch.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupBatch.java
deleted file mode 100644
index d5c4d5821..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupBatch.java
+++ /dev/null
@@ -1,79 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.exception.FlussRuntimeException;
-import com.alibaba.fluss.metadata.TableBucket;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** A batch that contains the lookup operations that send to same tablet bucket together. */
-@Internal
-public class LookupBatch {
-
-    /** The table bucket that the lookup operations should fall into. */
-    private final TableBucket tableBucket;
-
-    private final List<LookupQuery> lookups;
-
-    public LookupBatch(TableBucket tableBucket) {
-        this.tableBucket = tableBucket;
-        this.lookups = new ArrayList<>();
-    }
-
-    public void addLookup(LookupQuery lookup) {
-        lookups.add(lookup);
-    }
-
-    public List<LookupQuery> lookups() {
-        return lookups;
-    }
-
-    public TableBucket tableBucket() {
-        return tableBucket;
-    }
-
-    /** Complete the lookup operations using given values . */
-    public void complete(List<byte[]> values) {
-        // if the size of return values of lookup operation are not equal to the number of lookups,
-        // should complete an exception.
-        if (values.size() != lookups.size()) {
-            completeExceptionally(
-                    new FlussRuntimeException(
-                            String.format(
-                                    "The number of return values of lookup operation is not equal to the number of "
-                                            + "lookups. Return %d values, but expected %d.",
-                                    values.size(), lookups.size())));
-        } else {
-            for (int i = 0; i < values.size(); i++) {
-                AbstractLookupQuery<byte[]> lookup = lookups.get(i);
-                // single value.
-                lookup.future().complete(values.get(i));
-            }
-        }
-    }
-
-    /** Complete the lookup operations with given exception. */
-    public void completeExceptionally(Exception exception) {
-        for (LookupQuery lookup : lookups) {
-            lookup.future().completeExceptionally(exception);
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupClient.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupClient.java
deleted file mode 100644
index 157b906a0..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupClient.java
+++ /dev/null
@@ -1,122 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.client.metadata.MetadataUpdater;
-import com.alibaba.fluss.config.ConfigOptions;
-import com.alibaba.fluss.config.Configuration;
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.utils.concurrent.ExecutorThreadFactory;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.concurrent.ThreadSafe;
-
-import java.time.Duration;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A client that lookups value of keys from server.
- *
- * <p>The lookup client contains of a queue of pending lookup operations and background I/O threads
- * that is responsible for turning these lookup operations into network requests and transmitting
- * them to the cluster.
- *
- * <p>The {@link #lookup(TableBucket, byte[])} method is asynchronous, when called, it adds the
- * lookup operation to a queue of pending lookup operations and immediately returns. This allows the
- * lookup operations to batch together individual lookup operations for efficiency.
- */
-@ThreadSafe
-@Internal
-public class LookupClient {
-
-    private static final Logger LOG = LoggerFactory.getLogger(LookupClient.class);
-
-    public static final String LOOKUP_THREAD_PREFIX = "fluss-lookup-sender";
-
-    private final LookupQueue lookupQueue;
-
-    private final ExecutorService lookupSenderThreadPool;
-    private final LookupSender lookupSender;
-
-    public LookupClient(Configuration conf, MetadataUpdater metadataUpdater) {
-        this.lookupQueue = new LookupQueue(conf);
-        this.lookupSenderThreadPool = createThreadPool();
-        this.lookupSender =
-                new LookupSender(
-                        metadataUpdater,
-                        lookupQueue,
-                        conf.getInt(ConfigOptions.CLIENT_LOOKUP_MAX_INFLIGHT_SIZE));
-        lookupSenderThreadPool.submit(lookupSender);
-    }
-
-    private ExecutorService createThreadPool() {
-        // according to benchmark, increase the thread pool size improve not so much
-        // performance, so we always use 1 thread for simplicity.
-        return Executors.newFixedThreadPool(1, new ExecutorThreadFactory(LOOKUP_THREAD_PREFIX));
-    }
-
-    public CompletableFuture<byte[]> lookup(TableBucket tableBucket, byte[] keyBytes) {
-        LookupQuery lookup = new LookupQuery(tableBucket, keyBytes);
-        lookupQueue.appendLookup(lookup);
-        return lookup.future();
-    }
-
-    public CompletableFuture<List<byte[]>> prefixLookup(TableBucket tableBucket, byte[] keyBytes) {
-        PrefixLookupQuery prefixLookup = new PrefixLookupQuery(tableBucket, keyBytes);
-        lookupQueue.appendLookup(prefixLookup);
-        return prefixLookup.future();
-    }
-
-    public void close(Duration timeout) {
-        LOG.info("Closing lookup client and lookup sender.");
-
-        if (lookupSender != null) {
-            lookupSender.initiateClose();
-        }
-
-        if (lookupSenderThreadPool != null) {
-            lookupSenderThreadPool.shutdown();
-            try {
-                if (lookupSenderThreadPool.awaitTermination(
-                        timeout.toMillis(), TimeUnit.MILLISECONDS)) {
-                    lookupSenderThreadPool.shutdownNow();
-
-                    if (!lookupSenderThreadPool.awaitTermination(
-                            timeout.toMillis(), TimeUnit.MILLISECONDS)) {
-                        LOG.error("Failed to shutdown lookup client.");
-                    }
-                }
-            } catch (InterruptedException e) {
-                lookupSenderThreadPool.shutdownNow();
-                Thread.currentThread().interrupt();
-            }
-        }
-
-        if (lookupSender != null) {
-            lookupSender.forceClose();
-        }
-        LOG.info("Lookup client closed.");
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupQuery.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupQuery.java
deleted file mode 100644
index b4e906aca..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupQuery.java
+++ /dev/null
@@ -1,48 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.metadata.TableBucket;
-
-import java.util.concurrent.CompletableFuture;
-
-/**
- * Class to represent a Lookup operation, it contains the table bucket that the key should lookup
- * from, the bytes of the key, and a future for the lookup operation.
- */
-@Internal
-public class LookupQuery extends AbstractLookupQuery<byte[]> {
-
-    private final CompletableFuture<byte[]> future;
-
-    LookupQuery(TableBucket tableBucket, byte[] key) {
-        super(tableBucket, key);
-        this.future = new CompletableFuture<>();
-    }
-
-    @Override
-    public LookupType lookupType() {
-        return LookupType.LOOKUP;
-    }
-
-    @Override
-    public CompletableFuture<byte[]> future() {
-        return future;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupQueue.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupQueue.java
deleted file mode 100644
index 522ae37e4..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupQueue.java
+++ /dev/null
@@ -1,106 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.config.ConfigOptions;
-import com.alibaba.fluss.config.Configuration;
-
-import javax.annotation.concurrent.ThreadSafe;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A queue that buffers the pending lookup operations and provides a list of {@link LookupQuery}
- * when call method {@link #drain()}.
- */
-@ThreadSafe
-@Internal
-class LookupQueue {
-
-    private volatile boolean closed;
-    // buffering both the Lookup and PrefixLookup.
-    private final ArrayBlockingQueue<AbstractLookupQuery<?>> lookupQueue;
-    private final int maxBatchSize;
-    private final long batchTimeoutNanos;
-
-    LookupQueue(Configuration conf) {
-        this.lookupQueue =
-                new ArrayBlockingQueue<>(conf.get(ConfigOptions.CLIENT_LOOKUP_QUEUE_SIZE));
-        this.maxBatchSize = conf.get(ConfigOptions.CLIENT_LOOKUP_MAX_BATCH_SIZE);
-        this.batchTimeoutNanos = conf.get(ConfigOptions.CLIENT_LOOKUP_BATCH_TIMEOUT).toNanos();
-        this.closed = false;
-    }
-
-    void appendLookup(AbstractLookupQuery<?> lookup) {
-        if (closed) {
-            throw new IllegalStateException(
-                    "Can not append lookup operation since the LookupQueue is closed.");
-        }
-
-        try {
-            lookupQueue.put(lookup);
-        } catch (InterruptedException e) {
-            lookup.future().completeExceptionally(e);
-        }
-    }
-
-    boolean hasUnDrained() {
-        return !lookupQueue.isEmpty();
-    }
-
-    /** Drain a batch of {@link LookupQuery}s from the lookup queue. */
-    List<AbstractLookupQuery<?>> drain() throws Exception {
-        final long startNanos = System.nanoTime();
-        List<AbstractLookupQuery<?>> lookupOperations = new ArrayList<>(maxBatchSize);
-        int count = 0;
-        while (true) {
-            long waitNanos = batchTimeoutNanos - (System.nanoTime() - startNanos);
-            if (waitNanos <= 0) {
-                break;
-            }
-
-            AbstractLookupQuery<?> lookup = lookupQueue.poll(waitNanos, TimeUnit.NANOSECONDS);
-            if (lookup == null) {
-                break;
-            }
-            lookupOperations.add(lookup);
-            count++;
-            int transferred = lookupQueue.drainTo(lookupOperations, maxBatchSize - count);
-            count += transferred;
-            if (count >= maxBatchSize) {
-                break;
-            }
-        }
-        return lookupOperations;
-    }
-
-    /** Drain all the {@link LookupQuery}s from the lookup queue. */
-    List<AbstractLookupQuery<?>> drainAll() {
-        List<AbstractLookupQuery<?>> lookupOperations = new ArrayList<>(lookupQueue.size());
-        lookupQueue.drainTo(lookupOperations);
-        return lookupOperations;
-    }
-
-    public void close() {
-        closed = true;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupResult.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupResult.java
deleted file mode 100644
index 82b197401..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupResult.java
+++ /dev/null
@@ -1,83 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.row.InternalRow;
-
-import javax.annotation.Nullable;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * The result of {@link Lookuper#lookup(InternalRow)}.
- *
- * @since 0.1
- */
-@PublicEvolving
-public final class LookupResult {
-    private final List<InternalRow> rowList;
-
-    public LookupResult(@Nullable InternalRow row) {
-        this(row == null ? Collections.emptyList() : Collections.singletonList(row));
-    }
-
-    public LookupResult(List<InternalRow> rowList) {
-        this.rowList = rowList;
-    }
-
-    public List<InternalRow> getRowList() {
-        return rowList;
-    }
-
-    public @Nullable InternalRow getSingletonRow() {
-        if (rowList.isEmpty()) {
-            return null;
-        } else if (rowList.size() == 1) {
-            return rowList.get(0);
-        } else {
-            throw new IllegalStateException(
-                    "Expecting exactly one row, but got: " + rowList.size());
-        }
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        LookupResult lookupResult = (LookupResult) o;
-        return Objects.equals(rowList, lookupResult.rowList);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(rowList);
-    }
-
-    @Override
-    public String toString() {
-        return rowList.toString();
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupType.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupType.java
deleted file mode 100644
index b9e5ad395..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/LookupType.java
+++ /dev/null
@@ -1,27 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.Internal;
-
-/** Enum to represent the type of lookup operation. */
-@Internal
-public enum LookupType {
-    LOOKUP,
-    PREFIX_LOOKUP;
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/Lookuper.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/Lookuper.java
deleted file mode 100644
index b24a1fa25..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/Lookuper.java
+++ /dev/null
@@ -1,44 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.row.InternalRow;
-
-import java.util.concurrent.CompletableFuture;
-
-/**
- * The lookup-er is used to lookup row of a primary key table by primary key or prefix key.
- *
- * @since 0.6
- */
-@PublicEvolving
-public interface Lookuper {
-
-    /**
-     * Lookups certain row from the given lookup key.
-     *
-     * <p>The lookup key must be a primary key if the lookuper is a Primary Key Lookuper (created by
-     * {@code table.newLookup().createLookuper()}), or be the prefix key if the lookuper is a Prefix
-     * Key Lookuper (created by {@code table.newLookup().lookupBy(prefixKeys).createLookuper()}).
-     *
-     * @param lookupKey the lookup key.
-     * @return the result of lookup.
-     */
-    CompletableFuture<LookupResult> lookup(InternalRow lookupKey);
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/PrefixLookup.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/PrefixLookup.java
deleted file mode 100644
index 2f0530e89..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/PrefixLookup.java
+++ /dev/null
@@ -1,51 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.row.InternalRow;
-
-import java.util.List;
-
-/**
- * Used to describe the operation to prefix lookup by {@link PrefixLookuper} to a primary key table.
- *
- * @since 0.6
- */
-@PublicEvolving
-public class PrefixLookup {
-
-    /**
-     * Currently, For non-partitioned table, the lookupColumnNames can only be the field of bucket
-     * key.
-     *
-     * <p>For partitioned table, the lookupColumnNames exclude partition fields should be a prefix
-     * of primary key exclude partition fields.
-     *
-     * <p>See {@link PrefixLookuper#prefixLookup(InternalRow)} for more details.
-     */
-    private final List<String> lookupColumnNames;
-
-    public PrefixLookup(List<String> lookupColumnNames) {
-        this.lookupColumnNames = lookupColumnNames;
-    }
-
-    public List<String> getLookupColumnNames() {
-        return lookupColumnNames;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/PrefixLookupBatch.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/PrefixLookupBatch.java
deleted file mode 100644
index 823e911ae..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/PrefixLookupBatch.java
+++ /dev/null
@@ -1,78 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.exception.FlussRuntimeException;
-import com.alibaba.fluss.metadata.TableBucket;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A batch that contains the prefix lookup operations that send to same destination and some table
- * together.
- */
-@Internal
-public class PrefixLookupBatch {
-
-    /** The table bucket that the lookup operations should fall into. */
-    private final TableBucket tableBucket;
-
-    private final List<PrefixLookupQuery> prefixLookups;
-
-    public PrefixLookupBatch(TableBucket tableBucket) {
-        this.tableBucket = tableBucket;
-        this.prefixLookups = new ArrayList<>();
-    }
-
-    public void addLookup(PrefixLookupQuery lookup) {
-        prefixLookups.add(lookup);
-    }
-
-    public List<PrefixLookupQuery> lookups() {
-        return prefixLookups;
-    }
-
-    public TableBucket tableBucket() {
-        return tableBucket;
-    }
-
-    public void complete(List<List<byte[]>> values) {
-        if (values.size() != prefixLookups.size()) {
-            completeExceptionally(
-                    new FlussRuntimeException(
-                            String.format(
-                                    "The number of values return by prefix lookup request is not equal to the number of "
-                                            + "prefix lookups send. Got %d values, but expected %d.",
-                                    values.size(), prefixLookups.size())));
-        } else {
-            for (int i = 0; i < values.size(); i++) {
-                AbstractLookupQuery<List<byte[]>> lookup = prefixLookups.get(i);
-                lookup.future().complete(values.get(i));
-            }
-        }
-    }
-
-    /** Complete the get operations with given exception. */
-    public void completeExceptionally(Exception exception) {
-        for (PrefixLookupQuery prefixLookup : prefixLookups) {
-            prefixLookup.future().completeExceptionally(exception);
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/PrefixLookupQuery.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/PrefixLookupQuery.java
deleted file mode 100644
index 4d88743e4..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/PrefixLookupQuery.java
+++ /dev/null
@@ -1,48 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.metadata.TableBucket;
-
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-/**
- * Class to represent a prefix lookup operation, it contains the table id, bucketNums and related
- * CompletableFuture.
- */
-@Internal
-public class PrefixLookupQuery extends AbstractLookupQuery<List<byte[]>> {
-    private final CompletableFuture<List<byte[]>> future;
-
-    PrefixLookupQuery(TableBucket tableBucket, byte[] prefixKey) {
-        super(tableBucket, prefixKey);
-        this.future = new CompletableFuture<>();
-    }
-
-    @Override
-    public CompletableFuture<List<byte[]>> future() {
-        return future;
-    }
-
-    @Override
-    public LookupType lookupType() {
-        return LookupType.PREFIX_LOOKUP;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/TableLookup.java b/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/TableLookup.java
deleted file mode 100644
index 9e7e8a669..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/lookup/TableLookup.java
+++ /dev/null
@@ -1,66 +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 com.alibaba.fluss.client.lookup;
-
-import com.alibaba.fluss.client.metadata.MetadataUpdater;
-import com.alibaba.fluss.metadata.TableInfo;
-
-import javax.annotation.Nullable;
-
-import java.util.List;
-
-/** API for configuring and creating {@link Lookuper}. */
-public class TableLookup implements Lookup {
-
-    private final TableInfo tableInfo;
-    private final MetadataUpdater metadataUpdater;
-    private final LookupClient lookupClient;
-
-    @Nullable private final List<String> lookupColumnNames;
-
-    public TableLookup(
-            TableInfo tableInfo, MetadataUpdater metadataUpdater, LookupClient lookupClient) {
-        this(tableInfo, metadataUpdater, lookupClient, null);
-    }
-
-    private TableLookup(
-            TableInfo tableInfo,
-            MetadataUpdater metadataUpdater,
-            LookupClient lookupClient,
-            @Nullable List<String> lookupColumnNames) {
-        this.tableInfo = tableInfo;
-        this.metadataUpdater = metadataUpdater;
-        this.lookupClient = lookupClient;
-        this.lookupColumnNames = lookupColumnNames;
-    }
-
-    @Override
-    public Lookup lookupBy(List<String> lookupColumnNames) {
-        return new TableLookup(tableInfo, metadataUpdater, lookupClient, lookupColumnNames);
-    }
-
-    @Override
-    public Lookuper createLookuper() {
-        if (lookupColumnNames == null) {
-            return new PrimaryKeyLookuper(tableInfo, metadataUpdater, lookupClient);
-        } else {
-            return new PrefixKeyLookuper(
-                    tableInfo, metadataUpdater, lookupClient, lookupColumnNames);
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/metadata/KvSnapshotMetadata.java b/fluss-client/src/main/java/com/alibaba/fluss/client/metadata/KvSnapshotMetadata.java
deleted file mode 100644
index c50a65378..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/metadata/KvSnapshotMetadata.java
+++ /dev/null
@@ -1,66 +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 com.alibaba.fluss.client.metadata;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.fs.FsPathAndFileName;
-
-import java.util.List;
-
-/**
- * A class to represent the snapshot info of a kv tablet (bucket). It contains:
- *
- * <ul>
- *   <li>The snapshot files of the bucket.
- *   <li>The log offset corresponding to the snapshot.
- * </ul>
- *
- * <p>To read the full data of a bucket, it requires to read the snapshot and the log from the
- * corresponding log offset.
- *
- * @since 0.6
- */
-@PublicEvolving
-public class KvSnapshotMetadata {
-
-    private final List<FsPathAndFileName> snapshotFiles;
-    private final long logOffset;
-
-    public KvSnapshotMetadata(List<FsPathAndFileName> snapshotFiles, long logOffset) {
-        this.snapshotFiles = snapshotFiles;
-        this.logOffset = logOffset;
-    }
-
-    public List<FsPathAndFileName> getSnapshotFiles() {
-        return snapshotFiles;
-    }
-
-    public long getLogOffset() {
-        return logOffset;
-    }
-
-    @Override
-    public String toString() {
-        return "BucketSnapshotInfo{"
-                + "snapshotFiles="
-                + snapshotFiles
-                + ", logOffset="
-                + logOffset
-                + '}';
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/metadata/KvSnapshots.java b/fluss-client/src/main/java/com/alibaba/fluss/client/metadata/KvSnapshots.java
deleted file mode 100644
index 07a77da22..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/metadata/KvSnapshots.java
+++ /dev/null
@@ -1,90 +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 com.alibaba.fluss.client.metadata;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-
-import javax.annotation.Nullable;
-
-import java.util.Map;
-import java.util.OptionalLong;
-import java.util.Set;
-
-/**
- * A class representing the kv snapshots of a table or a partition. It contains multiple snapshots
- * for each kv tablet (bucket).
- *
- * @since 0.6
- */
-@PublicEvolving
-public class KvSnapshots {
-
-    private final long tableId;
-
-    @Nullable private final Long partitionId;
-
-    // map from bucket id to the latest snapshot id,
-    // null or empty if there is no snapshot for this bucket
-    private final Map<Integer, Long> snapshotIds;
-
-    // map from bucket id to the log offset to read after the snapshot,
-    // null or empty if there is no snapshot for this bucket,
-    // then read from EARLIEST offset
-    private final Map<Integer, Long> logOffsets;
-
-    public KvSnapshots(
-            long tableId,
-            @Nullable Long partitionId,
-            Map<Integer, Long> snapshotIds,
-            Map<Integer, Long> logOffsets) {
-        this.tableId = tableId;
-        this.partitionId = partitionId;
-        this.snapshotIds = snapshotIds;
-        this.logOffsets = logOffsets;
-    }
-
-    public long getTableId() {
-        return tableId;
-    }
-
-    @Nullable
-    public Long getPartitionId() {
-        return partitionId;
-    }
-
-    public Set<Integer> getBucketIds() {
-        return snapshotIds.keySet();
-    }
-
-    /**
-     * Get the latest snapshot id for this kv tablet (bucket), or empty if there are no snapshots.
-     */
-    public OptionalLong getSnapshotId(int bucketId) {
-        Long snapshotId = snapshotIds.get(bucketId);
-        return snapshotId == null ? OptionalLong.empty() : OptionalLong.of(snapshotId);
-    }
-
-    /**
-     * Get the log offset to read after the snapshot for this kv tablet (bucket), or empty if there
-     * are no snapshots.
-     */
-    public OptionalLong getLogOffset(int bucketId) {
-        Long logOffset = logOffsets.get(bucketId);
-        return logOffset == null ? OptionalLong.empty() : OptionalLong.of(logOffset);
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/metadata/LakeSnapshot.java b/fluss-client/src/main/java/com/alibaba/fluss/client/metadata/LakeSnapshot.java
deleted file mode 100644
index 36228cb4c..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/metadata/LakeSnapshot.java
+++ /dev/null
@@ -1,76 +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 com.alibaba.fluss.client.metadata;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.metadata.TableBucket;
-
-import java.util.Collections;
-import java.util.Map;
-
-/**
- * A class representing the lake snapshot information of a table. It contains:
- * <li>The snapshot id and the log offset for each bucket.
- *
- * @since 0.3
- */
-@PublicEvolving
-public class LakeSnapshot {
-
-    private final long snapshotId;
-
-    // the specific log offset of the snapshot
-    private final Map<TableBucket, Long> tableBucketsOffset;
-
-    // the partition name by partition id of this lake snapshot if
-    // is a partitioned table, empty if not a partitioned table
-    private final Map<Long, String> partitionNameById;
-
-    public LakeSnapshot(
-            long snapshotId,
-            Map<TableBucket, Long> tableBucketsOffset,
-            Map<Long, String> partitionNameById) {
-        this.snapshotId = snapshotId;
-        this.tableBucketsOffset = tableBucketsOffset;
-        this.partitionNameById = partitionNameById;
-    }
-
-    public long getSnapshotId() {
-        return snapshotId;
-    }
-
-    public Map<TableBucket, Long> getTableBucketsOffset() {
-        return Collections.unmodifiableMap(tableBucketsOffset);
-    }
-
-    public Map<Long, String> getPartitionNameById() {
-        return Collections.unmodifiableMap(partitionNameById);
-    }
-
-    @Override
-    public String toString() {
-        return "LakeSnapshot{"
-                + "snapshotId="
-                + snapshotId
-                + ", tableBucketsOffset="
-                + tableBucketsOffset
-                + ", partitionNameById="
-                + partitionNameById
-                + '}';
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/metrics/ScannerMetricGroup.java b/fluss-client/src/main/java/com/alibaba/fluss/client/metrics/ScannerMetricGroup.java
deleted file mode 100644
index b9d0f848b..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/metrics/ScannerMetricGroup.java
+++ /dev/null
@@ -1,135 +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 com.alibaba.fluss.client.metrics;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.client.table.scanner.batch.BatchScanner;
-import com.alibaba.fluss.client.table.scanner.log.LogScanner;
-import com.alibaba.fluss.metadata.TablePath;
-import com.alibaba.fluss.metrics.CharacterFilter;
-import com.alibaba.fluss.metrics.Counter;
-import com.alibaba.fluss.metrics.DescriptiveStatisticsHistogram;
-import com.alibaba.fluss.metrics.Histogram;
-import com.alibaba.fluss.metrics.MeterView;
-import com.alibaba.fluss.metrics.MetricNames;
-import com.alibaba.fluss.metrics.ThreadSafeSimpleCounter;
-import com.alibaba.fluss.metrics.groups.AbstractMetricGroup;
-import com.alibaba.fluss.rpc.metrics.ClientMetricGroup;
-
-import java.util.Map;
-
-import static com.alibaba.fluss.metrics.utils.MetricGroupUtils.makeScope;
-
-/** The metric group for scanner, including {@link LogScanner} and {@link BatchScanner}. */
-@Internal
-public class ScannerMetricGroup extends AbstractMetricGroup {
-
-    private static final String NAME = "scanner";
-    private static final int WINDOW_SIZE = 1024;
-
-    private final TablePath tablePath;
-
-    private final Counter fetchRequestCount;
-    private final Histogram bytesPerRequest;
-
-    // remote log
-    private final Counter remoteFetchBytes;
-    private final Counter remoteFetchRequestCount;
-    private final Counter remoteFetchErrorCount;
-
-    private volatile long fetchLatencyInMs;
-    private volatile long timeMsBetweenPoll;
-    private volatile double pollIdleRatio;
-    private volatile long lastPollMs;
-    private volatile long pollStartMs;
-
-    public ScannerMetricGroup(ClientMetricGroup parent, TablePath tablePath) {
-        super(parent.getMetricRegistry(), makeScope(parent, NAME), parent);
-        this.tablePath = tablePath;
-
-        fetchRequestCount = new ThreadSafeSimpleCounter();
-        meter(MetricNames.SCANNER_FETCH_RATE, new MeterView(fetchRequestCount));
-
-        remoteFetchBytes = new ThreadSafeSimpleCounter();
-        meter(MetricNames.SCANNER_REMOTE_FETCH_BYTES_RATE, new MeterView(remoteFetchBytes));
-        remoteFetchRequestCount = new ThreadSafeSimpleCounter();
-        meter(MetricNames.SCANNER_REMOTE_FETCH_RATE, new MeterView(remoteFetchRequestCount));
-        remoteFetchErrorCount = new ThreadSafeSimpleCounter();
-        meter(MetricNames.SCANNER_REMOTE_FETCH_ERROR_RATE, new MeterView(remoteFetchErrorCount));
-
-        bytesPerRequest =
-                histogram(
-                        MetricNames.SCANNER_BYTES_PER_REQUEST,
-                        new DescriptiveStatisticsHistogram(WINDOW_SIZE));
-
-        gauge(MetricNames.SCANNER_TIME_MS_BETWEEN_POLL, () -> timeMsBetweenPoll);
-        gauge(MetricNames.SCANNER_LAST_POLL_SECONDS_AGO, this::lastPollSecondsAgo);
-        gauge(MetricNames.SCANNER_FETCH_LATENCY_MS, () -> fetchLatencyInMs);
-        gauge(MetricNames.SCANNER_POLL_IDLE_RATIO, () -> pollIdleRatio);
-    }
-
-    public Counter fetchRequestCount() {
-        return fetchRequestCount;
-    }
-
-    public Histogram bytesPerRequest() {
-        return bytesPerRequest;
-    }
-
-    public Counter remoteFetchBytes() {
-        return remoteFetchBytes;
-    }
-
-    public Counter remoteFetchRequestCount() {
-        return remoteFetchRequestCount;
-    }
-
-    public Counter remoteFetchErrorCount() {
-        return remoteFetchErrorCount;
-    }
-
-    public void recordPollStart(long pollStartMs) {
-        this.pollStartMs = pollStartMs;
-        this.timeMsBetweenPoll = lastPollMs != 0L ? pollStartMs - lastPollMs : 0L;
-        this.lastPollMs = pollStartMs;
-    }
-
-    public void recordPollEnd(long pollEndMs) {
-        long pollTimeMs = pollEndMs - pollStartMs;
-        this.pollIdleRatio = pollTimeMs * 1.0 / (pollTimeMs + timeMsBetweenPoll);
-    }
-
-    public void updateFetchLatency(long latencyInMs) {
-        fetchLatencyInMs = latencyInMs;
-    }
-
-    private long lastPollSecondsAgo() {
-        return (System.currentTimeMillis() - lastPollMs) / 1000;
-    }
-
-    @Override
-    protected String getGroupName(CharacterFilter filter) {
-        return NAME;
-    }
-
-    @Override
-    protected final void putVariables(Map<String, String> variables) {
-        variables.put("database", tablePath.getDatabaseName());
-        variables.put("table", tablePath.getTableName());
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/metrics/WriterMetricGroup.java b/fluss-client/src/main/java/com/alibaba/fluss/client/metrics/WriterMetricGroup.java
deleted file mode 100644
index b5649efe0..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/metrics/WriterMetricGroup.java
+++ /dev/null
@@ -1,104 +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 com.alibaba.fluss.client.metrics;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.client.write.WriterClient;
-import com.alibaba.fluss.metrics.CharacterFilter;
-import com.alibaba.fluss.metrics.Counter;
-import com.alibaba.fluss.metrics.DescriptiveStatisticsHistogram;
-import com.alibaba.fluss.metrics.Histogram;
-import com.alibaba.fluss.metrics.MeterView;
-import com.alibaba.fluss.metrics.MetricNames;
-import com.alibaba.fluss.metrics.ThreadSafeSimpleCounter;
-import com.alibaba.fluss.metrics.groups.AbstractMetricGroup;
-import com.alibaba.fluss.rpc.metrics.ClientMetricGroup;
-
-import static com.alibaba.fluss.metrics.utils.MetricGroupUtils.makeScope;
-
-/** Metrics for {@link WriterClient}. */
-@Internal
-public class WriterMetricGroup extends AbstractMetricGroup {
-    private static final String name = "writer";
-    private static final int WINDOW_SIZE = 1024;
-
-    private final Counter recordsRetryTotal;
-    private final Counter recordsSendTotal;
-    private final Counter bytesSendTotal;
-    private final Histogram bytesPerBatch;
-    private final Histogram recordPerBatch;
-
-    private volatile long sendLatencyInMs = -1;
-    private volatile long batchQueueTimeMs = -1;
-
-    public WriterMetricGroup(ClientMetricGroup parent) {
-        super(parent.getMetricRegistry(), makeScope(parent, name), parent);
-
-        gauge(MetricNames.WRITER_BATCH_QUEUE_TIME_MS, () -> batchQueueTimeMs);
-
-        recordsRetryTotal = new ThreadSafeSimpleCounter();
-        meter(MetricNames.WRITER_RECORDS_RETRY_RATE, new MeterView(recordsRetryTotal));
-        recordsSendTotal = new ThreadSafeSimpleCounter();
-        meter(MetricNames.WRITER_RECORDS_SEND_RATE, new MeterView(recordsSendTotal));
-        bytesSendTotal = new ThreadSafeSimpleCounter();
-        meter(MetricNames.WRITER_BYTES_SEND_RATE, new MeterView(bytesSendTotal));
-        gauge(MetricNames.WRITER_SEND_LATENCY_MS, () -> sendLatencyInMs);
-
-        bytesPerBatch =
-                histogram(
-                        MetricNames.WRITER_BYTES_PER_BATCH,
-                        new DescriptiveStatisticsHistogram(WINDOW_SIZE));
-        recordPerBatch =
-                histogram(
-                        MetricNames.WRITER_RECORDS_PER_BATCH,
-                        new DescriptiveStatisticsHistogram(WINDOW_SIZE));
-    }
-
-    public void setBatchQueueTimeMs(long batchQueueTimeMs) {
-        this.batchQueueTimeMs = batchQueueTimeMs;
-    }
-
-    public void setSendLatencyInMs(long sendLatencyInMs) {
-        this.sendLatencyInMs = sendLatencyInMs;
-    }
-
-    public Counter recordsRetryTotal() {
-        return recordsRetryTotal;
-    }
-
-    public Counter recordsSendTotal() {
-        return recordsSendTotal;
-    }
-
-    public Histogram bytesPerBatch() {
-        return bytesPerBatch;
-    }
-
-    public Counter bytesSendTotal() {
-        return bytesSendTotal;
-    }
-
-    public Histogram recordPerBatch() {
-        return recordPerBatch;
-    }
-
-    @Override
-    protected String getGroupName(CharacterFilter filter) {
-        return name;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/FlussTable.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/FlussTable.java
deleted file mode 100644
index aa894d55c..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/FlussTable.java
+++ /dev/null
@@ -1,93 +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 com.alibaba.fluss.client.table;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.client.FlussConnection;
-import com.alibaba.fluss.client.lookup.Lookup;
-import com.alibaba.fluss.client.lookup.TableLookup;
-import com.alibaba.fluss.client.table.scanner.Scan;
-import com.alibaba.fluss.client.table.scanner.TableScan;
-import com.alibaba.fluss.client.table.writer.Append;
-import com.alibaba.fluss.client.table.writer.TableAppend;
-import com.alibaba.fluss.client.table.writer.TableUpsert;
-import com.alibaba.fluss.client.table.writer.Upsert;
-import com.alibaba.fluss.metadata.TableInfo;
-import com.alibaba.fluss.metadata.TablePath;
-
-import static com.alibaba.fluss.utils.Preconditions.checkState;
-
-/**
- * The base impl of {@link Table}.
- *
- * @since 0.1
- */
-@PublicEvolving
-public class FlussTable implements Table {
-
-    private final FlussConnection conn;
-    private final TablePath tablePath;
-    private final TableInfo tableInfo;
-    private final boolean hasPrimaryKey;
-
-    public FlussTable(FlussConnection conn, TablePath tablePath, TableInfo tableInfo) {
-        this.conn = conn;
-        this.tablePath = tablePath;
-        this.tableInfo = tableInfo;
-        this.hasPrimaryKey = tableInfo.hasPrimaryKey();
-    }
-
-    @Override
-    public TableInfo getTableInfo() {
-        return tableInfo;
-    }
-
-    @Override
-    public Scan newScan() {
-        return new TableScan(conn, tableInfo);
-    }
-
-    @Override
-    public Lookup newLookup() {
-        return new TableLookup(
-                tableInfo, conn.getMetadataUpdater(), conn.getOrCreateLookupClient());
-    }
-
-    @Override
-    public Append newAppend() {
-        checkState(
-                !hasPrimaryKey,
-                "Table %s is not a Log Table and doesn't support AppendWriter.",
-                tablePath);
-        return new TableAppend(tablePath, tableInfo, conn.getOrCreateWriterClient());
-    }
-
-    @Override
-    public Upsert newUpsert() {
-        checkState(
-                hasPrimaryKey,
-                "Table %s is not a Primary Key Table and doesn't support UpsertWriter.",
-                tablePath);
-        return new TableUpsert(tablePath, tableInfo, conn.getOrCreateWriterClient());
-    }
-
-    @Override
-    public void close() throws Exception {
-        // do nothing
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/Table.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/Table.java
deleted file mode 100644
index 573a6580d..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/Table.java
+++ /dev/null
@@ -1,75 +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 com.alibaba.fluss.client.table;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.client.Connection;
-import com.alibaba.fluss.client.lookup.Lookup;
-import com.alibaba.fluss.client.lookup.Lookuper;
-import com.alibaba.fluss.client.table.scanner.Scan;
-import com.alibaba.fluss.client.table.writer.Append;
-import com.alibaba.fluss.client.table.writer.AppendWriter;
-import com.alibaba.fluss.client.table.writer.Upsert;
-import com.alibaba.fluss.client.table.writer.UpsertWriter;
-import com.alibaba.fluss.metadata.TableInfo;
-
-/**
- * Used to communicate with a single Fluss table. Obtain an instance from a {@link Connection}.
- *
- * <p>Table can be used to get, put, delete or scan data from a fluss table.
- *
- * @since 0.1
- */
-@PublicEvolving
-public interface Table extends AutoCloseable {
-
-    /**
-     * Get the {@link TableInfo} for this table.
-     *
-     * <p>Note: the table info of this {@link Table} is set during the creation of this {@link
-     * Table} and will not be updated after that, even if the table info of the table has been
-     * changed. Therefore, if there are any changes to the table info, it may be necessary to
-     * reconstruct the {@link Table}.
-     */
-    TableInfo getTableInfo();
-
-    /**
-     * Creates a new {@link Scan} for this table to configure and create a scanner to scan data for
-     * this table. The scanner can be a log scanner to continuously read streaming log data or a
-     * batch scanner to read batch data.
-     */
-    Scan newScan();
-
-    /**
-     * Creates a new {@link Lookup} for this table to configure and create a {@link Lookuper} to
-     * lookup data for this table by primary key or a prefix of primary key.
-     */
-    Lookup newLookup();
-
-    /**
-     * Creates a new {@link Append} to build a {@link AppendWriter} to append data to this table
-     * (requires to be a Log Table).
-     */
-    Append newAppend();
-
-    /**
-     * Creates a new {@link Upsert} to build a {@link UpsertWriter} to upsert and delete data to
-     * this table (requires to be a Primary Key Table).
-     */
-    Upsert newUpsert();
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/getter/PartitionGetter.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/getter/PartitionGetter.java
deleted file mode 100644
index d205d0855..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/getter/PartitionGetter.java
+++ /dev/null
@@ -1,68 +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 com.alibaba.fluss.client.table.getter;
-
-import com.alibaba.fluss.metadata.ResolvedPartitionSpec;
-import com.alibaba.fluss.row.InternalRow;
-import com.alibaba.fluss.types.DataType;
-import com.alibaba.fluss.types.RowType;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static com.alibaba.fluss.utils.Preconditions.checkArgument;
-import static com.alibaba.fluss.utils.Preconditions.checkNotNull;
-
-/** A getter to get partition name from a row. */
-public class PartitionGetter {
-
-    private final List<String> partitionKeys;
-    private final List<InternalRow.FieldGetter> partitionFieldGetters;
-
-    public PartitionGetter(RowType rowType, List<String> partitionKeys) {
-        // check the partition column
-        List<String> fieldNames = rowType.getFieldNames();
-        this.partitionKeys = partitionKeys;
-        partitionFieldGetters = new ArrayList<>();
-        for (String partitionKey : partitionKeys) {
-            int partitionColumnIndex = fieldNames.indexOf(partitionKey);
-            checkArgument(
-                    partitionColumnIndex >= 0,
-                    "The partition column %s is not in the row %s.",
-                    partitionKey,
-                    rowType);
-
-            // check the data type of the partition column
-            DataType partitionColumnDataType = rowType.getTypeAt(partitionColumnIndex);
-            partitionFieldGetters.add(
-                    InternalRow.createFieldGetter(partitionColumnDataType, partitionColumnIndex));
-        }
-    }
-
-    public String getPartition(InternalRow row) {
-        List<String> partitionValues = new ArrayList<>();
-        for (InternalRow.FieldGetter partitionFieldGetter : partitionFieldGetters) {
-            Object partitionValue = partitionFieldGetter.getFieldOrNull(row);
-            checkNotNull(partitionValue, "Partition value shouldn't be null.");
-            partitionValues.add(partitionValue.toString());
-        }
-        ResolvedPartitionSpec resolvedPartitionSpec =
-                new ResolvedPartitionSpec(partitionKeys, partitionValues);
-        return resolvedPartitionSpec.getPartitionName();
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/Scan.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/Scan.java
deleted file mode 100644
index eeb8245e0..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/Scan.java
+++ /dev/null
@@ -1,83 +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 com.alibaba.fluss.client.table.scanner;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.client.table.scanner.batch.BatchScanner;
-import com.alibaba.fluss.client.table.scanner.log.LogScanner;
-import com.alibaba.fluss.metadata.TableBucket;
-
-import javax.annotation.Nullable;
-
-import java.util.List;
-
-/**
- * Used to configure and create a scanner to scan data for a table.
- *
- * <p>{@link Scan} objects are immutable and can be shared between threads. Refinement methods, like
- * {@link #project} and {@link #limit(int)}, create new Scan instances.
- *
- * @since 0.6
- */
-@PublicEvolving
-public interface Scan {
-
-    /**
-     * Returns a new scan from this that will read the given data columns.
-     *
-     * @param projectedColumns the selected column indexes
-     */
-    Scan project(@Nullable int[] projectedColumns);
-
-    /**
-     * Returns a new scan from this that will read the given data columns.
-     *
-     * @param projectedColumnNames the selected column names
-     */
-    Scan project(List<String> projectedColumnNames);
-
-    /**
-     * Returns a new scan from this that will read the given limited row number.
-     *
-     * @param rowNumber the limited row number to read
-     */
-    Scan limit(int rowNumber);
-
-    /**
-     * Creates a {@link LogScanner} to continuously read log data for this scan.
-     *
-     * <p>Note: this API doesn't support pre-configured with {@link #limit(int)}.
-     */
-    LogScanner createLogScanner();
-
-    /**
-     * Creates a {@link BatchScanner} to read current data in the given table bucket for this scan.
-     *
-     * <p>Note: this API doesn't support pre-configured with {@link #project}.
-     */
-    BatchScanner createBatchScanner(TableBucket tableBucket);
-
-    /**
-     * Creates a {@link BatchScanner} to read given snapshot data in the given table bucket for this
-     * scan.
-     *
-     * <p>Note: this API doesn't support pre-configured with {@link #project} and {@link
-     * #limit(int)} and only support for Primary Key Tables.
-     */
-    BatchScanner createBatchScanner(TableBucket tableBucket, long snapshotId);
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/ScanRecord.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/ScanRecord.java
deleted file mode 100644
index 30d5180e4..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/ScanRecord.java
+++ /dev/null
@@ -1,93 +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 com.alibaba.fluss.client.table.scanner;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.record.ChangeType;
-import com.alibaba.fluss.record.LogRecord;
-import com.alibaba.fluss.row.InternalRow;
-
-import java.util.Objects;
-
-/** one scan record. */
-// TODO: replace this with GenericRecord in the future
-@Internal
-public class ScanRecord implements LogRecord {
-    private static final long INVALID = -1L;
-
-    private final long offset;
-    private final long timestamp;
-    private final ChangeType changeType;
-    private final InternalRow row;
-
-    public ScanRecord(InternalRow row) {
-        this(INVALID, INVALID, ChangeType.INSERT, row);
-    }
-
-    public ScanRecord(long offset, long timestamp, ChangeType changeType, InternalRow row) {
-        this.offset = offset;
-        this.timestamp = timestamp;
-        this.changeType = changeType;
-        this.row = row;
-    }
-
-    /** The position of this record in the corresponding fluss table bucket. */
-    @Override
-    public long logOffset() {
-        return offset;
-    }
-
-    @Override
-    public long timestamp() {
-        return timestamp;
-    }
-
-    @Override
-    public ChangeType getChangeType() {
-        return changeType;
-    }
-
-    @Override
-    public InternalRow getRow() {
-        return row;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        ScanRecord that = (ScanRecord) o;
-        return offset == that.offset
-                && changeType == that.changeType
-                && Objects.equals(row, that.row);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(offset, changeType, row);
-    }
-
-    @Override
-    public String toString() {
-        return changeType.shortString() + row.toString() + "@" + offset;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/TableScan.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/TableScan.java
deleted file mode 100644
index 0121a882e..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/TableScan.java
+++ /dev/null
@@ -1,138 +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 com.alibaba.fluss.client.table.scanner;
-
-import com.alibaba.fluss.client.FlussConnection;
-import com.alibaba.fluss.client.admin.Admin;
-import com.alibaba.fluss.client.metadata.KvSnapshotMetadata;
-import com.alibaba.fluss.client.table.scanner.batch.BatchScanner;
-import com.alibaba.fluss.client.table.scanner.batch.KvSnapshotBatchScanner;
-import com.alibaba.fluss.client.table.scanner.batch.LimitBatchScanner;
-import com.alibaba.fluss.client.table.scanner.log.LogScanner;
-import com.alibaba.fluss.client.table.scanner.log.LogScannerImpl;
-import com.alibaba.fluss.config.ConfigOptions;
-import com.alibaba.fluss.exception.FlussRuntimeException;
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.metadata.TableInfo;
-import com.alibaba.fluss.types.RowType;
-
-import javax.annotation.Nullable;
-
-import java.util.List;
-
-/** API for configuring and creating {@link LogScanner} and {@link BatchScanner}. */
-public class TableScan implements Scan {
-
-    private final FlussConnection conn;
-    private final TableInfo tableInfo;
-
-    /** The projected fields to do projection. No projection if is null. */
-    @Nullable private final int[] projectedColumns;
-    /** The limited row number to read. No limit if is null. */
-    @Nullable private final Integer limit;
-
-    public TableScan(FlussConnection conn, TableInfo tableInfo) {
-        this(conn, tableInfo, null, null);
-    }
-
-    private TableScan(
-            FlussConnection conn,
-            TableInfo tableInfo,
-            @Nullable int[] projectedColumns,
-            @Nullable Integer limit) {
-        this.conn = conn;
-        this.tableInfo = tableInfo;
-        this.projectedColumns = projectedColumns;
-        this.limit = limit;
-    }
-
-    @Override
-    public Scan project(@Nullable int[] projectedColumns) {
-        return new TableScan(conn, tableInfo, projectedColumns, limit);
-    }
-
-    @Override
-    public Scan project(List<String> projectedColumnNames) {
-        int[] columnIndexes = new int[projectedColumnNames.size()];
-        RowType rowType = tableInfo.getRowType();
-        for (int i = 0; i < projectedColumnNames.size(); i++) {
-            int index = rowType.getFieldIndex(projectedColumnNames.get(i));
-            if (index < 0) {
-                throw new IllegalArgumentException(
-                        "Field " + projectedColumnNames.get(i) + " not found in table schema.");
-            }
-            columnIndexes[i] = index;
-        }
-        return new TableScan(conn, tableInfo, columnIndexes, limit);
-    }
-
-    @Override
-    public Scan limit(int rowNumber) {
-        return new TableScan(conn, tableInfo, projectedColumns, rowNumber);
-    }
-
-    @Override
-    public LogScanner createLogScanner() {
-        if (limit != null) {
-            throw new UnsupportedOperationException("LogScanner doesn't support limit pushdown.");
-        }
-        return new LogScannerImpl(
-                conn.getConfiguration(),
-                tableInfo,
-                conn.getMetadataUpdater(),
-                conn.getClientMetricGroup(),
-                conn.getOrCreateRemoteFileDownloader(),
-                projectedColumns);
-    }
-
-    @Override
-    public BatchScanner createBatchScanner(TableBucket tableBucket) {
-        if (limit == null) {
-            throw new UnsupportedOperationException(
-                    "Currently, BatchScanner is only available when limit is set.");
-        }
-        return new LimitBatchScanner(
-                tableInfo, tableBucket, conn.getMetadataUpdater(), projectedColumns, limit);
-    }
-
-    @Override
-    public BatchScanner createBatchScanner(TableBucket tableBucket, long snapshotId) {
-        if (limit != null) {
-            throw new UnsupportedOperationException(
-                    "Currently, SnapshotBatchScanner doesn't support limit pushdown.");
-        }
-        String scannerTmpDir =
-                conn.getConfiguration().getString(ConfigOptions.CLIENT_SCANNER_IO_TMP_DIR);
-        Admin admin = conn.getAdmin();
-        final KvSnapshotMetadata snapshotMeta;
-        try {
-            snapshotMeta = admin.getKvSnapshotMetadata(tableBucket, snapshotId).get();
-        } catch (Exception e) {
-            throw new FlussRuntimeException("Failed to get snapshot metadata", e);
-        }
-
-        return new KvSnapshotBatchScanner(
-                tableInfo.getRowType(),
-                tableBucket,
-                snapshotMeta.getSnapshotFiles(),
-                projectedColumns,
-                scannerTmpDir,
-                tableInfo.getTableConfig().getKvFormat(),
-                conn.getOrCreateRemoteFileDownloader());
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/BatchScanUtils.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/BatchScanUtils.java
deleted file mode 100644
index ae1a422aa..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/BatchScanUtils.java
+++ /dev/null
@@ -1,108 +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 com.alibaba.fluss.client.table.scanner.batch;
-
-import com.alibaba.fluss.row.InternalRow;
-import com.alibaba.fluss.utils.CloseableIterator;
-
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Queue;
-
-/** Utility class for batch scan. */
-public class BatchScanUtils {
-
-    private static final Duration DEFAULT_POLL_TIMEOUT = Duration.ofMillis(10);
-
-    /** Collect all rows from the scanner. */
-    public static List<InternalRow> collectRows(BatchScanner scanner) {
-        List<InternalRow> rows = new ArrayList<>();
-        while (true) {
-            try {
-                CloseableIterator<InternalRow> iterator = scanner.pollBatch(DEFAULT_POLL_TIMEOUT);
-                if (iterator == null) {
-                    scanner.close();
-                    break;
-                }
-                rows.addAll(toList(iterator));
-            } catch (Exception e) {
-                throw new RuntimeException("Failed to collect rows", e);
-            }
-        }
-        return rows;
-    }
-
-    /** Collect all rows from the scanners. */
-    public static List<InternalRow> collectAllRows(List<BatchScanner> scanners) {
-        List<InternalRow> rows = new ArrayList<>();
-        for (BatchScanner scanner : scanners) {
-            rows.addAll(collectRows(scanner));
-        }
-        return rows;
-    }
-
-    /** Collect rows from the scanners until the number of rows reaches the limit. */
-    public static List<InternalRow> collectLimitedRows(List<BatchScanner> scanners, int limit) {
-        List<InternalRow> rows = new ArrayList<>();
-        Queue<BatchScanner> scannerQueue = new LinkedList<>(scanners);
-        while (!scannerQueue.isEmpty()) {
-            BatchScanner scanner = scannerQueue.poll();
-            try {
-                CloseableIterator<InternalRow> iterator = scanner.pollBatch(DEFAULT_POLL_TIMEOUT);
-                if (iterator != null) {
-                    rows.addAll(toList(iterator));
-                    // If the scanner has more data, add it back to the queue
-                    scannerQueue.add(scanner);
-                } else {
-                    // Close the scanner if it has no more data, and not add it back to the queue
-                    scanner.close();
-                }
-            } catch (Exception e) {
-                throw new RuntimeException("Failed to collect rows", e);
-            }
-            if (rows.size() >= limit) {
-                break;
-            }
-        }
-        // may collect enough rows before drain all scanners, close all scanners in the queue
-        for (BatchScanner scanner : scannerQueue) {
-            try {
-                scanner.close();
-            } catch (Exception e) {
-                throw new RuntimeException("Failed to close scanner", e);
-            }
-        }
-        return rows;
-    }
-
-    /**
-     * Collect all rows from the iterator and close it.
-     *
-     * @return return a list of rows
-     */
-    public static <T> List<T> toList(CloseableIterator<T> iterator) {
-        List<T> rows = new ArrayList<>();
-        while (iterator.hasNext()) {
-            rows.add(iterator.next());
-        }
-        iterator.close();
-        return rows;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/BatchScanner.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/BatchScanner.java
deleted file mode 100644
index 432071b2f..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/BatchScanner.java
+++ /dev/null
@@ -1,53 +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 com.alibaba.fluss.client.table.scanner.batch;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.client.table.scanner.log.LogScanner;
-import com.alibaba.fluss.row.InternalRow;
-import com.alibaba.fluss.utils.CloseableIterator;
-
-import javax.annotation.Nullable;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.time.Duration;
-
-/**
- * The scanner that reads records form a table in a batch fashion. Compared to {@link LogScanner},
- * this scanner is designed to read bounded data and will stop when reading end of a bucket, but
- * {@link LogScanner} is designed to read unbounded data and continuously read data from buckets.
- *
- * @since 0.6
- */
-@PublicEvolving
-public interface BatchScanner extends Closeable {
-
-    /**
-     * Poll one batch records. The method should return null when reaching the end of the input.
-     *
-     * @param timeout The maximum time to block (must not be greater than {@link Long#MAX_VALUE}
-     *     milliseconds)
-     */
-    @Nullable
-    CloseableIterator<InternalRow> pollBatch(Duration timeout) throws IOException;
-
-    /** Closes the scanner and should release all resources. */
-    @Override
-    void close() throws IOException;
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/KvSnapshotBatchScanner.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/KvSnapshotBatchScanner.java
deleted file mode 100644
index ba53eaa9b..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/KvSnapshotBatchScanner.java
+++ /dev/null
@@ -1,223 +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 com.alibaba.fluss.client.table.scanner.batch;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.client.table.scanner.RemoteFileDownloader;
-import com.alibaba.fluss.exception.FlussRuntimeException;
-import com.alibaba.fluss.fs.FsPathAndFileName;
-import com.alibaba.fluss.metadata.KvFormat;
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.row.InternalRow;
-import com.alibaba.fluss.types.RowType;
-import com.alibaba.fluss.utils.CloseableIterator;
-import com.alibaba.fluss.utils.CloseableRegistry;
-import com.alibaba.fluss.utils.FileUtils;
-import com.alibaba.fluss.utils.IOUtils;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.GuardedBy;
-
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.time.Duration;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.ReentrantLock;
-
-import static com.alibaba.fluss.utils.concurrent.LockUtils.inLock;
-
-/**
- * A scanner to scan the snapshot data of a kv bucket.
- *
- * <p>When the scanner is created, It will download the given snapshot files from the remote storage
- * and create a reader to read the files into records asynchronously.
- *
- * <p>In the {@link BatchScanner#pollBatch(Duration)} method:
- *
- * <ul>
- *   <li>if the reader is not ready in given time, return an empty iterator
- *   <li>If the reader is ready, always return the reader if there remains any data in the reader.
- *       Otherwise, return null
- * </ul>
- */
-@Internal
-public class KvSnapshotBatchScanner implements BatchScanner {
-
-    private static final Logger LOG = LoggerFactory.getLogger(KvSnapshotBatchScanner.class);
-
-    public static final CloseableIterator<InternalRow> NO_DATA_AVAILABLE =
-            CloseableIterator.emptyIterator();
-
-    private final RowType tableRowType;
-    private final TableBucket tableBucket;
-    private final List<FsPathAndFileName> fsPathAndFileNames;
-    @Nullable private final int[] projectedFields;
-
-    private final Path snapshotLocalDirectory;
-    private final RemoteFileDownloader remoteFileDownloader;
-    private final KvFormat kvFormat;
-
-    private final ReentrantLock lock = new ReentrantLock();
-
-    @GuardedBy("lock")
-    private final Condition readerIsReady = lock.newCondition();
-
-    private final AtomicBoolean closed;
-
-    private volatile SnapshotFilesReader snapshotFilesReader;
-
-    @Nullable private volatile Throwable initSnapshotFilesReaderException = null;
-
-    public KvSnapshotBatchScanner(
-            RowType tableRowType,
-            TableBucket tableBucket,
-            List<FsPathAndFileName> fsPathAndFileNames,
-            @Nullable int[] projectedFields,
-            String scannerTmpDir,
-            KvFormat kvFormat,
-            RemoteFileDownloader remoteFileDownloader) {
-        this.tableRowType = tableRowType;
-        this.tableBucket = tableBucket;
-        this.fsPathAndFileNames = fsPathAndFileNames;
-        this.projectedFields = projectedFields;
-        this.kvFormat = kvFormat;
-        // create a directory to store the snapshot files
-        this.snapshotLocalDirectory =
-                Paths.get(scannerTmpDir, String.format("kv-snapshots-%s", UUID.randomUUID()));
-        this.remoteFileDownloader = remoteFileDownloader;
-        this.closed = new AtomicBoolean(false);
-        initReaderAsynchronously();
-    }
-
-    /**
-     * Fetch data from snapshot.
-     *
-     * <p>If the snapshot file reader is not ready in given maximum block time, return an empty
-     * iterator. If the reader is ready, always return the reader if there remains any record in the
-     * reader, otherwise, return null.
-     *
-     * @param timeout The maximum time to block (must not be greater than {@link Long#MAX_VALUE}
-     *     milliseconds)
-     */
-    @Nullable
-    @Override
-    public CloseableIterator<InternalRow> pollBatch(Duration timeout) throws IOException {
-        // note: we don't throw exception if the scanner is closed since in flink access pattern,
-        // the scanner will be closed by source reader thread after finished reading all records,
-        // but the fetcher thread may still calling poll method
-        ensureNoException();
-        return inLock(
-                lock,
-                () -> {
-                    try {
-                        if (snapshotFilesReader == null) {
-                            // wait for the reader to be ready,
-                            if (!readerIsReady.await(timeout.toMillis(), TimeUnit.MILLISECONDS)) {
-                                // reader is still not ready
-                                return NO_DATA_AVAILABLE;
-                            }
-                        }
-                        return snapshotFilesReader.hasNext() ? snapshotFilesReader : null;
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                        throw new FlussRuntimeException(
-                                "Interrupted when waiting for snapshot files reader.", e);
-                    }
-                });
-    }
-
-    /**
-     * Ensure that the scanner hasn't encountered any exception.
-     *
-     * @throws FlussRuntimeException If any exception has been thrown during snapshot reader
-     *     initialization
-     */
-    private void ensureNoException() {
-        if (initSnapshotFilesReaderException != null) {
-            throw new FlussRuntimeException(
-                    "Failed to initialize snapshot files reader.",
-                    initSnapshotFilesReaderException);
-        }
-    }
-
-    @Override
-    public void close() {
-        if (closed.compareAndSet(false, true)) {
-            IOUtils.closeQuietly(snapshotFilesReader);
-            FileUtils.deleteDirectoryQuietly(snapshotLocalDirectory.toFile());
-        }
-    }
-
-    private void initReaderAsynchronously() {
-        CompletableFuture.runAsync(
-                () ->
-                        inLock(
-                                lock,
-                                () -> {
-                                    CloseableRegistry closeableRegistry = new CloseableRegistry();
-                                    try {
-                                        if (!snapshotLocalDirectory.toFile().mkdirs()) {
-                                            throw new IOException(
-                                                    String.format(
-                                                            "Failed to create directory %s for storing kv snapshot files.",
-                                                            snapshotLocalDirectory));
-                                        }
-                                        closeableRegistry.registerCloseable(
-                                                () ->
-                                                        FileUtils.deleteDirectoryQuietly(
-                                                                snapshotLocalDirectory.toFile()));
-                                        // todo: refactor transferAllToDirectory method to
-                                        // return a future so that we won't need to runAsync using
-                                        // the default thread pool
-                                        LOG.info(
-                                                "Start to download kv snapshot files to local directory for bucket {}.",
-                                                tableBucket);
-                                        long startTime = System.currentTimeMillis();
-                                        remoteFileDownloader.transferAllToDirectory(
-                                                fsPathAndFileNames,
-                                                snapshotLocalDirectory,
-                                                closeableRegistry);
-                                        LOG.info(
-                                                "Download kv snapshot files to local directory for bucket {} cost {} ms.",
-                                                tableBucket,
-                                                System.currentTimeMillis() - startTime);
-                                        snapshotFilesReader =
-                                                new SnapshotFilesReader(
-                                                        kvFormat,
-                                                        snapshotLocalDirectory,
-                                                        tableRowType,
-                                                        projectedFields);
-                                        readerIsReady.signalAll();
-                                    } catch (Throwable e) {
-                                        IOUtils.closeQuietly(closeableRegistry);
-                                        initSnapshotFilesReaderException = e;
-                                    } finally {
-                                        IOUtils.closeQuietly(closeableRegistry);
-                                    }
-                                }));
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/SnapshotFilesReader.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/SnapshotFilesReader.java
deleted file mode 100644
index 6a1654a9d..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/batch/SnapshotFilesReader.java
+++ /dev/null
@@ -1,163 +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 com.alibaba.fluss.client.table.scanner.batch;
-
-import com.alibaba.fluss.client.table.scanner.ScanRecord;
-import com.alibaba.fluss.exception.FlussRuntimeException;
-import com.alibaba.fluss.metadata.KvFormat;
-import com.alibaba.fluss.rocksdb.RocksDBHandle;
-import com.alibaba.fluss.rocksdb.RocksIteratorWrapper;
-import com.alibaba.fluss.row.InternalRow;
-import com.alibaba.fluss.row.ProjectedRow;
-import com.alibaba.fluss.row.decode.RowDecoder;
-import com.alibaba.fluss.row.encode.ValueDecoder;
-import com.alibaba.fluss.types.DataType;
-import com.alibaba.fluss.types.RowType;
-import com.alibaba.fluss.utils.CloseableIterator;
-import com.alibaba.fluss.utils.CloseableRegistry;
-import com.alibaba.fluss.utils.IOUtils;
-
-import org.rocksdb.ColumnFamilyOptions;
-import org.rocksdb.DBOptions;
-import org.rocksdb.ReadOptions;
-import org.rocksdb.RocksDB;
-import org.rocksdb.RocksIterator;
-import org.rocksdb.Snapshot;
-
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.NotThreadSafe;
-
-import java.io.IOException;
-import java.nio.file.Path;
-
-/**
- * A reader to read kv snapshot files to {@link ScanRecord}s. It will return the {@link ScanRecord}s
- * as an iterator.
- */
-@NotThreadSafe
-class SnapshotFilesReader implements CloseableIterator<InternalRow> {
-
-    private final ValueDecoder valueDecoder;
-    @Nullable private final int[] projectedFields;
-    private RocksIteratorWrapper rocksIteratorWrapper;
-
-    private Snapshot snapshot;
-    private RocksDBHandle rocksDBHandle;
-    private boolean isClose = false;
-
-    private final CloseableRegistry closeableRegistry;
-
-    SnapshotFilesReader(
-            KvFormat kvFormat,
-            Path rocksDbPath,
-            RowType tableRowType,
-            @Nullable int[] projectedFields)
-            throws IOException {
-        this.valueDecoder =
-                new ValueDecoder(
-                        RowDecoder.create(
-                                kvFormat, tableRowType.getChildren().toArray(new DataType[0])));
-        this.projectedFields = projectedFields;
-        closeableRegistry = new CloseableRegistry();
-        try {
-            initRocksDB(rocksDbPath);
-            initRocksIterator();
-        } catch (Throwable t) {
-            releaseSnapshot();
-            // If anything goes wrong, clean up our stuff. If things went smoothly the
-            // merging iterator is now responsible for closing the resources
-            IOUtils.closeQuietly(closeableRegistry);
-            throw new IOException("Error creating RocksDB snapshot reader.", t);
-        }
-    }
-
-    private void initRocksDB(Path rocksDbPath) throws Exception {
-        // create rocksdb
-        DBOptions dbOptions = new DBOptions();
-        closeableRegistry.registerCloseable(dbOptions::close);
-        ColumnFamilyOptions columnFamilyOptions = new ColumnFamilyOptions();
-        closeableRegistry.registerCloseable(columnFamilyOptions::close);
-
-        rocksDBHandle =
-                new RocksDBHandle(rocksDbPath.toFile(), dbOptions, columnFamilyOptions, true);
-        closeableRegistry.registerCloseable(rocksDBHandle::close);
-    }
-
-    private void initRocksIterator() throws IOException {
-        // open a db
-        rocksDBHandle.openDB();
-        // get the snapshot
-        RocksDB db = rocksDBHandle.getDb();
-        snapshot = db.getSnapshot();
-        closeableRegistry.registerCloseable(snapshot::close);
-
-        // use the snapshot to read rocksdb
-        ReadOptions readOptions = new ReadOptions();
-        closeableRegistry.registerCloseable(readOptions::close);
-        readOptions.setSnapshot(snapshot);
-
-        // get the iterator
-        RocksIterator rocksIterator = db.newIterator(db.getDefaultColumnFamily(), readOptions);
-        rocksIteratorWrapper = new RocksIteratorWrapper(rocksIterator);
-        closeableRegistry.registerCloseable(rocksIteratorWrapper);
-
-        // seek to first
-        rocksIteratorWrapper.seekToFirst();
-    }
-
-    public void close() {
-        if (isClose) {
-            return;
-        }
-
-        releaseSnapshot();
-        try {
-            closeableRegistry.close();
-        } catch (IOException e) {
-            throw new FlussRuntimeException("Failed to close resources", e);
-        }
-        isClose = true;
-    }
-
-    private void releaseSnapshot() {
-        if (snapshot != null && rocksDBHandle != null) {
-            rocksDBHandle.getDb().releaseSnapshot(snapshot);
-            snapshot = null;
-        }
-    }
-
-    @Override
-    public boolean hasNext() {
-        return !isClose && rocksIteratorWrapper.isValid();
-    }
-
-    @Override
-    public InternalRow next() {
-        byte[] value = rocksIteratorWrapper.value();
-        rocksIteratorWrapper.next();
-
-        InternalRow originRow = valueDecoder.decodeValue(value).row;
-        if (projectedFields != null) {
-            ProjectedRow projectedRow = ProjectedRow.from(projectedFields);
-            projectedRow.replaceRow(originRow);
-            return projectedRow;
-        } else {
-            return originRow;
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/BucketScanStatus.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/BucketScanStatus.java
deleted file mode 100644
index e8418f06c..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/BucketScanStatus.java
+++ /dev/null
@@ -1,52 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.annotation.Internal;
-
-/** Bucket scan status for log fetch. */
-@Internal
-class BucketScanStatus {
-    private long offset; // last consumed position
-    private long highWatermark; // the high watermark from last fetch
-    // TODO add resetStrategy and nextAllowedRetryTimeMs.
-
-    public BucketScanStatus() {
-        this.offset = 0L;
-    }
-
-    public BucketScanStatus(Long position) {
-        this.offset = position;
-    }
-
-    public long getOffset() {
-        return offset;
-    }
-
-    public long getHighWatermark() {
-        return highWatermark;
-    }
-
-    public void setOffset(Long offset) {
-        this.offset = offset;
-    }
-
-    public void setHighWatermark(Long highWatermark) {
-        this.highWatermark = highWatermark;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/CompletedFetch.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/CompletedFetch.java
deleted file mode 100644
index 2c2f76132..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/CompletedFetch.java
+++ /dev/null
@@ -1,258 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.client.table.scanner.ScanRecord;
-import com.alibaba.fluss.exception.CorruptRecordException;
-import com.alibaba.fluss.exception.FetchException;
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.record.LogRecord;
-import com.alibaba.fluss.record.LogRecordBatch;
-import com.alibaba.fluss.record.LogRecordReadContext;
-import com.alibaba.fluss.row.GenericRow;
-import com.alibaba.fluss.row.InternalRow;
-import com.alibaba.fluss.rpc.messages.FetchLogRequest;
-import com.alibaba.fluss.rpc.protocol.ApiError;
-import com.alibaba.fluss.utils.CloseableIterator;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Closeable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * {@link CompletedFetch} represents the result that was returned from the tablet server via a
- * {@link FetchLogRequest}, which can be a {@link LogRecordBatch} or remote log segments path. It
- * contains logic to maintain state between calls to {@link #fetchRecords(int)}.
- */
-@Internal
-abstract class CompletedFetch {
-    static final Logger LOG = LoggerFactory.getLogger(CompletedFetch.class);
-
-    final TableBucket tableBucket;
-    final ApiError error;
-    final int sizeInBytes;
-    final long highWatermark;
-
-    private final boolean isCheckCrcs;
-    private final Iterator<LogRecordBatch> batches;
-    private final LogScannerStatus logScannerStatus;
-    protected final LogRecordReadContext readContext;
-    protected final InternalRow.FieldGetter[] selectedFieldGetters;
-
-    private LogRecordBatch currentBatch;
-    private LogRecord lastRecord;
-    private CloseableIterator<LogRecord> records;
-    private int recordsRead = 0;
-    private Exception cachedRecordException = null;
-    private boolean corruptLastRecord = false;
-    private long nextFetchOffset;
-    private boolean isConsumed = false;
-    private boolean initialized = false;
-
-    public CompletedFetch(
-            TableBucket tableBucket,
-            ApiError error,
-            int sizeInBytes,
-            long highWatermark,
-            Iterator<LogRecordBatch> batches,
-            LogRecordReadContext readContext,
-            LogScannerStatus logScannerStatus,
-            boolean isCheckCrcs,
-            long fetchOffset) {
-        this.tableBucket = tableBucket;
-        this.error = error;
-        this.sizeInBytes = sizeInBytes;
-        this.highWatermark = highWatermark;
-        this.batches = batches;
-        this.readContext = readContext;
-        this.isCheckCrcs = isCheckCrcs;
-        this.logScannerStatus = logScannerStatus;
-        this.nextFetchOffset = fetchOffset;
-        this.selectedFieldGetters = readContext.getSelectedFieldGetters();
-    }
-
-    // TODO: optimize this to avoid deep copying the record.
-    //  refactor #fetchRecords to return an iterator which lazily deserialize
-    //  from underlying record stream and arrow buffer.
-    ScanRecord toScanRecord(LogRecord record) {
-        GenericRow newRow = new GenericRow(selectedFieldGetters.length);
-        InternalRow internalRow = record.getRow();
-        for (int i = 0; i < selectedFieldGetters.length; i++) {
-            newRow.setField(i, selectedFieldGetters[i].getFieldOrNull(internalRow));
-        }
-        return new ScanRecord(
-                record.logOffset(), record.timestamp(), record.getChangeType(), newRow);
-    }
-
-    boolean isConsumed() {
-        return isConsumed;
-    }
-
-    boolean isInitialized() {
-        return initialized;
-    }
-
-    long nextFetchOffset() {
-        return nextFetchOffset;
-    }
-
-    void setInitialized() {
-        this.initialized = true;
-    }
-
-    /**
-     * Draining a {@link CompletedFetch} will signal that the data has been consumed and the
-     * underlying resources are closed. This is somewhat analogous to {@link Closeable#close()
-     * closing}, though no error will result if a caller invokes {@link #fetchRecords(int)}; an
-     * empty {@link List list} will be returned instead.
-     */
-    void drain() {
-        if (!isConsumed) {
-            maybeCloseRecordStream();
-            cachedRecordException = null;
-            isConsumed = true;
-
-            // we move the bucket to the end if we received some bytes.
-            if (recordsRead > 0) {
-                logScannerStatus.moveBucketToEnd(tableBucket);
-            }
-        }
-    }
-
-    /**
-     * The {@link LogRecordBatch batch} of {@link LogRecord records} is converted to a {@link List
-     * list} of {@link ScanRecord scan records} and returned.
-     *
-     * @param maxRecords The number of records to return; the number returned may be {@code 0 <=
-     *     maxRecords}
-     * @return {@link ScanRecord scan records}
-     */
-    public List<ScanRecord> fetchRecords(int maxRecords) {
-        if (corruptLastRecord) {
-            throw new FetchException(
-                    "Received exception when fetching the next record from "
-                            + tableBucket
-                            + ". If needed, please back to past the record to continue scanning.",
-                    cachedRecordException);
-        }
-
-        if (isConsumed) {
-            return Collections.emptyList();
-        }
-
-        List<ScanRecord> scanRecords = new ArrayList<>();
-        try {
-            for (int i = 0; i < maxRecords; i++) {
-                // Only move to next record if there was no exception in the last fetch.
-                if (cachedRecordException == null) {
-                    corruptLastRecord = true;
-                    lastRecord = nextFetchedRecord();
-                    corruptLastRecord = false;
-                }
-
-                if (lastRecord == null) {
-                    break;
-                }
-
-                ScanRecord record = toScanRecord(lastRecord);
-                scanRecords.add(record);
-                recordsRead++;
-                nextFetchOffset = lastRecord.logOffset() + 1;
-                cachedRecordException = null;
-            }
-        } catch (Exception e) {
-            cachedRecordException = e;
-            if (scanRecords.isEmpty()) {
-                throw new FetchException(
-                        "Received exception when fetching the next record from "
-                                + tableBucket
-                                + ". If needed, please back to past the record to continue scanning.",
-                        e);
-            }
-        }
-
-        return scanRecords;
-    }
-
-    private LogRecord nextFetchedRecord() throws Exception {
-        while (true) {
-            if (records == null || !records.hasNext()) {
-                maybeCloseRecordStream();
-
-                if (!batches.hasNext()) {
-                    // In batch, we preserve the last offset in a batch. By using the next offset
-                    // computed from the last offset in the batch, we ensure that the offset of the
-                    // next fetch will point to the next batch, which avoids unnecessary re-fetching
-                    // of the same batch (in the worst case, the scanner could get stuck fetching
-                    // the same batch repeatedly).
-                    if (currentBatch != null) {
-                        nextFetchOffset = currentBatch.nextLogOffset();
-                    }
-                    drain();
-                    return null;
-                }
-
-                currentBatch = batches.next();
-                // TODO get last epoch.
-                maybeEnsureValid(currentBatch);
-
-                records = currentBatch.records(readContext);
-            } else {
-                LogRecord record = records.next();
-                // skip any records out of range.
-                if (record.logOffset() >= nextFetchOffset) {
-                    return record;
-                }
-            }
-        }
-    }
-
-    private void maybeEnsureValid(LogRecordBatch batch) {
-        if (isCheckCrcs) {
-            if (readContext.isProjectionPushDowned()) {
-                LOG.debug("Skipping CRC check for column projected log record batch.");
-                return;
-            }
-            try {
-                batch.ensureValid();
-            } catch (CorruptRecordException e) {
-                throw new FetchException(
-                        "Record batch for bucket "
-                                + tableBucket
-                                + " at offset "
-                                + batch.baseLogOffset()
-                                + " is invalid, cause: "
-                                + e.getMessage());
-            }
-        }
-    }
-
-    private void maybeCloseRecordStream() {
-        if (records != null) {
-            // release underlying resources
-            records.close();
-            records = null;
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/CompletedPendingFetch.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/CompletedPendingFetch.java
deleted file mode 100644
index 414482254..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/CompletedPendingFetch.java
+++ /dev/null
@@ -1,48 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.metadata.TableBucket;
-
-/**
- * A {@link PendingFetch} that already has been completed. This is a CompletedFetch that needs to in
- * queue to wait other PendingFetch.
- */
-class CompletedPendingFetch implements PendingFetch {
-
-    private final CompletedFetch completedFetch;
-
-    public CompletedPendingFetch(CompletedFetch completedFetch) {
-        this.completedFetch = completedFetch;
-    }
-
-    @Override
-    public TableBucket tableBucket() {
-        return completedFetch.tableBucket;
-    }
-
-    @Override
-    public boolean isCompleted() {
-        return true;
-    }
-
-    @Override
-    public CompletedFetch toCompletedFetch() {
-        return completedFetch;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/DefaultCompletedFetch.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/DefaultCompletedFetch.java
deleted file mode 100644
index e4cf0638d..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/DefaultCompletedFetch.java
+++ /dev/null
@@ -1,51 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.record.LogRecordReadContext;
-import com.alibaba.fluss.rpc.entity.FetchLogResultForBucket;
-import com.alibaba.fluss.rpc.messages.FetchLogRequest;
-
-/**
- * {@link DefaultCompletedFetch} is a {@link CompletedFetch} that represents a completed fetch that
- * the log records have been returned from the tablet server by {@link FetchLogRequest}.
- */
-@Internal
-class DefaultCompletedFetch extends CompletedFetch {
-
-    public DefaultCompletedFetch(
-            TableBucket tableBucket,
-            FetchLogResultForBucket fetchLogResultForBucket,
-            LogRecordReadContext readContext,
-            LogScannerStatus logScannerStatus,
-            boolean isCheckCrc,
-            Long fetchOffset) {
-        super(
-                tableBucket,
-                fetchLogResultForBucket.getError(),
-                fetchLogResultForBucket.recordsOrEmpty().sizeInBytes(),
-                fetchLogResultForBucket.getHighWatermark(),
-                fetchLogResultForBucket.recordsOrEmpty().batches().iterator(),
-                readContext,
-                logScannerStatus,
-                isCheckCrc,
-                fetchOffset);
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogFetchBuffer.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogFetchBuffer.java
deleted file mode 100644
index de2b09175..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogFetchBuffer.java
+++ /dev/null
@@ -1,280 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.exception.WakeupException;
-import com.alibaba.fluss.metadata.TableBucket;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.GuardedBy;
-import javax.annotation.concurrent.ThreadSafe;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import static com.alibaba.fluss.utils.concurrent.LockUtils.inLock;
-
-/* This file is based on source code of Apache Kafka Project (https://kafka.apache.org/), licensed by the Apache
- * Software Foundation (ASF) under the Apache License, Version 2.0. See the NOTICE file distributed with this work for
- * additional information regarding copyright ownership. */
-
-/**
- * {@link LogFetchBuffer} buffers up {@link CompletedFetch the results} from the tablet server
- * responses as they are received. It's essentially a wrapper around a {@link java.util.Queue} of
- * {@link CompletedFetch}. There is at most one {@link LogFetchBuffer} per bucket in the queue.
- *
- * <p>Note: this class is thread-safe with the intention that {@link CompletedFetch the data} will
- * be created by a background thread and consumed by the application thread.
- */
-@ThreadSafe
-@Internal
-public class LogFetchBuffer implements AutoCloseable {
-    private static final Logger LOG = LoggerFactory.getLogger(LogFetchBuffer.class);
-
-    private final Lock lock = new ReentrantLock();
-    private final Condition notEmptyCondition = lock.newCondition();
-    private final AtomicBoolean wokenup = new AtomicBoolean(false);
-
-    @GuardedBy("lock")
-    private final LinkedList<CompletedFetch> completedFetches;
-
-    @GuardedBy("lock")
-    private final Map<TableBucket, LinkedList<PendingFetch>> pendingFetches = new HashMap<>();
-
-    @GuardedBy("lock")
-    private @Nullable CompletedFetch nextInLineFetch;
-
-    public LogFetchBuffer() {
-        this.completedFetches = new LinkedList<>();
-    }
-
-    /**
-     * Returns {@code true} if there are no completed fetches pending to return to the user.
-     *
-     * @return {@code true} if the buffer is empty, {@code false} otherwise
-     */
-    boolean isEmpty() {
-        return inLock(lock, completedFetches::isEmpty);
-    }
-
-    void pend(PendingFetch pendingFetch) {
-        inLock(
-                lock,
-                () -> {
-                    pendingFetches
-                            .computeIfAbsent(pendingFetch.tableBucket(), k -> new LinkedList<>())
-                            .add(pendingFetch);
-                });
-    }
-
-    /**
-     * Tries to complete the pending fetches in order, convert them into completed fetches in the
-     * buffer.
-     */
-    void tryComplete(TableBucket tableBucket) {
-        inLock(
-                lock,
-                () -> {
-                    boolean hasCompleted = false;
-                    LinkedList<PendingFetch> pendings = this.pendingFetches.get(tableBucket);
-                    while (pendings != null && !pendings.isEmpty()) {
-                        PendingFetch pendingFetch = pendings.peek();
-                        if (pendingFetch.isCompleted()) {
-                            CompletedFetch completedFetch = pendingFetch.toCompletedFetch();
-                            completedFetches.add(completedFetch);
-                            pendings.poll();
-                            hasCompleted = true;
-                        } else {
-                            break;
-                        }
-                    }
-                    if (hasCompleted) {
-                        notEmptyCondition.signalAll();
-                        // clear the bucket entry if there is no pending fetches for the bucket.
-                        if (pendings.isEmpty()) {
-                            this.pendingFetches.remove(tableBucket);
-                        }
-                    }
-                });
-    }
-
-    void add(CompletedFetch completedFetch) {
-        inLock(
-                lock,
-                () -> {
-                    LinkedList<PendingFetch> pendings =
-                            pendingFetches.get(completedFetch.tableBucket);
-                    if (pendings == null || pendings.isEmpty()) {
-                        completedFetches.add(completedFetch);
-                        notEmptyCondition.signalAll();
-                    } else {
-                        pendings.add(new CompletedPendingFetch(completedFetch));
-                    }
-                });
-    }
-
-    void addAll(Collection<CompletedFetch> completedFetches) {
-        if (completedFetches == null || completedFetches.isEmpty()) {
-            return;
-        }
-        inLock(lock, () -> completedFetches.forEach(this::add));
-    }
-
-    CompletedFetch nextInLineFetch() {
-        return inLock(lock, () -> nextInLineFetch);
-    }
-
-    void setNextInLineFetch(@Nullable CompletedFetch nextInLineFetch) {
-        inLock(lock, () -> this.nextInLineFetch = nextInLineFetch);
-    }
-
-    CompletedFetch peek() {
-        return inLock(lock, completedFetches::peek);
-    }
-
-    CompletedFetch poll() {
-        return inLock(lock, completedFetches::poll);
-    }
-
-    /**
-     * Allows the caller to await presence of data in the buffer. The method will block, returning
-     * only under one of the following conditions:
-     *
-     * <ol>
-     *   <li>The buffer was already non-empty on entry
-     *   <li>The buffer was populated during the wait
-     *   <li>The time out
-     *   <li>The thread was interrupted
-     * </ol>
-     *
-     * @param deadlineNanos the deadline time to wait until
-     * @return false if the waiting time detectably elapsed before return from the method, else true
-     */
-    boolean awaitNotEmpty(long deadlineNanos) throws InterruptedException {
-        return inLock(
-                lock,
-                () -> {
-                    while (isEmpty()) {
-                        if (wokenup.compareAndSet(true, false)) {
-                            throw new WakeupException("The await is wakeup.");
-                        }
-                        long remainingNanos = deadlineNanos - System.nanoTime();
-                        if (remainingNanos <= 0) {
-                            // false for timeout
-                            return false;
-                        }
-
-                        if (notEmptyCondition.await(remainingNanos, TimeUnit.NANOSECONDS)) {
-                            // true for signal
-                            return true;
-                        }
-                    }
-
-                    // true for wakeup or we have data to return
-                    return true;
-                });
-    }
-
-    public void wakeup() {
-        wokenup.set(true);
-        inLock(lock, notEmptyCondition::signalAll);
-    }
-
-    /**
-     * Updates the buffer to retain only the fetch data that corresponds to the given buckets. Any
-     * previously {@link CompletedFetch fetched data} and {@link PendingFetch pending fetch} is
-     * removed if its bucket is not in the given set of buckets.
-     *
-     * @param buckets {@link Set} of {@link TableBucket}s for which any buffered data should be kept
-     */
-    void retainAll(Set<TableBucket> buckets) {
-        inLock(
-                lock,
-                () -> {
-                    completedFetches.removeIf(cf -> maybeDrain(buckets, cf));
-
-                    if (maybeDrain(buckets, nextInLineFetch)) {
-                        nextInLineFetch = null;
-                    }
-
-                    // remove entries that not matches the buckets from pendingFetches
-                    pendingFetches.entrySet().removeIf(entry -> !buckets.contains(entry.getKey()));
-                });
-    }
-
-    /**
-     * Drains (i.e. <em>removes</em>) the contents of the given {@link CompletedFetch} as its data
-     * should not be returned to the user.
-     */
-    private boolean maybeDrain(Set<TableBucket> excludedBuckets, CompletedFetch completedFetch) {
-        if (completedFetch != null && !excludedBuckets.contains(completedFetch.tableBucket)) {
-            LOG.debug(
-                    "Removing {} from buffered fetch data as it is not in the set of buckets to retain ({})",
-                    completedFetch.tableBucket,
-                    excludedBuckets);
-            completedFetch.drain();
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Return the set of {@link TableBucket buckets} for which we have data in the buffer.
-     *
-     * @return {@link TableBucket bucket} set
-     */
-    @Nullable
-    Set<TableBucket> bufferedBuckets() {
-        return inLock(
-                lock,
-                () -> {
-                    final Set<TableBucket> buckets = new HashSet<>();
-                    if (nextInLineFetch != null && !nextInLineFetch.isConsumed()) {
-                        buckets.add(nextInLineFetch.tableBucket);
-                    }
-                    completedFetches.forEach(cf -> buckets.add(cf.tableBucket));
-                    buckets.addAll(pendingFetches.keySet());
-                    return buckets;
-                });
-    }
-
-    /** Return the set of {@link TableBucket buckets} for which we have pending fetches. */
-    Set<TableBucket> pendedBuckets() {
-        return inLock(lock, pendingFetches::keySet);
-    }
-
-    @Override
-    public void close() throws Exception {
-        inLock(lock, () -> retainAll(Collections.emptySet()));
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogFetchCollector.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogFetchCollector.java
deleted file mode 100644
index fb6095f2a..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogFetchCollector.java
+++ /dev/null
@@ -1,292 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.client.metadata.MetadataUpdater;
-import com.alibaba.fluss.client.table.scanner.ScanRecord;
-import com.alibaba.fluss.config.ConfigOptions;
-import com.alibaba.fluss.config.Configuration;
-import com.alibaba.fluss.exception.AuthorizationException;
-import com.alibaba.fluss.exception.FetchException;
-import com.alibaba.fluss.exception.LogOffsetOutOfRangeException;
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.metadata.TablePath;
-import com.alibaba.fluss.record.LogRecord;
-import com.alibaba.fluss.record.LogRecordBatch;
-import com.alibaba.fluss.rpc.protocol.ApiError;
-import com.alibaba.fluss.rpc.protocol.Errors;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.ThreadSafe;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/* This file is based on source code of Apache Kafka Project (https://kafka.apache.org/), licensed by the Apache
- * Software Foundation (ASF) under the Apache License, Version 2.0. See the NOTICE file distributed with this work for
- * additional information regarding copyright ownership. */
-
-/**
- * {@link LogFetchCollector} operates at the {@link LogRecordBatch} level, as that is what is stored
- * in the {@link LogFetchBuffer}. Each {@link LogRecord} in the {@link LogRecordBatch} is converted
- * to a {@link ScanRecord} and added to the returned {@link LogFetcher}.
- */
-@ThreadSafe
-@Internal
-public class LogFetchCollector {
-    private static final Logger LOG = LoggerFactory.getLogger(LogFetchCollector.class);
-
-    private final TablePath tablePath;
-    private final LogScannerStatus logScannerStatus;
-    private final int maxPollRecords;
-    private final MetadataUpdater metadataUpdater;
-
-    public LogFetchCollector(
-            TablePath tablePath,
-            LogScannerStatus logScannerStatus,
-            Configuration conf,
-            MetadataUpdater metadataUpdater) {
-        this.tablePath = tablePath;
-        this.logScannerStatus = logScannerStatus;
-        this.maxPollRecords = conf.getInt(ConfigOptions.CLIENT_SCANNER_LOG_MAX_POLL_RECORDS);
-        this.metadataUpdater = metadataUpdater;
-    }
-
-    /**
-     * Return the fetched log records, empty the record buffer and update the consumed position.
-     *
-     * <p>NOTE: returning empty records guarantees the consumed position are NOT updated.
-     *
-     * @return The fetched records per partition
-     * @throws LogOffsetOutOfRangeException If there is OffsetOutOfRange error in fetchResponse and
-     *     the defaultResetPolicy is NONE
-     */
-    public Map<TableBucket, List<ScanRecord>> collectFetch(final LogFetchBuffer logFetchBuffer) {
-        Map<TableBucket, List<ScanRecord>> fetched = new HashMap<>();
-        int recordsRemaining = maxPollRecords;
-
-        try {
-            while (recordsRemaining > 0) {
-                CompletedFetch nextInLineFetch = logFetchBuffer.nextInLineFetch();
-                if (nextInLineFetch == null || nextInLineFetch.isConsumed()) {
-                    CompletedFetch completedFetch = logFetchBuffer.peek();
-                    if (completedFetch == null) {
-                        break;
-                    }
-
-                    if (!completedFetch.isInitialized()) {
-                        try {
-                            logFetchBuffer.setNextInLineFetch(initialize(completedFetch));
-                        } catch (Exception e) {
-                            // Remove a completedFetch upon a parse with exception if
-                            // (1) it contains no records, and
-                            // (2) there are no fetched records with actual content preceding this
-                            // exception.
-                            if (fetched.isEmpty() && completedFetch.sizeInBytes == 0) {
-                                logFetchBuffer.poll();
-                            }
-                            throw e;
-                        }
-                    } else {
-                        logFetchBuffer.setNextInLineFetch(completedFetch);
-                    }
-
-                    logFetchBuffer.poll();
-                } else {
-                    List<ScanRecord> records = fetchRecords(nextInLineFetch, recordsRemaining);
-                    if (!records.isEmpty()) {
-                        TableBucket tableBucket = nextInLineFetch.tableBucket;
-                        List<ScanRecord> currentRecords = fetched.get(tableBucket);
-                        if (currentRecords == null) {
-                            fetched.put(tableBucket, records);
-                        } else {
-                            // this case shouldn't usually happen because we only send one fetch at
-                            // a time per bucket, but it might conceivably happen in some rare
-                            // cases (such as bucket leader changes). we have to copy to a new list
-                            // because the old one may be immutable
-                            List<ScanRecord> newScanRecords =
-                                    new ArrayList<>(records.size() + currentRecords.size());
-                            newScanRecords.addAll(currentRecords);
-                            newScanRecords.addAll(records);
-                            fetched.put(tableBucket, newScanRecords);
-                        }
-
-                        recordsRemaining -= records.size();
-                    }
-                }
-            }
-        } catch (FetchException e) {
-            if (fetched.isEmpty()) {
-                throw e;
-            }
-        }
-
-        return fetched;
-    }
-
-    private List<ScanRecord> fetchRecords(CompletedFetch nextInLineFetch, int maxRecords) {
-        TableBucket tb = nextInLineFetch.tableBucket;
-        Long offset = logScannerStatus.getBucketOffset(tb);
-        if (offset == null) {
-            LOG.debug(
-                    "Ignoring fetched records for {} at offset {} since the current offset is null which means the "
-                            + "bucket has been unsubscribe.",
-                    tb,
-                    nextInLineFetch.nextFetchOffset());
-        } else {
-            if (nextInLineFetch.nextFetchOffset() == offset) {
-                List<ScanRecord> records = nextInLineFetch.fetchRecords(maxRecords);
-                LOG.trace(
-                        "Returning {} fetched records at offset {} for assigned bucket {}.",
-                        records.size(),
-                        offset,
-                        tb);
-
-                if (nextInLineFetch.nextFetchOffset() > offset) {
-                    LOG.trace(
-                            "Updating fetch offset from {} to {} for bucket {} and returning {} records from poll()",
-                            offset,
-                            nextInLineFetch.nextFetchOffset(),
-                            tb,
-                            records.size());
-                    logScannerStatus.updateOffset(tb, nextInLineFetch.nextFetchOffset());
-                }
-                return records;
-            } else {
-                // these records aren't next in line based on the last consumed offset, ignore them
-                // they must be from an obsolete request
-                LOG.warn(
-                        "Ignoring fetched records for {} at offset {} since the current offset is {}",
-                        nextInLineFetch.tableBucket,
-                        nextInLineFetch.nextFetchOffset(),
-                        offset);
-            }
-        }
-
-        LOG.trace("Draining fetched records for bucket {}", nextInLineFetch.tableBucket);
-        nextInLineFetch.drain();
-
-        return Collections.emptyList();
-    }
-
-    /** Initialize a {@link CompletedFetch} object. */
-    private @Nullable CompletedFetch initialize(CompletedFetch completedFetch) {
-        TableBucket tb = completedFetch.tableBucket;
-        ApiError error = completedFetch.error;
-
-        try {
-            if (error.isSuccess()) {
-                return handleInitializeSuccess(completedFetch);
-            } else {
-                handleInitializeErrors(completedFetch, error.error(), error.messageWithFallback());
-                return null;
-            }
-        } finally {
-            if (error.isFailure()) {
-                // we move the bucket to the end if there was an error. This way,
-                // it's more likely that buckets for the same table can remain together
-                // (allowing for more efficient serialization).
-                logScannerStatus.moveBucketToEnd(tb);
-            }
-        }
-    }
-
-    private @Nullable CompletedFetch handleInitializeSuccess(CompletedFetch completedFetch) {
-        TableBucket tb = completedFetch.tableBucket;
-        long fetchOffset = completedFetch.nextFetchOffset();
-
-        // we are interested in this fetch only if the beginning offset matches the
-        // current consumed position.
-        Long offset = logScannerStatus.getBucketOffset(tb);
-        if (offset == null) {
-            LOG.debug(
-                    "Discarding stale fetch response for bucket {} since the expected offset is null which means the bucket has been "
-                            + "unsubscribed.",
-                    tb);
-            return null;
-        }
-        if (offset != fetchOffset) {
-            LOG.warn(
-                    "Discarding stale fetch response for bucket {} since its offset {} does not match the expected offset {}.",
-                    tb,
-                    fetchOffset,
-                    offset);
-            return null;
-        }
-
-        long highWatermark = completedFetch.highWatermark;
-        if (highWatermark >= 0) {
-            LOG.trace("Updating high watermark for bucket {} to {}.", tb, highWatermark);
-            logScannerStatus.updateHighWatermark(tb, highWatermark);
-        }
-
-        completedFetch.setInitialized();
-        return completedFetch;
-    }
-
-    private void handleInitializeErrors(
-            CompletedFetch completedFetch, Errors error, String errorMessage) {
-        TableBucket tb = completedFetch.tableBucket;
-        long fetchOffset = completedFetch.nextFetchOffset();
-        if (error == Errors.NOT_LEADER_OR_FOLLOWER
-                || error == Errors.LOG_STORAGE_EXCEPTION
-                || error == Errors.KV_STORAGE_EXCEPTION
-                || error == Errors.STORAGE_EXCEPTION
-                || error == Errors.FENCED_LEADER_EPOCH_EXCEPTION) {
-            LOG.debug(
-                    "Error in fetch for bucket {}: {}:{}",
-                    tb,
-                    error.exceptionName(),
-                    error.exception(errorMessage));
-            metadataUpdater.checkAndUpdateMetadata(tablePath, tb);
-        } else if (error == Errors.UNKNOWN_TABLE_OR_BUCKET_EXCEPTION) {
-            LOG.warn("Received unknown table or bucket error in fetch for bucket {}", tb);
-            metadataUpdater.checkAndUpdateMetadata(tablePath, tb);
-        } else if (error == Errors.LOG_OFFSET_OUT_OF_RANGE_EXCEPTION) {
-            throw new FetchException(
-                    String.format(
-                            "The fetching offset %s is out of range: %s",
-                            fetchOffset, error.exception(errorMessage)));
-        } else if (error == Errors.AUTHORIZATION_EXCEPTION) {
-            throw new AuthorizationException(errorMessage);
-        } else if (error == Errors.UNKNOWN_SERVER_ERROR) {
-            LOG.warn(
-                    "Unknown server error while fetching offset {} for bucket {}: {}",
-                    fetchOffset,
-                    tb,
-                    error.exception(errorMessage));
-        } else if (error == Errors.CORRUPT_MESSAGE) {
-            throw new FetchException(
-                    String.format(
-                            "Encountered corrupt message when fetching offset %s for bucket %s: %s",
-                            fetchOffset, tb, error.exception(errorMessage)));
-        } else {
-            throw new FetchException(
-                    String.format(
-                            "Unexpected error code %s while fetching at offset %s from bucket %s: %s",
-                            error, fetchOffset, tb, error.exception(errorMessage)));
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogScan.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogScan.java
deleted file mode 100644
index 2c1316075..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogScan.java
+++ /dev/null
@@ -1,56 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-
-import javax.annotation.Nullable;
-
-/**
- * Used to describe the operation to scan log data by {@link LogScanner} to a table.
- *
- * @since 0.1
- */
-@PublicEvolving
-public class LogScan {
-
-    /** The projected fields to do projection. No projection if is null. */
-    @Nullable private final int[] projectedFields;
-
-    public LogScan() {
-        this(null);
-    }
-
-    private LogScan(@Nullable int[] projectedFields) {
-        this.projectedFields = projectedFields;
-    }
-
-    /**
-     * Returns a new instance of LogScan description with column projection.
-     *
-     * @param projectedFields the projection fields
-     */
-    public LogScan withProjectedFields(int[] projectedFields) {
-        return new LogScan(projectedFields);
-    }
-
-    @Nullable
-    public int[] getProjectedFields() {
-        return projectedFields;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogScanner.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogScanner.java
deleted file mode 100644
index a0c08d940..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogScanner.java
+++ /dev/null
@@ -1,124 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-
-import java.time.Duration;
-
-/**
- * The scanner is used to scan log data of specify table from Fluss.
- *
- * @since 0.1
- */
-@PublicEvolving
-public interface LogScanner extends AutoCloseable {
-
-    /**
-     * The earliest offset to fetch from. Fluss uses "-2" to indicate fetching from log start
-     * offset.
-     */
-    long EARLIEST_OFFSET = -2L;
-
-    /**
-     * Poll log data from tablet server.
-     *
-     * <p>On each poll, scanner will try to use the last scanned offset as the starting offset and
-     * fetch sequentially. The latest offset will be cached in memory, and if there is no offset
-     * cached in memory, scanner will start either from the earliest offset or from the latest
-     * offset for each bucket according to the policy.
-     *
-     * @param timeout the timeout to poll.
-     * @return the result of poll.
-     * @throws java.lang.IllegalStateException if the scanner is not subscribed to any buckets to
-     *     read from.
-     */
-    ScanRecords poll(Duration timeout);
-
-    /**
-     * Subscribe to the given table bucket in given offset dynamically. If the table bucket is
-     * already subscribed, the offset will be updated.
-     *
-     * <p>Please use {@link #subscribe(long, int, long)} to subscribe a partitioned table.
-     *
-     * @param bucket the table bucket to subscribe.
-     * @param offset the offset to start from.
-     * @throws java.lang.IllegalStateException if the table is a partitioned table.
-     */
-    void subscribe(int bucket, long offset);
-
-    /**
-     * Subscribe to the given table buckets from beginning dynamically. If the table bucket is
-     * already subscribed, the start offset will be updated.
-     *
-     * <p>It equals to call {@link #subscribe(int, long)} with offset {@link #EARLIEST_OFFSET} for
-     * the subscribed bucket.
-     *
-     * <p>Please use {@link #subscribeFromBeginning(long, int)} to subscribe a partitioned table.
-     *
-     * @param bucket the table bucket to subscribe.
-     * @throws java.lang.IllegalStateException if the table is a partitioned table.
-     */
-    default void subscribeFromBeginning(int bucket) {
-        subscribe(bucket, EARLIEST_OFFSET);
-    }
-
-    /**
-     * Subscribe to the given partitioned table bucket in given offset dynamically. If the table
-     * bucket is already subscribed, the offset will be updated.
-     *
-     * <p>Please use {@link #subscribe(int, long)} to subscribe a non-partitioned table.
-     *
-     * @param partitionId the partition id of the table partition to subscribe.
-     * @param bucket the table bucket to subscribe.
-     * @param offset the offset to start from.
-     * @throws java.lang.IllegalStateException if the table is a non-partitioned table.
-     */
-    void subscribe(long partitionId, int bucket, long offset);
-
-    /**
-     * Unsubscribe from the given bucket of given partition dynamically.
-     *
-     * @param partitionId the partition id of the table partition to unsubscribe.
-     * @param bucket the table bucket to unsubscribe.
-     * @throws java.lang.IllegalStateException if the table is a non-partitioned table.
-     */
-    void unsubscribe(long partitionId, int bucket);
-
-    /**
-     * Subscribe to the given partitioned table bucket from beginning dynamically. If the table
-     * bucket is already subscribed, the start offset will be updated.
-     *
-     * <p>It equals to call {@link #subscribe(long, int, long)} with offset {@link #EARLIEST_OFFSET}
-     * for the subscribed bucket.
-     *
-     * <p>Please use {@link #subscribeFromBeginning(int)} to subscribe a non-partitioned table.
-     *
-     * @param bucket the table bucket to subscribe.
-     * @throws java.lang.IllegalStateException if the table is a non-partitioned table.
-     */
-    default void subscribeFromBeginning(long partitionId, int bucket) {
-        subscribe(partitionId, bucket, EARLIEST_OFFSET);
-    }
-
-    /**
-     * Wake up the log scanner in case the fetcher thread in log scanner is blocking in {@link
-     * #poll(Duration timeout)}.
-     */
-    void wakeup();
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogScannerStatus.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogScannerStatus.java
deleted file mode 100644
index 42e4e8435..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/LogScannerStatus.java
+++ /dev/null
@@ -1,104 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.utils.log.FairBucketStatusMap;
-
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.ThreadSafe;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Predicate;
-
-/** The status of a {@link LogScanner}. */
-@ThreadSafe
-@Internal
-public class LogScannerStatus {
-    private final FairBucketStatusMap<BucketScanStatus> bucketStatusMap;
-
-    public LogScannerStatus() {
-        this.bucketStatusMap = new FairBucketStatusMap<>();
-    }
-
-    synchronized boolean prepareToPoll() {
-        return bucketStatusMap.size() > 0;
-    }
-
-    synchronized void moveBucketToEnd(TableBucket tableBucket) {
-        bucketStatusMap.moveToEnd(tableBucket);
-    }
-
-    /** Return the offset of the bucket, if the bucket have been unsubscribed, return null. */
-    synchronized @Nullable Long getBucketOffset(TableBucket tableBucket) {
-        BucketScanStatus bucketScanStatus = bucketStatus(tableBucket);
-        if (bucketScanStatus == null) {
-            return null;
-        } else {
-            return bucketScanStatus.getOffset();
-        }
-    }
-
-    synchronized void updateHighWatermark(TableBucket tableBucket, long highWatermark) {
-        bucketStatus(tableBucket).setHighWatermark(highWatermark);
-    }
-
-    synchronized void updateOffset(TableBucket tableBucket, long offset) {
-        bucketStatus(tableBucket).setOffset(offset);
-    }
-
-    synchronized void assignScanBuckets(Map<TableBucket, Long> scanBucketAndOffsets) {
-        for (Map.Entry<TableBucket, Long> entry : scanBucketAndOffsets.entrySet()) {
-            TableBucket scanBucket = entry.getKey();
-            long offset = entry.getValue();
-            BucketScanStatus bucketScanStatus = bucketStatusMap.statusValue(scanBucket);
-            if (bucketScanStatus == null) {
-                bucketScanStatus = new BucketScanStatus(offset);
-            } else {
-                bucketScanStatus.setOffset(offset);
-            }
-            bucketStatusMap.update(scanBucket, bucketScanStatus);
-        }
-    }
-
-    synchronized void unassignScanBuckets(List<TableBucket> buckets) {
-        for (TableBucket bucket : buckets) {
-            bucketStatusMap.remove(bucket);
-        }
-    }
-
-    synchronized List<TableBucket> fetchableBuckets(Predicate<TableBucket> isAvailable) {
-        // Since this is in the hot-path for fetching, we do this instead of using java.util.stream
-        // API
-        List<TableBucket> result = new ArrayList<>();
-        bucketStatusMap.forEach(
-                ((tableBucket, bucketScanStatus) -> {
-                    if (isAvailable.test(tableBucket)) {
-                        result.add(tableBucket);
-                    }
-                }));
-        return result;
-    }
-
-    private BucketScanStatus bucketStatus(TableBucket tableBucket) {
-        return bucketStatusMap.statusValue(tableBucket);
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/PendingFetch.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/PendingFetch.java
deleted file mode 100644
index 2bc4d4837..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/PendingFetch.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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.metadata.TableBucket;
-
-/**
- * A pending fetch is a fetch that requested to download remote log segment file to local but not
- * yet been completed.
- */
-interface PendingFetch {
-
-    TableBucket tableBucket();
-
-    boolean isCompleted();
-
-    CompletedFetch toCompletedFetch();
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/RemoteCompletedFetch.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/RemoteCompletedFetch.java
deleted file mode 100644
index 1ea8c5ae9..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/RemoteCompletedFetch.java
+++ /dev/null
@@ -1,75 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.annotation.Internal;
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.record.FileLogRecords;
-import com.alibaba.fluss.record.LogRecordReadContext;
-import com.alibaba.fluss.rpc.protocol.ApiError;
-
-import java.io.IOException;
-
-/**
- * {@link RemoteCompletedFetch} is a {@link CompletedFetch} that represents a completed fetch that
- * the log records are fetched from remote log storage.
- */
-@Internal
-class RemoteCompletedFetch extends CompletedFetch {
-
-    private final FileLogRecords fileLogRecords;
-
-    // recycle to clean up the fetched remote log files and increment the prefetch semaphore
-    private final Runnable recycleCallback;
-
-    RemoteCompletedFetch(
-            TableBucket tableBucket,
-            FileLogRecords fileLogRecords,
-            long highWatermark,
-            LogRecordReadContext readContext,
-            LogScannerStatus logScannerStatus,
-            boolean isCheckCrc,
-            long fetchOffset,
-            Runnable recycleCallback) {
-        super(
-                tableBucket,
-                ApiError.NONE,
-                fileLogRecords.sizeInBytes(),
-                highWatermark,
-                fileLogRecords.batches().iterator(),
-                readContext,
-                logScannerStatus,
-                isCheckCrc,
-                fetchOffset);
-        this.fileLogRecords = fileLogRecords;
-        this.recycleCallback = recycleCallback;
-    }
-
-    @Override
-    void drain() {
-        super.drain();
-        // close file channel only, don't need to flush the file which is very heavy
-        try {
-            fileLogRecords.closeHandlers();
-        } catch (IOException e) {
-            LOG.warn("Failed to close file channel for remote log records", e);
-        }
-        // call recycle to remove the fetched files and increment the prefetch semaphore
-        recycleCallback.run();
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/RemoteLogDownloadFuture.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/RemoteLogDownloadFuture.java
deleted file mode 100644
index c135033ce..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/RemoteLogDownloadFuture.java
+++ /dev/null
@@ -1,63 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.exception.FlussRuntimeException;
-import com.alibaba.fluss.record.FileLogRecords;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.concurrent.CompletableFuture;
-
-/** Represents the future of a remote log download request. */
-public class RemoteLogDownloadFuture {
-
-    private final CompletableFuture<File> logFileFuture;
-    private final Runnable recycleCallback;
-
-    public RemoteLogDownloadFuture(
-            CompletableFuture<File> logFileFuture, Runnable recycleCallback) {
-        this.logFileFuture = logFileFuture;
-        this.recycleCallback = recycleCallback;
-    }
-
-    public boolean isDone() {
-        return logFileFuture.isDone();
-    }
-
-    public FileLogRecords getFileLogRecords(int startPosition) {
-        try {
-            FileLogRecords fileLogRecords = FileLogRecords.open(logFileFuture.join(), false);
-            if (startPosition > 0) {
-                return fileLogRecords.slice(startPosition, Integer.MAX_VALUE);
-            } else {
-                return fileLogRecords;
-            }
-        } catch (IOException e) {
-            throw new FlussRuntimeException(e);
-        }
-    }
-
-    public Runnable getRecycleCallback() {
-        return recycleCallback;
-    }
-
-    public void onComplete(Runnable callback) {
-        logFileFuture.thenRun(callback);
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/RemotePendingFetch.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/RemotePendingFetch.java
deleted file mode 100644
index c61fcc56a..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/RemotePendingFetch.java
+++ /dev/null
@@ -1,97 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.record.FileLogRecords;
-import com.alibaba.fluss.record.LogRecordReadContext;
-import com.alibaba.fluss.remote.RemoteLogSegment;
-
-/**
- * {@link RemotePendingFetch} is a {@link PendingFetch} that represents a pending fetch that waiting
- * for the remote log file fetched to local disk.
- */
-class RemotePendingFetch implements PendingFetch {
-
-    final RemoteLogSegment remoteLogSegment;
-    private final RemoteLogDownloadFuture downloadFuture;
-
-    private final int posInLogSegment;
-    private final long fetchOffset;
-    private final long highWatermark;
-    private final LogRecordReadContext readContext;
-    private final LogScannerStatus logScannerStatus;
-    private final boolean isCheckCrc;
-
-    RemotePendingFetch(
-            RemoteLogSegment remoteLogSegment,
-            RemoteLogDownloadFuture downloadFuture,
-            int posInLogSegment,
-            long fetchOffset,
-            long highWatermark,
-            LogRecordReadContext readContext,
-            LogScannerStatus logScannerStatus,
-            boolean isCheckCrc) {
-        this.remoteLogSegment = remoteLogSegment;
-        this.downloadFuture = downloadFuture;
-        this.posInLogSegment = posInLogSegment;
-        this.fetchOffset = fetchOffset;
-        this.highWatermark = highWatermark;
-        this.readContext = readContext;
-        this.logScannerStatus = logScannerStatus;
-        this.isCheckCrc = isCheckCrc;
-    }
-
-    @Override
-    public TableBucket tableBucket() {
-        return remoteLogSegment.tableBucket();
-    }
-
-    @Override
-    public boolean isCompleted() {
-        return downloadFuture.isDone();
-    }
-
-    @Override
-    public CompletedFetch toCompletedFetch() {
-        FileLogRecords fileLogRecords = downloadFuture.getFileLogRecords(posInLogSegment);
-        return new RemoteCompletedFetch(
-                remoteLogSegment.tableBucket(),
-                fileLogRecords,
-                highWatermark,
-                readContext,
-                logScannerStatus,
-                isCheckCrc,
-                fetchOffset,
-                downloadFuture.getRecycleCallback());
-    }
-
-    @Override
-    public String toString() {
-        return "RemotePendingFetch{"
-                + "remoteLogSegment="
-                + remoteLogSegment
-                + ", fetchOffset="
-                + fetchOffset
-                + ", posInLogSegment="
-                + posInLogSegment
-                + ", highWatermark="
-                + highWatermark
-                + '}';
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/ScanRecords.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/ScanRecords.java
deleted file mode 100644
index 58ff0d6ae..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/scanner/log/ScanRecords.java
+++ /dev/null
@@ -1,116 +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 com.alibaba.fluss.client.table.scanner.log;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.client.table.scanner.ScanRecord;
-import com.alibaba.fluss.metadata.TableBucket;
-import com.alibaba.fluss.utils.AbstractIterator;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A container that holds the list {@link ScanRecord} per bucket for a particular table. There is
- * one {@link ScanRecord} list for every bucket returned by a {@link
- * LogScanner#poll(java.time.Duration)} operation.
- *
- * @since 0.1
- */
-@PublicEvolving
-public class ScanRecords implements Iterable<ScanRecord> {
-    public static final ScanRecords EMPTY = new ScanRecords(Collections.emptyMap());
-
-    private final Map<TableBucket, List<ScanRecord>> records;
-
-    public ScanRecords(Map<TableBucket, List<ScanRecord>> records) {
-        this.records = records;
-    }
-
-    /**
-     * Get just the records for the given bucketId.
-     *
-     * @param scanBucket The bucket to get records for
-     */
-    public List<ScanRecord> records(TableBucket scanBucket) {
-        List<ScanRecord> recs = records.get(scanBucket);
-        if (recs == null) {
-            return Collections.emptyList();
-        }
-        return Collections.unmodifiableList(recs);
-    }
-
-    /**
-     * Get the bucket ids which have records contained in this record set.
-     *
-     * @return the set of partitions with data in this record set (maybe empty if no data was
-     *     returned)
-     */
-    public Set<TableBucket> buckets() {
-        return Collections.unmodifiableSet(records.keySet());
-    }
-
-    /** The number of records for all buckets. */
-    public int count() {
-        int count = 0;
-        for (List<ScanRecord> recs : records.values()) {
-            count += recs.size();
-        }
-        return count;
-    }
-
-    public boolean isEmpty() {
-        return records.isEmpty();
-    }
-
-    @Override
-    public Iterator<ScanRecord> iterator() {
-        return new ConcatenatedIterable(records.values()).iterator();
-    }
-
-    private static class ConcatenatedIterable implements Iterable<ScanRecord> {
-
-        private final Iterable<? extends Iterable<ScanRecord>> iterables;
-
-        public ConcatenatedIterable(Iterable<? extends Iterable<ScanRecord>> iterables) {
-            this.iterables = iterables;
-        }
-
-        @Override
-        public Iterator<ScanRecord> iterator() {
-            return new AbstractIterator<ScanRecord>() {
-                final Iterator<? extends Iterable<ScanRecord>> iters = iterables.iterator();
-                Iterator<ScanRecord> current;
-
-                public ScanRecord makeNext() {
-                    while (current == null || !current.hasNext()) {
-                        if (iters.hasNext()) {
-                            current = iters.next().iterator();
-                        } else {
-                            return allDone();
-                        }
-                    }
-                    return current.next();
-                }
-            };
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AbstractTableWriter.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AbstractTableWriter.java
deleted file mode 100644
index 0de28284e..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AbstractTableWriter.java
+++ /dev/null
@@ -1,99 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.client.table.getter.PartitionGetter;
-import com.alibaba.fluss.client.write.WriteRecord;
-import com.alibaba.fluss.client.write.WriterClient;
-import com.alibaba.fluss.config.ConfigOptions;
-import com.alibaba.fluss.metadata.PhysicalTablePath;
-import com.alibaba.fluss.metadata.TableInfo;
-import com.alibaba.fluss.metadata.TablePath;
-import com.alibaba.fluss.row.InternalRow;
-
-import javax.annotation.Nullable;
-
-import java.util.concurrent.CompletableFuture;
-
-/** A base class for {@link AppendWriter} and {@link UpsertWriter} to write data to table. */
-public abstract class AbstractTableWriter implements TableWriter {
-
-    // the table path that the data will write to
-    protected final TablePath tablePath;
-    protected final WriterClient writerClient;
-    protected final int fieldCount;
-    private final @Nullable PartitionGetter partitionFieldGetter;
-
-    protected AbstractTableWriter(
-            TablePath tablePath, TableInfo tableInfo, WriterClient writerClient) {
-        this.tablePath = tablePath;
-        this.writerClient = writerClient;
-        this.fieldCount = tableInfo.getRowType().getFieldCount();
-        this.partitionFieldGetter =
-                tableInfo.isPartitioned()
-                        ? new PartitionGetter(tableInfo.getRowType(), tableInfo.getPartitionKeys())
-                        : null;
-    }
-
-    /**
-     * Flush data written that have not yet been sent to the server, forcing the client to send the
-     * requests to server and blocks on the completion of the requests associated with these
-     * records. A request is considered completed when it is successfully acknowledged according to
-     * the {@link ConfigOptions#CLIENT_WRITER_ACKS} configuration you have specified or else it
-     * results in an error.
-     */
-    public void flush() {
-        writerClient.flush();
-    }
-
-    protected CompletableFuture<Void> send(WriteRecord record) {
-        CompletableFuture<Void> future = new CompletableFuture<>();
-        writerClient.send(
-                record,
-                (exception) -> {
-                    if (exception == null) {
-                        future.complete(null);
-                    } else {
-                        future.completeExceptionally(exception);
-                    }
-                });
-        return future;
-    }
-
-    protected PhysicalTablePath getPhysicalPath(InternalRow row) {
-        // not partitioned table, return the original physical path
-        if (partitionFieldGetter == null) {
-            return PhysicalTablePath.of(tablePath);
-        } else {
-            // partitioned table, extract partition from the row
-            String partition = partitionFieldGetter.getPartition(row);
-            return PhysicalTablePath.of(tablePath, partition);
-        }
-    }
-
-    protected void checkFieldCount(InternalRow row) {
-        if (row.getFieldCount() != fieldCount) {
-            throw new IllegalArgumentException(
-                    "The field count of the row does not match the table schema. "
-                            + "Expected: "
-                            + fieldCount
-                            + ", Actual: "
-                            + row.getFieldCount());
-        }
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/Append.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/Append.java
deleted file mode 100644
index fa58949c3..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/Append.java
+++ /dev/null
@@ -1,37 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-
-/**
- * Used to configure and create a {@link AppendWriter} to write data to a Log Table.
- *
- * <p>{@link Append} objects are immutable and can be shared between threads.
- *
- * @since 0.6
- */
-@PublicEvolving
-public interface Append {
-
-    // TODO: Add more methods to configure the AppendWriter, such as apply static partitions,
-    //  apply overwrites, etc.
-
-    /** Create a new {@link AppendWriter} to write data to a Log Table. */
-    AppendWriter createWriter();
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AppendResult.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AppendResult.java
deleted file mode 100644
index 3b3a7ea9a..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AppendResult.java
+++ /dev/null
@@ -1,32 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.row.InternalRow;
-
-/**
- * The result of appending a record ({@link AppendWriter#append(InternalRow)}).
- *
- * @since 0.6
- */
-@PublicEvolving
-public class AppendResult {
-    // currently, it's an empty class, it will be a compatible evolution if it extends
-    // to have offset, timestamp, etc. in the future
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AppendWriter.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AppendWriter.java
deleted file mode 100644
index 1da2de207..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AppendWriter.java
+++ /dev/null
@@ -1,40 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.row.InternalRow;
-
-import java.util.concurrent.CompletableFuture;
-
-/**
- * The writer to write data to the log table.
- *
- * @since 0.2
- */
-@PublicEvolving
-public interface AppendWriter extends TableWriter {
-
-    /**
-     * Append row into a Log Table.
-     *
-     * @param row the row to append.
-     * @return A {@link CompletableFuture} that always returns append result when complete normally.
-     */
-    CompletableFuture<AppendResult> append(InternalRow row);
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AppendWriterImpl.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AppendWriterImpl.java
deleted file mode 100644
index bcfce0023..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/AppendWriterImpl.java
+++ /dev/null
@@ -1,99 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.client.write.WriteRecord;
-import com.alibaba.fluss.client.write.WriterClient;
-import com.alibaba.fluss.metadata.DataLakeFormat;
-import com.alibaba.fluss.metadata.LogFormat;
-import com.alibaba.fluss.metadata.PhysicalTablePath;
-import com.alibaba.fluss.metadata.TableInfo;
-import com.alibaba.fluss.metadata.TablePath;
-import com.alibaba.fluss.row.InternalRow;
-import com.alibaba.fluss.row.InternalRow.FieldGetter;
-import com.alibaba.fluss.row.encode.IndexedRowEncoder;
-import com.alibaba.fluss.row.encode.KeyEncoder;
-import com.alibaba.fluss.row.indexed.IndexedRow;
-import com.alibaba.fluss.types.RowType;
-
-import javax.annotation.Nullable;
-
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-/** The writer to write data to the log table. */
-class AppendWriterImpl extends AbstractTableWriter implements AppendWriter {
-    private static final AppendResult APPEND_SUCCESS = new AppendResult();
-
-    private final @Nullable KeyEncoder bucketKeyEncoder;
-
-    private final LogFormat logFormat;
-    private final IndexedRowEncoder indexedRowEncoder;
-    private final FieldGetter[] fieldGetters;
-
-    AppendWriterImpl(TablePath tablePath, TableInfo tableInfo, WriterClient writerClient) {
-        super(tablePath, tableInfo, writerClient);
-        List<String> bucketKeys = tableInfo.getBucketKeys();
-        if (bucketKeys.isEmpty()) {
-            this.bucketKeyEncoder = null;
-        } else {
-            RowType rowType = tableInfo.getSchema().getRowType();
-            DataLakeFormat lakeFormat = tableInfo.getTableConfig().getDataLakeFormat().orElse(null);
-            this.bucketKeyEncoder = KeyEncoder.of(rowType, bucketKeys, lakeFormat);
-        }
-
-        this.logFormat = tableInfo.getTableConfig().getLogFormat();
-        this.indexedRowEncoder = new IndexedRowEncoder(tableInfo.getRowType());
-        this.fieldGetters = InternalRow.createFieldGetters(tableInfo.getRowType());
-    }
-
-    /**
-     * Append row into Fluss non-pk table.
-     *
-     * @param row the row to append.
-     * @return A {@link CompletableFuture} that always returns null when complete normally.
-     */
-    public CompletableFuture<AppendResult> append(InternalRow row) {
-        checkFieldCount(row);
-
-        PhysicalTablePath physicalPath = getPhysicalPath(row);
-        byte[] bucketKey = bucketKeyEncoder != null ? bucketKeyEncoder.encodeKey(row) : null;
-
-        final WriteRecord record;
-        if (logFormat == LogFormat.INDEXED) {
-            IndexedRow indexedRow = encodeIndexedRow(row);
-            record = WriteRecord.forIndexedAppend(physicalPath, indexedRow, bucketKey);
-        } else {
-            // ARROW format supports general internal row
-            record = WriteRecord.forArrowAppend(physicalPath, row, bucketKey);
-        }
-        return send(record).thenApply(ignored -> APPEND_SUCCESS);
-    }
-
-    private IndexedRow encodeIndexedRow(InternalRow row) {
-        if (row instanceof IndexedRow) {
-            return (IndexedRow) row;
-        }
-
-        indexedRowEncoder.startNewRow();
-        for (int i = 0; i < fieldCount; i++) {
-            indexedRowEncoder.encodeField(i, fieldGetters[i].getFieldOrNull(row));
-        }
-        return indexedRowEncoder.finishRow();
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/DeleteResult.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/DeleteResult.java
deleted file mode 100644
index 9422dbbc5..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/DeleteResult.java
+++ /dev/null
@@ -1,32 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.row.InternalRow;
-
-/**
- * The result of deleting a record ({@link UpsertWriter#delete(InternalRow)}.
- *
- * @since 0.6
- */
-@PublicEvolving
-public class DeleteResult {
-    // currently, it's an empty class, it will be a compatible evolution if it extends
-    // to have offset, timestamp, etc. in the future
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/TableAppend.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/TableAppend.java
deleted file mode 100644
index 6a29ccf69..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/TableAppend.java
+++ /dev/null
@@ -1,41 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.client.write.WriterClient;
-import com.alibaba.fluss.metadata.TableInfo;
-import com.alibaba.fluss.metadata.TablePath;
-
-/** API for configuring and creating {@link AppendWriter}. */
-public class TableAppend implements Append {
-
-    private final TablePath tablePath;
-    private final TableInfo tableInfo;
-    private final WriterClient writerClient;
-
-    public TableAppend(TablePath tablePath, TableInfo tableInfo, WriterClient writerClient) {
-        this.tablePath = tablePath;
-        this.tableInfo = tableInfo;
-        this.writerClient = writerClient;
-    }
-
-    @Override
-    public AppendWriter createWriter() {
-        return new AppendWriterImpl(tablePath, tableInfo, writerClient);
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/TableUpsert.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/TableUpsert.java
deleted file mode 100644
index 7ff451b36..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/TableUpsert.java
+++ /dev/null
@@ -1,98 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.client.write.WriterClient;
-import com.alibaba.fluss.metadata.TableInfo;
-import com.alibaba.fluss.metadata.TablePath;
-import com.alibaba.fluss.types.RowType;
-
-import javax.annotation.Nullable;
-
-import static com.alibaba.fluss.utils.Preconditions.checkNotNull;
-
-/** API for configuring and creating {@link UpsertWriter}. */
-public class TableUpsert implements Upsert {
-
-    private final TablePath tablePath;
-    private final TableInfo tableInfo;
-    private final WriterClient writerClient;
-
-    private final @Nullable int[] targetColumns;
-
-    public TableUpsert(TablePath tablePath, TableInfo tableInfo, WriterClient writerClient) {
-        this(tablePath, tableInfo, writerClient, null);
-    }
-
-    private TableUpsert(
-            TablePath tablePath,
-            TableInfo tableInfo,
-            WriterClient writerClient,
-            @Nullable int[] targetColumns) {
-        this.tablePath = tablePath;
-        this.tableInfo = tableInfo;
-        this.writerClient = writerClient;
-        this.targetColumns = targetColumns;
-    }
-
-    @Override
-    public Upsert partialUpdate(@Nullable int[] targetColumns) {
-        // check if the target columns are valid and throw pretty exception messages
-        if (targetColumns != null) {
-            int numColumns = tableInfo.getRowType().getFieldCount();
-            for (int targetColumn : targetColumns) {
-                if (targetColumn < 0 || targetColumn >= numColumns) {
-                    throw new IllegalArgumentException(
-                            "Invalid target column index: "
-                                    + targetColumn
-                                    + " for table "
-                                    + tablePath
-                                    + ". The table only has "
-                                    + numColumns
-                                    + " columns.");
-                }
-            }
-        }
-        return new TableUpsert(tablePath, tableInfo, writerClient, targetColumns);
-    }
-
-    @Override
-    public Upsert partialUpdate(String... targetColumnNames) {
-        checkNotNull(targetColumnNames, "targetColumnNames");
-        // check if the target columns are valid
-        RowType rowType = tableInfo.getRowType();
-        int[] targetColumns = new int[targetColumnNames.length];
-        for (int i = 0; i < targetColumnNames.length; i++) {
-            targetColumns[i] = rowType.getFieldIndex(targetColumnNames[i]);
-            if (targetColumns[i] == -1) {
-                throw new IllegalArgumentException(
-                        "Can not find target column: "
-                                + targetColumnNames[i]
-                                + " for table "
-                                + tablePath
-                                + ".");
-            }
-        }
-        return partialUpdate(targetColumns);
-    }
-
-    @Override
-    public UpsertWriter createWriter() {
-        return new UpsertWriterImpl(tablePath, tableInfo, targetColumns, writerClient);
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/TableWriter.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/TableWriter.java
deleted file mode 100644
index 4036e27d8..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/TableWriter.java
+++ /dev/null
@@ -1,41 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.config.ConfigOptions;
-
-/**
- * A writer to write data to a Fluss table.
- *
- * <p>A base interface for {@link AppendWriter} and {@link UpsertWriter} to write data to table.
- *
- * @since 0.1
- */
-@PublicEvolving
-public interface TableWriter {
-
-    /**
-     * Flush data written that have not yet been sent to the server, forcing the client to send the
-     * requests to server and blocks on the completion of the requests associated with these
-     * records. A request is considered completed when it is successfully acknowledged according to
-     * the {@link ConfigOptions#CLIENT_WRITER_ACKS} configuration you have specified or else it
-     * results in an error.
-     */
-    void flush();
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/Upsert.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/Upsert.java
deleted file mode 100644
index 02970a450..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/Upsert.java
+++ /dev/null
@@ -1,67 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.row.InternalRow;
-
-import javax.annotation.Nullable;
-
-/**
- * Used to configure and create {@link UpsertWriter} to upsert and delete data to a Primary Key
- * Table.
- *
- * <p>{@link Upsert} objects are immutable and can be shared between threads. Refinement methods,
- * like {@link #partialUpdate}, create new Upsert instances.
- *
- * @since 0.6
- */
-@PublicEvolving
-public interface Upsert {
-
-    /**
-     * Apply partial update columns and returns a new Upsert instance.
-     *
-     * <p>For {@link UpsertWriter#upsert(InternalRow)} operation, only the specified columns will be
-     * updated and other columns will remain unchanged if the row exists or set to null if the row
-     * doesn't exist.
-     *
-     * <p>For {@link UpsertWriter#delete(InternalRow)} operation, the entire row will not be
-     * removed, but only the specified columns except primary key will be set to null. The entire
-     * row will be removed when all columns except primary key are null after a {@link
-     * UpsertWriter#delete(InternalRow)} operation.
-     *
-     * <p>Note: The specified columns must be a contains all columns of primary key, and all columns
-     * except primary key should be nullable.
-     *
-     * @param targetColumns the column indexes to partial update
-     */
-    Upsert partialUpdate(@Nullable int[] targetColumns);
-
-    /**
-     * @see #partialUpdate(int[]) for more details.
-     * @param targetColumnNames the column names to partial update
-     */
-    Upsert partialUpdate(String... targetColumnNames);
-
-    /**
-     * Create a new {@link UpsertWriter} with the optional {@link #partialUpdate(String...)}
-     * information to upsert and delete data to a Primary Key Table.
-     */
-    UpsertWriter createWriter();
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertResult.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertResult.java
deleted file mode 100644
index bacb7bbb8..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertResult.java
+++ /dev/null
@@ -1,32 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.row.InternalRow;
-
-/**
- * The result of upserting a record ({@link UpsertWriter#upsert(InternalRow)}).
- *
- * @since 0.6
- */
-@PublicEvolving
-public class UpsertResult {
-    // currently, it's an empty class, it will be a compatible evolution if it extends
-    // to have offset, timestamp, etc. in the future
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertWrite.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertWrite.java
deleted file mode 100644
index 9e4078ed7..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertWrite.java
+++ /dev/null
@@ -1,75 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.row.InternalRow;
-
-import javax.annotation.Nullable;
-
-import static com.alibaba.fluss.utils.Preconditions.checkNotNull;
-
-/**
- * Used to describe the operation to write data by {@link UpsertWriter} to a table.
- *
- * @since 0.2
- */
-@PublicEvolving
-public class UpsertWrite {
-
-    private final @Nullable int[] targetColumns;
-
-    public UpsertWrite() {
-        this(null);
-    }
-
-    private UpsertWrite(@Nullable int[] targetColumns) {
-        this.targetColumns = targetColumns;
-    }
-
-    /**
-     * Returns a new instance of UpsertWrite description with partial update the specified columns.
-     *
-     * <p>For {@link UpsertWriter#upsert(InternalRow)} operation, only the specified columns will be
-     * updated and other columns will remain unchanged if the row exists or set to null if the row
-     * doesn't exist.
-     *
-     * <p>For {@link UpsertWriter#delete(InternalRow)} operation, the entire row will not be
-     * removed, but only the specified columns except primary key will be set to null. The entire
-     * row will be removed when all columns except primary key are null after a {@link
-     * UpsertWriter#delete(InternalRow)} operation.
-     *
-     * <p>Note: The specified columns must be a contains all columns of primary key, and all columns
-     * except primary key should be nullable.
-     *
-     * @param targetColumns the columns to partial update,
-     */
-    public UpsertWrite withPartialUpdate(int[] targetColumns) {
-        checkNotNull(targetColumns, "targetColumns");
-        return new UpsertWrite(targetColumns);
-    }
-
-    /**
-     * Returns the columns to partial update. Returns null if update all columns.
-     *
-     * @return the columns to partial update.
-     */
-    public @Nullable int[] getPartialUpdateColumns() {
-        return targetColumns;
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertWriter.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertWriter.java
deleted file mode 100644
index 215d472d8..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertWriter.java
+++ /dev/null
@@ -1,49 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.annotation.PublicEvolving;
-import com.alibaba.fluss.row.InternalRow;
-
-import java.util.concurrent.CompletableFuture;
-
-/**
- * The writer to write data to the primary key table.
- *
- * @since 0.2
- */
-@PublicEvolving
-public interface UpsertWriter extends TableWriter {
-
-    /**
-     * Inserts row into Fluss table if they do not already exist, or updates them if they do exist.
-     *
-     * @param row the row to upsert.
-     * @return A {@link CompletableFuture} that always returns upsert result when complete normally.
-     */
-    CompletableFuture<UpsertResult> upsert(InternalRow row);
-
-    /**
-     * Delete certain row by the input row in Fluss table, the input row must contain the primary
-     * key.
-     *
-     * @param row the row to delete.
-     * @return A {@link CompletableFuture} that always delete result when complete normally.
-     */
-    CompletableFuture<DeleteResult> delete(InternalRow row);
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertWriterImpl.java b/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertWriterImpl.java
deleted file mode 100644
index e9d83c8c3..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/table/writer/UpsertWriterImpl.java
+++ /dev/null
@@ -1,167 +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 com.alibaba.fluss.client.table.writer;
-
-import com.alibaba.fluss.client.write.WriteRecord;
-import com.alibaba.fluss.client.write.WriterClient;
-import com.alibaba.fluss.metadata.DataLakeFormat;
-import com.alibaba.fluss.metadata.KvFormat;
-import com.alibaba.fluss.metadata.TableInfo;
-import com.alibaba.fluss.metadata.TablePath;
-import com.alibaba.fluss.row.BinaryRow;
-import com.alibaba.fluss.row.InternalRow;
-import com.alibaba.fluss.row.InternalRow.FieldGetter;
-import com.alibaba.fluss.row.compacted.CompactedRow;
-import com.alibaba.fluss.row.encode.KeyEncoder;
-import com.alibaba.fluss.row.encode.RowEncoder;
-import com.alibaba.fluss.row.indexed.IndexedRow;
-import com.alibaba.fluss.types.RowType;
-
-import javax.annotation.Nullable;
-
-import java.util.BitSet;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-/** The writer to write data to the primary key table. */
-class UpsertWriterImpl extends AbstractTableWriter implements UpsertWriter {
-    private static final UpsertResult UPSERT_SUCCESS = new UpsertResult();
-    private static final DeleteResult DELETE_SUCCESS = new DeleteResult();
-
-    private final KeyEncoder primaryKeyEncoder;
-    private final @Nullable int[] targetColumns;
-
-    // same to primaryKeyEncoder if the bucket key is the same to the primary key
-    private final KeyEncoder bucketKeyEncoder;
-
-    private final KvFormat kvFormat;
-    private final RowEncoder rowEncoder;
-    private final FieldGetter[] fieldGetters;
-
-    UpsertWriterImpl(
-            TablePath tablePath,
-            TableInfo tableInfo,
-            @Nullable int[] partialUpdateColumns,
-            WriterClient writerClient) {
-        super(tablePath, tableInfo, writerClient);
-        RowType rowType = tableInfo.getRowType();
-        sanityCheck(rowType, tableInfo.getPrimaryKeys(), partialUpdateColumns);
-
-        this.targetColumns = partialUpdateColumns;
-        DataLakeFormat lakeFormat = tableInfo.getTableConfig().getDataLakeFormat().orElse(null);
-        // encode primary key using physical primary key
-        this.primaryKeyEncoder =
-                KeyEncoder.of(rowType, tableInfo.getPhysicalPrimaryKeys(), lakeFormat);
-        this.bucketKeyEncoder =
-                tableInfo.isDefaultBucketKey()
-                        ? primaryKeyEncoder
-                        : KeyEncoder.of(rowType, tableInfo.getBucketKeys(), lakeFormat);
-
-        this.kvFormat = tableInfo.getTableConfig().getKvFormat();
-        this.rowEncoder = RowEncoder.create(kvFormat, rowType);
-        this.fieldGetters = InternalRow.createFieldGetters(rowType);
-    }
-
-    private static void sanityCheck(
-            RowType rowType, List<String> primaryKeys, @Nullable int[] targetColumns) {
-        // skip check when target columns is null
-        if (targetColumns == null) {
-            return;
-        }
-        BitSet targetColumnsSet = new BitSet();
-        for (int targetColumnIndex : targetColumns) {
-            targetColumnsSet.set(targetColumnIndex);
-        }
-
-        BitSet pkColumnSet = new BitSet();
-        // check the target columns contains the primary key
-        for (String key : primaryKeys) {
-            int pkIndex = rowType.getFieldIndex(key);
-            if (!targetColumnsSet.get(pkIndex)) {
-                throw new IllegalArgumentException(
-                        String.format(
-                                "The target write columns %s must contain the primary key columns %s.",
-                                rowType.project(targetColumns).getFieldNames(), primaryKeys));
-            }
-            pkColumnSet.set(pkIndex);
-        }
-
-        // check the columns not in targetColumns should be nullable
-        for (int i = 0; i < rowType.getFieldCount(); i++) {
-            // column not in primary key
-            if (!pkColumnSet.get(i)) {
-                // the column should be nullable
-                if (!rowType.getTypeAt(i).isNullable()) {
-                    throw new IllegalArgumentException(
-                            String.format(
-                                    "Partial Update requires all columns except primary key to be nullable, but column %s is NOT NULL.",
-                                    rowType.getFieldNames().get(i)));
-                }
-            }
-        }
-    }
-
-    /**
-     * Inserts row into Fluss table if they do not already exist, or updates them if they do exist.
-     *
-     * @param row the row to upsert.
-     * @return A {@link CompletableFuture} that always returns null when complete normally.
-     */
-    public CompletableFuture<UpsertResult> upsert(InternalRow row) {
-        checkFieldCount(row);
-        byte[] key = primaryKeyEncoder.encodeKey(row);
-        byte[] bucketKey =
-                bucketKeyEncoder == primaryKeyEncoder ? key : bucketKeyEncoder.encodeKey(row);
-        WriteRecord record =
-                WriteRecord.forUpsert(
-                        getPhysicalPath(row), encodeRow(row), key, bucketKey, targetColumns);
-        return send(record).thenApply(ignored -> UPSERT_SUCCESS);
-    }
-
-    /**
-     * Delete certain row by the input row in Fluss table, the input row must contain the primary
-     * key.
-     *
-     * @param row the row to delete.
-     * @return A {@link CompletableFuture} that always returns null when complete normally.
-     */
-    public CompletableFuture<DeleteResult> delete(InternalRow row) {
-        checkFieldCount(row);
-        byte[] key = primaryKeyEncoder.encodeKey(row);
-        byte[] bucketKey =
-                bucketKeyEncoder == primaryKeyEncoder ? key : bucketKeyEncoder.encodeKey(row);
-        WriteRecord record =
-                WriteRecord.forDelete(getPhysicalPath(row), key, bucketKey, targetColumns);
-        return send(record).thenApply(ignored -> DELETE_SUCCESS);
-    }
-
-    private BinaryRow encodeRow(InternalRow row) {
-        if (kvFormat == KvFormat.INDEXED && row instanceof IndexedRow) {
-            return (IndexedRow) row;
-        } else if (kvFormat == KvFormat.COMPACTED && row instanceof CompactedRow) {
-            return (CompactedRow) row;
-        }
-
-        // encode the row to target format
-        rowEncoder.startNewRow();
-        for (int i = 0; i < fieldCount; i++) {
-            rowEncoder.encodeField(i, fieldGetters[i].getFieldOrNull(row));
-        }
-        return rowEncoder.finishRow();
-    }
-}
diff --git a/fluss-client/src/main/java/com/alibaba/fluss/client/token/DefaultSecurityTokenManager.java b/fluss-client/src/main/java/com/alibaba/fluss/client/token/DefaultSecurityTokenManager.java
deleted file mode 100644
index 7c636f1ab..000000000
--- a/fluss-client/src/main/java/com/alibaba/fluss/client/token/DefaultSecurityTokenManager.java
+++ /dev/null
@@ -1,185 +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,
... 415510 lines suppressed ...