| 3029 | } |
| 3030 | |
| 3031 | void NameServerImpl::ShowOPStatus(RpcController* controller, const ShowOPStatusRequest* request, |
| 3032 | ShowOPStatusResponse* response, Closure* done) { |
| 3033 | brpc::ClosureGuard done_guard(done); |
| 3034 | if (!running_.load(std::memory_order_acquire)) { |
| 3035 | response->set_code(::fedb::base::ReturnCode::kNameserverIsNotLeader); |
| 3036 | response->set_msg("nameserver is not leader"); |
| 3037 | PDLOG(WARNING, "cur nameserver is not leader"); |
| 3038 | return; |
| 3039 | } |
| 3040 | std::map<uint64_t, std::shared_ptr<OPData>> op_map; |
| 3041 | std::lock_guard<std::mutex> lock(mu_); |
| 3042 | DeleteDoneOP(); |
| 3043 | for (const auto& op_data : done_op_list_) { |
| 3044 | if (request->has_name() && op_data->op_info_.name() != request->name()) { |
| 3045 | continue; |
| 3046 | } |
| 3047 | if (request->has_pid() && op_data->op_info_.pid() != request->pid()) { |
| 3048 | continue; |
| 3049 | } |
| 3050 | op_map.insert(std::make_pair(op_data->op_info_.op_id(), op_data)); |
| 3051 | } |
| 3052 | for (const auto& op_list : task_vec_) { |
| 3053 | if (op_list.empty()) { |
| 3054 | continue; |
| 3055 | } |
| 3056 | for (const auto& op_data : op_list) { |
| 3057 | if (request->has_name() && op_data->op_info_.name() != request->name()) { |
| 3058 | continue; |
| 3059 | } |
| 3060 | if (request->has_db() && op_data->op_info_.db() != request->db()) { |
| 3061 | continue; |
| 3062 | } |
| 3063 | if (request->has_pid() && op_data->op_info_.pid() != request->pid()) { |
| 3064 | continue; |
| 3065 | } |
| 3066 | op_map.insert(std::make_pair(op_data->op_info_.op_id(), op_data)); |
| 3067 | } |
| 3068 | } |
| 3069 | for (const auto& kv : op_map) { |
| 3070 | OPStatus* op_status = response->add_op_status(); |
| 3071 | op_status->set_op_id(kv.second->op_info_.op_id()); |
| 3072 | op_status->set_op_type(::fedb::api::OPType_Name(kv.second->op_info_.op_type())); |
| 3073 | op_status->set_name(kv.second->op_info_.name()); |
| 3074 | op_status->set_db(kv.second->op_info_.db()); |
| 3075 | op_status->set_pid(kv.second->op_info_.pid()); |
| 3076 | op_status->set_status(::fedb::api::TaskStatus_Name(kv.second->op_info_.task_status())); |
| 3077 | op_status->set_for_replica_cluster(kv.second->op_info_.for_replica_cluster()); |
| 3078 | if (kv.second->task_list_.empty() || kv.second->op_info_.task_status() == ::fedb::api::kInited) { |
| 3079 | op_status->set_task_type("-"); |
| 3080 | } else { |
| 3081 | std::shared_ptr<Task> task = kv.second->task_list_.front(); |
| 3082 | op_status->set_task_type(::fedb::api::TaskType_Name(task->task_info_->task_type())); |
| 3083 | } |
| 3084 | op_status->set_start_time(kv.second->op_info_.start_time()); |
| 3085 | op_status->set_end_time(kv.second->op_info_.end_time()); |
| 3086 | } |
| 3087 | response->set_code(::fedb::base::ReturnCode::kOk); |
| 3088 | response->set_msg("ok"); |