| 2455 | } |
| 2456 | |
| 2457 | void TabletImpl::MakeSnapshot(RpcController* controller, |
| 2458 | const ::fedb::api::GeneralRequest* request, |
| 2459 | ::fedb::api::GeneralResponse* response, |
| 2460 | Closure* done) { |
| 2461 | brpc::ClosureGuard done_guard(done); |
| 2462 | std::shared_ptr<::fedb::api::TaskInfo> task_ptr; |
| 2463 | if (request->has_task_info() && request->task_info().IsInitialized()) { |
| 2464 | if (AddOPTask(request->task_info(), |
| 2465 | ::fedb::api::TaskType::kMakeSnapshot, task_ptr) < 0) { |
| 2466 | response->set_code(-1); |
| 2467 | response->set_msg("add task failed"); |
| 2468 | return; |
| 2469 | } |
| 2470 | } |
| 2471 | uint32_t tid = request->tid(); |
| 2472 | uint32_t pid = request->pid(); |
| 2473 | uint64_t offset = 0; |
| 2474 | if (request->has_offset() && request->offset() > 0) { |
| 2475 | offset = request->offset(); |
| 2476 | } |
| 2477 | do { |
| 2478 | { |
| 2479 | std::lock_guard<SpinMutex> spin_lock(spin_mutex_); |
| 2480 | std::shared_ptr<Snapshot> snapshot = GetSnapshotUnLock(tid, pid); |
| 2481 | if (!snapshot) { |
| 2482 | response->set_code( |
| 2483 | ::fedb::base::ReturnCode::kSnapshotIsNotExist); |
| 2484 | response->set_msg("snapshot is not exist"); |
| 2485 | PDLOG(WARNING, "snapshot is not exist. tid[%u] pid[%u]", tid, |
| 2486 | pid); |
| 2487 | break; |
| 2488 | } |
| 2489 | std::shared_ptr<Table> table = |
| 2490 | GetTableUnLock(request->tid(), request->pid()); |
| 2491 | if (!table) { |
| 2492 | PDLOG(WARNING, "table is not exist. tid %u, pid %u", tid, pid); |
| 2493 | response->set_code(::fedb::base::ReturnCode::kTableIsNotExist); |
| 2494 | response->set_msg("table is not exist"); |
| 2495 | break; |
| 2496 | } |
| 2497 | if (table->GetTableStat() != ::fedb::storage::kNormal) { |
| 2498 | response->set_code( |
| 2499 | ::fedb::base::ReturnCode::kTableStatusIsNotKnormal); |
| 2500 | response->set_msg("table status is not kNormal"); |
| 2501 | PDLOG(WARNING, |
| 2502 | "table state is %d, cannot make snapshot. %u, pid %u", |
| 2503 | table->GetTableStat(), tid, pid); |
| 2504 | break; |
| 2505 | } |
| 2506 | } |
| 2507 | snapshot_pool_.AddTask(boost::bind(&TabletImpl::MakeSnapshotInternal, |
| 2508 | this, tid, pid, offset, task_ptr)); |
| 2509 | response->set_code(::fedb::base::ReturnCode::kOk); |
| 2510 | response->set_msg("ok"); |
| 2511 | return; |
| 2512 | } while (0); |
| 2513 | SetTaskStatus(task_ptr, ::fedb::api::TaskStatus::kFailed); |
| 2514 | } |