| 4471 | } |
| 4472 | |
| 4473 | void TabletImpl::SendIndexData( |
| 4474 | RpcController* controller, |
| 4475 | const ::fedb::api::SendIndexDataRequest* request, |
| 4476 | ::fedb::api::GeneralResponse* response, Closure* done) { |
| 4477 | brpc::ClosureGuard done_guard(done); |
| 4478 | std::shared_ptr<::fedb::api::TaskInfo> task_ptr; |
| 4479 | if (request->has_task_info() && request->task_info().IsInitialized()) { |
| 4480 | if (AddOPTask(request->task_info(), |
| 4481 | ::fedb::api::TaskType::kSendIndexData, task_ptr) < 0) { |
| 4482 | response->set_code(-1); |
| 4483 | response->set_msg("add task failed"); |
| 4484 | return; |
| 4485 | } |
| 4486 | } |
| 4487 | do { |
| 4488 | std::shared_ptr<Table> table = GetTable(request->tid(), request->pid()); |
| 4489 | if (!table) { |
| 4490 | PDLOG(WARNING, "table is not exist. tid %u, pid %u", request->tid(), |
| 4491 | request->pid()); |
| 4492 | response->set_code(::fedb::base::ReturnCode::kTableIsNotExist); |
| 4493 | response->set_msg("table is not exist"); |
| 4494 | break; |
| 4495 | } |
| 4496 | MemTable* mem_table = dynamic_cast<MemTable*>(table.get()); |
| 4497 | if (mem_table == NULL) { |
| 4498 | PDLOG(WARNING, "table is not memtable. tid %u, pid %u", |
| 4499 | request->tid(), request->pid()); |
| 4500 | response->set_code(::fedb::base::ReturnCode::kTableTypeMismatch); |
| 4501 | response->set_msg("table is not memtable"); |
| 4502 | break; |
| 4503 | } |
| 4504 | std::map<uint32_t, std::string> pid_endpoint_map; |
| 4505 | for (int idx = 0; idx < request->pairs_size(); idx++) { |
| 4506 | pid_endpoint_map.insert(std::make_pair( |
| 4507 | request->pairs(idx).pid(), request->pairs(idx).endpoint())); |
| 4508 | } |
| 4509 | response->set_code(::fedb::base::ReturnCode::kOk); |
| 4510 | response->set_msg("ok"); |
| 4511 | if (pid_endpoint_map.empty()) { |
| 4512 | PDLOG(INFO, "pid endpoint map is empty. tid %u, pid %u", |
| 4513 | request->tid(), request->pid()); |
| 4514 | SetTaskStatus(task_ptr, ::fedb::api::TaskStatus::kDone); |
| 4515 | } else { |
| 4516 | task_pool_.AddTask(boost::bind(&TabletImpl::SendIndexDataInternal, |
| 4517 | this, table, pid_endpoint_map, |
| 4518 | task_ptr)); |
| 4519 | } |
| 4520 | return; |
| 4521 | } while (0); |
| 4522 | SetTaskStatus(task_ptr, ::fedb::api::TaskStatus::kFailed); |
| 4523 | } |
| 4524 | |
| 4525 | void TabletImpl::SendIndexDataInternal( |
| 4526 | std::shared_ptr<::fedb::storage::Table> table, |