MCPcopy Create free account
hub / github.com/Tencent/phxqueue / PaxosAcquireLock

Method PaxosAcquireLock

phxqueue/lock/lock.cpp:441–507  ·  view source on GitHub ↗

ret: RET_OK if acquired, others if not acquired

Source from the content-addressed store, hash-verified

439
440// ret: RET_OK if acquired, others if not acquired
441comm::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;

Callers

nothing calls this directly

Calls 10

HashUi32Function · 0.85
OnPaxosAcquireLockMethod · 0.80
OnProposeMethod · 0.80
OnProposeErrMethod · 0.80
OnProposeErrTimeoutMethod · 0.80
OnProposeErrOtherMethod · 0.80
OnProposeErrResultMethod · 0.80
OnProposeSuccMethod · 0.80

Tested by

no test coverage detected