ret: RET_OK if acquired, others if not acquired
| 160 | |
| 161 | // ret: RET_OK if acquired, others if not acquired |
| 162 | comm::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()); |
no test coverage detected