| 58 | LockMgr::~LockMgr() {} |
| 59 | |
| 60 | comm::RetCode LockMgr::Init(const string &mirror_dir_path) { |
| 61 | impl_->groups.reserve(impl_->lock->GetLockOption()->nr_group); |
| 62 | for (int paxos_group_id{0}; |
| 63 | impl_->lock->GetLockOption()->nr_group > paxos_group_id; ++paxos_group_id) { |
| 64 | impl_->groups.emplace_back(); |
| 65 | auto &&group(impl_->groups[paxos_group_id]); |
| 66 | |
| 67 | // recover leveldb |
| 68 | string group_directory{mirror_dir_path + to_string(paxos_group_id)}; |
| 69 | comm::RetCode ret{group.leveldb.Init(LockDb::Type::LEVELDB, group_directory)}; |
| 70 | if (comm::RetCode::RET_OK != ret) { |
| 71 | QLErr("paxos_group_id %d init leveldb err %d path \"%s\"", paxos_group_id, ret, group_directory.c_str()); |
| 72 | |
| 73 | assert(false); |
| 74 | } |
| 75 | |
| 76 | // init map |
| 77 | ret = group.map.Init(LockDb::Type::MAP, ""); |
| 78 | if (comm::RetCode::RET_OK != ret) { |
| 79 | QLErr("paxos_group_id %d init map err %d", paxos_group_id, ret); |
| 80 | |
| 81 | assert(false); |
| 82 | } |
| 83 | |
| 84 | // recover map |
| 85 | for (group.leveldb.SeekToFirst(); group.leveldb.Valid(); group.leveldb.Next()) { |
| 86 | string lock_key; |
| 87 | proto::LocalLockInfo local_lock_info; |
| 88 | comm::RetCode ret{group.leveldb.GetCurrent(lock_key, local_lock_info)}; |
| 89 | if (comm::RetCode::RET_ERR_IGNORE == ret) { |
| 90 | QLInfo("paxos_group_id %d lock_key \"%s\" GetCurrent ignore", paxos_group_id, lock_key.c_str()); |
| 91 | |
| 92 | continue; |
| 93 | } |
| 94 | |
| 95 | if (comm::RetCode::RET_OK != ret) { |
| 96 | QLErr("paxos_group_id %d lock_key \"%s\" GetCurrent err %d", paxos_group_id, lock_key.c_str(), ret); |
| 97 | |
| 98 | assert(false); |
| 99 | } |
| 100 | // reset expire time |
| 101 | local_lock_info.set_expire_time_ms(comm::utils::Time::GetSteadyClockMS() + |
| 102 | local_lock_info.lease_time_ms()); |
| 103 | group.map.Put(lock_key, move(local_lock_info)); |
| 104 | } |
| 105 | |
| 106 | // recover checkpoint |
| 107 | uint64_t checkpoint{phxpaxos::NoCheckpoint}; |
| 108 | ret = ReadCheckpoint(paxos_group_id, checkpoint); |
| 109 | if (comm::RetCode::RET_ERR_KEY_NOT_EXIST == ret) { |
| 110 | QLErr("topic_id %d paxos_group_id %d ReadCheckpoint not exist", |
| 111 | impl_->lock->GetTopicID(), paxos_group_id); |
| 112 | } else if (comm::RetCode::RET_OK == ret) { |
| 113 | QLInfo("topic_id %d paxos_group_id %d ReadCheckpoint cp %llu ok", |
| 114 | impl_->lock->GetTopicID(), paxos_group_id, checkpoint); |
| 115 | } else { |
| 116 | QLErr("topic_id %d paxos_group_id %d ReadCheckpoint err %d", |
| 117 | impl_->lock->GetTopicID(), paxos_group_id, ret); |
nothing calls this directly
no test coverage detected