| 154 | } |
| 155 | |
| 156 | comm::RetCode KeepMasterThread::KeepMaster() { |
| 157 | const int topic_id{impl_->lock->GetTopicID()}; |
| 158 | |
| 159 | shared_ptr<const config::TopicConfig> topic_config; |
| 160 | comm::RetCode ret{config::GlobalConfig::GetThreadInstance()-> |
| 161 | GetTopicConfigByTopicID(topic_id, topic_config)}; |
| 162 | if (comm::RetCode::RET_OK != ret) { |
| 163 | QLErr("GetTopicConfigByTopicID ret %d topic_id %d", ret, topic_id); |
| 164 | |
| 165 | return ret; |
| 166 | } |
| 167 | |
| 168 | static vector<bool> last_master; |
| 169 | const auto &opt(impl_->lock->GetLockOption()); |
| 170 | last_master.resize(opt->nr_group); |
| 171 | |
| 172 | comm::proto::Addr addr; |
| 173 | addr.set_ip(opt->ip); |
| 174 | addr.set_port(opt->port); |
| 175 | addr.set_paxos_port(opt->paxos_port); |
| 176 | |
| 177 | shared_ptr<const config::LockConfig> lock_config; |
| 178 | ret = config::GlobalConfig::GetThreadInstance()->GetLockConfig(topic_id, lock_config); |
| 179 | if (comm::RetCode::RET_OK != ret) { |
| 180 | QLErr("GetLockConfig ret %d topic_id %d", as_integer(ret), topic_id); |
| 181 | |
| 182 | return ret; |
| 183 | } |
| 184 | |
| 185 | shared_ptr<const config::proto::Lock> lock; |
| 186 | ret = lock_config->GetLockByAddr(addr, lock); |
| 187 | if (comm::RetCode::RET_OK != ret) { |
| 188 | QLErr("GetLockByAddr ret %d", as_integer(ret)); |
| 189 | |
| 190 | return ret; |
| 191 | } |
| 192 | |
| 193 | int idx_in_lock{-1}; |
| 194 | for (size_t i{0}; lock->addrs_size() > i; ++i) { |
| 195 | if (addr.ip() == lock->addrs(i).ip() && |
| 196 | addr.port() == lock->addrs(i).port() && |
| 197 | addr.paxos_port() == lock->addrs(i).paxos_port()) { |
| 198 | idx_in_lock = i; |
| 199 | |
| 200 | break; |
| 201 | } |
| 202 | } |
| 203 | |
| 204 | auto node(impl_->lock->GetNode()); |
| 205 | |
| 206 | if (-1 == idx_in_lock) |
| 207 | return comm::RetCode::RET_ERR_LOGIC; |
| 208 | |
| 209 | for (int paxos_group_id{0}; paxos_group_id < opt->nr_group; ++paxos_group_id) { |
| 210 | if (static_cast<double>(paxos_group_id) / opt->nr_group * 100.0 + 0.5 > |
| 211 | impl_->master_rate) { |
| 212 | QLInfo("MASTERSTAT: master_rate too low, need drop master. " |
| 213 | "paxos_group_id %d master_rate %d", paxos_group_id, impl_->master_rate); |
nothing calls this directly
no test coverage detected