[FEAT MERGE] 开源裁减颗粒度优化

Co-authored-by: nroskill <nroskill@gmail.com>
Co-authored-by: akaError <lzg020616@163.com>
Co-authored-by: yinyj17 <yinyijun92@gmail.com>
This commit is contained in:
wenxingsen
2023-08-15 02:40:25 +00:00
committed by ob-robot
parent a31e422133
commit 9b31f8aa03
378 changed files with 26718 additions and 2379 deletions

View File

@ -339,6 +339,16 @@ int ObLogHandler::set_initial_member_list(const common::ObMemberList &member_lis
return palf_handle_.set_initial_member_list(member_list, paxos_replica_num, learner_list);
}
#ifdef OB_BUILD_ARBITRATION
int ObLogHandler::set_initial_member_list(const common::ObMemberList &member_list,
const common::ObMember &arb_member,
const int64_t paxos_replica_num,
const common::GlobalLearnerList &learner_list)
{
RLockGuard guard(lock_);
return palf_handle_.set_initial_member_list(member_list, arb_member, paxos_replica_num, learner_list);
}
#endif
int ObLogHandler::set_election_priority(palf::election::ElectionPriority *priority)
{
@ -949,6 +959,199 @@ int ObLogHandler::switch_acceptor_to_learner(const common::ObMember &member,
return ret;
}
#ifdef OB_BUILD_ARBITRATION
int ObLogHandler::create_arb_member_(const common::ObMember &arb_member,
const int64_t timeout_us)
{
int ret = OB_SUCCESS;
const int64_t conn_timeout_us = MIN(timeout_us, MIN_CONN_TIMEOUT_US);
int64_t mode_version = -1;
AccessMode access_mode = AccessMode::INVALID_ACCESS_MODE;
if (OB_FAIL(get_access_mode(mode_version, access_mode))) {
CLOG_LOG(WARN, "get_access_mode failed", KR(ret), K_(id), K(access_mode));
} else if (AccessMode::INVALID_ACCESS_MODE == access_mode) {
ret = OB_ERR_UNEXPECTED;
CLOG_LOG(WARN, "invalid access_mode", KR(ret), K_(id), K(access_mode));
} else {
share::ObTenantRole::Role role = share::ObTenantRole::Role::PRIMARY_TENANT;
if (AccessMode::APPEND != access_mode) {
role = share::ObTenantRole::Role::STANDBY_TENANT;
}
share::ObTenantRole tenant_role(role);
share::ObLSID ls_id(id_);
obrpc::ObCreateArbArg req;
obrpc::ObCreateArbResult resp;
if (OB_FAIL(req.init(MTL_ID(), ls_id, tenant_role))) {
CLOG_LOG(WARN, "ObCreateArbArg init failed", KR(ret), K_(id), K(arb_member), K(timeout_us));
} else if (OB_FAIL(rpc_proxy_->to(arb_member.get_server()).timeout(conn_timeout_us).trace_time(true).
max_process_handler_time(timeout_us).by(MTL_ID()).create_arb(req, resp))) {
CLOG_LOG(WARN, "create_arb failed", KR(ret), K_(id), K(arb_member), K(timeout_us));
} else {
CLOG_LOG(INFO, "create_arb success", KR(ret), K_(id), K(arb_member), K(timeout_us));
}
}
return ret;
}
int ObLogHandler::delete_arb_member_(const common::ObMember &arb_member,
const int64_t timeout_us)
{
int ret = OB_SUCCESS;
const int64_t conn_timeout_us = MIN(timeout_us, MIN_CONN_TIMEOUT_US);
obrpc::ObDeleteArbArg req;
obrpc::ObDeleteArbResult resp;
share::ObLSID ls_id(id_);
if (OB_FAIL(req.init(MTL_ID(), ls_id))) {
CLOG_LOG(WARN, "ObDeleteArbArg init failed", KR(ret), K_(id), K(arb_member), K(timeout_us));
} else if (OB_FAIL(rpc_proxy_->to(arb_member.get_server()).timeout(conn_timeout_us).trace_time(true).
max_process_handler_time(timeout_us).by(MTL_ID()).delete_arb(req, resp))) {
CLOG_LOG(WARN, "delete arb member failed", KR(ret), K_(id), K(arb_member), K(timeout_us));
}
return ret;
}
// @desc: add_arbitration_member interface
// | 1.add_arbitration_member()
// V
// [any_member] ----> [2. Sync create_arb_member]
// |
// [3. Sync LogConfigChangeCmd] -------> [leader]
// |
// [any_member] <----[5. Sync LogConfigChangeCmdResp] <---- | 4. one_stage_config_change_(ADD_ARB_MEMBER)
int ObLogHandler::add_arbitration_member(const common::ObMember &added_member,
const int64_t timeout_us)
{
int ret = OB_SUCCESS;
const int64_t begin_ts = ObTimeUtility::current_time();
int64_t current_timeout_us = timeout_us;
const int64_t abs_timeout_us = common::ObTimeUtility::current_time() + timeout_us / 2;
WLockGuardWithTimeout deps_guard(deps_lock_, abs_timeout_us, ret);
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
} else if (OB_FAIL(ret)) {
CLOG_LOG(WARN, "get_lock failed", KR(ret), K_(id), K(added_member), K(timeout_us));
} else if (is_in_stop_state_) {
ret = OB_NOT_RUNNING;
} else if (!added_member.is_valid() || timeout_us <= 0) {
ret = OB_INVALID_ARGUMENT;
CLOG_LOG(WARN, "invalid argument", KR(ret), K_(id), K(added_member), K(timeout_us));
} else if (OB_FAIL(create_arb_member_(added_member, current_timeout_us))) {
CLOG_LOG(WARN, "create_arb_member_ failed", KR(ret), K_(id), K(added_member), K(current_timeout_us));
} else if (FALSE_IT(current_timeout_us -= (ObTimeUtility::current_time() - begin_ts))) {
} else if (current_timeout_us <= 0) {
ret = OB_TIMEOUT;
CLOG_LOG(WARN, "add_arbitration_member tiemout", KR(ret), K_(id), K(added_member), K(timeout_us));
} else {
common::ObMember dummy_member;
LogConfigChangeCmd req(self_, id_, added_member, dummy_member, 0, ADD_ARB_MEMBER_CMD, current_timeout_us);
if (OB_FAIL(submit_config_change_cmd_(req))) {
CLOG_LOG(WARN, " submit_config_change_cmd failed", KR(ret), K_(id), K(req), K(timeout_us), K(current_timeout_us));
} else {
CLOG_LOG(INFO, "add_arbitration_member success", KR(ret), K_(id), K(added_member));
}
}
return ret;
}
// @desc: remove_arbitration_member interface
// | 1. remove_arbitration_member()
// V
// [any_member] -----[2. Sync LogConfigChangeCmd]----> [leader]
// |
// [4. Sync LogConfigChangeCmdResp] ---- | 3. one_stage_config_change_(REMOVE_ARB_MEMBER)
// |
// [5. Sync delete_arb_member] ----> [any_member]
int ObLogHandler::remove_arbitration_member(const common::ObMember &removed_member,
const int64_t timeout_us)
{
int ret = OB_SUCCESS;
int64_t current_timeout_us = timeout_us;
const int64_t begin_ts = ObTimeUtility::current_time();
const int64_t abs_timeout_us = common::ObTimeUtility::current_time() + timeout_us / 2;
WLockGuardWithTimeout deps_guard(deps_lock_, abs_timeout_us, ret);
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
} else if (OB_FAIL(ret)) {
CLOG_LOG(WARN, "get_lock failed", KR(ret), K_(id), K(removed_member), K(timeout_us));
} else if (is_in_stop_state_) {
ret = OB_NOT_RUNNING;
} else if (!removed_member.is_valid() || timeout_us <= 0) {
ret = OB_INVALID_ARGUMENT;
CLOG_LOG(WARN, "invalid argument", KR(ret), K_(id), K(removed_member), K(timeout_us));
} else {
common::ObMember dummy_member;
LogConfigChangeCmd req(self_, id_, dummy_member, removed_member, 0, REMOVE_ARB_MEMBER_CMD, current_timeout_us);
if (OB_FAIL(submit_config_change_cmd_(req))) {
CLOG_LOG(WARN, " submit_config_change_cmd failed", KR(ret), K_(id), K(req), K(current_timeout_us));
} else if (FALSE_IT(current_timeout_us -= (ObTimeUtility::current_time() - begin_ts))) {
} else if (current_timeout_us <= 0) {
ret = OB_TIMEOUT;
CLOG_LOG(WARN, "add_arbitration_member tiemout", KR(ret), K_(id), K(removed_member), K(timeout_us));
} else if (OB_FAIL(delete_arb_member_(removed_member, current_timeout_us))) {
CLOG_LOG(WARN, "delete_arb_member_ failed", KR(ret), K_(id), K(removed_member), K(current_timeout_us));
} else {
CLOG_LOG(INFO, "remove_arbitration_member success", KR(ret), K_(id), K(removed_member));
}
}
return ret;
}
// @desc: degrade_acceptor_to_learner interface
// | 1.degrade_acceptor_to_learner()
// V
// [leader]
int ObLogHandler::degrade_acceptor_to_learner(const palf::LogMemberAckInfoList &degrade_servers,
const int64_t timeout_us)
{
int ret = OB_SUCCESS;
const int64_t abs_timeout_us = common::ObTimeUtility::current_time() + timeout_us / 2;
WLockGuardWithTimeout deps_guard(deps_lock_, abs_timeout_us, ret);
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
} else if (OB_FAIL(ret)) {
CLOG_LOG(WARN, "get_lock failed", KR(ret), K_(id), K(degrade_servers), K(timeout_us));
} else if (is_in_stop_state_) {
ret = OB_NOT_RUNNING;
} else if (0 == degrade_servers.count() ||
timeout_us <= 0) {
ret = OB_INVALID_ARGUMENT;
CLOG_LOG(WARN, "invalid argument", KR(ret), K_(id), K(degrade_servers), K(timeout_us));
} else if (OB_FAIL(palf_handle_.degrade_acceptor_to_learner(degrade_servers, timeout_us))) {
CLOG_LOG(WARN, "degrade_acceptor_to_learner failed", KR(ret), K_(id), K(degrade_servers), K(timeout_us));
} else {
CLOG_LOG(INFO, "degrade_acceptor_to_learner success", KR(ret), K_(id), K(degrade_servers));
}
return ret;
}
// @desc: upgrade_learner_to_acceptor interface
// | 1.upgrade_learner_to_acceptor()
// V
// [leader]
int ObLogHandler::upgrade_learner_to_acceptor(const palf::LogMemberAckInfoList &upgrade_servers,
const int64_t timeout_us)
{
int ret = OB_SUCCESS;
const int64_t abs_timeout_us = common::ObTimeUtility::current_time() + timeout_us / 2;
WLockGuardWithTimeout deps_guard(deps_lock_, abs_timeout_us, ret);
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
} else if (OB_FAIL(ret)) {
CLOG_LOG(WARN, "get_lock failed", KR(ret), K_(id), K(upgrade_servers), K(timeout_us));
} else if (is_in_stop_state_) {
ret = OB_NOT_RUNNING;
} else if (0 == upgrade_servers.count() ||
timeout_us <= 0) {
ret = OB_INVALID_ARGUMENT;
CLOG_LOG(WARN, "invalid argument", KR(ret), K_(id), K(upgrade_servers), K(timeout_us));
} else if (OB_FAIL(palf_handle_.upgrade_learner_to_acceptor(upgrade_servers, timeout_us))) {
CLOG_LOG(WARN, "upgrade_learner_to_acceptor failed", KR(ret), K_(id), K(upgrade_servers), K(timeout_us));
} else {
CLOG_LOG(INFO, "upgrade_learner_to_acceptor success", KR(ret), K_(id), K(upgrade_servers));
}
return ret;
}
#endif
int ObLogHandler::try_lock_config_change(const int64_t lock_owner, const int64_t timeout_us)