Files
oceanbase/src/logservice/ob_log_handler_base.cpp
obdev 50024b39cd [FEAT MERGE] log4100 branch
Co-authored-by: tino247 <tino247@126.com>
Co-authored-by: BinChenn <binchenn.bc@gmail.com>
Co-authored-by: HaHaJeff <jeffzhouhhh@gmail.com>
2023-01-28 18:17:32 +08:00

100 lines
3.2 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#include "ob_log_handler_base.h"
#include "common/ob_role.h"
#include "logservice/palf/log_define.h"
namespace oceanbase
{
namespace logservice
{
ObLogHandlerBase::ObLogHandlerBase() :
lock_(),
role_(common::FOLLOWER),
proposal_id_(palf::INVALID_PROPOSAL_ID),
id_(-1),
palf_handle_(),
palf_env_(NULL),
is_in_stop_state_(true),
is_inited_(false)
{}
int ObLogHandlerBase::prepare_switch_role(common::ObRole &curr_role,
int64_t &curr_proposal_id,
common::ObRole &new_role,
int64_t &new_proposal_id,
bool &is_pending_state) const
{
int ret = OB_SUCCESS;
RLockGuard guard(lock_);
if (OB_FAIL(palf_handle_.get_role(new_role, new_proposal_id, is_pending_state))) {
PALF_LOG(WARN, "PalfHandle get_role failed", K(ret), K_(id), K(curr_role), K(curr_proposal_id));
} else {
curr_role = role_;
curr_proposal_id = proposal_id_;
PALF_LOG(TRACE, "prepare_switch_role success", K(ret), K_(id), K(curr_role), K(curr_proposal_id),
K(new_role), K(new_proposal_id));
}
return ret;
}
int ObLogHandlerBase::revoke_leader()
{
RLockGuard guard(lock_);
return palf_handle_.revoke_leader(proposal_id_);
}
int ObLogHandlerBase::change_leader_to(const common::ObAddr &dst_addr)
{
int ret = OB_SUCCESS;
WLockGuard guard(lock_);
if (OB_FAIL(palf_handle_.change_leader_to(dst_addr))) {
PALF_LOG(WARN, "palf change_leader failed", K(ret), K(dst_addr), K(palf_handle_));
} else {
PALF_LOG(INFO, "ObLogHandler change_laeder success", K(ret), K(dst_addr), K(palf_handle_));
}
return ret;
}
int ObLogHandlerBase::get_role(common::ObRole &role, int64_t &proposal_id) const
{
int ret = OB_SUCCESS;
bool is_pending_state = false;
int64_t curr_palf_proposal_id;
ObRole curr_palf_role;
// 获取当前的proposal_id
RLockGuard guard(lock_);
const int64_t saved_proposal_id = ATOMIC_LOAD(&proposal_id_);
const ObRole saved_role = ATOMIC_LOAD(&role_);
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
} else if (is_in_stop_state_) {
ret = OB_NOT_RUNNING;
} else if (FOLLOWER == saved_role) {
role = FOLLOWER;
proposal_id = saved_proposal_id;
} else if (OB_FAIL(palf_handle_.get_role(curr_palf_role, curr_palf_proposal_id, is_pending_state))) {
CLOG_LOG(WARN, "get_role failed", K(ret));
} else if (curr_palf_proposal_id != saved_proposal_id) {
// palf的proposal_id已经发生变化,返回FOLLOWER
role = FOLLOWER;
proposal_id = saved_proposal_id;
} else {
role = curr_palf_role;
proposal_id = saved_proposal_id;
}
return ret;
}
} // end namespace logservice
} // end namespace oceanbase