[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>
This commit is contained in:
obdev
2023-01-28 18:17:31 +08:00
committed by ob-robot
parent a269ffe6be
commit 50024b39cd
772 changed files with 60275 additions and 11301 deletions

View File

@ -16,6 +16,7 @@
#include "share/scn.h"
#define private public
#include "env/ob_simple_log_cluster_env.h"
#include "env/ob_simple_log_server.h"
#undef private
const std::string TEST_NAME = "access_mode";
@ -39,6 +40,7 @@ public:
int64_t ObSimpleLogClusterTestBase::member_cnt_ = 3;
int64_t ObSimpleLogClusterTestBase::node_cnt_ = 4;
std::string ObSimpleLogClusterTestBase::test_name_ = TEST_NAME;
bool ObSimpleLogClusterTestBase::need_add_arb_server_ = false;
// 1. basic change_access_mode
// 2. change_access_mode(block a follower), then switch this follower to leader
@ -56,34 +58,35 @@ TEST_F(TestObSimpleLogClusterAccessMode, basic_change_access_mode)
int64_t ref_ts_ns = common::ObTimeUtility::current_time_ns() + 1800 * 1000L * 1000L * 1000L;
share::SCN ref_scn;
ref_scn.convert_for_logservice(ref_ts_ns);
PalfHandleGuard leader;
PalfHandleImplGuard leader;
const int64_t CONFIG_CHANGE_TIMEOUT = 10 * 1000 * 1000 * 1000L; // 10s
EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, leader_idx, leader));
EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));
AccessMode curr_access_mode;
int64_t mode_version, curr_proposal_id;
ObRole unused_role;
EXPECT_EQ(OB_SUCCESS, leader.get_access_mode(mode_version, curr_access_mode));
bool state;
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(AccessMode::APPEND, curr_access_mode);
// test can not submit log in MODE_PREPARE
EXPECT_EQ(OB_EAGAIN, leader.palf_handle_.palf_handle_impl_->mode_mgr_.change_access_mode(mode_version, palf::AccessMode::RAW_WRITE, share::SCN::min_scn()));
EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->mode_mgr_.change_access_mode(mode_version, palf::AccessMode::RAW_WRITE, share::SCN::min_scn()));
// cannot submit_log in prepare state
EXPECT_EQ(OB_NOT_MASTER, submit_log(leader, 1, id));
int tmp_ret = OB_EAGAIN;
while(OB_EAGAIN == tmp_ret) {
tmp_ret = leader.palf_handle_.palf_handle_impl_->mode_mgr_.change_access_mode(mode_version, palf::AccessMode::RAW_WRITE, share::SCN::min_scn());
tmp_ret = leader.palf_handle_impl_->mode_mgr_.change_access_mode(mode_version, palf::AccessMode::RAW_WRITE, share::SCN::min_scn());
usleep(10 * 1000);
}
EXPECT_EQ(OB_SUCCESS, leader.get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(AccessMode::RAW_WRITE, curr_access_mode);
EXPECT_EQ(OB_SUCCESS, leader.get_role(unused_role, curr_proposal_id));
EXPECT_EQ(OB_SUCCESS, leader.change_access_mode(curr_proposal_id, mode_version, palf::AccessMode::FLASHBACK, share::SCN::min_scn()));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, palf::AccessMode::FLASHBACK, share::SCN::min_scn()));
EXPECT_EQ(OB_NOT_MASTER, submit_log(leader, 1, id));
// base_ts: 0.5 hour later
EXPECT_EQ(OB_SUCCESS, leader.get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.get_role(unused_role, curr_proposal_id));
EXPECT_EQ(OB_SUCCESS, leader.change_access_mode(curr_proposal_id, mode_version, AccessMode::APPEND, ref_scn));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, AccessMode::APPEND, ref_scn));
std::vector<LSN> lsn_array;
std::vector<SCN> scn_arrary;
EXPECT_EQ(OB_SUCCESS, submit_log(leader, 50, id, lsn_array, scn_arrary));
@ -94,16 +97,16 @@ TEST_F(TestObSimpleLogClusterAccessMode, basic_change_access_mode)
// 40 minutes later
ref_ts_ns = common::ObTimeUtility::current_time_ns() + 2400L * 1000L * 1000L * 1000L;
ref_scn.convert_for_logservice(ref_ts_ns);
EXPECT_EQ(OB_SUCCESS, leader.get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.get_role(unused_role, curr_proposal_id));
// can not APPEND -> APPEND
EXPECT_EQ(OB_STATE_NOT_MATCH, leader.change_access_mode(curr_proposal_id, mode_version, AccessMode::APPEND, ref_scn));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
// APPEND -> APPEND
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, AccessMode::APPEND, ref_scn));
// can not APPEND -> FLASHBACK
EXPECT_EQ(OB_STATE_NOT_MATCH, leader.change_access_mode(curr_proposal_id, mode_version, AccessMode::FLASHBACK, ref_scn));
EXPECT_EQ(OB_SUCCESS, leader.change_access_mode(curr_proposal_id, mode_version, AccessMode::RAW_WRITE, ref_scn));
EXPECT_EQ(OB_SUCCESS, leader.get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.get_role(unused_role, curr_proposal_id));
EXPECT_EQ(OB_SUCCESS, leader.change_access_mode(curr_proposal_id, mode_version, AccessMode::APPEND, ref_scn));
EXPECT_EQ(OB_STATE_NOT_MATCH, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, AccessMode::FLASHBACK, ref_scn));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, AccessMode::RAW_WRITE, ref_scn));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, AccessMode::APPEND, ref_scn));
lsn_array.clear();
scn_arrary.clear();
EXPECT_EQ(OB_SUCCESS, submit_log(leader, 50, id, lsn_array, scn_arrary));
@ -121,37 +124,38 @@ TEST_F(TestObSimpleLogClusterAccessMode, switch_leader1)
const int64_t id = ATOMIC_AAF(&palf_id_, 1);
PALF_LOG(INFO, "begin test switch_leader1", K(id));
int64_t leader_idx = 0;
PalfHandleGuard leader;
PalfHandleImplGuard leader;
bool state;
EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, leader_idx, leader));
EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));
AccessMode curr_access_mode;
int64_t mode_version, curr_proposal_id;
ObRole unused_role;
EXPECT_EQ(OB_SUCCESS, leader.get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.get_role(unused_role, curr_proposal_id));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
EXPECT_EQ(AccessMode::APPEND, curr_access_mode);
const int64_t follower1_idx = (leader_idx+1)%3;
const int64_t follower2_idx = (leader_idx+2)%3;
block_net(leader_idx, follower1_idx);
EXPECT_EQ(OB_SUCCESS, leader.change_access_mode(curr_proposal_id, mode_version, palf::AccessMode::RAW_WRITE, share::SCN::min_scn()));
EXPECT_EQ(OB_SUCCESS, leader.get_role(unused_role, curr_proposal_id));
EXPECT_EQ(OB_SUCCESS, leader.get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, palf::AccessMode::RAW_WRITE, share::SCN::min_scn()));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(curr_proposal_id, mode_version);
block_net(leader_idx, follower2_idx);
sleep(10);
// a follower will be leader
while (true) {
PalfHandleGuard new_leader;
PalfHandleImplGuard new_leader;
int64_t new_leader_idx;
int64_t mode_version_after_reconfirm = -1;
EXPECT_EQ(OB_SUCCESS, get_leader(id, new_leader, new_leader_idx));
if (new_leader_idx != leader_idx) {
EXPECT_EQ(OB_SUCCESS, new_leader.get_access_mode(mode_version_after_reconfirm, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, new_leader.palf_handle_impl_->get_access_mode(mode_version_after_reconfirm, curr_access_mode));
EXPECT_EQ(AccessMode::RAW_WRITE, curr_access_mode);
// mode_version won't be changed after reconfirming
EXPECT_EQ(mode_version_after_reconfirm, mode_version);
EXPECT_EQ(OB_SUCCESS, new_leader.get_role(unused_role, curr_proposal_id));
EXPECT_EQ(OB_SUCCESS, new_leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, state));
EXPECT_GT(curr_proposal_id, mode_version_after_reconfirm);
break;
} else {
@ -166,14 +170,15 @@ TEST_F(TestObSimpleLogClusterAccessMode, switch_leader1)
TEST_F(TestObSimpleLogClusterAccessMode, add_member)
{
SET_CASE_LOG_FILE(TEST_NAME, "add_member");
OB_LOGGER.set_log_level("INFO");
MockLocCB loc_cb;
int ret = OB_SUCCESS;
const int64_t id = ATOMIC_AAF(&palf_id_, 1);
PALF_LOG(INFO, "begin test add_member", K(id));
{
int64_t leader_idx = 0;
PalfHandleGuard leader;
std::vector<PalfHandleGuard*> palf_list;
PalfHandleImplGuard leader;
std::vector<PalfHandleImplGuard*> palf_list;
const int64_t CONFIG_CHANGE_TIMEOUT = 10 * 1000 * 1000 * 1000L; // 10s
EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, leader_idx, leader));
EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));
@ -186,16 +191,17 @@ TEST_F(TestObSimpleLogClusterAccessMode, add_member)
region_map.insert(get_cluster()[0]->get_addr(), default_region);
region_map.insert(get_cluster()[1]->get_addr(), ObRegion("SHANGHAI"));
region_map.insert(get_cluster()[2]->get_addr(), ObRegion("TIANJIN"));
EXPECT_EQ(OB_SUCCESS, leader.set_paxos_member_region_map(region_map));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->set_paxos_member_region_map(region_map));
EXPECT_EQ(OB_SUCCESS, get_cluster_palf_handle_guard(id, palf_list));
palf_list[1]->set_region(ObRegion("SHANGHAI"));
palf_list[2]->set_region(ObRegion("TIANJIN"));
palf_list[1]->palf_handle_impl_->set_region(ObRegion("SHANGHAI"));
palf_list[2]->palf_handle_impl_->set_region(ObRegion("TIANJIN"));
AccessMode curr_access_mode;
int64_t mode_version, curr_proposal_id;
ObRole unused_role;
EXPECT_EQ(OB_SUCCESS, leader.get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.get_role(unused_role, curr_proposal_id));
bool unused_is_pending_state = false;
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_access_mode(mode_version, curr_access_mode));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(unused_role, curr_proposal_id, unused_is_pending_state));
EXPECT_EQ(AccessMode::APPEND, curr_access_mode);
const int64_t follower1_idx = (leader_idx+1)%3;
const int64_t follower2_idx = (leader_idx+2)%3;
@ -203,21 +209,21 @@ TEST_F(TestObSimpleLogClusterAccessMode, add_member)
// election membership version reaches majority
sleep(1);
EXPECT_EQ(OB_SUCCESS, leader.change_access_mode(curr_proposal_id, mode_version, palf::AccessMode::RAW_WRITE, share::SCN::min_scn()));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->change_access_mode(curr_proposal_id, mode_version, palf::AccessMode::RAW_WRITE, share::SCN::min_scn()));
unblock_net(leader_idx, follower1_idx);
block_net(leader_idx, follower2_idx);
// new_leader需要在delete_paxos_group()之前析构,否则palf_handle引用计数无法清零
PalfHandleGuard new_leader;
PalfHandleImplGuard new_leader;
int64_t new_leader_idx;
EXPECT_EQ(OB_SUCCESS, get_leader(id, new_leader, new_leader_idx));
loc_cb.leader_ = get_cluster()[new_leader_idx]->get_addr();
PALF_LOG(INFO, "set leader for loc_cb", "leader", get_cluster()[new_leader_idx]->get_addr());
EXPECT_EQ(OB_SUCCESS, palf_list[3]->set_location_cache_cb(&loc_cb));
EXPECT_EQ(OB_SUCCESS, palf_list[3]->palf_handle_impl_->set_location_cache_cb(&loc_cb));
EXPECT_EQ(OB_SUCCESS, leader.add_learner(ObMember(get_cluster()[3]->addr_, 1), CONFIG_CHANGE_TIMEOUT));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->add_learner(ObMember(get_cluster()[3]->get_addr(), 1), CONFIG_CHANGE_TIMEOUT));
sleep(2);
EXPECT_EQ(OB_SUCCESS, leader.switch_learner_to_acceptor(ObMember(get_cluster()[3]->addr_, 1), CONFIG_CHANGE_TIMEOUT));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->switch_learner_to_acceptor(ObMember(get_cluster()[3]->get_addr(), 1), CONFIG_CHANGE_TIMEOUT));
unblock_net(leader_idx, follower2_idx);
revert_cluster_palf_handle_guard(palf_list);
}
@ -232,7 +238,7 @@ TEST_F(TestObSimpleLogClusterAccessMode, prev_log_slide)
const int64_t id = ATOMIC_AAF(&palf_id_, 1);
PALF_LOG(INFO, "begin test prev_log_slide", K(id));
int64_t leader_idx = 0;
PalfHandleGuard leader;
PalfHandleImplGuard leader;
const int64_t CONFIG_CHANGE_TIMEOUT = 10 * 1000 * 1000 * 1000L; // 10s
EXPECT_EQ(OB_SUCCESS, create_paxos_group(id, leader_idx, leader));
EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));
@ -240,36 +246,40 @@ TEST_F(TestObSimpleLogClusterAccessMode, prev_log_slide)
// inc current proposal_id
int64_t curr_pid = 0;
ObRole role;
std::vector<PalfHandleGuard*> palf_list;
bool state;
std::vector<PalfHandleImplGuard*> palf_list;
EXPECT_EQ(OB_SUCCESS, get_cluster_palf_handle_guard(id, palf_list));
EXPECT_EQ(OB_SUCCESS, leader.get_role(role, curr_pid));
EXPECT_EQ(OB_EAGAIN, leader.palf_handle_.palf_handle_impl_->mode_mgr_.switch_state_(AccessMode::RAW_WRITE, share::SCN::min_scn(), false));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(role, curr_pid, state));
EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->mode_mgr_.switch_state_(AccessMode::RAW_WRITE, share::SCN::min_scn(), false));
// can not submit_log, config_change in prepare state
EXPECT_FALSE(leader.palf_handle_.palf_handle_impl_->mode_mgr_.can_append());
LogConfigChangeArgs args(ObMember(get_cluster()[3]->addr_, 1), 0, ADD_LEARNER);
EXPECT_FALSE(leader.palf_handle_impl_->mode_mgr_.can_append());
LogConfigChangeArgs args(ObMember(get_cluster()[3]->get_addr(), 1), 0, ADD_LEARNER);
EXPECT_EQ(OB_NOT_MASTER, submit_log(leader, 1, id));
const LogConfigMeta config_meta = leader.palf_handle_.palf_handle_impl_->config_mgr_.log_ms_meta_;
EXPECT_EQ(OB_EAGAIN, leader.palf_handle_.palf_handle_impl_->config_mgr_.change_config(args));
const LogConfigMeta new_config_meta = leader.palf_handle_.palf_handle_impl_->config_mgr_.log_ms_meta_;
const LogConfigMeta config_meta = leader.palf_handle_impl_->config_mgr_.log_ms_meta_;
LogConfigVersion config_version;
const int64_t proposal_id = leader.palf_handle_impl_->state_mgr_.get_proposal_id();
const int64_t leader_epoch = leader.palf_handle_impl_->state_mgr_.get_leader_epoch();
EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->config_mgr_.change_config(args, proposal_id, leader_epoch, config_version));
const LogConfigMeta new_config_meta = leader.palf_handle_impl_->config_mgr_.log_ms_meta_;
EXPECT_EQ(config_meta.curr_.config_version_, new_config_meta.curr_.config_version_);
// wait prepare req reaches majority
sleep(1);
// switch to accept state
EXPECT_EQ(OB_EAGAIN, leader.palf_handle_.palf_handle_impl_->mode_mgr_.switch_state_(AccessMode::RAW_WRITE, share::SCN::min_scn(), false));
EXPECT_TRUE(leader.palf_handle_.palf_handle_impl_->mode_mgr_.can_append());
EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->mode_mgr_.switch_state_(AccessMode::RAW_WRITE, share::SCN::min_scn(), false));
EXPECT_TRUE(leader.palf_handle_impl_->mode_mgr_.can_append());
int64_t new_pid = 0;
EXPECT_EQ(OB_SUCCESS, leader.get_role(role, new_pid));
EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_role(role, new_pid, state));
EXPECT_EQ(curr_pid + 1, new_pid);
EXPECT_EQ(curr_pid + 1, palf_list[1]->palf_handle_.palf_handle_impl_->state_mgr_.get_proposal_id());
EXPECT_EQ(curr_pid + 1, palf_list[2]->palf_handle_.palf_handle_impl_->state_mgr_.get_proposal_id());
EXPECT_EQ(curr_pid + 1, palf_list[1]->palf_handle_impl_->state_mgr_.get_proposal_id());
EXPECT_EQ(curr_pid + 1, palf_list[2]->palf_handle_impl_->state_mgr_.get_proposal_id());
// apply config_change barrier with older log proposal_id
EXPECT_EQ(OB_EAGAIN, leader.palf_handle_.palf_handle_impl_->config_mgr_.change_config(args));
EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->config_mgr_.change_config(args, proposal_id, leader_epoch, config_version));
// submit log with new proposal_id and wait for sliding out in follower
EXPECT_EQ(OB_SUCCESS, submit_log(leader, 100, id));
while (true) {
if (palf_list[1]->palf_handle_.palf_handle_impl_->sw_.last_slide_log_pid_ == new_pid &&
palf_list[2]->palf_handle_.palf_handle_impl_->sw_.last_slide_log_pid_ == new_pid) {
if (palf_list[1]->palf_handle_impl_->sw_.last_slide_log_pid_ == new_pid &&
palf_list[2]->palf_handle_impl_->sw_.last_slide_log_pid_ == new_pid) {
break;
} else {
EXPECT_EQ(OB_SUCCESS, submit_log(leader, 1, id));
@ -280,7 +290,7 @@ TEST_F(TestObSimpleLogClusterAccessMode, prev_log_slide)
revert_cluster_palf_handle_guard(palf_list);
// continue add_learner, prev log must have slided
while(true) {
if (OB_SUCC(leader.palf_handle_.palf_handle_impl_->config_mgr_.change_config(args))) {
if (OB_SUCC(leader.palf_handle_impl_->config_mgr_.change_config(args, proposal_id, leader_epoch, config_version))) {
break;
} else {
usleep(100 * 1000);