diff --git a/src/ray/gcs/gcs_server/gcs_actor_scheduler.cc b/src/ray/gcs/gcs_server/gcs_actor_scheduler.cc index 8e2329c7b..7c788275a 100644 --- a/src/ray/gcs/gcs_server/gcs_actor_scheduler.cc +++ b/src/ray/gcs/gcs_server/gcs_actor_scheduler.cc @@ -45,7 +45,18 @@ void GcsActorScheduler::Schedule(std::shared_ptr actor) { RAY_CHECK(actor->GetNodeID().IsNil() && actor->GetWorkerID().IsNil()); // Select a node to lease worker for the actor. - auto node = SelectNodeRandomly(); + std::shared_ptr node; + + // If an actor is non-detached and has resource requirements, We will try to schedule it + // on the same node as the owner if possible. + const auto &task_spec = actor->GetCreationTaskSpecification(); + if (!actor->IsDetached() && !task_spec.GetRequiredResources().IsEmpty()) { + auto maybe_node = gcs_node_manager_.GetNode(actor->GetOwnerNodeID()); + node = maybe_node.has_value() ? maybe_node.value() : SelectNodeRandomly(); + } else { + node = SelectNodeRandomly(); + } + if (node == nullptr) { // There are no available nodes to schedule the actor, so just trigger the failed // handler.