init push
This commit is contained in:
637
unittest/storage/test_partition_migrator.cpp
Normal file
637
unittest/storage/test_partition_migrator.cpp
Normal file
@ -0,0 +1,637 @@
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define USING_LOG_PREFIX STORAGE
|
||||
#include <gtest/gtest.h>
|
||||
#include <gmock/gmock.h>
|
||||
#define private public
|
||||
#define protected public
|
||||
#include "storage/ob_partition_migrator.h"
|
||||
|
||||
using ::testing::_;
|
||||
using ::testing::Invoke;
|
||||
using ::testing::Return;
|
||||
using ::testing::SetArgReferee;
|
||||
|
||||
namespace oceanbase {
|
||||
using namespace common;
|
||||
using namespace share;
|
||||
using namespace storage;
|
||||
using namespace blocksstable;
|
||||
using namespace transaction;
|
||||
using namespace share::schema;
|
||||
using namespace obrpc;
|
||||
using namespace observer;
|
||||
using namespace lib;
|
||||
|
||||
namespace unittest {
|
||||
|
||||
class ObPartitionMigratorTest : public ::testing::Test {
|
||||
public:
|
||||
void init()
|
||||
{
|
||||
ASSERT_EQ(OB_SUCCESS, a_.parse_from_cstring("10.10.10.1:1001"));
|
||||
ASSERT_EQ(OB_SUCCESS, b_.parse_from_cstring("10.10.10.2:1001"));
|
||||
ASSERT_EQ(OB_SUCCESS, c_.parse_from_cstring("10.10.10.3:1001"));
|
||||
}
|
||||
|
||||
void make_info(
|
||||
const int64_t version, const ObAddr& server, uint64_t last_replay_log_id, ObMigrateStoreInfo& fake_info)
|
||||
{
|
||||
common::ObMemberList member_list;
|
||||
const int64_t last_submit_timestamp = 0;
|
||||
const int64_t replica_num = 1;
|
||||
|
||||
member_list.add_server(server);
|
||||
fake_info.store_info_.sstable_count_ = 2;
|
||||
ASSERT_EQ(
|
||||
OB_SUCCESS, fake_info.store_info_.saved_storage_info_.init(replica_num, member_list, last_submit_timestamp));
|
||||
fake_info.store_info_.saved_storage_info_.frozen_version_ = version;
|
||||
fake_info.store_info_.saved_storage_info_.memstore_version_ = version + 1;
|
||||
fake_info.store_info_.saved_storage_info_.last_replay_log_id_ = last_replay_log_id;
|
||||
fake_info.server_ = server;
|
||||
}
|
||||
|
||||
int check_info(ObMigrateInfoFetchResult output, const int64_t index, const int64_t major, const ObAddr& server,
|
||||
const int64_t minor = -1)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
|
||||
if (server != output.info_list_[index].server_) {
|
||||
ret = OB_ERR_SYS;
|
||||
STORAGE_LOG(WARN, "server not match", K(server), K(index), K(output));
|
||||
}
|
||||
if (major != output.info_list_[index].get_version().major_) {
|
||||
ret = OB_ERR_SYS;
|
||||
STORAGE_LOG(WARN, "version not match", K(major), K(index), K(output));
|
||||
}
|
||||
if (minor >= 0 && minor != output.info_list_[index].get_version().minor_) {
|
||||
ret = OB_ERR_SYS;
|
||||
STORAGE_LOG(WARN, "minor version not match", K(minor), K(index), K(output));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
protected:
|
||||
ObAddr a_;
|
||||
ObAddr b_;
|
||||
ObAddr c_;
|
||||
};
|
||||
|
||||
TEST_F(ObPartitionMigratorTest, update_base_source_use_candidate)
|
||||
{
|
||||
init();
|
||||
ObMigrateInfoFetchResult candidate;
|
||||
ObMigrateInfoFetchResult output;
|
||||
ObMigrateStoreInfo fake_info;
|
||||
make_info(2, a_, 100, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 0, ObVersion(0), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 2, a_));
|
||||
}
|
||||
|
||||
TEST_F(ObPartitionMigratorTest, update_base_source_invalid_candidate)
|
||||
{
|
||||
init();
|
||||
ObMigrateInfoFetchResult candidate;
|
||||
ObMigrateInfoFetchResult output;
|
||||
ObMigrateStoreInfo fake_info;
|
||||
make_info(2, a_, 100, fake_info);
|
||||
fake_info.store_info_.saved_storage_info_.memstore_version_ = 2;
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_ERR_SYS, ObPartitionMigrateTask::update_base_source(candidate, 0, ObVersion(0), output));
|
||||
}
|
||||
|
||||
TEST_F(ObPartitionMigratorTest, update_base_source_candidate_not_continues)
|
||||
{
|
||||
init();
|
||||
ObMigrateInfoFetchResult candidate;
|
||||
ObMigrateInfoFetchResult output;
|
||||
ObMigrateStoreInfo fake_info;
|
||||
make_info(2, a_, 100, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_ERR_SYS, ObPartitionMigrateTask::update_base_source(candidate, 0, ObVersion(0), output));
|
||||
}
|
||||
|
||||
TEST_F(ObPartitionMigratorTest, update_base_source_output_not_continues)
|
||||
{
|
||||
init();
|
||||
ObMigrateInfoFetchResult candidate;
|
||||
ObMigrateInfoFetchResult output;
|
||||
ObMigrateStoreInfo fake_info;
|
||||
make_info(2, a_, 100, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(2, a_, 100, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_ERR_SYS, ObPartitionMigrateTask::update_base_source(candidate, 400, ObVersion(5), output));
|
||||
}
|
||||
|
||||
// output candidate new_output
|
||||
// 3-a 3-b 3-a
|
||||
// 3-a,4-a 3-b,4-b 3-a,4-a
|
||||
// 3-a,4-a 3-b,4-b,5-b 3-a,4-a,5-b
|
||||
// 3-a,4-b 3-c,4-c,5-c 3-a,4-b,5-c
|
||||
// 3-a,4-a 3-b,4-b,5-b,6-b 3-a,4-a,5-b
|
||||
TEST_F(ObPartitionMigratorTest, update_base_source_same_base_version)
|
||||
{
|
||||
init();
|
||||
ObMigrateInfoFetchResult candidate;
|
||||
ObMigrateInfoFetchResult output;
|
||||
ObMigrateStoreInfo fake_info;
|
||||
|
||||
// 3-a 3-b 3-a
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(3, b_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 500, ObVersion(6), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
|
||||
// 3-a,4-a 3-b,4-b 3-a,4-a
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 500, ObVersion(6), output));
|
||||
ASSERT_EQ(2, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 4, a_));
|
||||
|
||||
// 3-a,4-a 3-b,4-b,5-b 3-a,4-a,5-b
|
||||
make_info(5, b_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 500, ObVersion(6), output));
|
||||
ASSERT_EQ(3, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 4, a_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 2, 5, b_));
|
||||
|
||||
// 3-a,4-b 3-c,4-c,5-c 3-a,4-b,5-c
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(3, c_, 200, fake_info);
|
||||
candidate.info_list_.reset();
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(4, c_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(5, c_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 500, ObVersion(6), output));
|
||||
ASSERT_EQ(3, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 4, b_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 2, 5, c_));
|
||||
|
||||
// 3-a,4-a 3-b,4-b,5-b,6-b 3-a,4-a,5-b
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(3, b_, 200, fake_info);
|
||||
candidate.info_list_.reset();
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(5, b_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(6, b_, 500, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 500, ObVersion(6), output));
|
||||
ASSERT_EQ(3, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 4, a_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 2, 5, b_));
|
||||
}
|
||||
|
||||
// output candidate new_output
|
||||
// 3-a 2-b 3-a
|
||||
// 3-a,4-a 2-b,3-b 3-a,4-a
|
||||
// 3-a, 2-b,3-b,4-b 3-a,4-b
|
||||
// 3-a,4-b 2-c,3-c,4-c,5-c 3-a,4-b,5-c
|
||||
// 5-a 3-b,4-b 5-a
|
||||
|
||||
TEST_F(ObPartitionMigratorTest, update_base_source_output_newer)
|
||||
{
|
||||
init();
|
||||
ObMigrateInfoFetchResult candidate;
|
||||
ObMigrateInfoFetchResult output;
|
||||
ObMigrateStoreInfo fake_info;
|
||||
// 3-a 2-b 3-a
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(2, b_, 100, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 300, ObVersion(4), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
|
||||
// 3-a,4-a 2-b,3-b 3-a,4-a
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(3, b_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 400, ObVersion(5), output));
|
||||
ASSERT_EQ(2, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 4, a_));
|
||||
|
||||
// 3-a, 2-b,3-b,4-b 3-a,4-b
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 250, ObVersion(4), output));
|
||||
ASSERT_EQ(2, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 4, b_));
|
||||
|
||||
// 3-a,4-b 2-c,3-c,4-c,5-c 3-a,4-b,5-c
|
||||
candidate.info_list_.reset();
|
||||
make_info(2, c_, 100, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(3, c_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(4, c_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(5, c_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 350, ObVersion(5), output));
|
||||
ASSERT_EQ(3, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 4, b_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 2, 5, c_));
|
||||
|
||||
// 5-a 3-b,4-b 5-a
|
||||
output.info_list_.reset();
|
||||
make_info(5, a_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(3, b_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 500, ObVersion(6), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 5, a_));
|
||||
}
|
||||
// output candidate new_output
|
||||
// 3-a 4-b 4-b
|
||||
// 3-a,4-a 4-b,5-b 4-b,5-b
|
||||
// 3-a,4-a,5-c 4-b 4-b,5-c
|
||||
// 3-a,4-b 4-c 4-c
|
||||
// 3-b 5-c 5-c
|
||||
// 3-a(200) 4-b(300) 3-a active_memstore:4 max_confirm_log_id:350
|
||||
// 3-a(200) 4-b(300) 4-b active_memstore:5 max_confirm_log_id:450
|
||||
TEST_F(ObPartitionMigratorTest, update_base_source_candidate_newer)
|
||||
{
|
||||
init();
|
||||
ObMigrateInfoFetchResult candidate;
|
||||
ObMigrateInfoFetchResult output;
|
||||
ObMigrateStoreInfo fake_info;
|
||||
// 3-a 4-b 4-b
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 250, ObVersion(4), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 4, b_));
|
||||
|
||||
// 3-a,4-a 4-b,5-b 4-b,5-b
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(5, b_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 350, ObVersion(5), output));
|
||||
ASSERT_EQ(2, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 4, b_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 5, b_));
|
||||
|
||||
// 3-a,4-a,5-c 4-b 4-b,5-c
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(5, c_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 500, ObVersion(6), output));
|
||||
ASSERT_EQ(2, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 4, b_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 5, c_));
|
||||
|
||||
// 3-a,4-b 4-c 4-c
|
||||
output.info_list_.reset();
|
||||
make_info(3, c_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(4, c_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 400, ObVersion(5), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 4, c_));
|
||||
|
||||
// 3-b 5-c 5-c
|
||||
output.info_list_.reset();
|
||||
make_info(3, b_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(5, c_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 300, ObVersion(4), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 5, c_));
|
||||
|
||||
// 3-a(200) 4-b(300) 3-a active_memstore:4 max_confirm_log_id:350
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 350, ObVersion(4), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
|
||||
// 3-a(200) 4-b(300) 4-b active_memstore:5 max_confirm_log_id:450
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 450, ObVersion(5), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 4, b_));
|
||||
}
|
||||
|
||||
TEST_F(ObPartitionMigratorTest, update_base_source_sstable_not_same)
|
||||
{
|
||||
init();
|
||||
ObMigrateInfoFetchResult candidate;
|
||||
ObMigrateInfoFetchResult output;
|
||||
ObMigrateStoreInfo fake_info;
|
||||
|
||||
// output has more sstables
|
||||
// 3-a(more) 3-b 3-a
|
||||
make_info(3, a_, 200, fake_info);
|
||||
fake_info.store_info_.sstable_count_ = 3;
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(3, b_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 300, ObVersion(4), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
|
||||
// output has more sstables
|
||||
// 3-a(more) 4-b 4-b
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
fake_info.store_info_.sstable_count_ = 3;
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 250, ObVersion(4), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 4, b_));
|
||||
|
||||
// candidate has more sstables
|
||||
// 3-a 3-b(more) 3-b
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(3, b_, 200, fake_info);
|
||||
fake_info.store_info_.sstable_count_ = 3;
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 300, ObVersion(4), output));
|
||||
ASSERT_EQ(1, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, b_));
|
||||
|
||||
// candidate has more sstables
|
||||
// 3-a,4-a 3-b(more) 3-b,4-a
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(3, b_, 200, fake_info);
|
||||
fake_info.store_info_.sstable_count_ = 3;
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 400, ObVersion(5), output));
|
||||
ASSERT_EQ(2, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, b_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 4, a_));
|
||||
|
||||
// candidate has more sstables
|
||||
// 3-a,4-a 3-b(more),4-b 3-b,4-a
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(3, b_, 200, fake_info);
|
||||
fake_info.store_info_.sstable_count_ = 3;
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 400, ObVersion(5), output));
|
||||
ASSERT_EQ(2, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, b_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 4, a_));
|
||||
|
||||
// candidate has more sstables
|
||||
// 3-a(more) 2-b,3-b,4-b 3-a,4-b
|
||||
output.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
fake_info.store_info_.sstable_count_ = 3;
|
||||
ASSERT_EQ(OB_SUCCESS, output.info_list_.push_back(fake_info));
|
||||
candidate.info_list_.reset();
|
||||
make_info(2, b_, 100, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(3, b_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
make_info(4, b_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, candidate.info_list_.push_back(fake_info));
|
||||
ASSERT_EQ(OB_SUCCESS, ObPartitionMigrateTask::update_base_source(candidate, 250, ObVersion(4), output));
|
||||
ASSERT_EQ(2, output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 0, 3, a_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(output, 1, 4, b_));
|
||||
}
|
||||
|
||||
TEST_F(ObPartitionMigratorTest, update_construct_source)
|
||||
{
|
||||
init();
|
||||
ObMigrateInfoFetchResult info_local;
|
||||
ObMigrateInfoFetchResult info_src;
|
||||
ObMigrateInfoFetchResult info_output;
|
||||
ObMigrateStoreInfo fake_info;
|
||||
|
||||
info_local.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(5, a_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
|
||||
info_src.info_list_.reset();
|
||||
make_info(5, b_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
|
||||
ASSERT_EQ(OB_SUCCESS,
|
||||
ObPartitionMigrateTask::construct_source(info_local, 600, ObVersion(6), info_src, info_src, info_output));
|
||||
ASSERT_EQ(1, info_output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(info_output, 0, 5, b_));
|
||||
|
||||
info_local.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(5, a_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
|
||||
info_src.info_list_.reset();
|
||||
make_info(5, b_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
make_info(6, b_, 500, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
make_info(7, b_, 550, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
|
||||
ASSERT_EQ(OB_SUCCESS,
|
||||
ObPartitionMigrateTask::construct_source(info_local, 600, ObVersion(6), info_src, info_src, info_output));
|
||||
ASSERT_EQ(1, info_output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(info_output, 0, 5, b_));
|
||||
|
||||
info_local.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(5, a_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
|
||||
info_src.info_list_.reset();
|
||||
make_info(5, b_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
make_info(6, b_, 500, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
|
||||
ASSERT_EQ(OB_SUCCESS,
|
||||
ObPartitionMigrateTask::construct_source(info_local, 450, ObVersion(6), info_src, info_src, info_output));
|
||||
ASSERT_EQ(2, info_output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(info_output, 0, 5, b_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(info_output, 1, 6, b_));
|
||||
|
||||
info_local.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(5, a_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
|
||||
info_src.info_list_.reset();
|
||||
make_info(5, b_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
make_info(6, b_, 450, fake_info);
|
||||
fake_info.store_info_.saved_storage_info_.memstore_version_ = ObVersion(6, 1);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
|
||||
ASSERT_EQ(OB_SUCCESS,
|
||||
ObPartitionMigrateTask::construct_source(info_local, 480, ObVersion(6), info_src, info_src, info_output));
|
||||
ASSERT_EQ(1, info_output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(info_output, 0, 5, b_));
|
||||
|
||||
info_local.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
|
||||
info_src.info_list_.reset();
|
||||
make_info(5, b_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
make_info(6, b_, 500, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
make_info(7, b_, 600, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
make_info(8, b_, 700, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
make_info(9, b_, 750, fake_info);
|
||||
fake_info.store_info_.saved_storage_info_.memstore_version_ = ObVersion(6, 1);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
|
||||
ASSERT_EQ(OB_SUCCESS,
|
||||
ObPartitionMigrateTask::construct_source(info_local, 800, ObVersion(6), info_src, info_src, info_output));
|
||||
ASSERT_EQ(1, info_output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(info_output, 0, 5, b_));
|
||||
|
||||
info_local.info_list_.reset();
|
||||
make_info(3, a_, 200, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(4, a_, 300, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(5, a_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
make_info(6, a_, 410, fake_info);
|
||||
fake_info.store_info_.saved_storage_info_.memstore_version_ = ObVersion(6, 1);
|
||||
ASSERT_EQ(OB_SUCCESS, info_local.info_list_.push_back(fake_info));
|
||||
|
||||
info_src.info_list_.reset();
|
||||
make_info(5, b_, 400, fake_info);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
make_info(6, b_, 450, fake_info);
|
||||
fake_info.store_info_.saved_storage_info_.memstore_version_ = ObVersion(6, 1);
|
||||
ASSERT_EQ(OB_SUCCESS, info_src.info_list_.push_back(fake_info));
|
||||
|
||||
ASSERT_EQ(OB_SUCCESS,
|
||||
ObPartitionMigrateTask::construct_source(info_local, 420, ObVersion(6), info_src, info_src, info_output));
|
||||
ASSERT_EQ(2, info_output.info_list_.count());
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(info_output, 0, 5, b_));
|
||||
ASSERT_EQ(OB_SUCCESS, check_info(info_output, 1, 6, b_));
|
||||
}
|
||||
|
||||
} // namespace unittest
|
||||
} // namespace oceanbase
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
OB_LOGGER.set_log_level("INFO");
|
||||
STORAGE_LOG(INFO, "begin unittest: test partition migrator");
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
Reference in New Issue
Block a user