638 lines
27 KiB
C++
638 lines
27 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.
|
|
*/
|
|
|
|
#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();
|
|
}
|