diff --git a/be/src/agent/task_worker_pool.cpp b/be/src/agent/task_worker_pool.cpp index 6717af3ce4b837..dc1e3a1951e405 100644 --- a/be/src/agent/task_worker_pool.cpp +++ b/be/src/agent/task_worker_pool.cpp @@ -1943,9 +1943,10 @@ void StorageMediumMigrateTaskPool::_storage_medium_migrate_worker_thread_callbac // check request and get info TabletSharedPtr tablet; DataDir* dest_store = nullptr; - - auto status = _check_migrate_request(storage_medium_migrate_req, tablet, &dest_store); - if (status.ok()) { + + bool need_deal = true; + auto status = _check_migrate_request(storage_medium_migrate_req, tablet, &dest_store, &need_deal); + if (status.ok() && need_deal) { EngineStorageMigrationTask engine_task(tablet, dest_store); status = StorageEngine::instance()->execute_task(&engine_task); } @@ -1973,7 +1974,8 @@ void StorageMediumMigrateTaskPool::_storage_medium_migrate_worker_thread_callbac Status StorageMediumMigrateTaskPool::_check_migrate_request(const TStorageMediumMigrateReq& req, TabletSharedPtr& tablet, - DataDir** dest_store) { + DataDir** dest_store, + bool* need_deal) { int64_t tablet_id = req.tablet_id; tablet = StorageEngine::instance()->tablet_manager()->get_tablet(tablet_id); if (tablet == nullptr) { @@ -2011,8 +2013,10 @@ Status StorageMediumMigrateTaskPool::_check_migrate_request(const TStorageMedium *dest_store = stores[0]; } if (tablet->data_dir()->path() == (*dest_store)->path()) { - return Status::InternalError("tablet is already on specified path {}", - tablet->data_dir()->path()); + LOG_WARNING("tablet is already on specified path") + .tag("path", tablet->data_dir()->path()); + *need_deal = false; + return Status::OK(); } // check local disk capacity @@ -2021,7 +2025,7 @@ Status StorageMediumMigrateTaskPool::_check_migrate_request(const TStorageMedium return Status::InternalError("reach the capacity limit of path {}, tablet_size={}", (*dest_store)->path(), tablet_size); } - + *need_deal = true; return Status::OK(); } diff --git a/be/src/agent/task_worker_pool.h b/be/src/agent/task_worker_pool.h index 50c8842166ffe2..497ea9fa6a7c9b 100644 --- a/be/src/agent/task_worker_pool.h +++ b/be/src/agent/task_worker_pool.h @@ -323,7 +323,7 @@ class StorageMediumMigrateTaskPool : public TaskWorkerPool { public: StorageMediumMigrateTaskPool(ExecEnv* env, ThreadModel thread_model); Status _check_migrate_request(const TStorageMediumMigrateReq& req, TabletSharedPtr& tablet, - DataDir** dest_store); + DataDir** dest_store, bool* need_deal); void _storage_medium_migrate_worker_thread_callback(); DISALLOW_COPY_AND_ASSIGN(StorageMediumMigrateTaskPool); diff --git a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java index 1d4592501f2413..ffae27c9638a74 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java @@ -79,6 +79,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; @@ -615,6 +616,15 @@ private void checkDiskBalanceLastSuccTime(long beId, long pathHash) throws Sched } } + public void updateDestPathHash(TabletSchedCtx tabletCtx) { + // find dest replica + Optional destReplica = tabletCtx.getReplicas() + .stream().filter(replica -> replica.getBackendId() == tabletCtx.getDestBackendId()).findAny(); + if (destReplica.isPresent() && tabletCtx.getDestPathHash() != -1) { + destReplica.get().setPathHash(tabletCtx.getDestPathHash()); + } + } + public void updateDiskBalanceLastSuccTime(long beId, long pathHash) { PathSlot pathSlot = backendsWorkingSlots.get(beId); if (pathSlot == null) { @@ -1642,6 +1652,7 @@ public boolean finishStorageMediaMigrationTask(StorageMediaMigrationTask migrati // if we have a success task, then stat must be refreshed before schedule a new task updateDiskBalanceLastSuccTime(tabletCtx.getSrcBackendId(), tabletCtx.getSrcPathHash()); updateDiskBalanceLastSuccTime(tabletCtx.getDestBackendId(), tabletCtx.getDestPathHash()); + updateDestPathHash(tabletCtx); finalizeTabletCtx(tabletCtx, TabletSchedCtx.State.FINISHED, Status.FINISHED, "finished"); } else { finalizeTabletCtx(tabletCtx, TabletSchedCtx.State.CANCELLED, Status.UNRECOVERABLE,