204 lines
5.8 KiB
C++
204 lines
5.8 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 "ob_partition_migrate_old_rpc.h"
|
|
#include "storage/ob_sstable.h"
|
|
|
|
namespace oceanbase {
|
|
using namespace common;
|
|
using namespace share;
|
|
using namespace blocksstable;
|
|
using namespace oceanbase::share::schema;
|
|
using namespace storage;
|
|
|
|
namespace storage {
|
|
|
|
ObStoreInfo::ObStoreInfo() : saved_storage_info_(), sstable_count_(-1)
|
|
{}
|
|
|
|
ObStoreInfo::~ObStoreInfo()
|
|
{}
|
|
|
|
OB_SERIALIZE_MEMBER(ObStoreInfo, saved_storage_info_, sstable_count_);
|
|
|
|
int ObStoreInfo::assign(const ObStoreInfo& info)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (OB_FAIL(assign(info.saved_storage_info_, info.sstable_count_))) {
|
|
STORAGE_LOG(WARN, "failed to assign store info", K(ret));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObStoreInfo::assign(const ObSavedStorageInfo& info, const int64_t sstable_count)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
if (OB_UNLIKELY(saved_storage_info_.is_valid())) {
|
|
ret = OB_INIT_TWICE;
|
|
STORAGE_LOG(WARN, "cannot assign twice", K(ret), K(*this));
|
|
} else if (OB_FAIL(saved_storage_info_.deep_copy(info))) {
|
|
STORAGE_LOG(WARN, "failed to deep copy saved storage info", K(ret), K(info));
|
|
} else {
|
|
sstable_count_ = sstable_count;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
} // namespace storage
|
|
|
|
namespace obrpc {
|
|
OB_SERIALIZE_MEMBER(ObMigrateInfoFetchArg, pkey_);
|
|
|
|
int ObMigrateStoreInfo::assign(const ObMigrateStoreInfo& info)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
if (OB_FAIL(store_info_.assign(info.store_info_))) {
|
|
STORAGE_LOG(WARN, "failed to deep copy saved_storage_info", K(ret));
|
|
} else {
|
|
server_ = info.server_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
OB_SERIALIZE_MEMBER(ObMigrateStoreInfo, store_info_, server_);
|
|
|
|
const ObMigrateStoreInfo* ObMigrateInfoFetchResult::left_migrate_info() const
|
|
{
|
|
const ObMigrateStoreInfo* left_info = NULL;
|
|
|
|
for (int64_t i = 0; NULL == left_info && i < info_list_.count(); ++i) {
|
|
const ObSavedStorageInfo& info = info_list_[i].store_info_.get_saved_info();
|
|
if (info.get_frozen_version().major_ < info.get_memstore_version().major_) {
|
|
left_info = &info_list_[i];
|
|
}
|
|
}
|
|
return left_info;
|
|
}
|
|
|
|
const ObMigrateStoreInfo* ObMigrateInfoFetchResult::right_migrate_info() const
|
|
{
|
|
const ObMigrateStoreInfo* right_info = NULL;
|
|
for (int64_t i = info_list_.count() - 1; NULL == right_info && i >= 0; --i) {
|
|
const ObSavedStorageInfo& info = info_list_[i].store_info_.get_saved_info();
|
|
if (info.get_frozen_version().major_ < info.get_memstore_version().major_) {
|
|
right_info = &info_list_[i];
|
|
}
|
|
}
|
|
return right_info;
|
|
}
|
|
|
|
uint64_t ObMigrateInfoFetchResult::get_last_replay_log_id() const
|
|
{
|
|
uint64_t last_replay_log_id = OB_INVALID_ID;
|
|
if (info_list_.count() > 0) {
|
|
const ObSavedStorageInfo& info = info_list_[info_list_.count() - 1].store_info_.get_saved_info();
|
|
last_replay_log_id = info.get_last_replay_log_id();
|
|
}
|
|
|
|
return last_replay_log_id;
|
|
}
|
|
|
|
int ObMigrateInfoFetchResult::add_store_info(const ObMigrateStoreInfo& info)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (OB_FAIL(info_list_.push_back(info))) {
|
|
STORAGE_LOG(WARN, "failed to add info", K(ret));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObMigrateInfoFetchResult::add_store_info(const storage::ObStoreInfo& info, const common::ObAddr server)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObMigrateStoreInfo tmp_info;
|
|
if (OB_FAIL(tmp_info.store_info_.assign(info))) {
|
|
STORAGE_LOG(WARN, "failed to assign store info", K(ret));
|
|
} else {
|
|
tmp_info.server_ = server;
|
|
if (OB_FAIL(info_list_.push_back(tmp_info))) {
|
|
STORAGE_LOG(WARN, "failed to add info", K(ret));
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
bool ObMigrateInfoFetchResult::is_continues() const
|
|
{
|
|
bool is_continues = true;
|
|
for (int64_t i = 1; is_continues && i < info_list_.count(); ++i) {
|
|
if (info_list_[i].get_version().major_ != info_list_[i - 1].get_version().major_ + 1) {
|
|
is_continues = false;
|
|
STORAGE_LOG(ERROR,
|
|
"major version not continues",
|
|
K(i),
|
|
"i",
|
|
info_list_[i].get_version().major_,
|
|
"i-1",
|
|
info_list_[i - 1].get_version().major_,
|
|
K(*this));
|
|
}
|
|
}
|
|
return is_continues;
|
|
}
|
|
|
|
ObMigrateInfoFetchResult::ObMigrateInfoFetchResult()
|
|
{
|
|
reset();
|
|
}
|
|
|
|
void ObMigrateInfoFetchResult::reset()
|
|
{
|
|
info_list_.reset();
|
|
replica_type_ = REPLICA_TYPE_FULL;
|
|
}
|
|
|
|
OB_SERIALIZE_MEMBER(ObMigrateInfoFetchResult, info_list_, replica_type_);
|
|
|
|
OB_SERIALIZE_MEMBER(ObFetchMacroBlockOldArg, index_id_, macro_block_index_, data_version_, data_seq_);
|
|
|
|
void ObFetchMacroBlockOldArg::reset()
|
|
{
|
|
index_id_ = 0;
|
|
macro_block_index_ = 0;
|
|
data_version_ = 0;
|
|
data_seq_ = 0;
|
|
}
|
|
|
|
bool ObFetchMacroBlockOldArg::operator==(const ObFetchMacroBlockOldArg& arg) const
|
|
{
|
|
return index_id_ == arg.index_id_ && macro_block_index_ == arg.macro_block_index_ &&
|
|
data_version_ == arg.data_version_ && data_seq_ == arg.data_seq_;
|
|
}
|
|
|
|
int64_t ObFetchMacroBlockOldArg::hash() const
|
|
{
|
|
int64_t hash_value = 0;
|
|
hash_value = murmurhash(&index_id_, sizeof(index_id_), hash_value);
|
|
hash_value = murmurhash(¯o_block_index_, sizeof(macro_block_index_), hash_value);
|
|
hash_value = murmurhash(&data_version_, sizeof(data_version_), hash_value);
|
|
hash_value = murmurhash(&data_seq_, sizeof(data_seq_), hash_value);
|
|
return hash_value;
|
|
}
|
|
|
|
ObFetchMacroBlockListOldArg::ObFetchMacroBlockListOldArg()
|
|
: pkey_(), data_version_(0), arg_list_(), store_type_(storage::MAJOR_SSSTORE)
|
|
{}
|
|
|
|
OB_SERIALIZE_MEMBER(ObFetchMacroBlockListOldArg, pkey_, data_version_, arg_list_, store_type_);
|
|
|
|
} // namespace obrpc
|
|
} // namespace oceanbase
|