oceanbase
432 строки · 21.3 Кб
1/**
2* Copyright (c) 2021 OceanBase
3* OceanBase CE is licensed under Mulan PubL v2.
4* You can use this software according to the terms and conditions of the Mulan PubL v2.
5* You may obtain a copy of Mulan PubL v2 at:
6* http://license.coscl.org.cn/MulanPubL-2.0
7* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10* See the Mulan PubL v2 for more details.
11*/
12
13#include <cstdio>14#include <gtest/gtest.h>15#include <signal.h>16#include <share/scn.h>17#define private public18#include "env/ob_simple_log_cluster_env.h"19#undef private20
21const std::string TEST_NAME = "config_change_mock_ele";22
23using namespace oceanbase::common;24using namespace oceanbase;25namespace oceanbase26{
27using namespace logservice;28namespace unittest29{
30class TestObSimpleLogClusterConfigChangeMockEle : public ObSimpleLogClusterTestEnv31{
32public:33TestObSimpleLogClusterConfigChangeMockEle() : ObSimpleLogClusterTestEnv()34{}35};36
37int64_t ObSimpleLogClusterTestBase::member_cnt_ = 3;38int64_t ObSimpleLogClusterTestBase::node_cnt_ = 7;39std::string ObSimpleLogClusterTestBase::test_name_ = TEST_NAME;40bool ObSimpleLogClusterTestBase::need_add_arb_server_ = false;41
42MockLocCB loc_cb;43
44// switch leader after appending config log
45TEST_F(TestObSimpleLogClusterConfigChangeMockEle, switch_leader_during_removing_member1)46{
47int ret = OB_SUCCESS;48const int64_t id = ATOMIC_AAF(&palf_id_, 1);49SET_CASE_LOG_FILE(TEST_NAME, "switch_leader_during_removing_member1");50PALF_LOG(INFO, "begin test switch_leader_during_removing_member1", K(id));51{52int64_t leader_idx = 0;53PalfHandleImplGuard leader;54std::vector<PalfHandleImplGuard*> palf_list;55EXPECT_EQ(OB_SUCCESS, create_paxos_group_with_mock_election(id, leader_idx, leader));56EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));57EXPECT_EQ(OB_SUCCESS, get_cluster_palf_handle_guard(id, palf_list));58
59const int64_t b_idx = (leader_idx + 1) % 3;60const int64_t c_idx = (leader_idx + 2) % 3;61PalfHandleImplGuard *a_handle = palf_list[leader_idx];62PalfHandleImplGuard *b_handle = palf_list[b_idx];63PalfHandleImplGuard *c_handle = palf_list[c_idx];64
65// 1. A starts to remove B66int64_t remove_b_pid = 0;67int64_t remove_b_ele_epoch = 0;68LogConfigVersion remove_b_version;69const common::ObAddr b_addr = get_cluster()[b_idx]->get_addr();70const common::ObAddr c_addr = get_cluster()[c_idx]->get_addr();71LogConfigChangeArgs args(common::ObMember(b_addr, 1), 2, REMOVE_MEMBER);72EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->config_mgr_.start_change_config(remove_b_pid, remove_b_ele_epoch, args.type_));73EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->config_mgr_.change_config_(args, remove_b_pid, remove_b_ele_epoch, remove_b_version));74
75EXPECT_FALSE(leader.palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));76EXPECT_TRUE(b_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));77EXPECT_TRUE(c_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));78
79// 2. B is elected to be the leader80block_net(leader_idx, b_idx);81for (auto srv: get_cluster()) {82srv->set_leader(id, b_addr);83}84EXPECT_UNTIL_EQ(true, b_handle->palf_handle_impl_->state_mgr_.is_leader_active());85
86// 3. A can not remove B successfully87EXPECT_EQ(OB_NOT_MASTER, leader.palf_handle_impl_->config_mgr_.change_config_(args, remove_b_pid, remove_b_ele_epoch, remove_b_version));88unblock_net(leader_idx, b_idx);89
90// 4. A's memberlist will be reset91EXPECT_UNTIL_EQ(true, leader.palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));92leader.reset();93
94// 5. B remove C95EXPECT_EQ(OB_SUCCESS, get_leader(id, leader, leader_idx));96EXPECT_EQ(OB_SUCCESS, submit_log(leader, 100, id));97LogConfigChangeArgs remove_c_args(common::ObMember(c_addr, 1), 2, REMOVE_MEMBER);98int64_t remove_c_pid = 0;99int64_t remove_c_ele_epoch = 0;100LogConfigVersion remove_c_version;101EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->config_mgr_.start_change_config(remove_c_pid, remove_c_ele_epoch, remove_c_args.type_));102EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->config_mgr_.change_config_(remove_c_args, remove_c_pid, remove_c_ele_epoch, remove_c_version));103
104EXPECT_TRUE(a_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(c_addr));105EXPECT_FALSE(b_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(c_addr));106EXPECT_TRUE(c_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(c_addr));107
108// 6. the leader B revokes and takeover again109for (auto srv: get_cluster()) {110const ObAddr addr1(ObAddr::IPV4, "0.0.0.0", 0);111srv->set_leader(id, addr1);112}113EXPECT_UNTIL_EQ(false, b_handle->palf_handle_impl_->state_mgr_.is_leader_active());114for (auto srv: get_cluster()) {115srv->set_leader(id, b_addr, 3);116}117EXPECT_UNTIL_EQ(true, b_handle->palf_handle_impl_->state_mgr_.is_leader_active());118
119// 7. C will be removed successfully120EXPECT_FALSE(a_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(c_addr));121EXPECT_FALSE(b_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(c_addr));122
123revert_cluster_palf_handle_guard(palf_list);124}125delete_paxos_group(id);126PALF_LOG(INFO, "end test switch_leader_during_removing_member1", K(id));127}
128
129// switch leader after sending config meta to followers
130TEST_F(TestObSimpleLogClusterConfigChangeMockEle, switch_leader_during_removing_member2)131{
132int ret = OB_SUCCESS;133const int64_t id = ATOMIC_AAF(&palf_id_, 1);134SET_CASE_LOG_FILE(TEST_NAME, "switch_leader_during_removing_member2");135PALF_LOG(INFO, "begin test switch_leader_during_removing_member2", K(id));136{137int64_t leader_idx = 0;138PalfHandleImplGuard leader;139std::vector<PalfHandleImplGuard*> palf_list;140EXPECT_EQ(OB_SUCCESS, create_paxos_group_with_mock_election(id, leader_idx, leader));141EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));142EXPECT_EQ(OB_SUCCESS, get_cluster_palf_handle_guard(id, palf_list));143
144const int64_t b_idx = (leader_idx + 1) % 3;145const int64_t c_idx = (leader_idx + 2) % 3;146PalfHandleImplGuard *b_handle = palf_list[b_idx];147PalfHandleImplGuard *c_handle = palf_list[c_idx];148
149// 1. A starts to remove B150int64_t remove_b_pid = 0;151int64_t remove_b_ele_epoch = 0;152LogConfigVersion remove_b_version;153const common::ObAddr b_addr = get_cluster()[b_idx]->get_addr();154LogConfigChangeArgs args(common::ObMember(b_addr, 1), 2, REMOVE_MEMBER);155EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->config_mgr_.start_change_config(remove_b_pid, remove_b_ele_epoch, args.type_));156EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->config_mgr_.change_config_(args, remove_b_pid, remove_b_ele_epoch, remove_b_version));157
158EXPECT_FALSE(leader.palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));159EXPECT_TRUE(b_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));160EXPECT_TRUE(c_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));161
162// 1. A sends config meta to C163block_net(leader_idx, b_idx);164while (-1 == leader.palf_handle_impl_->config_mgr_.last_submit_config_log_time_us_ ||165c_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr)) {166EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->config_mgr_.change_config_(args, remove_b_pid, remove_b_ele_epoch, remove_b_version));167usleep(500);168}169
170EXPECT_FALSE(leader.palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));171EXPECT_UNTIL_EQ(true, b_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));172EXPECT_UNTIL_EQ(false, c_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));173
174// 2. B is elected to be the leader175for (auto srv: get_cluster()) {176srv->set_leader(id, b_addr);177}178EXPECT_UNTIL_EQ(true, b_handle->palf_handle_impl_->state_mgr_.is_leader_active());179
180// 3. A can not remove B successfully181EXPECT_EQ(OB_NOT_MASTER, leader.palf_handle_impl_->config_mgr_.change_config_(args, remove_b_pid, remove_b_ele_epoch, remove_b_version));182unblock_net(leader_idx, b_idx);183
184// 4. A's memberlist will be reset185EXPECT_UNTIL_EQ(true, leader.palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));186
187revert_cluster_palf_handle_guard(palf_list);188}189delete_paxos_group(id);190PALF_LOG(INFO, "end test switch_leader_during_removing_member2", K(id));191}
192
193TEST_F(TestObSimpleLogClusterConfigChangeMockEle, switch_leader_during_removing_member3)194{
195int ret = OB_SUCCESS;196const int64_t id = ATOMIC_AAF(&palf_id_, 1);197SET_CASE_LOG_FILE(TEST_NAME, "switch_leader_during_removing_member3");198PALF_LOG(INFO, "begin test switch_leader_during_removing_member3", K(id));199{200int64_t leader_idx = 0;201PalfHandleImplGuard leader;202std::vector<PalfHandleImplGuard*> palf_list;203EXPECT_EQ(OB_SUCCESS, create_paxos_group_with_mock_election(id, leader_idx, leader));204EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));205EXPECT_EQ(OB_SUCCESS, get_cluster_palf_handle_guard(id, palf_list));206
207const int64_t b_idx = (leader_idx + 1) % 3;208const int64_t c_idx = (leader_idx + 2) % 3;209PalfHandleImplGuard *a_handle = palf_list[leader_idx];210PalfHandleImplGuard *b_handle = palf_list[b_idx];211PalfHandleImplGuard *c_handle = palf_list[c_idx];212
213// 1. A starts to remove B214int64_t remove_b_pid = 0;215int64_t remove_b_ele_epoch = 0;216LogConfigVersion remove_b_version;217const common::ObAddr b_addr = get_cluster()[b_idx]->get_addr();218const common::ObAddr c_addr = get_cluster()[c_idx]->get_addr();219LogConfigChangeArgs args(common::ObMember(b_addr, 1), 2, REMOVE_MEMBER);220EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->config_mgr_.start_change_config(remove_b_pid, remove_b_ele_epoch, args.type_));221EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->config_mgr_.change_config_(args, remove_b_pid, remove_b_ele_epoch, remove_b_version));222
223EXPECT_FALSE(leader.palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));224EXPECT_TRUE(b_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));225EXPECT_TRUE(c_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));226
227// A sends config meta to C228block_net(leader_idx, b_idx);229while (-1 == leader.palf_handle_impl_->config_mgr_.last_submit_config_log_time_us_ ||230c_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr)) {231EXPECT_EQ(OB_EAGAIN, leader.palf_handle_impl_->config_mgr_.change_config_(args, remove_b_pid, remove_b_ele_epoch, remove_b_version));232usleep(500);233}234
235EXPECT_FALSE(leader.palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));236EXPECT_UNTIL_EQ(true, b_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));237EXPECT_UNTIL_EQ(false, c_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));238
239// 2. C is elected to be the leader240for (auto srv: get_cluster()) {241srv->set_leader(id, c_addr);242}243EXPECT_UNTIL_EQ(true, c_handle->palf_handle_impl_->state_mgr_.is_leader_active());244
245// 3. A can not remove B successfully246EXPECT_EQ(OB_NOT_MASTER, leader.palf_handle_impl_->config_mgr_.change_config_(args, remove_b_pid, remove_b_ele_epoch, remove_b_version));247unblock_net(leader_idx, b_idx);248
249// 4. A's memberlist will be re-sync by C successfully250EXPECT_UNTIL_EQ(false, a_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));251EXPECT_UNTIL_EQ(false, c_handle->palf_handle_impl_->config_mgr_.log_ms_meta_.curr_.config_.log_sync_memberlist_.contains(b_addr));252
253leader.reset();254revert_cluster_palf_handle_guard(palf_list);255}256delete_paxos_group(id);257PALF_LOG(INFO, "end test switch_leader_during_removing_member3", K(id));258}
259
260// 1. remove D from member list (ABCD) and match_lsn_map, committed_end_lsn is 100 and last_submit_end_lsn is 200.
261// 2. because committed_end_lsn is smaller than last_submit_end_lsn, the leader will use prev_member_list (ABCD) to generate committed_end_lsn
262// 3. D is not in match_lsn_map, the leader may can not generate committed_end_lsn
263TEST_F(TestObSimpleLogClusterConfigChangeMockEle, test_committed_end_lsn_after_removing_member)264{
265int ret = OB_SUCCESS;266const int64_t id = ATOMIC_AAF(&palf_id_, 1);267const int64_t CONFIG_CHANGE_TIMEOUT = 10 * 1000 * 1000L; // 10s268SET_CASE_LOG_FILE(TEST_NAME, "test_committed_end_lsn_after_removing_member");269PALF_LOG(INFO, "begin test test_committed_end_lsn_after_removing_member", K(id));270{271int64_t leader_idx = 0;272PalfHandleImplGuard leader;273std::vector<PalfHandleImplGuard*> palf_list;274EXPECT_EQ(OB_SUCCESS, create_paxos_group_with_mock_election(id, leader_idx, leader));275EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));276EXPECT_EQ(OB_SUCCESS, get_cluster_palf_handle_guard(id, palf_list));277
278const int64_t b_idx = (leader_idx + 1) % 4;279const int64_t c_idx = (leader_idx + 2) % 4;280const int64_t d_idx = (leader_idx + 3) % 4;281const common::ObAddr b_addr = get_cluster()[b_idx]->get_addr();282const common::ObAddr c_addr = get_cluster()[c_idx]->get_addr();283const common::ObAddr d_addr = get_cluster()[d_idx]->get_addr();284PalfHandleImplGuard *a_handle = palf_list[leader_idx];285PalfHandleImplGuard *b_handle = palf_list[b_idx];286PalfHandleImplGuard *c_handle = palf_list[c_idx];287PalfHandleImplGuard *d_handle = palf_list[d_idx];288LogConfigVersion config_version;289EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_config_version(config_version));290EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->add_member(common::ObMember(d_addr, 1), 4, config_version, CONFIG_CHANGE_TIMEOUT));291
292// 1. leader can not commit logs293block_pcode(leader_idx, ObRpcPacketCode::OB_LOG_PUSH_RESP);294EXPECT_EQ(OB_SUCCESS, submit_log(leader, 100, id));295sleep(1);296EXPECT_GT(leader.palf_handle_impl_->sw_.last_submit_lsn_, leader.palf_handle_impl_->sw_.committed_end_lsn_);297
298// 2. remove D299EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->remove_member(common::ObMember(d_addr, 1), 3, CONFIG_CHANGE_TIMEOUT));300EXPECT_GT(leader.palf_handle_impl_->sw_.last_submit_lsn_, leader.palf_handle_impl_->sw_.committed_end_lsn_);301EXPECT_EQ(leader.palf_handle_impl_->config_mgr_.reconfig_barrier_.prev_end_lsn_, leader.palf_handle_impl_->sw_.last_submit_end_lsn_);302EXPECT_GT(leader.palf_handle_impl_->config_mgr_.reconfig_barrier_.prev_end_lsn_, leader.palf_handle_impl_->sw_.committed_end_lsn_);303
304// 3. leader can commit logs305unblock_pcode(leader_idx, ObRpcPacketCode::OB_LOG_PUSH_RESP);306
307// 4. check if the leader can commit logs after D has been removed from match_lsn_map308EXPECT_UNTIL_EQ(leader.palf_handle_impl_->sw_.committed_end_lsn_, leader.palf_handle_impl_->sw_.last_submit_end_lsn_);309
310leader.reset();311revert_cluster_palf_handle_guard(palf_list);312}313delete_paxos_group(id);314PALF_LOG(INFO, "end test test_committed_end_lsn_after_removing_member", K(id));315}
316
317TEST_F(TestObSimpleLogClusterConfigChangeMockEle, test_remove_if_another_rebuild)318{
319int ret = OB_SUCCESS;320const int64_t id = ATOMIC_AAF(&palf_id_, 1);321const int64_t CONFIG_CHANGE_TIMEOUT = 4 * 1000 * 1000L; // 10s322SET_CASE_LOG_FILE(TEST_NAME, "test_remove_if_another_rebuild");323PALF_LOG(INFO, "begin test test_remove_if_another_rebuild", K(id));324{325int64_t leader_idx = 0;326PalfHandleImplGuard leader;327std::vector<PalfHandleImplGuard*> palf_list;328EXPECT_EQ(OB_SUCCESS, create_paxos_group_with_mock_election(id, leader_idx, leader));329EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));330EXPECT_EQ(OB_SUCCESS, get_cluster_palf_handle_guard(id, palf_list));331
332const int64_t b_idx = (leader_idx + 1) % 4;333const int64_t c_idx = (leader_idx + 2) % 4;334const int64_t d_idx = (leader_idx + 3) % 4;335const common::ObAddr b_addr = get_cluster()[b_idx]->get_addr();336const common::ObAddr c_addr = get_cluster()[c_idx]->get_addr();337const common::ObAddr d_addr = get_cluster()[d_idx]->get_addr();338PalfHandleImplGuard *a_handle = palf_list[leader_idx];339PalfHandleImplGuard *b_handle = palf_list[b_idx];340PalfHandleImplGuard *c_handle = palf_list[c_idx];341PalfHandleImplGuard *d_handle = palf_list[d_idx];342LogConfigVersion config_version;343
344// 1. disable vote345EXPECT_EQ(OB_SUCCESS, c_handle->palf_handle_impl_->disable_vote(false));346EXPECT_EQ(OB_TIMEOUT, leader.palf_handle_impl_->remove_member(common::ObMember(b_addr, 1), 2, CONFIG_CHANGE_TIMEOUT));347EXPECT_EQ(OB_SUCCESS, c_handle->palf_handle_impl_->enable_vote());348
349// 2. disable sync350EXPECT_EQ(OB_SUCCESS, c_handle->palf_handle_impl_->disable_sync());351EXPECT_EQ(OB_TIMEOUT, leader.palf_handle_impl_->remove_member(common::ObMember(b_addr, 1), 2, CONFIG_CHANGE_TIMEOUT));352EXPECT_EQ(OB_SUCCESS, c_handle->palf_handle_impl_->enable_sync());353
354// 3. need rebuild355c_handle->palf_handle_impl_->last_rebuild_lsn_ = LSN(leader.get_palf_handle_impl()->get_max_lsn().val_ + 100000);356EXPECT_EQ(OB_TIMEOUT, leader.palf_handle_impl_->remove_member(common::ObMember(b_addr, 1), 2, CONFIG_CHANGE_TIMEOUT));357
358leader.reset();359revert_cluster_palf_handle_guard(palf_list);360}361delete_paxos_group(id);362PALF_LOG(INFO, "end test test_committed_end_lsn_after_removing_member", K(id));363}
364
365// 1. (ABCD), A is the leader, D crashed
366// 2. remove C from member list (ABCD) and match_lsn_map, committed_end_lsn is 100 and last_submit_end_lsn is 200.
367// 2. because committed_end_lsn is smaller than last_submit_end_lsn, the leader will use prev_member_list (ABCD) to generate committed_end_lsn
368// 3. C is not in match_lsn_map, D crashed, the leader may can not generate committed_end_lsn
369TEST_F(TestObSimpleLogClusterConfigChangeMockEle, test_committed_end_lsn_after_removing_member2)370{
371int ret = OB_SUCCESS;372const int64_t id = ATOMIC_AAF(&palf_id_, 1);373const int64_t CONFIG_CHANGE_TIMEOUT = 10 * 1000 * 1000L; // 10s374SET_CASE_LOG_FILE(TEST_NAME, "test_committed_end_lsn_after_removing_member");375PALF_LOG(INFO, "begin test test_committed_end_lsn_after_removing_member", K(id));376{377int64_t leader_idx = 0;378PalfHandleImplGuard leader;379std::vector<PalfHandleImplGuard*> palf_list;380EXPECT_EQ(OB_SUCCESS, create_paxos_group_with_mock_election(id, leader_idx, leader));381EXPECT_EQ(OB_SUCCESS, submit_log(leader, 200, id));382EXPECT_EQ(OB_SUCCESS, get_cluster_palf_handle_guard(id, palf_list));383
384const int64_t b_idx = (leader_idx + 1) % 4;385const int64_t c_idx = (leader_idx + 2) % 4;386const int64_t d_idx = (leader_idx + 3) % 4;387const common::ObAddr b_addr = get_cluster()[b_idx]->get_addr();388const common::ObAddr c_addr = get_cluster()[c_idx]->get_addr();389const common::ObAddr d_addr = get_cluster()[d_idx]->get_addr();390PalfHandleImplGuard *a_handle = palf_list[leader_idx];391PalfHandleImplGuard *b_handle = palf_list[b_idx];392PalfHandleImplGuard *c_handle = palf_list[c_idx];393PalfHandleImplGuard *d_handle = palf_list[d_idx];394LogConfigVersion config_version;395EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->get_config_version(config_version));396EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->add_member(common::ObMember(d_addr, 1), 4, config_version, CONFIG_CHANGE_TIMEOUT));397
398// 1. D crashed399block_all_net(d_idx);400
401// 2. leader can not commit logs402block_pcode(leader_idx, ObRpcPacketCode::OB_LOG_PUSH_RESP);403EXPECT_EQ(OB_SUCCESS, submit_log(leader, 100, id));404sleep(1);405EXPECT_GT(leader.palf_handle_impl_->sw_.last_submit_lsn_, leader.palf_handle_impl_->sw_.committed_end_lsn_);406
407// 3. remove C408EXPECT_EQ(OB_SUCCESS, leader.palf_handle_impl_->remove_member(common::ObMember(c_addr, 1), 3, CONFIG_CHANGE_TIMEOUT));409EXPECT_GT(leader.palf_handle_impl_->sw_.last_submit_lsn_, leader.palf_handle_impl_->sw_.committed_end_lsn_);410EXPECT_EQ(leader.palf_handle_impl_->config_mgr_.reconfig_barrier_.prev_end_lsn_, leader.palf_handle_impl_->sw_.last_submit_end_lsn_);411EXPECT_GT(leader.palf_handle_impl_->config_mgr_.reconfig_barrier_.prev_end_lsn_, leader.palf_handle_impl_->sw_.committed_end_lsn_);412
413// 3. leader can commit logs414unblock_pcode(leader_idx, ObRpcPacketCode::OB_LOG_PUSH_RESP);415
416// 4. check if the leader can commit logs after C has been removed from match_lsn_map417EXPECT_UNTIL_EQ(leader.palf_handle_impl_->sw_.committed_end_lsn_, leader.palf_handle_impl_->sw_.last_submit_end_lsn_);418
419leader.reset();420revert_cluster_palf_handle_guard(palf_list);421}422delete_paxos_group(id);423PALF_LOG(INFO, "end test test_committed_end_lsn_after_removing_member", K(id));424}
425
426} // end unittest427} // end oceanbase428
429int main(int argc, char **argv)430{
431RUN_SIMPLE_LOG_CLUSTER_TEST(TEST_NAME);432}
433