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

roryqi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git

commit 266db26cbc9869240089fc59f576fbdf9884645d
Author: remilu <[email protected]>
AuthorDate: Mon Oct 26 10:27:44 2026 +0800

    [#14222] refactor(tms): Rename plugins/tms to plugins/maintenance and add 
plugin ITs
    
    Add plugins/maintenance CI (TMS Test workflow + cron suite) modeled on
    idp-basic, and deepen the action-callback REST IT with a metrics/before →
    after?finish happy path (embedded).
    
    Fixes #14222.
    
    Co-authored-by: Cursor <[email protected]>
---
 .../workflows/backend-integration-test-action.yml  |   1 +
 .github/workflows/cron-integration-test.yml        |  17 +-
 .github/workflows/tms-test-action.yml              |  72 ++++++
 .github/workflows/tms-test.yml                     |  59 +++++
 build.gradle.kts                                   |   2 +-
 conf/gravitino.conf.template                       |   4 +-
 .../optimizer-configuration.md                     |   2 +-
 maintenance/maintenance-common/build.gradle.kts    |   2 +-
 plugins/{tms => maintenance}/build.gradle.kts      |   3 +-
 .../maintenance/MaintenanceMetricsService.java     |   8 +-
 .../maintenance/TableMaintenanceConfig.java        |   0
 .../injob/AlwaysMaintainInJobRecommender.java      |   0
 .../injob/CompactionInJobRecommender.java          |   0
 .../maintenance/injob/InJobGateOutcome.java        |   0
 .../maintenance/injob/InJobRecommender.java        |   0
 .../gravitino/maintenance/injob/MetricsJson.java   |   2 +-
 .../maintenance/injob/RecommendDecision.java       |   0
 .../gravitino/maintenance/injob/SnapshotHead.java  |   0
 .../injob/TableMaintenanceInJobPipeline.java       |   0
 .../injob/TableMaintenanceInJobSampler.java        |   4 +-
 .../injob/TriggerExprInJobRecommender.java         |   0
 .../injob/TypeDispatchingInJobRecommender.java     |   0
 .../listener/PostCommitMaintenanceListener.java    |   2 +-
 .../maintenance/occupancy/OccupancyGate.java       |   0
 .../policy/PolicyExpandLifecycleHook.java          |   0
 .../maintenance/policy/PolicyExpandReconciler.java |   2 +-
 .../maintenance/policy/PolicyExpandRegistrar.java  |   0
 .../scheduler/AutocommitDataSources.java           |   0
 .../maintenance/scheduler/MaintenanceJobSpec.java  |   0
 .../scheduler/MaintenanceJobSpecFactory.java       |   0
 .../scheduler/TableMaintenanceSchedulerPools.java  |   9 +-
 .../scheduler/job/commit/CollectedCommitChain.java |   0
 .../job/commit/CommitAuthConsistency.java          |   0
 .../scheduler/job/commit/CommitChainCollector.java |   0
 .../scheduler/job/commit/CommitChainMember.java    |   0
 .../scheduler/job/commit/CommitJobScheduler.java   |   0
 .../scheduler/job/commit/CommitJobSpecFactory.java |   0
 .../job/commit/CommitJobUpsertResult.java          |   0
 .../scheduler/job/commit/CommitOccupancyGate.java  |   0
 .../commit/MaintenanceCommitSubmitPipeline.java    |   2 +-
 .../job/commit/RelationalCommitJobScheduler.java   |   0
 .../maintenance/scheduler/job/cron/CronJobIds.java |   0
 .../scheduler/job/cron/CronJobScheduler.java       |   0
 .../scheduler/job/cron/CronSubmitGate.java         |   0
 .../job/cron/MaintenanceJobConfBuilder.java        |   6 +-
 .../job/cron/MaintenanceJobSubmitter.java          |   2 +-
 .../job/cron/MaintenanceJobTemplates.java          |  17 +-
 .../job/cron/MaintenanceSparkSubmitPipeline.java   |   2 +-
 .../scheduler/job/cron/MaintenanceTableRefs.java   |   0
 .../job/cron/PendingCronExpandOccupancyGate.java   |   0
 .../job/cron/RelationalCronJobScheduler.java       |   0
 .../policy/expand/ExpandOccupancyGate.java         |   0
 .../policy/expand/ExpandTableCandidate.java        |   0
 .../expand/NearestMaintenancePolicyResolver.java   |   0
 .../expand/NearestPolicyTableEnumerator.java       |   1 -
 .../scheduler/policy/expand/PolicyExpandCrons.java |   0
 .../policy/expand/PolicyExpandPipeline.java        |   1 -
 .../policy/expand/PolicyTableEnumerator.java       |   1 -
 .../maintenance/storage/MetalakeNames.java         |   2 +-
 .../mapper/TableMaintenanceActionMapper.java       |   0
 .../TableMaintenanceActionSQLProviderFactory.java  |   0
 .../storage/mapper/TableSnapshotMetricsMapper.java |   0
 .../TableSnapshotMetricsSQLProviderFactory.java    |   0
 .../MaintenanceMapperPackageProvider.java}         |   4 +-
 .../TableMaintenanceActionBaseSQLProvider.java     |   0
 .../base/TableSnapshotMetricsBaseSQLProvider.java  |   0
 .../h2/TableMaintenanceActionH2Provider.java       |   0
 .../h2/TableSnapshotMetricsH2Provider.java         |   0
 .../TableMaintenanceActionPostgreSQLProvider.java  |   0
 .../TableSnapshotMetricsPostgreSQLProvider.java    |   0
 .../storage/po/TableMaintenanceActionPO.java       |   0
 .../storage/po/TableSnapshotMetricsPO.java         |   0
 .../storage/service/OccupancyClaim.java            |   0
 .../service/TableMaintenanceActionMetaService.java |   0
 .../service/TableSnapshotMetricsMetaService.java   |   0
 .../maintenance/web/TableMaintenanceRESTUtils.java |   2 +-
 .../web/rest/TableMaintenanceActionOperations.java |  16 +-
 .../web/rest/TableMaintenanceBinder.java           |   2 +-
 .../rest/feature/TableMaintenanceRESTFeature.java  |   0
 ...elational.mapper.provider.MapperPackageProvider |   2 +-
 .../injob/TestCompactionInJobRecommender.java      |   0
 .../maintenance/injob/TestMetricsJson.java         |   0
 .../injob/TestTableMaintenanceInJobPipeline.java   |   0
 .../injob/TestTableMaintenanceInJobSampler.java    |   0
 .../injob/TestTriggerExprInJobRecommender.java     |   0
 .../injob/TestTypeDispatchingInJobRecommender.java |   0
 .../test/TableMaintenanceActionRESTIT.java         | 241 +++++++++++++++++++++
 .../TestPostCommitMaintenanceListener.java         |   0
 .../maintenance/occupancy/TestOccupancyGate.java   |  25 ++-
 .../policy/TestPolicyExpandLifecycleHook.java      |   0
 .../policy/TestPolicyExpandReconciler.java         |   0
 .../policy/TestPolicyExpandRegistrar.java          |   0
 .../scheduler/TestMaintenanceJobSpecFactory.java   |   0
 .../TestTableMaintenanceSchedulerPools.java        |   0
 .../job/commit/TestCommitAuthConsistency.java      |   0
 .../job/commit/TestCommitJobSpecFactory.java       |   0
 .../TestMaintenanceCommitSubmitPipeline.java       |   2 +-
 .../commit/TestRelationalCommitJobScheduler.java   |   0
 .../scheduler/job/cron/TestCronJobIds.java         |   0
 .../scheduler/job/cron/TestCronJobScheduler.java   |   1 -
 .../job/cron/TestMaintenanceJobConfBuilder.java    |   0
 .../job/cron/TestMaintenanceJobTemplates.java      |   7 +-
 .../cron/TestMaintenanceSparkSubmitPipeline.java   |  12 +-
 .../TestNearestMaintenancePolicyResolver.java      |   0
 .../expand/TestNearestPolicyTableEnumerator.java   |   1 -
 .../policy/expand/TestPolicyExpandCrons.java       |   0
 .../policy/expand/TestPolicyExpandPipeline.java    |   1 -
 .../storage/TableMaintenanceActionTestUtils.java   |   0
 .../TestMaintenanceMapperPackageProvider.java}     |  10 +-
 .../h2/TestTableMaintenanceActionH2Provider.java   |   0
 .../TestTableMaintenanceActionMetaService.java     |   0
 .../TestTableSnapshotMetricsMetaService.java       |   0
 .../rest/TestTableMaintenanceActionOperations.java |   0
 .../feature/TestTableMaintenanceRESTFeature.java   |   0
 settings.gradle.kts                                |   2 +-
 115 files changed, 474 insertions(+), 77 deletions(-)

diff --git a/.github/workflows/backend-integration-test-action.yml 
b/.github/workflows/backend-integration-test-action.yml
index 02dfc374b0..5ed5a92a69 100644
--- a/.github/workflows/backend-integration-test-action.yml
+++ b/.github/workflows/backend-integration-test-action.yml
@@ -113,6 +113,7 @@ jobs:
             -x :trino-connector:integration-test:test -x 
:trino-connector:trino-connector:test \
             -x :iceberg:iceberg-rest-trino-it:test \
             -x :plugins:idp-basic:test \
+            -x :plugins:maintenance:test \
             -x :authorizations:authorization-chain:test -x 
:authorizations:authorization-ranger:test \
             -x :clients:cli:test -x :maintenance:jobs:test -x 
:maintenance:optimizer:test \
             $EXCLUDE_CONTRIB_TESTS
diff --git a/.github/workflows/cron-integration-test.yml 
b/.github/workflows/cron-integration-test.yml
index f5f81e66c7..8f4fabb26b 100644
--- a/.github/workflows/cron-integration-test.yml
+++ b/.github/workflows/cron-integration-test.yml
@@ -6,7 +6,7 @@ name: Cron Integration Test
 #
 # Phase-1 suites (gvfs-fuse, web-ui, frontend, contrib-catalog are excluded):
 #   backend, spark, flink, maintenance, python, trino, access-control,
