ret: RET_OK if acquired, others if not acquired
| 439 | |
| 440 | // ret: RET_OK if acquired, others if not acquired |
| 441 | comm::RetCode Lock::PaxosAcquireLock(const comm::proto::AcquireLockRequest &req, |
| 442 | comm::proto::AcquireLockResponse &resp) { |
| 443 | comm::LockBP::GetThreadInstance()->OnPaxosAcquireLock(req); |
| 444 | |
| 445 | auto &&lock_info(req.lock_info()); |
| 446 | uint32_t paxos_group_id{HashUi32(lock_info.lock_key()) % impl_->opt.nr_group}; |
| 447 | |
| 448 | // paxos |
| 449 | proto::LockPaxosArgs args; |
| 450 | |
| 451 | // 1. make args |
| 452 | *args.mutable_acquire_lock_req() = req; |
| 453 | |
| 454 | // 2. serialize args to paxos value |
| 455 | string buf; |
| 456 | args.SerializeToString(&buf); |
| 457 | |
| 458 | // 3. send to paxos |
| 459 | comm::LockBP::GetThreadInstance()->OnPropose(req); |
| 460 | |
| 461 | LockContext lc; |
| 462 | phxpaxos::SMCtx sm_ctx(LockSM::ID, &lc); |
| 463 | uint64_t instance_id{0}; |
| 464 | |
| 465 | uint64_t t1{comm::utils::Time::GetSteadyClockMS()}; |
| 466 | int paxos_ret{impl_->node->Propose(paxos_group_id, buf, instance_id, &sm_ctx)}; |
| 467 | uint64_t t2{comm::utils::Time::GetSteadyClockMS()}; |
| 468 | uint64_t used_time_ms{t2 - t1}; |
| 469 | |
| 470 | if (phxpaxos::PaxosTryCommitRet_OK != paxos_ret) { |
| 471 | comm::LockBP::GetThreadInstance()->OnProposeErr(req, used_time_ms); |
| 472 | QLErr("paxos_group %d lock \"%s\" Propose err %d buf.size %zu req.client_id \"%s\"", |
| 473 | paxos_group_id, lock_info.lock_key().c_str(), |
| 474 | paxos_ret, buf.size(), lock_info.client_id().c_str()); |
| 475 | switch (paxos_ret) { |
| 476 | case phxpaxos::PaxosTryCommitRet_Timeout: |
| 477 | comm::LockBP::GetThreadInstance()->OnProposeErrTimeout(req); |
| 478 | return comm::RetCode::RET_ERR_PROPOSE_TIMEOUT; |
| 479 | case phxpaxos::PaxosTryCommitRet_TooManyThreadWaiting_Reject: |
| 480 | comm::LockBP::GetThreadInstance()->OnProposeErrTooManyThreadWaitingReject(req); |
| 481 | return comm::RetCode::RET_ERR_PROPOSE_FAST_REJECT; |
| 482 | case phxpaxos::PaxosTryCommitRet_Value_Size_TooLarge: |
| 483 | comm::LockBP::GetThreadInstance()->OnProposeErrValueSizeTooLarge(req); |
| 484 | return comm::RetCode::RET_ERR_SIZE_TOO_LARGE; |
| 485 | default: |
| 486 | comm::LockBP::GetThreadInstance()->OnProposeErrOther(req); |
| 487 | return comm::RetCode::RET_ERR_PROPOSE; |
| 488 | }; |
| 489 | } |
| 490 | |
| 491 | if (comm::RetCode::RET_OK != lc.result) { |
| 492 | QLErr("paxos_group %d lock \"%s\" Propose err %d instance_id %" PRIu64 |
| 493 | " buf.size %zu req.client_id \"%s\"", paxos_group_id, |
| 494 | lock_info.lock_key().c_str(), lc.result, instance_id, buf.size(), |
| 495 | lock_info.client_id().c_str()); |
| 496 | comm::LockBP::GetThreadInstance()->OnProposeErrResult(req, instance_id, used_time_ms); |
| 497 | |
| 498 | return lc.result; |
nothing calls this directly
no test coverage detected