| 952 | } |
| 953 | |
| 954 | bool NameServerImpl::RecoverOPTask() { |
| 955 | for (auto& op_list : task_vec_) { |
| 956 | op_list.clear(); |
| 957 | } |
| 958 | std::vector<std::string> op_vec; |
| 959 | if (!zk_client_->GetChildren(zk_op_data_path_, op_vec)) { |
| 960 | if (zk_client_->IsExistNode(zk_op_data_path_) > 0) { |
| 961 | PDLOG(WARNING, "op data node is not exist"); |
| 962 | return true; |
| 963 | } |
| 964 | PDLOG(WARNING, "get op failed!"); |
| 965 | return false; |
| 966 | } |
| 967 | PDLOG(INFO, "need to recover op num[%d]", op_vec.size()); |
| 968 | for (const auto& op_id : op_vec) { |
| 969 | std::string op_node = zk_op_data_path_ + "/" + op_id; |
| 970 | std::string value; |
| 971 | if (!zk_client_->GetNodeValue(op_node, value)) { |
| 972 | PDLOG(WARNING, "get table info failed! table node[%s]", op_node.c_str()); |
| 973 | continue; |
| 974 | } |
| 975 | std::shared_ptr<OPData> op_data = std::make_shared<OPData>(); |
| 976 | if (!op_data->op_info_.ParseFromString(value)) { |
| 977 | PDLOG(WARNING, "parse op info failed! value[%s]", value.c_str()); |
| 978 | continue; |
| 979 | } |
| 980 | if (op_data->op_info_.task_status() == ::fedb::api::TaskStatus::kDone) { |
| 981 | DEBUGLOG("op status is kDone. op_id[%lu]", op_data->op_info_.op_id()); |
| 982 | continue; |
| 983 | } |
| 984 | if (op_data->op_info_.task_status() == ::fedb::api::TaskStatus::kCanceled) { |
| 985 | DEBUGLOG("op status is kCanceled. op_id[%lu]", op_data->op_info_.op_id()); |
| 986 | continue; |
| 987 | } |
| 988 | switch (op_data->op_info_.op_type()) { |
| 989 | case ::fedb::api::OPType::kMakeSnapshotOP: |
| 990 | if (CreateMakeSnapshotOPTask(op_data) < 0) { |
| 991 | PDLOG(WARNING, "recover op[%s] failed. op_id[%lu]", |
| 992 | ::fedb::api::OPType_Name(op_data->op_info_.op_type()).c_str(), op_data->op_info_.op_id()); |
| 993 | continue; |
| 994 | } |
| 995 | break; |
| 996 | case ::fedb::api::OPType::kAddReplicaOP: |
| 997 | if (CreateAddReplicaOPTask(op_data) < 0) { |
| 998 | PDLOG(WARNING, "recover op[%s] failed. op_id[%lu]", |
| 999 | ::fedb::api::OPType_Name(op_data->op_info_.op_type()).c_str(), op_data->op_info_.op_id()); |
| 1000 | continue; |
| 1001 | } |
| 1002 | break; |
| 1003 | case ::fedb::api::OPType::kChangeLeaderOP: |
| 1004 | if (CreateChangeLeaderOPTask(op_data) < 0) { |
| 1005 | PDLOG(WARNING, "recover op[%s] failed. op_id[%lu]", |
| 1006 | ::fedb::api::OPType_Name(op_data->op_info_.op_type()).c_str(), op_data->op_info_.op_id()); |
| 1007 | continue; |
| 1008 | } |
| 1009 | break; |
| 1010 | case ::fedb::api::OPType::kMigrateOP: |
| 1011 | if (CreateMigrateTask(op_data) < 0) { |
nothing calls this directly
no test coverage detected