-#   iceberg-rest-trino, mcp, idp, trino-multi-version, lance, multi-instance
+#   iceberg-rest-trino, mcp, idp, tms, trino-multi-version, lance, 
multi-instance
 
 run-name: OSS IT (${{ inputs.suites || 'all' }}) caller=${{ 
inputs.caller_run_id || 'manual' }}
 
@@ -66,6 +66,7 @@ jobs:
       iceberg-rest-trino: ${{ steps.parse.outputs.iceberg-rest-trino }}
       mcp: ${{ steps.parse.outputs.mcp }}
       idp: ${{ steps.parse.outputs.idp }}
+      tms: ${{ steps.parse.outputs.tms }}
       trino-multi-version: ${{ steps.parse.outputs.trino-multi-version }}
       lance: ${{ steps.parse.outputs.lance }}
       multi-instance: ${{ steps.parse.outputs.multi-instance }}
@@ -92,6 +93,7 @@ jobs:
               "iceberg-rest-trino",
               "mcp",
               "idp",
+              "tms",
               "trino-multi-version",
               "lance",
               "multi-instance",
@@ -207,6 +209,14 @@ jobs:
     with:
       java-version: ${{ needs.select-suites.outputs.java-version }}
 
+  tms:
+    name: tms
+    needs: select-suites
+    if: needs.select-suites.outputs.tms == 'true'
+    uses: ./.github/workflows/tms-test-action.yml
+    with:
+      java-version: ${{ needs.select-suites.outputs.java-version }}
+
   trino-multi-version:
     name: trino-multi-version
     needs: select-suites
@@ -239,6 +249,7 @@ jobs:
       - iceberg-rest-trino
       - mcp
       - idp
+      - tms
       - trino-multi-version
       - lance
       - multi-instance
@@ -258,6 +269,7 @@ jobs:
           ICEBERG_REST_TRINO: ${{ needs.iceberg-rest-trino.result }}
           MCP: ${{ needs.mcp.result }}
           IDP: ${{ needs.idp.result }}
+          TMS: ${{ needs.tms.result }}
           TRINO_MULTI_VERSION: ${{ needs.trino-multi-version.result }}
           LANCE: ${{ needs.lance.result }}
           MULTI_INSTANCE: ${{ needs.multi-instance.result }}
@@ -284,6 +296,7 @@ jobs:
           | iceberg-rest-trino | ${ICEBERG_REST_TRINO} |
           | mcp | ${MCP} |
           | idp | ${IDP} |
+          | tms | ${TMS} |
           | trino-multi-version | ${TRINO_MULTI_VERSION} |
           | lance | ${LANCE} |
           | multi-instance | ${MULTI_INSTANCE} |
@@ -294,7 +307,7 @@ jobs:
             failed=1
           fi
           for result in "$BACKEND" "$SPARK" "$FLINK" "$MAINTENANCE" "$PYTHON" 
"$TRINO" \
-            "$ACCESS_CONTROL" "$ICEBERG_REST_TRINO" "$MCP" "$IDP" \
+            "$ACCESS_CONTROL" "$ICEBERG_REST_TRINO" "$MCP" "$IDP" "$TMS" \
             "$TRINO_MULTI_VERSION" "$LANCE" "$MULTI_INSTANCE"
           do
             if [[ "$result" == "failure" || "$result" == "cancelled" ]]; then
