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

Method AcquireLock

phxqueue/lock/lock.cpp:162–251  ·  view source on GitHub ↗

ret: RET_OK if acquired, others if not acquired

Source from the content-addressed store, hash-verified

160
161// ret: RET_OK if acquired, others if not acquired
162comm::RetCode Lock::AcquireLock(const comm::proto::AcquireLockRequest &req,
163 comm::proto::AcquireLockResponse &resp) {
164 comm::LockBP::GetThreadInstance()->OnAcquireLock(req);
165
166 auto &&lock_info(req.lock_info());
167
168 if (0 >= lock_info.lock_key().size()) {
169 QLErr("lock \"%s\" invalid", lock_info.lock_key().c_str());
170
171 return comm::RetCode::RET_ERR_KEY;
172 }
173
174 uint32_t paxos_group_id{HashUi32(lock_info.lock_key()) % impl_->opt.nr_group};
175
176 comm::RetCode ret{CheckMaster(paxos_group_id, *resp.mutable_redirect_addr())};
177 if (comm::RetCode::RET_OK != ret) {
178 comm::LockBP::GetThreadInstance()->OnAcquireLockRequestInvalid(req);
179 QLErr("paxos_group %d lock \"%s\" CheckMaster err %d req.client_id \"%s\"",
180 paxos_group_id, lock_info.lock_key().c_str(), ret, lock_info.client_id().c_str());
181
182 return ret;
183 }
184 comm::LockBP::GetThreadInstance()->OnAcquireLockCheckMasterPass(req);
185 QLVerb("paxos_group %d lock \"%s\" node %" PRIu64 " master 1 req.ver %llu req.client_id \"%s\"",
186 paxos_group_id, lock_info.lock_key().c_str(), impl_->node->GetMyNodeID(),
187 lock_info.version(), lock_info.client_id().c_str());
188
189 // compare version
190 proto::LocalLockInfo local_lock_info;
191
192 // begin mutex
193 {
194
195 // ensure clean thread not cleaning
196 comm::utils::MutexGuard guard(impl_->lock_mgr->map(paxos_group_id).mutex());
197 ret = impl_->lock_mgr->map(paxos_group_id).Get(lock_info.lock_key(), local_lock_info);
198
199 }
200 // end mutex
201
202 if (comm::RetCode::RET_ERR_KEY_NOT_EXIST == ret) {
203 QLVerb("paxos_group %d lock \"%s\" Get not exist",
204 paxos_group_id, lock_info.lock_key().c_str());
205 // TODO:
206 //OssAttrInc(impl_->opt.oss_attr_id, 15u, 1u);
207 } else if (comm::RetCode::RET_OK != ret) {
208 QLErr("paxos_group %d lock \"%s\" Get err %d",
209 paxos_group_id, lock_info.lock_key().c_str(), ret);
210 // TODO:
211 //OssAttrInc(impl_->opt.oss_attr_id, 14u, 1u);
212
213 return ret;
214 }
215
216 if (comm::RetCode::RET_ERR_KEY_NOT_EXIST != ret && local_lock_info.version() != lock_info.version()) {
217 QLErr("paxos_group %d lock \"%s\" map.ver %llu != req.ver %llu req.client_id \"%s\"",
218 paxos_group_id, lock_info.lock_key().c_str(), local_lock_info.version(),
219 lock_info.version(), lock_info.client_id().c_str());

Callers 1

DoExecuteFunction · 0.45

Calls 7

HashUi32Function · 0.85
mutexMethod · 0.80
DeleteMethod · 0.80
OnAcquireLockMethod · 0.45
GetMethod · 0.45

Tested by

no test coverage detected