diff --git a/.github/workflows/tms-test-action.yml 
b/.github/workflows/tms-test-action.yml
new file mode 100644
index 0000000000..ac81715d40
--- /dev/null
+++ b/.github/workflows/tms-test-action.yml
@@ -0,0 +1,72 @@
+name: TMS Test Action
+
+on:
+  workflow_call:
+    inputs:
+      java-version:
+        required: true
+        description: 'Java version'
+        type: string
+
+jobs:
+  tms-test:
+    name: JDK${{ inputs.java-version }}
+    runs-on: ubuntu-22.04
+    timeout-minutes: 45
+    steps:
+      - uses: actions/checkout@v4
+
+      - uses: actions/setup-java@v4
+        with:
+          java-version: ${{ inputs.java-version }}
+          distribution: "temurin"
+          cache: "gradle"
+
+      - name: Set up QEMU
+        uses: 
docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
+
+      - name: Check required command
+        run: |
+          dev/ci/check_commands.sh
+
+      - name: Package Gravitino
+        run: |
+          ./gradlew compileDistribution -PskipWeb=true -x test
+
+      - name: Free up disk space
+        run: |
+          dev/ci/util_free_space.sh
+
+      - name: Run TMS plugin tests
+        id: tmsTest
+        env:
+          dockerTest: true
+        run: |
+          set -euo pipefail
+
+          # Unit and in-process tests (no Docker, no REST IT).
+          ./gradlew :plugins:maintenance:test -PskipITs -PskipDockerTests=true
+
+          # REST IT: embedded and deploy, each against h2 / MySQL / PostgreSQL.
+          for test_mode in embedded deploy; do
+            for backend in h2 mysql postgresql; do
+              ./gradlew :plugins:maintenance:test \
+                -PtestMode="${test_mode}" \
+                -PjdbcBackend="${backend}" \
+                -PskipDockerTests=false \
+                --tests "org.apache.gravitino.maintenance.integration.test.**"
+            done
+          done
+
+      - name: Upload TMS plugin test reports
+        uses: actions/upload-artifact@v7
+        if: ${{ (failure() && steps.tmsTest.outcome == 'failure') || 
contains(github.event.pull_request.labels.*.name, 'upload log') }}
+        with:
+          name: tms-test-reports
+          path: |
+            plugins/maintenance/build/reports
+            plugins/maintenance/build/test-results
+            distribution/package-all/logs/gravitino-server.out
+            distribution/package-all/logs/gravitino-server.log
+            distribution/package/logs/gravitino-server.out
+            distribution/package/logs/gravitino-server.log
diff --git a/.github/workflows/tms-test.yml b/.github/workflows/tms-test.yml
new file mode 100644
index 0000000000..fb4c9f3daf
--- /dev/null
+++ b/.github/workflows/tms-test.yml
@@ -0,0 +1,59 @@
+name: TMS Test
+
+on:
+  push:
+    branches: ["main", "branch-*"]
+  pull_request:
+    branches: ["main", "branch-*"]
+  workflow_dispatch:
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.event.pull_request.number || 
github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  changes:
+    runs-on: ubuntu-22.04
+    steps:
+      - uses: actions/checkout@v4
+      - name: Disable Git automatic maintenance
+        run: git config --local maintenance.auto false
+      - uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d
+        id: filter
+        with:
+          filters: |
+            source_changes:
+              - plugins/maintenance/**
+              - maintenance/maintenance-common/**
+              - clients/client-java/**
+              - clients/client-java-runtime/**
+              - integration-test-common/**
+              - core/**
+              - server/**
+              - server-common/**
+              - gradle/**
+              - gradlew
+              - dev/**
+              - build.gradle.kts
+              - gradle.properties
+              - settings.gradle.kts
+              - .github/workflows/tms-test.yml
+              - .github/workflows/tms-test-action.yml
+      - name: Detect plugins/maintenance module
+        id: module
+        run: |
+          if [ -f plugins/maintenance/build.gradle.kts ]; then
+            echo "exists=true" >> "$GITHUB_OUTPUT"
+          else
+            echo "exists=false" >> "$GITHUB_OUTPUT"
+          fi
+    outputs:
+      source_changes: ${{ steps.filter.outputs.source_changes }}
+      module_exists: ${{ steps.module.outputs.exists }}
+
+  tms-test:
+    needs: changes
+    if: needs.changes.outputs.source_changes == 'true' && 
needs.changes.outputs.module_exists == 'true'
+    uses: ./.github/workflows/tms-test-action.yml
+    with:
+      java-version: '17'
diff --git a/build.gradle.kts b/build.gradle.kts
index c1201dfb18..b950c350a0 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1188,7 +1188,7 @@ tasks {
         ":lance:lance-rest-server:copyLibAndConfigs",
         ":maintenance:optimizer:copyLibAndConfigs",
         ":plugins:idp-basic:copyLibAndConfigs",
-        ":plugins:tms:copyLibAndConfigs",
+        ":plugins:maintenance:copyLibAndConfigs",
         ":plugins:k8s-job-executor:copyLibAndConfigs"
       )
     if (!skipWeb) {
diff --git a/conf/gravitino.conf.template b/conf/gravitino.conf.template
index f465f72f21..e7beebafec 100644
--- a/conf/gravitino.conf.template
+++ b/conf/gravitino.conf.template
@@ -154,11 +154,11 @@ gravitino.lance-rest.namespace-backend = gravitino
 # gravitino.maintenance.snapshot-expiry.minIntervalMs = 3600000
 # gravitino.maintenance.orphan-cleanup.minIntervalMs = 86400000
 
-# Base URI Spark jobs use for TMS sample/finish callbacks 
(updater_options.gravitino_uri).
+# Base URI Spark jobs use for maintenance sample/finish callbacks 
(updater_options.gravitino_uri).
 # Required for cron Spark submit when the policy does not set 
updaterOptions.gravitino_uri.
 # gravitino.maintenance.gravitinoUri = http://localhost:8090
 
-# IRC → post-commit maintenance listener (§5.2.3). Requires colocated 
iceberg-rest aux service and TMS Feature.
+# IRC → post-commit maintenance listener (§5.2.3). Requires colocated 
iceberg-rest aux service and TableMaintenanceRESTFeature.
 # gravitino.eventListener.names = post-commit-maintenance-listener
 # gravitino.eventListener.post-commit-maintenance-listener.class = 
org.apache.gravitino.maintenance.listener.PostCommitMaintenanceListener
 
diff --git a/docs/table-maintenance-service/optimizer-configuration.md 
b/docs/table-maintenance-service/optimizer-configuration.md
index 7c6e8c54b4..226a21578d 100644
--- a/docs/table-maintenance-service/optimizer-configuration.md
+++ b/docs/table-maintenance-service/optimizer-configuration.md
@@ -66,7 +66,7 @@ type is still in-flight it deletes the row and stops; 
otherwise it claims a soft
 gravitino.server.rest.extensionPackages = 
org.apache.gravitino.maintenance.web.rest.feature
 gravitino.auxService.names = iceberg-rest
 gravitino.eventListener.names = post-commit-maintenance-listener
-gravitino.eventListener.post-commit-maintenance-listener.class = 
org.apache.gravitino.maintenance.listener.IcebergUpdateTableEventListener
+gravitino.eventListener.post-commit-maintenance-listener.class = 
org.apache.gravitino.maintenance.listener.PostCommitMaintenanceListener
 ```
 
 Without the listener, the crontab (`timeTrigger` → expand → cron-job) path 
still works; commit-triggered
diff --git a/maintenance/maintenance-common/build.gradle.kts 
b/maintenance/maintenance-common/build.gradle.kts
index 9bcab80a90..28d0e0a664 100644
--- a/maintenance/maintenance-common/build.gradle.kts
+++ b/maintenance/maintenance-common/build.gradle.kts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-description = "Gravitino Maintenance shared common (TMS wire types)"
+description = "Gravitino Maintenance shared common (wire types)"
 
 plugins {
   `maven-publish`
diff --git a/plugins/tms/build.gradle.kts b/plugins/maintenance/build.gradle.kts
similarity index 95%
rename from plugins/tms/build.gradle.kts
rename to plugins/maintenance/build.gradle.kts
index 3f81af0a69..8a238ceb36 100644
--- a/plugins/tms/build.gradle.kts
+++ b/plugins/maintenance/build.gradle.kts
@@ -49,6 +49,7 @@ dependencies {
   testImplementation(project(":integration-test-common", "testArtifacts"))
   testImplementation(project(":server"))
   testImplementation(project(":server-common"))
+  testImplementation(libs.awaitility)
   testImplementation(libs.junit.jupiter.api)
   testImplementation(libs.junit.jupiter.params)
   testImplementation(libs.mockito.core)
@@ -81,7 +82,7 @@ tasks {
 
   register("copyLibAndConfigs", Copy::class) {
     group = "gravitino distribution"
-    description = "Copy tms plugin jar and runtime dependencies into 
distribution package libs"
+    description = "Copy maintenance plugin jar and runtime dependencies into 
distribution package libs"
     dependsOn(copyLibs)
   }
 
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/MaintenanceMetricsService.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/MaintenanceMetricsService.java
similarity index 95%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/MaintenanceMetricsService.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/MaintenanceMetricsService.java
index 94d60a8b1b..8cd620b345 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/MaintenanceMetricsService.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/MaintenanceMetricsService.java
@@ -51,7 +51,7 @@ public class MaintenanceMetricsService {
   /**
    * Production wiring.
    *
-   * @return service bound into the TMS Jersey feature
+   * @return service bound into the Jersey feature
    */
   public static MaintenanceMetricsService create() {
     return new MaintenanceMetricsService(
@@ -140,7 +140,7 @@ public class MaintenanceMetricsService {
         request.getAfterSnapshotId(),
         System.currentTimeMillis());
     LOG.info(
-        "TMS action finished for job {} metalake {} table {} policy {} 
afterSnapshotId={}",
+        "action finished for job {} metalake {} table {} policy {} 
afterSnapshotId={}",
         jobId,
         metalake,
         action.tableId(),
@@ -158,7 +158,7 @@ public class MaintenanceMetricsService {
       long snapshotId) {
     if (!finish) {
       LOG.info(
-          "TMS {} metrics reported for job {} metalake {} table {} policy {} 
snapshot {}",
+          "{} metrics reported for job {} metalake {} table {} policy {} 
snapshot {}",
           phase,
           jobId,
           metalake,
@@ -170,7 +170,7 @@ public class MaintenanceMetricsService {
     actionMetaService.markFinished(
         jobId, action.tableId(), action.policyId(), afterSnapshotId, 
System.currentTimeMillis());
     LOG.info(
-        "TMS {} metrics reported and action finished for job {} metalake {} 
table {} policy {} snapshot {}",
+        "{} metrics reported and action finished for job {} metalake {} table 
{} policy {} snapshot {}",
         phase,
         jobId,
         metalake,
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/TableMaintenanceConfig.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/TableMaintenanceConfig.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/TableMaintenanceConfig.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/TableMaintenanceConfig.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/AlwaysMaintainInJobRecommender.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/AlwaysMaintainInJobRecommender.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/AlwaysMaintainInJobRecommender.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/AlwaysMaintainInJobRecommender.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/CompactionInJobRecommender.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/CompactionInJobRecommender.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/CompactionInJobRecommender.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/CompactionInJobRecommender.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/InJobGateOutcome.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/InJobGateOutcome.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/InJobGateOutcome.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/InJobGateOutcome.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/InJobRecommender.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/InJobRecommender.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/InJobRecommender.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/InJobRecommender.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/MetricsJson.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/MetricsJson.java
similarity index 97%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/MetricsJson.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/MetricsJson.java
index 9fd61fb487..98530be898 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/MetricsJson.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/MetricsJson.java
@@ -29,7 +29,7 @@ import org.apache.gravitino.json.JsonUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/** Parses numeric fields from TMS in-job metrics JSON payloads. */
+/** Parses numeric fields from in-job metrics JSON payloads. */
 final class MetricsJson {
 
   private static final Logger LOG = LoggerFactory.getLogger(MetricsJson.class);
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/RecommendDecision.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/RecommendDecision.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/RecommendDecision.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/RecommendDecision.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/SnapshotHead.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/SnapshotHead.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/SnapshotHead.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/SnapshotHead.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/TableMaintenanceInJobPipeline.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/TableMaintenanceInJobPipeline.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/TableMaintenanceInJobPipeline.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/TableMaintenanceInJobPipeline.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/TableMaintenanceInJobSampler.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/TableMaintenanceInJobSampler.java
similarity index 95%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/TableMaintenanceInJobSampler.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/TableMaintenanceInJobSampler.java
index c6ad0995c1..59f187392f 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/TableMaintenanceInJobSampler.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/TableMaintenanceInJobSampler.java
@@ -23,8 +23,8 @@ import 
org.apache.gravitino.maintenance.storage.service.TableMaintenanceActionMe
 import 
org.apache.gravitino.maintenance.storage.service.TableSnapshotMetricsMetaService;
 
 /**
- * In-Spark sampling path for TMS cron jobs (§5.2.2): sample once at {@code 
S0}, persist metrics,
- * record {@code before_snapshot_id}, then gate on snapshot drift without 
re-sampling.
+ * In-Spark sampling path for cron jobs (§5.2.2): sample once at {@code S0}, 
persist metrics, record
+ * {@code before_snapshot_id}, then gate on snapshot drift without re-sampling.
  */
 public class TableMaintenanceInJobSampler {
 
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/TriggerExprInJobRecommender.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/TriggerExprInJobRecommender.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/TriggerExprInJobRecommender.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/TriggerExprInJobRecommender.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/TypeDispatchingInJobRecommender.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/TypeDispatchingInJobRecommender.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/injob/TypeDispatchingInJobRecommender.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/injob/TypeDispatchingInJobRecommender.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/listener/PostCommitMaintenanceListener.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/listener/PostCommitMaintenanceListener.java
similarity index 98%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/listener/PostCommitMaintenanceListener.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/listener/PostCommitMaintenanceListener.java
index 904dc99839..facf3d3ec8 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/listener/PostCommitMaintenanceListener.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/listener/PostCommitMaintenanceListener.java
@@ -72,7 +72,7 @@ public class PostCommitMaintenanceListener implements 
EventListenerPlugin {
       throw new IllegalStateException("GravitinoEnv config is not available");
     }
     this.commitJobScheduler = new RelationalCommitJobScheduler(dataSource, 
gravitinoConfig);
-    LOG.info("TMS PostCommitMaintenanceListener started (commit-job upsert 
with spec)");
+    LOG.info("PostCommitMaintenanceListener started (commit-job upsert with 
spec)");
   }
 
   @Override
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/occupancy/OccupancyGate.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/occupancy/OccupancyGate.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/occupancy/OccupancyGate.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/occupancy/OccupancyGate.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandLifecycleHook.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandLifecycleHook.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandLifecycleHook.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandLifecycleHook.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandReconciler.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandReconciler.java
similarity index 98%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandReconciler.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandReconciler.java
index 21b5e68b58..fe8bbb5fa0 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandReconciler.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandReconciler.java
@@ -30,7 +30,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Reconciles {@code policy-expand} tasks when TMS starts.
+ * Reconciles {@code policy-expand} tasks when starts.
  *
  * <p>Only {@code scheduled_expand_tasks} rows are touched — never policy rows 
or other scheduler
  * tables. Lifecycle hooks cover later writes; startup must still converge 
existing state:
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandRegistrar.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandRegistrar.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandRegistrar.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/policy/PolicyExpandRegistrar.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/AutocommitDataSources.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/AutocommitDataSources.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/AutocommitDataSources.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/AutocommitDataSources.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/MaintenanceJobSpec.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/MaintenanceJobSpec.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/MaintenanceJobSpec.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/MaintenanceJobSpec.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/MaintenanceJobSpecFactory.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/MaintenanceJobSpecFactory.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/MaintenanceJobSpecFactory.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/MaintenanceJobSpecFactory.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/TableMaintenanceSchedulerPools.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/TableMaintenanceSchedulerPools.java
similarity index 98%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/TableMaintenanceSchedulerPools.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/TableMaintenanceSchedulerPools.java
index 104ef7e81e..1714706e82 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/TableMaintenanceSchedulerPools.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/TableMaintenanceSchedulerPools.java
@@ -43,12 +43,12 @@ import 
org.apache.gravitino.maintenance.scheduler.job.cron.MaintenanceJobSubmitt
 import 
org.apache.gravitino.maintenance.scheduler.job.cron.MaintenanceSparkSubmitPipeline;
 import 
org.apache.gravitino.maintenance.scheduler.job.cron.PendingCronExpandOccupancyGate;
 import 
org.apache.gravitino.maintenance.scheduler.job.cron.RelationalCronJobScheduler;
+import 
org.apache.gravitino.maintenance.scheduler.policy.expand.ExpandOccupancyGate;
 import 
org.apache.gravitino.maintenance.scheduler.policy.expand.NearestPolicyTableEnumerator;
 import 
org.apache.gravitino.maintenance.scheduler.policy.expand.PolicyExpandPipeline;
 import 
org.apache.gravitino.maintenance.storage.service.TableMaintenanceActionMetaService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import 
org.apache.gravitino.maintenance.scheduler.policy.expand.ExpandOccupancyGate;
 
 /**
  * Starts and stops three isolated db-scheduler pools (§5.2, §7.2), each with 
its own task table
@@ -258,8 +258,6 @@ public class TableMaintenanceSchedulerPools implements 
AutoCloseable {
             });
   }
 
-
-
   /**
    * Commit-pool task definition. Consumes the enqueue-time chain spec, claims 
a soft slot, submits
    * Spark, then removes the one-shot row.
@@ -282,4 +280,9 @@ public class TableMaintenanceSchedulerPools implements 
AutoCloseable {
             });
   }
 
+  private static BiConsumer<String, MaintenanceJobSpec> 
unconfiguredSubmit(String pool) {
+    return (instanceId, spec) -> {
+      throw new IllegalStateException(pool + " submit pipeline is not 
configured");
+    };
+  }
 }
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CollectedCommitChain.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CollectedCommitChain.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CollectedCommitChain.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CollectedCommitChain.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitAuthConsistency.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitAuthConsistency.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitAuthConsistency.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitAuthConsistency.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitChainCollector.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitChainCollector.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitChainCollector.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitChainCollector.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitChainMember.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitChainMember.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitChainMember.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitChainMember.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobScheduler.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobScheduler.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobScheduler.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobScheduler.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobSpecFactory.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobSpecFactory.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobSpecFactory.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobSpecFactory.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobUpsertResult.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobUpsertResult.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobUpsertResult.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitJobUpsertResult.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitOccupancyGate.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitOccupancyGate.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitOccupancyGate.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/CommitOccupancyGate.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/MaintenanceCommitSubmitPipeline.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/MaintenanceCommitSubmitPipeline.java
similarity index 98%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/MaintenanceCommitSubmitPipeline.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/MaintenanceCommitSubmitPipeline.java
index 91a7d5df1d..42136cc14d 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/MaintenanceCommitSubmitPipeline.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/MaintenanceCommitSubmitPipeline.java
@@ -155,7 +155,7 @@ public final class MaintenanceCommitSubmitPipeline {
     try {
       jobId =
           jobSubmitter.runJob(
-              metalake, 
MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE, jobConf);
+              metalake, MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE, 
jobConf);
       actionMetaService.bindJobIds(claims, jobId);
       LOG.info(
           "Submitted commit-job for table {} as job {} (chain={}, 
policies={})",
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/RelationalCommitJobScheduler.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/RelationalCommitJobScheduler.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/RelationalCommitJobScheduler.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/commit/RelationalCommitJobScheduler.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronJobIds.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronJobIds.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronJobIds.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronJobIds.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronJobScheduler.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronJobScheduler.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronJobScheduler.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronJobScheduler.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronSubmitGate.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronSubmitGate.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronSubmitGate.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/CronSubmitGate.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobConfBuilder.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobConfBuilder.java
similarity index 98%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobConfBuilder.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobConfBuilder.java
index 1fc53dd5b9..b5dcb43532 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobConfBuilder.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobConfBuilder.java
@@ -44,7 +44,7 @@ import org.apache.gravitino.policy.PolicyContent;
 import org.apache.gravitino.policy.PolicyExecutionSpec;
 
 /**
- * Builds the {@code runJob} configuration map for TMS Spark submits.
+ * Builds the {@code runJob} configuration map for Spark submits.
  *
  * <p>Shape matches Iceberg update-stats submit: flatten template placeholders 
into the top-level
  * map, pack {@code updater_options} as one JSON string, and pack extra Spark 
/ IRC settings into
@@ -65,7 +65,7 @@ public final class MaintenanceJobConfBuilder {
 
   private static final String SPARK_SQL_CATALOG_PREFIX = "spark.sql.catalog.";
 
-  /** Top-level {@code runJob} placeholders consumed by Iceberg / TMS Spark 
templates. */
+  /** Top-level {@code runJob} placeholders consumed by Iceberg / Spark 
templates. */
   private static final Set<String> FLAT_PLACEHOLDER_KEYS =
       ImmutableSet.of(
           "catalog_name",
@@ -300,7 +300,7 @@ public final class MaintenanceJobConfBuilder {
     String gravitinoUri = updaterOptions.get("gravitino_uri");
     if (gravitinoUri == null || gravitinoUri.trim().isEmpty()) {
       throw new IllegalArgumentException(
-          "updater_options.gravitino_uri is required for TMS Spark submit; set 
policy "
+          "updater_options.gravitino_uri is required for Spark submit; set 
policy "
               + "updaterOptions.gravitino_uri or 
gravitino.maintenance.gravitinoAuth.uri");
     }
     return updaterOptions;
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobSubmitter.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobSubmitter.java
similarity index 97%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobSubmitter.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobSubmitter.java
index 54525187cb..4b87316f62 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobSubmitter.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobSubmitter.java
@@ -24,7 +24,7 @@ import org.apache.gravitino.job.JobHandle;
 import org.apache.gravitino.meta.JobEntity;
 
 /**
- * Submits a Gravitino Job for a TMS cron-job callback (§5.2.2).
+ * Submits a Gravitino Job for a cron-job callback (§5.2.2).
  *
  * <p>Production wiring uses {@link GravitinoEnv#jobOperationDispatcher()}; 
tests inject a fake.
  */
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobTemplates.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobTemplates.java
similarity index 82%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobTemplates.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobTemplates.java
index 07d116cef6..79d0d3bfe7 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobTemplates.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceJobTemplates.java
@@ -23,24 +23,23 @@ import org.apache.gravitino.job.JobTemplateProvider;
 import org.apache.gravitino.policy.Policy;
 
 /**
- * Maps maintenance {@link Policy.BuiltInType} to the TMS cron Spark job 
template and procedure
- * kind.
+ * Maps maintenance {@link Policy.BuiltInType} to the cron Spark job template 
and procedure kind.
  *
- * <p>Cron always submits {@link #TMS_ICEBERG_MAINTENANCE_TEMPLATE}; 
standalone {@code
+ * <p>Cron always submits {@link #ICEBERG_MAINTENANCE_TEMPLATE}; standalone 
{@code
  * builtin-iceberg-*} templates remain for CLI / optimizer.
  */
 public final class MaintenanceJobTemplates {
 
   /**
-   * Built-in template name for the TMS Iceberg maintenance Spark job. Must 
match {@code
+   * Built-in template name for the Iceberg maintenance Spark job. Must match 
{@code
    * IcebergMaintenanceJob.NAME} ({@code builtin-iceberg-maintenance-task}).
    */
-  public static final String TMS_ICEBERG_MAINTENANCE_TEMPLATE =
+  public static final String ICEBERG_MAINTENANCE_TEMPLATE =
       JobTemplateProvider.BUILTIN_NAME_PREFIX + "iceberg-maintenance-task";
 
   /**
-   * JobConf key for procedure dispatch inside the TMS template. One wire 
name, or a comma-separated
-   * commit chain. Required by {@link #TMS_ICEBERG_MAINTENANCE_TEMPLATE}.
+   * JobConf key for procedure dispatch inside the maintenance template. One 
wire name, or a
+   * comma-separated commit chain. Required by {@link 
#ICEBERG_MAINTENANCE_TEMPLATE}.
    */
   public static final String MAINTENANCE_TYPES_KEY = "maintenance_types";
 
@@ -63,13 +62,13 @@ public final class MaintenanceJobTemplates {
 
   /**
    * @param builtInType maintenance policy type
-   * @return TMS cron job template name when known
+   * @return cron job template name when known
    */
   public static Optional<String> templateName(Policy.BuiltInType builtInType) {
     if (maintenanceType(builtInType).isEmpty()) {
       return Optional.empty();
     }
-    return Optional.of(TMS_ICEBERG_MAINTENANCE_TEMPLATE);
+    return Optional.of(ICEBERG_MAINTENANCE_TEMPLATE);
   }
 
   /**
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceSparkSubmitPipeline.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceSparkSubmitPipeline.java
similarity index 98%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceSparkSubmitPipeline.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceSparkSubmitPipeline.java
index 10eabbb8b9..fd1a790ab9 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceSparkSubmitPipeline.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceSparkSubmitPipeline.java
@@ -172,7 +172,7 @@ public final class MaintenanceSparkSubmitPipeline {
     try {
       jobId =
           jobSubmitter.runJob(
-              metalake, 
MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE, jobConf);
+              metalake, MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE, 
jobConf);
       actionMetaService.bindJobId(claim, jobId);
       LOG.info("Submitted cron-job for table {} policy {} as job {}", tableId, 
policyId, jobId);
     } catch (RuntimeException e) {
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceTableRefs.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceTableRefs.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceTableRefs.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/MaintenanceTableRefs.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/PendingCronExpandOccupancyGate.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/PendingCronExpandOccupancyGate.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/PendingCronExpandOccupancyGate.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/PendingCronExpandOccupancyGate.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/RelationalCronJobScheduler.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/RelationalCronJobScheduler.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/RelationalCronJobScheduler.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/job/cron/RelationalCronJobScheduler.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/ExpandOccupancyGate.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/ExpandOccupancyGate.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/ExpandOccupancyGate.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/ExpandOccupancyGate.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/ExpandTableCandidate.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/ExpandTableCandidate.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/ExpandTableCandidate.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/ExpandTableCandidate.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/NearestMaintenancePolicyResolver.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/NearestMaintenancePolicyResolver.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/NearestMaintenancePolicyResolver.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/NearestMaintenancePolicyResolver.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/NearestPolicyTableEnumerator.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/NearestPolicyTableEnumerator.java
similarity index 99%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/NearestPolicyTableEnumerator.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/NearestPolicyTableEnumerator.java
index ae503ec6a0..35b5ee2d12 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/NearestPolicyTableEnumerator.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/NearestPolicyTableEnumerator.java
@@ -33,7 +33,6 @@ import org.apache.gravitino.MetadataObject;
 import org.apache.gravitino.MetadataObjects;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.RelationalEntity;
-import 
org.apache.gravitino.maintenance.scheduler.policy.expand.ExpandOccupancyGate;
 import org.apache.gravitino.meta.GenericEntity;
 import org.apache.gravitino.meta.PolicyEntity;
 import org.apache.gravitino.meta.SchemaEntity;
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyExpandCrons.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyExpandCrons.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyExpandCrons.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyExpandCrons.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyExpandPipeline.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyExpandPipeline.java
similarity index 98%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyExpandPipeline.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyExpandPipeline.java
index 58dbcedc06..bc879a71ac 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyExpandPipeline.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyExpandPipeline.java
@@ -27,7 +27,6 @@ import javax.annotation.Nullable;
 import org.apache.gravitino.Config;
 import org.apache.gravitino.maintenance.policy.MaintenanceMinIntervalConfigs;
 import org.apache.gravitino.maintenance.policy.MaintenancePolicyDefinitions;
-import 
org.apache.gravitino.maintenance.scheduler.policy.expand.ExpandOccupancyGate;
 import org.apache.gravitino.maintenance.scheduler.job.cron.CronJobScheduler;
 import org.apache.gravitino.meta.PolicyEntity;
 import org.apache.gravitino.policy.ExecutablePolicyContent;
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyTableEnumerator.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyTableEnumerator.java
similarity index 96%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyTableEnumerator.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyTableEnumerator.java
index 372068686b..11f1f742d4 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyTableEnumerator.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/scheduler/policy/expand/PolicyTableEnumerator.java
@@ -19,7 +19,6 @@
 package org.apache.gravitino.maintenance.scheduler.policy.expand;
 
 import java.util.List;
-import 
org.apache.gravitino.maintenance.scheduler.policy.expand.ExpandOccupancyGate;
 import org.apache.gravitino.meta.PolicyEntity;
 
 /**
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/MetalakeNames.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/MetalakeNames.java
similarity index 97%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/MetalakeNames.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/MetalakeNames.java
index a45a6fc71d..c01cfa4a18 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/MetalakeNames.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/MetalakeNames.java
@@ -27,7 +27,7 @@ import org.apache.gravitino.storage.relational.po.MetalakePO;
 import org.apache.gravitino.storage.relational.po.TablePO;
 import org.apache.gravitino.storage.relational.utils.SessionUtils;
 
-/** Resolves metalake names for TMS entity ids. */
+/** Resolves metalake names for maintenance entity ids. */
 public final class MetalakeNames {
 
   private MetalakeNames() {}
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableMaintenanceActionMapper.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableMaintenanceActionMapper.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableMaintenanceActionMapper.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableMaintenanceActionMapper.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableMaintenanceActionSQLProviderFactory.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableMaintenanceActionSQLProviderFactory.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableMaintenanceActionSQLProviderFactory.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableMaintenanceActionSQLProviderFactory.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableSnapshotMetricsMapper.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableSnapshotMetricsMapper.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableSnapshotMetricsMapper.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableSnapshotMetricsMapper.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableSnapshotMetricsSQLProviderFactory.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableSnapshotMetricsSQLProviderFactory.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableSnapshotMetricsSQLProviderFactory.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/TableSnapshotMetricsSQLProviderFactory.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/TmsMapperPackageProvider.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/MaintenanceMapperPackageProvider.java
similarity index 89%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/TmsMapperPackageProvider.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/MaintenanceMapperPackageProvider.java
index bafb8ce6e3..aa7072bde4 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/TmsMapperPackageProvider.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/MaintenanceMapperPackageProvider.java
@@ -24,8 +24,8 @@ import 
org.apache.gravitino.maintenance.storage.mapper.TableMaintenanceActionMap
 import 
org.apache.gravitino.maintenance.storage.mapper.TableSnapshotMetricsMapper;
 import 
org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider;
 
-/** Supplies TMS mapper classes from the {@code tms} plugin. */
-public class TmsMapperPackageProvider implements MapperPackageProvider {
+/** Supplies table-maintenance mapper classes from the {@code maintenance} 
plugin. */
+public class MaintenanceMapperPackageProvider implements MapperPackageProvider 
{
 
   @Override
   public List<Class<?>> getMapperClasses() {
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/base/TableMaintenanceActionBaseSQLProvider.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/base/TableMaintenanceActionBaseSQLProvider.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/base/TableMaintenanceActionBaseSQLProvider.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/base/TableMaintenanceActionBaseSQLProvider.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/base/TableSnapshotMetricsBaseSQLProvider.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/base/TableSnapshotMetricsBaseSQLProvider.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/base/TableSnapshotMetricsBaseSQLProvider.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/base/TableSnapshotMetricsBaseSQLProvider.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TableMaintenanceActionH2Provider.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TableMaintenanceActionH2Provider.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TableMaintenanceActionH2Provider.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TableMaintenanceActionH2Provider.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TableSnapshotMetricsH2Provider.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TableSnapshotMetricsH2Provider.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TableSnapshotMetricsH2Provider.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TableSnapshotMetricsH2Provider.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/postgresql/TableMaintenanceActionPostgreSQLProvider.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/postgresql/TableMaintenanceActionPostgreSQLProvider.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/postgresql/TableMaintenanceActionPostgreSQLProvider.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/postgresql/TableMaintenanceActionPostgreSQLProvider.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/postgresql/TableSnapshotMetricsPostgreSQLProvider.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/postgresql/TableSnapshotMetricsPostgreSQLProvider.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/postgresql/TableSnapshotMetricsPostgreSQLProvider.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/mapper/provider/postgresql/TableSnapshotMetricsPostgreSQLProvider.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/po/TableMaintenanceActionPO.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/po/TableMaintenanceActionPO.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/po/TableMaintenanceActionPO.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/po/TableMaintenanceActionPO.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/po/TableSnapshotMetricsPO.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/po/TableSnapshotMetricsPO.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/po/TableSnapshotMetricsPO.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/po/TableSnapshotMetricsPO.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/service/OccupancyClaim.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/service/OccupancyClaim.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/service/OccupancyClaim.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/service/OccupancyClaim.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/service/TableMaintenanceActionMetaService.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/service/TableMaintenanceActionMetaService.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/service/TableMaintenanceActionMetaService.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/service/TableMaintenanceActionMetaService.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/service/TableSnapshotMetricsMetaService.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/service/TableSnapshotMetricsMetaService.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/storage/service/TableSnapshotMetricsMetaService.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/storage/service/TableSnapshotMetricsMetaService.java
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/TableMaintenanceRESTUtils.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/TableMaintenanceRESTUtils.java
similarity index 98%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/TableMaintenanceRESTUtils.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/TableMaintenanceRESTUtils.java
index 669912deaa..e6080f5087 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/TableMaintenanceRESTUtils.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/TableMaintenanceRESTUtils.java
@@ -34,7 +34,7 @@ import org.apache.gravitino.utils.PrincipalUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/** REST helpers for table-maintenance resources in the TMS plugin. */
+/** REST helpers for table-maintenance resources in the plugin. */
 public final class TableMaintenanceRESTUtils {
 
   private static final Logger LOG = 
LoggerFactory.getLogger(TableMaintenanceRESTUtils.class);
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceActionOperations.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceActionOperations.java
similarity index 92%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceActionOperations.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceActionOperations.java
index a2130e0267..c069d22dad 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceActionOperations.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceActionOperations.java
@@ -86,8 +86,10 @@ public class TableMaintenanceActionOperations {
    */
   @POST
   @Path("{jobId}/metrics/before")
-  @Timed(name = "tms-action-metrics-before." + 
MetricNames.HTTP_PROCESS_DURATION, absolute = true)
-  @ResponseMetered(name = "tms-action-metrics-before", absolute = true)
+  @Timed(
+      name = "maintenance-action-metrics-before." + 
MetricNames.HTTP_PROCESS_DURATION,
+      absolute = true)
+  @ResponseMetered(name = "maintenance-action-metrics-before", absolute = true)
   @AuthorizationExpression(expression = "METALAKE::OWNER || METALAKE::RUN_JOB")
   public Response reportBeforeMetrics(
       @PathParam("metalake") @AuthorizationMetadata(type = 
Entity.EntityType.METALAKE)
@@ -118,8 +120,10 @@ public class TableMaintenanceActionOperations {
    */
   @POST
   @Path("{jobId}/metrics/after")
-  @Timed(name = "tms-action-metrics-after." + 
MetricNames.HTTP_PROCESS_DURATION, absolute = true)
-  @ResponseMetered(name = "tms-action-metrics-after", absolute = true)
+  @Timed(
+      name = "maintenance-action-metrics-after." + 
MetricNames.HTTP_PROCESS_DURATION,
+      absolute = true)
+  @ResponseMetered(name = "maintenance-action-metrics-after", absolute = true)
   @AuthorizationExpression(expression = "METALAKE::OWNER || METALAKE::RUN_JOB")
   public Response reportAfterMetrics(
       @PathParam("metalake") @AuthorizationMetadata(type = 
Entity.EntityType.METALAKE)
@@ -149,8 +153,8 @@ public class TableMaintenanceActionOperations {
    */
   @POST
   @Path("{jobId}/finish")
-  @Timed(name = "tms-action-finish." + MetricNames.HTTP_PROCESS_DURATION, 
absolute = true)
-  @ResponseMetered(name = "tms-action-finish", absolute = true)
+  @Timed(name = "maintenance-action-finish." + 
MetricNames.HTTP_PROCESS_DURATION, absolute = true)
+  @ResponseMetered(name = "maintenance-action-finish", absolute = true)
   @AuthorizationExpression(expression = "METALAKE::OWNER || METALAKE::RUN_JOB")
   public Response finishAction(
       @PathParam("metalake") @AuthorizationMetadata(type = 
Entity.EntityType.METALAKE)
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceBinder.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceBinder.java
similarity index 93%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceBinder.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceBinder.java
index 61edd478ff..7125caadf8 100644
--- 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceBinder.java
+++ 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/rest/TableMaintenanceBinder.java
@@ -21,7 +21,7 @@ package org.apache.gravitino.maintenance.web.rest;
 import org.apache.gravitino.maintenance.MaintenanceMetricsService;
 import org.glassfish.hk2.utilities.binding.AbstractBinder;
 
-/** Registers TMS maintenance metrics REST dependencies for Jersey/HK2 
injection. */
+/** Registers table maintenance metrics REST dependencies for Jersey/HK2 
injection. */
 public class TableMaintenanceBinder extends AbstractBinder {
 
   @Override
diff --git 
a/plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/rest/feature/TableMaintenanceRESTFeature.java
 
b/plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/rest/feature/TableMaintenanceRESTFeature.java
similarity index 100%
rename from 
plugins/tms/src/main/java/org/apache/gravitino/maintenance/web/rest/feature/TableMaintenanceRESTFeature.java
rename to 
plugins/maintenance/src/main/java/org/apache/gravitino/maintenance/web/rest/feature/TableMaintenanceRESTFeature.java
diff --git 
a/plugins/tms/src/main/resources/META-INF/services/org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider
 
b/plugins/maintenance/src/main/resources/META-INF/services/org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider
similarity index 89%
rename from 
plugins/tms/src/main/resources/META-INF/services/org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider
rename to 
plugins/maintenance/src/main/resources/META-INF/services/org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider
index a130adea4e..3be4cf00e3 100644
--- 
a/plugins/tms/src/main/resources/META-INF/services/org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider
+++ 
b/plugins/maintenance/src/main/resources/META-INF/services/org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider
@@ -15,4 +15,4 @@
 # specific language governing permissions and limitations
 # under the License.
 
-org.apache.gravitino.maintenance.storage.mapper.provider.TmsMapperPackageProvider
+org.apache.gravitino.maintenance.storage.mapper.provider.MaintenanceMapperPackageProvider
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestCompactionInJobRecommender.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestCompactionInJobRecommender.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestCompactionInJobRecommender.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestCompactionInJobRecommender.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestMetricsJson.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestMetricsJson.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestMetricsJson.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestMetricsJson.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestTableMaintenanceInJobPipeline.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestTableMaintenanceInJobPipeline.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestTableMaintenanceInJobPipeline.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestTableMaintenanceInJobPipeline.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestTableMaintenanceInJobSampler.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestTableMaintenanceInJobSampler.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestTableMaintenanceInJobSampler.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestTableMaintenanceInJobSampler.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestTriggerExprInJobRecommender.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestTriggerExprInJobRecommender.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestTriggerExprInJobRecommender.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestTriggerExprInJobRecommender.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestTypeDispatchingInJobRecommender.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestTypeDispatchingInJobRecommender.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/injob/TestTypeDispatchingInJobRecommender.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/injob/TestTypeDispatchingInJobRecommender.java
diff --git 
a/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/integration/test/TableMaintenanceActionRESTIT.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/integration/test/TableMaintenanceActionRESTIT.java
new file mode 100644
index 0000000000..a28a20a240
--- /dev/null
+++ 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/integration/test/TableMaintenanceActionRESTIT.java
@@ -0,0 +1,241 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.maintenance.integration.test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+import java.util.Map;
+import java.util.ServiceLoader;
+import java.util.UUID;
+import org.apache.gravitino.Catalog;
+import org.apache.gravitino.Configs;
+import org.apache.gravitino.EntityStore;
+import org.apache.gravitino.GravitinoEnv;
+import org.apache.gravitino.Namespace;
+import org.apache.gravitino.integration.test.util.BaseIT;
+import org.apache.gravitino.integration.test.util.ITUtils;
+import org.apache.gravitino.maintenance.TableMaintenanceConfig;
+import 
org.apache.gravitino.maintenance.storage.mapper.provider.MaintenanceMapperPackageProvider;
+import org.apache.gravitino.maintenance.storage.po.TableMaintenanceActionPO;
+import org.apache.gravitino.maintenance.storage.service.OccupancyClaim;
+import 
org.apache.gravitino.maintenance.storage.service.TableMaintenanceActionMetaService;
+import 
org.apache.gravitino.maintenance.storage.service.TableSnapshotMetricsMetaService;
+import 
org.apache.gravitino.maintenance.web.rest.feature.TableMaintenanceRESTFeature;
+import org.apache.gravitino.meta.AuditInfo;
+import org.apache.gravitino.meta.CatalogEntity;
+import org.apache.gravitino.meta.SchemaEntity;
+import org.apache.gravitino.meta.TableEntity;
+import org.apache.gravitino.storage.RandomIdGenerator;
+import 
org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Boots Gravitino with {@link TableMaintenanceRESTFeature} and exercises 
maintenance-action
+ * callback REST wiring.
+ *
+ * <p>Run with {@code -PskipITs} omitted (and optionally {@code 
-PjdbcBackend=h2|mysql|postgresql}).
+ * The happy-path seeds occupancy rows via MetaService and therefore runs in 
embedded mode only.
+ */
+public class TableMaintenanceActionRESTIT extends BaseIT {
+
+  private static final HttpClient HTTP = HttpClient.newHttpClient();
+  private static final String ACCEPT = "application/vnd.gravitino.v1+json";
+  private static final AuditInfo AUDIT =
+      
AuditInfo.builder().withCreator("it").withCreateTime(Instant.EPOCH).build();
+
+  private static String metalake;
+  private static String apiBase;
+
+  @BeforeAll
+  public void startIntegrationTest() throws Exception {
+    Map<String, String> configs = Maps.newHashMap();
+    configs.put(Configs.ENABLE_AUTHORIZATION.getKey(), String.valueOf(false));
+    configs.put(Configs.CACHE_ENABLED.getKey(), String.valueOf(false));
+    configs.put(
+        Configs.REST_API_EXTENSION_PACKAGES.getKey(),
+        TableMaintenanceRESTFeature.EXTENSION_PACKAGE);
+    registerCustomConfigs(configs);
+    super.startIntegrationTest();
+
+    metalake = "ml_maint_" + UUID.randomUUID().toString().replace("-", 
"").substring(0, 8);
+    client.createMetalake(metalake, "maintenance plugin IT", 
ImmutableMap.of());
+    apiBase = serverUri + "/api";
+  }
+
+  @Test
+  void testMapperPackageProviderOnClasspath() {
+    long count =
+        ServiceLoader.load(MapperPackageProvider.class).stream()
+            .map(ServiceLoader.Provider::get)
+            .filter(MaintenanceMapperPackageProvider.class::isInstance)
+            .count();
+    assertEquals(1L, count);
+  }
+
+  @Test
+  void testFinishUnknownActionReturnsNotFound() throws Exception {
+    String body = "{\"tableId\":1,\"policyId\":1}";
+    HttpResponse<String> response = postJson(actionPath(999999L, "finish"), 
body);
+    assertEquals(404, response.statusCode(), response.body());
+    assertTrue(
+        response.body().contains("NotFound")
+            || response.body().contains("not found")
+            || response.body().toLowerCase().contains("no maintenance action")
+            || response.body().contains("NoSuchEntity"),
+        response.body());
+  }
+
+  @Test
+  void testReportBeforeUnknownActionReturnsNotFound() throws Exception {
+    String body = 
"{\"tableId\":1,\"policyId\":1,\"snapshotId\":10,\"metricsJson\":\"{}\"}";
+    HttpResponse<String> response = postJson(actionPath(999999L, 
"metrics/before"), body);
+    assertEquals(404, response.statusCode(), response.body());
+  }
+
+  @Test
+  void testMetricsBeforeAfterFinishHappyPath() throws Exception {
+    assumeTrue(
+        ITUtils.EMBEDDED_TEST_MODE.equals(testMode),
+        "Happy-path seeds table_maintenance_action via MetaService in the 
server JVM");
+
+    long tableId = seedTableUnderMetalake(metalake);
+    long policyId = RandomIdGenerator.INSTANCE.nextId();
+    long jobId = 88001L;
+
+    TableMaintenanceActionMetaService actions = 
TableMaintenanceActionMetaService.getInstance();
+    OccupancyClaim claim =
+        actions.insertInFlight(
+            tableId, policyId, TableMaintenanceConfig.forTest(1, 1, 1, 500L, 
1_000L, 4, 10));
+    assertNotNull(claim);
+
+    String beforeBody =
+        "{\"tableId\":"
+            + tableId
+            + ",\"policyId\":"
+            + policyId
+            + ",\"snapshotId\":100,\"metricsJson\":\"{\\\"mse\\\":1}\"}";
+    HttpResponse<String> before = postJson(actionPath(jobId, 
"metrics/before"), beforeBody);
+    assertEquals(200, before.statusCode(), before.body());
+
+    TableMaintenanceActionPO afterBefore =
+        actions.getByJobIdAndTableIdAndPolicyId(jobId, tableId, policyId);
+    assertNotNull(afterBefore);
+    assertEquals(jobId, afterBefore.jobId());
+    assertEquals(100L, afterBefore.beforeSnapshotId());
+    assertEquals(0L, afterBefore.finishedAt());
+    assertEquals(
+        "{\"mse\":1}",
+        TableSnapshotMetricsMetaService.getInstance()
+            .getMetrics(tableId, policyId, 100L)
+            .metricsValue());
+
+    String afterBody =
+        "{\"tableId\":"
+            + tableId
+            + ",\"policyId\":"
+            + policyId
+            + ",\"snapshotId\":200,\"metricsJson\":\"{\\\"mse\\\":2}\"}";
+    HttpResponse<String> after =
+        postJson(actionPath(jobId, "metrics/after") + "?finish=true", 
afterBody);
+    assertEquals(200, after.statusCode(), after.body());
+
+    TableMaintenanceActionPO finished =
+        actions.getByJobIdAndTableIdAndPolicyId(jobId, tableId, policyId);
+    assertNotNull(finished);
+    assertEquals(200L, finished.afterSnapshotId());
+    assertTrue(finished.finishedAt() > 0L);
+    assertEquals(
+        "{\"mse\":2}",
+        TableSnapshotMetricsMetaService.getInstance()
+            .getMetrics(tableId, policyId, 200L)
+            .metricsValue());
+  }
+
+  private static String actionPath(long jobId, String suffix) {
+    return apiBase + "/metalakes/" + metalake + "/maintenance/actions/" + 
jobId + "/" + suffix;
+  }
+
+  private static HttpResponse<String> postJson(String url, String body) throws 
Exception {
+    HttpRequest request =
+        HttpRequest.newBuilder()
+            .uri(URI.create(url))
+            .header("Accept", ACCEPT)
+            .header("Content-Type", "application/json")
+            .POST(HttpRequest.BodyPublishers.ofString(body, 
StandardCharsets.UTF_8))
+            .build();
+    return HTTP.send(request, HttpResponse.BodyHandlers.ofString());
+  }
+
+  /**
+   * Inserts catalog/schema/table rows under the client-created metalake so 
metalake lookup succeeds
+   * for callback authorization of the action's table id.
+   */
+  private static long seedTableUnderMetalake(String metalakeName) throws 
Exception {
+    EntityStore store = GravitinoEnv.getInstance().entityStore();
+    String catalogName = "cat_" + UUID.randomUUID().toString().substring(0, 6);
+    String schemaName = "sch";
+    String tableName = "tbl";
+
+    CatalogEntity catalog =
+        CatalogEntity.builder()
+            .withId(RandomIdGenerator.INSTANCE.nextId())
+            .withName(catalogName)
+            .withNamespace(Namespace.of(metalakeName))
+            .withType(Catalog.Type.RELATIONAL)
+            .withProvider("test")
+            .withComment("")
+            .withProperties(null)
+            .withAuditInfo(AUDIT)
+            .build();
+    store.put(catalog, false);
+
+    SchemaEntity schema =
+        SchemaEntity.builder()
+            .withId(RandomIdGenerator.INSTANCE.nextId())
+            .withName(schemaName)
+            .withNamespace(Namespace.of(metalakeName, catalogName))
+            .withComment("")
+            .withProperties(null)
+            .withAuditInfo(AUDIT)
+            .build();
+    store.put(schema, false);
+
+    TableEntity table =
+        TableEntity.builder()
+            .withId(RandomIdGenerator.INSTANCE.nextId())
+            .withName(tableName)
+            .withNamespace(Namespace.of(metalakeName, catalogName, schemaName))
+            .withAuditInfo(AUDIT)
+            .build();
+    store.put(table, false);
+    return table.id();
+  }
+}
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/listener/TestPostCommitMaintenanceListener.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/listener/TestPostCommitMaintenanceListener.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/listener/TestPostCommitMaintenanceListener.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/listener/TestPostCommitMaintenanceListener.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/occupancy/TestOccupancyGate.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/occupancy/TestOccupancyGate.java
similarity index 82%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/occupancy/TestOccupancyGate.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/occupancy/TestOccupancyGate.java
index d522652fd6..def7654432 100644
--- 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/occupancy/TestOccupancyGate.java
+++ 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/occupancy/TestOccupancyGate.java
@@ -18,6 +18,8 @@
  */
 package org.apache.gravitino.maintenance.occupancy;
 
+import static 
org.apache.gravitino.maintenance.storage.TableMaintenanceActionTestUtils.expireClaim;
+
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
@@ -37,7 +39,7 @@ class TestOccupancyGate extends TestJDBCBackend {
 
   @TestTemplate
   void testUnboundClaimAndBoundSlotOccupyUntilMarkFinished() throws 
IOException {
-    String metalakeName = "tms_occ_ml";
+    String metalakeName = "maint_occ_ml";
     createAndInsertMakeLake(metalakeName);
     createAndInsertCatalog(metalakeName, "cat");
     createAndInsertSchema(metalakeName, "cat", "sch");
@@ -68,7 +70,7 @@ class TestOccupancyGate extends TestJDBCBackend {
 
   @TestTemplate
   void testMinIntervalUsesActionFinishedAtOnly() throws IOException {
-    String metalakeName = "tms_occ_ml2";
+    String metalakeName = "maint_occ_ml2";
     createAndInsertMakeLake(metalakeName);
     createAndInsertCatalog(metalakeName, "cat");
     createAndInsertSchema(metalakeName, "cat", "sch");
@@ -94,21 +96,30 @@ class TestOccupancyGate extends TestJDBCBackend {
 
   @TestTemplate
   void testExpiredUnboundClaimDoesNotBlock() throws Exception {
-    String metalakeName = "tms_occ_ml3";
+    String metalakeName = "maint_occ_ml3";
     createAndInsertMakeLake(metalakeName);
     createAndInsertCatalog(metalakeName, "cat");
     createAndInsertSchema(metalakeName, "cat", "sch");
     TableEntity table = createAndInsertTableEntity(Namespace.of(metalakeName, 
"cat", "sch"), "tbl");
 
     TableMaintenanceActionMetaService actions = 
TableMaintenanceActionMetaService.getInstance();
-    long timeoutMs = 200L;
-    OccupancyGate gate = new OccupancyGate(actions, timeoutMs);
+    long claimTimeoutMs = TableMaintenanceConfig.DEFAULT_CLAIM_TIMEOUT_MS;
+    OccupancyGate gate = new OccupancyGate(actions, claimTimeoutMs);
     long policyId = insertPolicy(metalakeName, "occ-policy-3").id();
 
-    actions.insertInFlight(table.id(), policyId, timeoutMs);
+    OccupancyClaim claim = actions.insertInFlight(table.id(), policyId, 
claimTimeoutMs);
+    Assertions.assertTrue(actions.hasLiveUnboundClaim(table.id(), policyId, 
claimTimeoutMs));
     Assertions.assertTrue(gate.isInFlight(table.id(), policyId));
-    Thread.sleep(timeoutMs + 50L);
+
+    expireClaim(claim, claimTimeoutMs);
+
+    // Unbound TTL is evaluated in the DAO against the database clock, so 
OccupancyGate agrees with
+    // acquire/reclaim even when the JVM clock would disagree (multi-node 
skew).
+    Assertions.assertFalse(actions.hasLiveUnboundClaim(table.id(), policyId, 
claimTimeoutMs));
     Assertions.assertFalse(gate.isInFlight(table.id(), policyId));
+    Assertions.assertTrue(
+        actions.tryAcquireInFlight(table.id(), policyId, 
claimTimeoutMs).isPresent());
+    Assertions.assertEquals(claim.id(), actions.getById(claim.id()).id());
   }
 
   private PolicyEntity insertPolicy(String metalakeName, String policyName) 
throws IOException {
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandLifecycleHook.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandLifecycleHook.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandLifecycleHook.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandLifecycleHook.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandReconciler.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandReconciler.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandReconciler.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandReconciler.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandRegistrar.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandRegistrar.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandRegistrar.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/policy/TestPolicyExpandRegistrar.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/TestMaintenanceJobSpecFactory.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/TestMaintenanceJobSpecFactory.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/TestMaintenanceJobSpecFactory.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/TestMaintenanceJobSpecFactory.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/TestTableMaintenanceSchedulerPools.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/TestTableMaintenanceSchedulerPools.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/TestTableMaintenanceSchedulerPools.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/TestTableMaintenanceSchedulerPools.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestCommitAuthConsistency.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestCommitAuthConsistency.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestCommitAuthConsistency.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestCommitAuthConsistency.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestCommitJobSpecFactory.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestCommitJobSpecFactory.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestCommitJobSpecFactory.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestCommitJobSpecFactory.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestMaintenanceCommitSubmitPipeline.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestMaintenanceCommitSubmitPipeline.java
similarity index 99%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestMaintenanceCommitSubmitPipeline.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestMaintenanceCommitSubmitPipeline.java
index 296e129d7c..b6efefad75 100644
--- 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestMaintenanceCommitSubmitPipeline.java
+++ 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestMaintenanceCommitSubmitPipeline.java
@@ -110,7 +110,7 @@ class TestMaintenanceCommitSubmitPipeline {
     verify(submitter)
         .runJob(
             eq("ml"),
-            eq(MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE),
+            eq(MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE),
             confCaptor.capture());
     verify(actions).bindJobIds(claims, 999L);
     verify(actions, never()).bindJobId(org.mockito.ArgumentMatchers.any(), 
anyLong());
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestRelationalCommitJobScheduler.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestRelationalCommitJobScheduler.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestRelationalCommitJobScheduler.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/commit/TestRelationalCommitJobScheduler.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestCronJobIds.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestCronJobIds.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestCronJobIds.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestCronJobIds.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestCronJobScheduler.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestCronJobScheduler.java
similarity index 99%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestCronJobScheduler.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestCronJobScheduler.java
index 57a4c17596..417a3cefcb 100644
--- 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestCronJobScheduler.java
+++ 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestCronJobScheduler.java
@@ -47,7 +47,6 @@ import 
org.apache.gravitino.storage.relational.session.SqlSessionFactoryHelper;
 import org.apache.gravitino.utils.NamespaceUtil;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.TestTemplate;
-import 
org.apache.gravitino.maintenance.scheduler.policy.expand.ExpandOccupancyGate;
 
 class TestCronJobScheduler extends TestJDBCBackend {
 
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceJobConfBuilder.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceJobConfBuilder.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceJobConfBuilder.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceJobConfBuilder.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceJobTemplates.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceJobTemplates.java
similarity index 89%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceJobTemplates.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceJobTemplates.java
index 123124f004..fe951b975f 100644
--- 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceJobTemplates.java
+++ 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceJobTemplates.java
@@ -26,10 +26,9 @@ import org.junit.jupiter.api.Test;
 class TestMaintenanceJobTemplates {
 
   @Test
-  void testAllFourTypesMapToSingleTmsTemplate() {
+  void testAllFourTypesMapToSingleMaintenanceTemplate() {
     Assertions.assertEquals(
-        "builtin-iceberg-maintenance-task",
-        MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE);
+        "builtin-iceberg-maintenance-task", 
MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE);
     for (Policy.BuiltInType type :
         new Policy.BuiltInType[] {
           Policy.BuiltInType.ICEBERG_COMPACTION,
@@ -38,7 +37,7 @@ class TestMaintenanceJobTemplates {
           Policy.BuiltInType.ICEBERG_ORPHAN_FILE_REMOVAL
         }) {
       Assertions.assertEquals(
-          MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE,
+          MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE,
           MaintenanceJobTemplates.templateName(type).orElseThrow());
       
Assertions.assertTrue(MaintenanceJobTemplates.maintenanceType(type).isPresent());
     }
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceSparkSubmitPipeline.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceSparkSubmitPipeline.java
similarity index 96%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceSparkSubmitPipeline.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceSparkSubmitPipeline.java
index ff9867772e..0c2d19ab7c 100644
--- 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceSparkSubmitPipeline.java
+++ 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/job/cron/TestMaintenanceSparkSubmitPipeline.java
@@ -116,7 +116,7 @@ class TestMaintenanceSparkSubmitPipeline {
   void testSuccessfulSubmitBindsJobId() {
     MaintenanceJobSubmitter submitter = mock(MaintenanceJobSubmitter.class);
     when(submitter.runJob(
-            eq("metalake"), 
eq(MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE), anyMap()))
+            eq("metalake"), 
eq(MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE), anyMap()))
         .thenReturn(999L);
     TableMaintenanceActionMetaService actions = 
mock(TableMaintenanceActionMetaService.class);
     OccupancyClaim claim = new OccupancyClaim(7L, 1_000L);
@@ -152,7 +152,7 @@ class TestMaintenanceSparkSubmitPipeline {
   void testBindFailureCancelsJobAndReleasesClaim() {
     MaintenanceJobSubmitter submitter = mock(MaintenanceJobSubmitter.class);
     when(submitter.runJob(
-            eq("metalake"), 
eq(MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE), anyMap()))
+            eq("metalake"), 
eq(MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE), anyMap()))
         .thenReturn(777L);
     TableMaintenanceActionMetaService actions = 
mock(TableMaintenanceActionMetaService.class);
     OccupancyClaim claim = new OccupancyClaim(9L, 3_000L);
@@ -172,7 +172,7 @@ class TestMaintenanceSparkSubmitPipeline {
   void testBindFailureSkipsReleaseWhenClaimAlreadyReclaimed() {
     MaintenanceJobSubmitter submitter = mock(MaintenanceJobSubmitter.class);
     when(submitter.runJob(
-            eq("metalake"), 
eq(MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE), anyMap()))
+            eq("metalake"), 
eq(MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE), anyMap()))
         .thenReturn(778L);
     TableMaintenanceActionMetaService actions = 
mock(TableMaintenanceActionMetaService.class);
     OccupancyClaim staleClaim = new OccupancyClaim(10L, 4_000L);
@@ -194,7 +194,7 @@ class TestMaintenanceSparkSubmitPipeline {
   void testBatchSubmitOneSparkJobPerTable() {
     MaintenanceJobSubmitter submitter = mock(MaintenanceJobSubmitter.class);
     when(submitter.runJob(
-            eq("metalake"), 
eq(MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE), anyMap()))
+            eq("metalake"), 
eq(MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE), anyMap()))
         .thenReturn(555L, 556L);
     TableMaintenanceActionMetaService actions = 
mock(TableMaintenanceActionMetaService.class);
     OccupancyClaim claimA = new OccupancyClaim(1L, 10L);
@@ -223,7 +223,7 @@ class TestMaintenanceSparkSubmitPipeline {
     verify(submitter, times(2))
         .runJob(
             eq("metalake"),
-            eq(MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE),
+            eq(MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE),
             confCaptor.capture());
     List<Map<String, String>> confs = confCaptor.getAllValues();
     Assertions.assertEquals("iceberg", confs.get(0).get("catalog_name"));
@@ -265,7 +265,7 @@ class TestMaintenanceSparkSubmitPipeline {
     verify(submitter)
         .runJob(
             eq("metalake"),
-            eq(MaintenanceJobTemplates.TMS_ICEBERG_MAINTENANCE_TEMPLATE),
+            eq(MaintenanceJobTemplates.ICEBERG_MAINTENANCE_TEMPLATE),
             confCaptor.capture());
     Map<String, String> conf = confCaptor.getValue();
     Assertions.assertEquals("iceberg", conf.get("catalog_name"));
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestNearestMaintenancePolicyResolver.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestNearestMaintenancePolicyResolver.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestNearestMaintenancePolicyResolver.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestNearestMaintenancePolicyResolver.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestNearestPolicyTableEnumerator.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestNearestPolicyTableEnumerator.java
similarity index 99%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestNearestPolicyTableEnumerator.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestNearestPolicyTableEnumerator.java
index 19a7ba394e..f2ef37d454 100644
--- 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestNearestPolicyTableEnumerator.java
+++ 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestNearestPolicyTableEnumerator.java
@@ -30,7 +30,6 @@ import org.apache.gravitino.MetadataObject;
 import org.apache.gravitino.MetadataObjects;
 import org.apache.gravitino.RelationalEntity;
 import org.apache.gravitino.SupportsRelationOperations;
-import 
org.apache.gravitino.maintenance.scheduler.policy.expand.ExpandOccupancyGate;
 import org.apache.gravitino.meta.AuditInfo;
 import org.apache.gravitino.meta.GenericEntity;
 import org.apache.gravitino.meta.PolicyEntity;
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestPolicyExpandCrons.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestPolicyExpandCrons.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestPolicyExpandCrons.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestPolicyExpandCrons.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestPolicyExpandPipeline.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestPolicyExpandPipeline.java
similarity index 99%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestPolicyExpandPipeline.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestPolicyExpandPipeline.java
index b5027c34f2..bd5e7509a1 100644
--- 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestPolicyExpandPipeline.java
+++ 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/scheduler/policy/expand/TestPolicyExpandPipeline.java
@@ -35,7 +35,6 @@ import org.apache.gravitino.Config;
 import org.apache.gravitino.MetadataObject;
 import org.apache.gravitino.Namespace;
 import org.apache.gravitino.maintenance.policy.MaintenanceMinIntervalConfigs;
-import 
org.apache.gravitino.maintenance.scheduler.policy.expand.ExpandOccupancyGate;
 import org.apache.gravitino.maintenance.scheduler.job.cron.CronJobScheduler;
 import org.apache.gravitino.meta.AuditInfo;
 import org.apache.gravitino.meta.PolicyEntity;
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/TableMaintenanceActionTestUtils.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/TableMaintenanceActionTestUtils.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/TableMaintenanceActionTestUtils.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/TableMaintenanceActionTestUtils.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/mapper/TestTmsMapperPackageProvider.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/mapper/TestMaintenanceMapperPackageProvider.java
similarity index 84%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/mapper/TestTmsMapperPackageProvider.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/mapper/TestMaintenanceMapperPackageProvider.java
index f0afbe27fb..6e86ae3cc7 100644
--- 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/mapper/TestTmsMapperPackageProvider.java
+++ 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/mapper/TestMaintenanceMapperPackageProvider.java
@@ -24,15 +24,15 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.List;
 import java.util.ServiceLoader;
-import 
org.apache.gravitino.maintenance.storage.mapper.provider.TmsMapperPackageProvider;
+import 
org.apache.gravitino.maintenance.storage.mapper.provider.MaintenanceMapperPackageProvider;
 import 
org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider;
 import org.junit.jupiter.api.Test;
 
-class TestTmsMapperPackageProvider {
+class TestMaintenanceMapperPackageProvider {
 
   @Test
   void testMapperClasses() {
-    MapperPackageProvider provider = new TmsMapperPackageProvider();
+    MapperPackageProvider provider = new MaintenanceMapperPackageProvider();
     assertEquals(2, provider.getMapperClasses().size());
     
assertTrue(provider.getMapperClasses().contains(TableMaintenanceActionMapper.class));
     
assertTrue(provider.getMapperClasses().contains(TableSnapshotMetricsMapper.class));
@@ -43,9 +43,9 @@ class TestTmsMapperPackageProvider {
     List<MapperPackageProvider> providers =
         ServiceLoader.load(MapperPackageProvider.class).stream()
             .map(ServiceLoader.Provider::get)
-            .filter(provider -> provider instanceof TmsMapperPackageProvider)
+            .filter(provider -> provider instanceof 
MaintenanceMapperPackageProvider)
             .toList();
     assertEquals(1, providers.size());
-    assertTrue(providers.get(0) instanceof TmsMapperPackageProvider);
+    assertTrue(providers.get(0) instanceof MaintenanceMapperPackageProvider);
   }
 }
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TestTableMaintenanceActionH2Provider.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TestTableMaintenanceActionH2Provider.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TestTableMaintenanceActionH2Provider.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/mapper/provider/h2/TestTableMaintenanceActionH2Provider.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/service/TestTableMaintenanceActionMetaService.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/service/TestTableMaintenanceActionMetaService.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/service/TestTableMaintenanceActionMetaService.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/service/TestTableMaintenanceActionMetaService.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/service/TestTableSnapshotMetricsMetaService.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/service/TestTableSnapshotMetricsMetaService.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/storage/service/TestTableSnapshotMetricsMetaService.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/storage/service/TestTableSnapshotMetricsMetaService.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/web/rest/TestTableMaintenanceActionOperations.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/web/rest/TestTableMaintenanceActionOperations.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/web/rest/TestTableMaintenanceActionOperations.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/web/rest/TestTableMaintenanceActionOperations.java
diff --git 
a/plugins/tms/src/test/java/org/apache/gravitino/maintenance/web/rest/feature/TestTableMaintenanceRESTFeature.java
 
b/plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/web/rest/feature/TestTableMaintenanceRESTFeature.java
similarity index 100%
rename from 
plugins/tms/src/test/java/org/apache/gravitino/maintenance/web/rest/feature/TestTableMaintenanceRESTFeature.java
rename to 
plugins/maintenance/src/test/java/org/apache/gravitino/maintenance/web/rest/feature/TestTableMaintenanceRESTFeature.java
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 0076ce9d82..7f1759282c 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -134,7 +134,7 @@ include(":lineage")
 include(":mcp-server")
 include(":plugins:idp-basic")
 include(":plugins:k8s-job-executor")
-include(":plugins:tms")
+include(":plugins:maintenance")
 include(
   ":maintenance:maintenance-common",
   ":maintenance:optimizer-api",

Reply via email to