1006 lines
45 KiB
C++
1006 lines
45 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 "storage/tablet/ob_tablet_meta.h"
|
|
|
|
#include "lib/ob_define.h"
|
|
#include "lib/utility/serialization.h"
|
|
#include "share/schema/ob_table_schema.h"
|
|
#include "share/scn.h"
|
|
|
|
namespace oceanbase
|
|
{
|
|
using namespace share;
|
|
using namespace blocksstable;
|
|
using namespace palf;
|
|
namespace storage
|
|
{
|
|
const SCN ObTabletMeta::INIT_CLOG_CHECKPOINT_SCN = SCN::base_scn();
|
|
|
|
ObTabletMeta::ObTabletMeta()
|
|
: version_(TABLET_META_VERSION),
|
|
length_(0),
|
|
ls_id_(),
|
|
tablet_id_(),
|
|
data_tablet_id_(),
|
|
ref_tablet_id_(),
|
|
has_next_tablet_(false),
|
|
create_scn_(),
|
|
start_scn_(),
|
|
clog_checkpoint_scn_(),
|
|
ddl_checkpoint_scn_(),
|
|
snapshot_version_(OB_INVALID_TIMESTAMP),
|
|
multi_version_start_(OB_INVALID_TIMESTAMP),
|
|
compat_mode_(lib::Worker::CompatMode::INVALID),
|
|
autoinc_seq_(),
|
|
ha_status_(),
|
|
report_status_(),
|
|
tx_data_(),
|
|
ddl_data_(),
|
|
table_store_flag_(),
|
|
ddl_start_scn_(),
|
|
ddl_snapshot_version_(OB_INVALID_TIMESTAMP),
|
|
max_sync_storage_schema_version_(0),
|
|
is_inited_(false)
|
|
{
|
|
}
|
|
|
|
ObTabletMeta::~ObTabletMeta()
|
|
{
|
|
reset();
|
|
}
|
|
|
|
int ObTabletMeta::init(
|
|
ObIAllocator &allocator,
|
|
const share::ObLSID &ls_id,
|
|
const common::ObTabletID &tablet_id,
|
|
const common::ObTabletID &data_tablet_id,
|
|
const common::ObTabletID &lob_meta_tablet_id,
|
|
const common::ObTabletID &lob_piece_tablet_id,
|
|
const SCN create_scn,
|
|
const int64_t snapshot_version,
|
|
const lib::Worker::CompatMode compat_mode,
|
|
const ObTabletTableStoreFlag &table_store_flag,
|
|
const int64_t max_sync_storage_schema_version)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
if (OB_UNLIKELY(is_inited_)) {
|
|
ret = OB_INIT_TWICE;
|
|
LOG_WARN("init twice", K(ret), K_(is_inited));
|
|
} else if (OB_UNLIKELY(!ls_id.is_valid())
|
|
|| OB_UNLIKELY(!tablet_id.is_valid())
|
|
|| OB_UNLIKELY(!data_tablet_id.is_valid())
|
|
// TODO: fix it after multi source data refactor
|
|
// || OB_UNLIKELY(!create_scn.is_valid())
|
|
|| OB_UNLIKELY(OB_INVALID_TIMESTAMP == snapshot_version)
|
|
|| OB_UNLIKELY(lib::Worker::CompatMode::INVALID == compat_mode)) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), K(ls_id), K(tablet_id), K(data_tablet_id),
|
|
K(create_scn), K(snapshot_version), K(compat_mode));
|
|
} else if (OB_FAIL(ha_status_.init_status())) {
|
|
LOG_WARN("failed to init ha status", K(ret));
|
|
} else {
|
|
version_ = TABLET_META_VERSION;
|
|
ls_id_ = ls_id;
|
|
tablet_id_ = tablet_id;
|
|
data_tablet_id_ = data_tablet_id;
|
|
create_scn_ = create_scn;
|
|
start_scn_.set_base();
|
|
clog_checkpoint_scn_.set_base();
|
|
ddl_checkpoint_scn_.set_base();
|
|
compat_mode_ = compat_mode;
|
|
snapshot_version_ = snapshot_version;
|
|
multi_version_start_ = snapshot_version;
|
|
table_store_flag_ = table_store_flag;
|
|
ddl_start_scn_.set_base();
|
|
ddl_snapshot_version_ = 0;
|
|
max_sync_storage_schema_version_ = max_sync_storage_schema_version;
|
|
|
|
report_status_.merge_snapshot_version_ = snapshot_version;
|
|
report_status_.cur_report_version_ = snapshot_version;
|
|
report_status_.data_checksum_ = 0;
|
|
report_status_.row_count_ = 0;
|
|
|
|
ddl_data_.snapshot_version_ = OB_INVALID_VERSION;
|
|
ddl_data_.schema_version_ = OB_INVALID_VERSION;
|
|
ddl_data_.lob_meta_tablet_id_ = lob_meta_tablet_id;
|
|
ddl_data_.lob_piece_tablet_id_ = lob_piece_tablet_id;
|
|
|
|
if (tablet_id_.is_ls_inner_tablet()) {
|
|
tx_data_.tablet_status_ = ObTabletStatus::NORMAL;
|
|
}
|
|
|
|
is_inited_ = true;
|
|
}
|
|
|
|
if (OB_UNLIKELY(!is_inited_)) {
|
|
reset();
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObTabletMeta::init(
|
|
common::ObIAllocator &allocator,
|
|
const ObTabletMeta &old_tablet_meta,
|
|
const int64_t snapshot_version,
|
|
const int64_t multi_version_start,
|
|
const ObTabletTxMultiSourceDataUnit &tx_data,
|
|
const ObTabletBindingInfo &ddl_data,
|
|
const ObTabletAutoincSeq &autoinc_seq,
|
|
const int64_t max_sync_storage_schema_version,
|
|
const SCN clog_checkpoint_scn,
|
|
const SCN ddl_checkpoint_scn,
|
|
const SCN ddl_start_scn,
|
|
const int64_t ddl_snapshot_version)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
if (OB_UNLIKELY(is_inited_)) {
|
|
ret = OB_INIT_TWICE;
|
|
LOG_WARN("init twice", K(ret), K_(is_inited));
|
|
} else if (OB_UNLIKELY(!old_tablet_meta.is_valid())
|
|
|| OB_UNLIKELY(OB_INVALID_VERSION == max_sync_storage_schema_version)) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), K(old_tablet_meta), K(max_sync_storage_schema_version));
|
|
} else if (OB_FAIL(ddl_data_.assign(ddl_data))) {
|
|
LOG_WARN("failed to assign ddl data", K(ret));
|
|
} else if (OB_FAIL(autoinc_seq_.assign(autoinc_seq))) {
|
|
LOG_WARN("failed to assign autoinc seq", K(ret));
|
|
} else {
|
|
version_ = TABLET_META_VERSION;
|
|
ls_id_ = old_tablet_meta.ls_id_;
|
|
tablet_id_ = old_tablet_meta.tablet_id_;
|
|
data_tablet_id_ = old_tablet_meta.data_tablet_id_;
|
|
ref_tablet_id_ = old_tablet_meta.ref_tablet_id_;
|
|
create_scn_ = old_tablet_meta.create_scn_;
|
|
start_scn_ = old_tablet_meta.start_scn_;
|
|
ddl_start_scn_ = SCN::max(ddl_start_scn, old_tablet_meta.ddl_start_scn_);
|
|
clog_checkpoint_scn_ = SCN::max(clog_checkpoint_scn, old_tablet_meta.clog_checkpoint_scn_);
|
|
compat_mode_ = old_tablet_meta.compat_mode_;
|
|
ha_status_ = old_tablet_meta.ha_status_;
|
|
report_status_ = old_tablet_meta.report_status_;
|
|
|
|
snapshot_version_ = MAX(snapshot_version, old_tablet_meta.snapshot_version_);
|
|
multi_version_start_ = MIN(MAX(multi_version_start, old_tablet_meta.multi_version_start_), snapshot_version_);
|
|
tx_data_ = tx_data;
|
|
table_store_flag_ = old_tablet_meta.table_store_flag_;
|
|
max_sync_storage_schema_version_ = max_sync_storage_schema_version;
|
|
ddl_checkpoint_scn_ = SCN::max(old_tablet_meta.ddl_checkpoint_scn_, ddl_checkpoint_scn);
|
|
ddl_snapshot_version_ = MAX(old_tablet_meta.ddl_snapshot_version_, ddl_snapshot_version);
|
|
is_inited_ = true;
|
|
}
|
|
|
|
if (OB_UNLIKELY(!is_inited_)) {
|
|
reset();
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObTabletMeta::init(
|
|
common::ObIAllocator &allocator,
|
|
const ObMigrationTabletParam ¶m)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
if (OB_UNLIKELY(is_inited_)) {
|
|
ret = OB_INIT_TWICE;
|
|
LOG_WARN("init twice", K(ret), K_(is_inited));
|
|
} else if (OB_UNLIKELY(!param.is_valid())) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), K(param));
|
|
} else if (OB_FAIL(ddl_data_.assign(param.ddl_data_))) {
|
|
LOG_WARN("failed to assign ddl data", K(ret));
|
|
} else if (OB_FAIL(autoinc_seq_.assign(param.autoinc_seq_))) {
|
|
LOG_WARN("failed to assign autoinc seq", K(ret));
|
|
} else if (OB_FAIL(ha_status_.init_status_for_ha(param.ha_status_))) {
|
|
LOG_WARN("failed to init status for ha", K(ret));
|
|
} else {
|
|
version_ = TABLET_META_VERSION;
|
|
ls_id_ = param.ls_id_;
|
|
tablet_id_ = param.tablet_id_;
|
|
data_tablet_id_ = param.data_tablet_id_;
|
|
ref_tablet_id_ = param.ref_tablet_id_;
|
|
create_scn_ = param.create_scn_;
|
|
start_scn_ = param.start_scn_;
|
|
clog_checkpoint_scn_ = param.clog_checkpoint_scn_;
|
|
ddl_checkpoint_scn_ = param.ddl_checkpoint_scn_;
|
|
snapshot_version_ = param.snapshot_version_;
|
|
multi_version_start_ = param.multi_version_start_;
|
|
compat_mode_ = param.compat_mode_;
|
|
report_status_ = param.report_status_;
|
|
tx_data_ = param.tx_data_;
|
|
table_store_flag_ = param.table_store_flag_;
|
|
ddl_start_scn_ = param.ddl_start_scn_;
|
|
ddl_snapshot_version_ = param.ddl_snapshot_version_;
|
|
max_sync_storage_schema_version_ = param.max_sync_storage_schema_version_;
|
|
is_inited_ = true;
|
|
}
|
|
|
|
if (OB_UNLIKELY(!is_inited_)) {
|
|
reset();
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObTabletMeta::init(
|
|
common::ObIAllocator &allocator,
|
|
const ObTabletMeta &old_tablet_meta,
|
|
const ObTabletTxMultiSourceDataUnit &tx_data,
|
|
const ObTabletBindingInfo &ddl_data,
|
|
const share::ObTabletAutoincSeq &autoinc_seq,
|
|
const ObMigrationTabletParam *tablet_meta)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
if (OB_UNLIKELY(is_inited_)) {
|
|
ret = OB_INIT_TWICE;
|
|
LOG_WARN("init twice", K(ret), K_(is_inited));
|
|
} else if (OB_UNLIKELY(!old_tablet_meta.is_valid())) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), K(old_tablet_meta));
|
|
} else if (OB_FAIL(inner_check_(old_tablet_meta, tablet_meta))) {
|
|
LOG_WARN("failed to do inner check", K(ret), K(old_tablet_meta), KP(tablet_meta));
|
|
} else {
|
|
const int64_t snapshot_version = OB_ISNULL(tablet_meta) ?
|
|
old_tablet_meta.snapshot_version_ : MAX(old_tablet_meta.snapshot_version_, tablet_meta->snapshot_version_);
|
|
const int64_t multi_version_start = OB_ISNULL(tablet_meta) ?
|
|
old_tablet_meta.multi_version_start_ : MAX(old_tablet_meta.multi_version_start_, tablet_meta->multi_version_start_);
|
|
const int64_t max_sync_storage_schema_version = OB_ISNULL(tablet_meta) ?
|
|
old_tablet_meta.max_sync_storage_schema_version_ : MIN(old_tablet_meta.max_sync_storage_schema_version_,
|
|
tablet_meta->max_sync_storage_schema_version_);
|
|
ObTabletTableStoreFlag table_store_flag = old_tablet_meta.table_store_flag_;
|
|
if (!table_store_flag.with_major_sstable()) {
|
|
table_store_flag = OB_ISNULL(tablet_meta) ? table_store_flag : tablet_meta->table_store_flag_;
|
|
}
|
|
|
|
version_ = TABLET_META_VERSION;
|
|
ls_id_ = old_tablet_meta.ls_id_;
|
|
tablet_id_ = old_tablet_meta.tablet_id_;
|
|
data_tablet_id_ = old_tablet_meta.data_tablet_id_;
|
|
ref_tablet_id_ = old_tablet_meta.ref_tablet_id_;
|
|
create_scn_ = old_tablet_meta.create_scn_;
|
|
start_scn_ = old_tablet_meta.start_scn_;
|
|
clog_checkpoint_scn_ = old_tablet_meta.clog_checkpoint_scn_;
|
|
snapshot_version_ = snapshot_version;
|
|
multi_version_start_ = multi_version_start;
|
|
compat_mode_ = old_tablet_meta.compat_mode_;
|
|
if (FAILEDx(autoinc_seq_.assign(autoinc_seq))) {
|
|
LOG_WARN("failed to assign autoinc seq", K(ret));
|
|
}
|
|
ha_status_ = old_tablet_meta.ha_status_;
|
|
report_status_ = old_tablet_meta.report_status_;
|
|
tx_data_ = tx_data;
|
|
if (FAILEDx(ddl_data_.assign(ddl_data))) {
|
|
LOG_WARN("failed to assign ddl data", K(ret));
|
|
}
|
|
table_store_flag_ = table_store_flag;
|
|
ddl_checkpoint_scn_ = old_tablet_meta.ddl_checkpoint_scn_;
|
|
ddl_start_scn_ = old_tablet_meta.ddl_start_scn_;
|
|
ddl_snapshot_version_ = old_tablet_meta.ddl_snapshot_version_;
|
|
max_sync_storage_schema_version_ = max_sync_storage_schema_version;
|
|
|
|
if (OB_SUCC(ret)) {
|
|
is_inited_ = true;
|
|
}
|
|
}
|
|
|
|
if (OB_UNLIKELY(!is_inited_)) {
|
|
reset();
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void ObTabletMeta::reset()
|
|
{
|
|
version_ = 0;
|
|
ls_id_.reset();
|
|
tablet_id_.reset();
|
|
data_tablet_id_.reset();
|
|
ref_tablet_id_.reset();
|
|
has_next_tablet_ = false;
|
|
create_scn_.reset();
|
|
start_scn_.reset();
|
|
clog_checkpoint_scn_.reset();
|
|
ddl_checkpoint_scn_ .reset();
|
|
snapshot_version_ = OB_INVALID_TIMESTAMP;
|
|
multi_version_start_ = OB_INVALID_TIMESTAMP;
|
|
compat_mode_ = lib::Worker::CompatMode::INVALID;
|
|
autoinc_seq_.reset();
|
|
ha_status_.reset();
|
|
report_status_.reset();
|
|
tx_data_.reset();
|
|
ddl_data_.reset();
|
|
table_store_flag_.reset();
|
|
ddl_start_scn_.reset();
|
|
ddl_snapshot_version_ = OB_INVALID_TIMESTAMP;
|
|
max_sync_storage_schema_version_ = 0;
|
|
is_inited_ = false;
|
|
}
|
|
|
|
bool ObTabletMeta::is_valid() const
|
|
{
|
|
// TODO: add more check
|
|
return ls_id_.is_valid()
|
|
&& tablet_id_.is_valid()
|
|
&& data_tablet_id_.is_valid()
|
|
//&& create_scn_ > OB_INVALID_TIMESTAMP
|
|
&& multi_version_start_ >= 0
|
|
&& multi_version_start_ <= snapshot_version_
|
|
&& compat_mode_ != lib::Worker::CompatMode::INVALID
|
|
&& max_sync_storage_schema_version_ >= 0
|
|
&& ha_status_.is_valid()
|
|
&& (ha_status_.is_restore_status_pending()
|
|
|| (!ha_status_.is_restore_status_pending()
|
|
&& clog_checkpoint_scn_ >= SCN::base_scn()
|
|
&& start_scn_ >= SCN::base_scn()
|
|
&& start_scn_ <= clog_checkpoint_scn_));
|
|
}
|
|
|
|
int ObTabletMeta::serialize(char *buf, const int64_t len, int64_t &pos)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
int64_t new_pos = pos;
|
|
|
|
if (OB_UNLIKELY(!is_inited_)) {
|
|
ret = OB_NOT_INIT;
|
|
LOG_WARN("not inited", K(ret), K_(is_inited));
|
|
} else if (OB_ISNULL(buf)
|
|
|| OB_UNLIKELY(len <= 0)
|
|
|| OB_UNLIKELY(pos < 0)) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), K(buf), K(len), K(pos));
|
|
} else if (OB_UNLIKELY(!is_valid())) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_ERROR("tablet meta is invalid", K(ret), K(*this));
|
|
} else if (TABLET_META_VERSION != version_) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_ERROR("invalid version", K(ret), K_(version));
|
|
} else if (FALSE_IT(length_ = get_serialize_size())) {
|
|
// do nothing
|
|
} else if (OB_UNLIKELY(length_ > len - pos)) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("buffer's length is not enough", K(ret), K(length_), K(len - new_pos));
|
|
} else if (OB_FAIL(serialization::encode_i32(buf, len, new_pos, version_))) {
|
|
LOG_WARN("failed to serialize tablet meta's version", K(ret), K(len), K(new_pos), K_(version));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::encode_i32(buf, len, new_pos, length_))) {
|
|
LOG_WARN("failed to serialize tablet meta's length", K(ret), K(len), K(new_pos), K_(length));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ls_id_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ls id", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(tablet_id_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(data_tablet_id_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize data tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ref_tablet_id_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ref tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::encode_bool(buf, len, new_pos, has_next_tablet_))) {
|
|
LOG_WARN("failed to serialize has next tablet", K(ret), K(len), K(new_pos), K_(has_next_tablet));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(create_scn_.fixed_serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize create scn", K(ret), K(len), K(new_pos), K_(create_scn));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(start_scn_.fixed_serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize start scn", K(ret), K(len), K(new_pos), K_(start_scn));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(clog_checkpoint_scn_.fixed_serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize clog checkpoint ts", K(ret), K(len), K(new_pos), K_(clog_checkpoint_scn));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ddl_checkpoint_scn_.fixed_serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ddl checkpoint ts", K(ret), K(len), K(new_pos), K_(ddl_checkpoint_scn));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::encode_i64(buf, len, new_pos, snapshot_version_))) {
|
|
LOG_WARN("failed to serialize snapshot version", K(ret), K(len), K(new_pos), K_(snapshot_version));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::encode_i64(buf, len, new_pos, multi_version_start_))) {
|
|
LOG_WARN("failed to serialize multi version start", K(ret), K(len), K(new_pos), K_(multi_version_start));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::encode_i8(buf, len, new_pos, static_cast<int8_t>(compat_mode_)))) {
|
|
LOG_WARN("failed to serialize auto inc seq", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(autoinc_seq_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize auto inc seq", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ha_status_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ha status", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(report_status_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize report status", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(tx_data_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize multi source data", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ddl_data_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ddl data", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(table_store_flag_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize table store flag", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ddl_start_scn_.fixed_serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ddl start log ts", K(ret), K(len), K(new_pos), K_(ddl_start_scn));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::encode_i64(buf, len, new_pos, ddl_snapshot_version_))) {
|
|
LOG_WARN("failed to serialize ddl snapshot version", K(ret), K(len), K(new_pos), K_(ddl_snapshot_version));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::encode_i64(buf, len, new_pos, max_sync_storage_schema_version_))) {
|
|
LOG_WARN("failed to serialize max_sync_storage_schema_version", K(ret), K(len), K(new_pos), K_(max_sync_storage_schema_version));
|
|
} else if (OB_UNLIKELY(length_ != new_pos - pos)) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("tablet meta's length doesn't match standard length", K(ret), K(new_pos), K(pos), K_(length));
|
|
} else {
|
|
pos = new_pos;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObTabletMeta::deserialize(
|
|
common::ObIAllocator &allocator,
|
|
const char *buf,
|
|
const int64_t len,
|
|
int64_t &pos)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
int64_t new_pos = pos;
|
|
|
|
if (OB_UNLIKELY(is_inited_)) {
|
|
ret = OB_INIT_TWICE;
|
|
LOG_WARN("cannot deserialize inited tablet meta", K(ret), K_(is_inited));
|
|
} else if (OB_ISNULL(buf)
|
|
|| OB_UNLIKELY(len <= 0)
|
|
|| OB_UNLIKELY(pos < 0)
|
|
|| OB_UNLIKELY(len <= pos)) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), K(buf), K(len), K(pos));
|
|
} else if (OB_FAIL(serialization::decode_i32(buf, len, new_pos, (int32_t *)&version_))) {
|
|
LOG_WARN("failed to deserialize tablet meta's version", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(serialization::decode_i32(buf, len, new_pos, (int32_t *)&length_))) {
|
|
LOG_WARN("failed to deserialize tablet meta's length", K(ret), K(len), K(new_pos));
|
|
} else if (TABLET_META_VERSION == version_) {
|
|
int8_t compat_mode = -1;
|
|
if (OB_UNLIKELY(length_ > len - pos)) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("buffer's length is not enough", K(ret), K(length_), K(len - new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ls_id_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ls id", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(tablet_id_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(data_tablet_id_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize data tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ref_tablet_id_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ref tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::decode_bool(buf, len, new_pos, (bool *)&has_next_tablet_))) {
|
|
LOG_WARN("failed to deserialize has_next_tablet_", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(create_scn_.fixed_deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize create scn", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(start_scn_.fixed_deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize start scn", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(clog_checkpoint_scn_.fixed_deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize clog checkpoint ts", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ddl_checkpoint_scn_.fixed_deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ddl checkpoint ts", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::decode_i64(buf, len, new_pos, &snapshot_version_))) {
|
|
LOG_WARN("failed to deserialize snapshot version", K(ret), K(len));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::decode_i64(buf, len, new_pos, &multi_version_start_))) {
|
|
LOG_WARN("failed to deserialize multi version start", K(ret), K(len));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::decode_i8(buf, len, new_pos, (int8_t*)(&compat_mode)))) {
|
|
LOG_WARN("failed to deserialize compat mode", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(autoinc_seq_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize auto inc seq", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ha_status_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize restore status", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(report_status_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize report status", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(tx_data_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize multi source data", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ddl_data_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ddl data", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(table_store_flag_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize table store flag", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(ddl_start_scn_.fixed_deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ddl start log ts", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::decode_i64(buf, len, new_pos, &ddl_snapshot_version_))) {
|
|
LOG_WARN("failed to deserialize ddl snapshot version", K(ret), K(len), K(new_pos));
|
|
} else if (new_pos - pos < length_ && OB_FAIL(serialization::decode_i64(buf, len, new_pos, &max_sync_storage_schema_version_))) {
|
|
LOG_WARN("failed to deserialize max_sync_storage_schema_version_", K(ret), K(len), K(new_pos));
|
|
} else if (OB_UNLIKELY(length_ != new_pos - pos)) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("tablet's length doesn't match standard length", K(ret), K(new_pos), K(pos), K_(length));
|
|
} else {
|
|
pos = new_pos;
|
|
compat_mode_ = static_cast<lib::Worker::CompatMode>(compat_mode);
|
|
is_inited_ = true;
|
|
}
|
|
} else {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("invalid version", K(ret), K_(version));
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int64_t ObTabletMeta::get_serialize_size() const
|
|
{
|
|
int64_t size = 0;
|
|
size += serialization::encoded_length_i32(version_);
|
|
size += serialization::encoded_length_i32(length_);
|
|
size += ls_id_.get_serialize_size();
|
|
size += tablet_id_.get_serialize_size();
|
|
size += data_tablet_id_.get_serialize_size();
|
|
size += ref_tablet_id_.get_serialize_size();
|
|
size += serialization::encoded_length_bool(has_next_tablet_);
|
|
size += create_scn_.get_fixed_serialize_size();
|
|
size += start_scn_.get_fixed_serialize_size();
|
|
size += clog_checkpoint_scn_.get_fixed_serialize_size();
|
|
size += ddl_checkpoint_scn_.get_fixed_serialize_size();
|
|
size += serialization::encoded_length_i64(snapshot_version_);
|
|
size += serialization::encoded_length_i64(multi_version_start_);
|
|
size += serialization::encoded_length_i8(static_cast<int8_t>(compat_mode_));
|
|
size += autoinc_seq_.get_serialize_size();
|
|
size += ha_status_.get_serialize_size();
|
|
size += report_status_.get_serialize_size();
|
|
size += tx_data_.get_serialize_size();
|
|
size += ddl_data_.get_serialize_size();
|
|
size += table_store_flag_.get_serialize_size();
|
|
size += ddl_start_scn_.get_fixed_serialize_size();
|
|
size += serialization::encoded_length_i64(ddl_snapshot_version_);
|
|
size += serialization::encoded_length_i64(max_sync_storage_schema_version_);
|
|
return size;
|
|
}
|
|
|
|
int ObTabletMeta::deserialize_id(
|
|
const char *buf,
|
|
const int64_t len,
|
|
int64_t &pos,
|
|
share::ObLSID &ls_id,
|
|
common::ObTabletID &tablet_id)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
int32_t version = 0;
|
|
int32_t length = 0;
|
|
if (OB_FAIL(serialization::decode_i32(buf, len, pos, &version))) {
|
|
LOG_WARN("fail to deserialize tablet meta's version", K(ret), K(len), K(pos));
|
|
} else if (OB_FAIL(serialization::decode_i32(buf, len, pos, &length))) {
|
|
LOG_WARN("fail to deserialize tablet meta's length", K(ret), K(len), K(pos));
|
|
} else if (TABLET_META_VERSION == version) {
|
|
if (OB_FAIL(ls_id.deserialize(buf, len, pos))) {
|
|
LOG_WARN("fail to deserialize ls id", K(ret), K(len), K(pos));
|
|
} else if (OB_FAIL(tablet_id.deserialize(buf, len, pos))) {
|
|
LOG_WARN("fail to deserialize tablet id", K(ret), K(len), K(pos));
|
|
}
|
|
} else {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("The version of tablet is not 1", K(ret), K(version));
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObTabletMeta::init_report_info(
|
|
const blocksstable::ObSSTable *sstable,
|
|
const int64_t report_version,
|
|
ObTabletReportStatus &report_status)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (OB_ISNULL(sstable) || !sstable->is_major_sstable() || report_version < 0) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("get invalid arguments", K(ret), K(sstable), K(report_version));
|
|
} else if (sstable->get_snapshot_version() < report_status.merge_snapshot_version_) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("get unexpected merge snapshot version", K(ret), K(report_status), KPC(sstable));
|
|
} else if (sstable->get_snapshot_version() == report_status.merge_snapshot_version_) {
|
|
} else {
|
|
report_status.reset();
|
|
report_status.cur_report_version_ = report_version;
|
|
report_status.merge_snapshot_version_ = sstable->get_snapshot_version();
|
|
report_status.data_checksum_ = sstable->get_meta().get_basic_meta().data_checksum_;
|
|
report_status.row_count_ = sstable->get_meta().get_basic_meta().row_count_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObTabletMeta::update(const ObMigrationTabletParam ¶m)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObTabletRestoreStatus::STATUS change_status = ObTabletRestoreStatus::RESTORE_STATUS_MAX;
|
|
ObTabletRestoreStatus::STATUS current_status = ObTabletRestoreStatus::RESTORE_STATUS_MAX;
|
|
bool can_change = false;
|
|
|
|
if (OB_UNLIKELY(!is_inited_)) {
|
|
ret = OB_NOT_INIT;
|
|
LOG_WARN("not inited", K(ret), K_(is_inited));
|
|
} else if (OB_UNLIKELY(!param.is_valid())) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), K(param));
|
|
} else if (OB_FAIL(param.ha_status_.get_restore_status(change_status))) {
|
|
LOG_WARN("failed to get restore status", K(ret), K(param));
|
|
} else if (OB_FAIL(ha_status_.get_restore_status(current_status))) {
|
|
LOG_WARN("failed to get restore status", K(ret), K(ha_status_));
|
|
} else if (OB_FAIL(ObTabletRestoreStatus::check_can_change_status(current_status, change_status, can_change))) {
|
|
LOG_WARN("failed to check can change restore status", K(ret), K(ha_status_), K(change_status), K(param));
|
|
} else if (!can_change) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("can not change restore status", K(ret), K(param), K(ha_status_), K(change_status));
|
|
} else if (OB_FAIL(ha_status_.set_restore_status(change_status))) {
|
|
LOG_WARN("failed to set restore status", K(ret), K(param));
|
|
} else if (OB_FAIL(autoinc_seq_.assign(param.autoinc_seq_))) {
|
|
LOG_WARN("failed to assign autoinc seq", K(ret), K(param));
|
|
} else {
|
|
ls_id_ = param.ls_id_;
|
|
tablet_id_ = param.tablet_id_;
|
|
data_tablet_id_ = param.data_tablet_id_;
|
|
ref_tablet_id_ = param.ref_tablet_id_;
|
|
create_scn_ = param.create_scn_;
|
|
start_scn_ = param.start_scn_;
|
|
clog_checkpoint_scn_ = param.clog_checkpoint_scn_;
|
|
ddl_checkpoint_scn_ = param.ddl_checkpoint_scn_;
|
|
table_store_flag_ = param.table_store_flag_;
|
|
ddl_start_scn_ = param.ddl_start_scn_;
|
|
ddl_snapshot_version_ = param.ddl_snapshot_version_;
|
|
max_sync_storage_schema_version_ = param.max_sync_storage_schema_version_;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObTabletMeta::update_create_scn(const SCN create_scn)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
if (OB_UNLIKELY(!is_inited_)) {
|
|
ret = OB_NOT_INIT;
|
|
LOG_WARN("not inited", K(ret), K_(is_inited));
|
|
} else if (OB_UNLIKELY(!create_scn.is_valid())) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), K(create_scn));
|
|
} else {
|
|
create_scn_ = create_scn;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObTabletMeta::inner_check_(
|
|
const ObTabletMeta &old_tablet_meta,
|
|
const ObMigrationTabletParam *tablet_meta)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (!old_tablet_meta.is_valid()) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("inner check get invalid argument", K(ret), K(old_tablet_meta));
|
|
} else if (OB_ISNULL(tablet_meta)) {
|
|
//do nohting
|
|
} else if (OB_FAIL(old_tablet_meta.ls_id_ != tablet_meta->ls_id_
|
|
|| old_tablet_meta.tablet_id_ != tablet_meta->tablet_id_
|
|
|| old_tablet_meta.data_tablet_id_ != tablet_meta->data_tablet_id_
|
|
|| old_tablet_meta.ref_tablet_id_ != tablet_meta->ref_tablet_id_
|
|
|| old_tablet_meta.compat_mode_ != tablet_meta->compat_mode_)) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("old tablet meta part variable is not same with migration tablet param",
|
|
K(ret), K(old_tablet_meta), KPC(tablet_meta));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
|
|
ObMigrationTabletParam::ObMigrationTabletParam()
|
|
: allocator_(),
|
|
ls_id_(),
|
|
tablet_id_(),
|
|
data_tablet_id_(),
|
|
ref_tablet_id_(),
|
|
create_scn_(),
|
|
start_scn_(),
|
|
clog_checkpoint_scn_(),
|
|
ddl_checkpoint_scn_(),
|
|
snapshot_version_(OB_INVALID_TIMESTAMP),
|
|
multi_version_start_(OB_INVALID_TIMESTAMP),
|
|
compat_mode_(lib::Worker::CompatMode::INVALID),
|
|
autoinc_seq_(),
|
|
ha_status_(),
|
|
report_status_(),
|
|
tx_data_(),
|
|
ddl_data_(),
|
|
storage_schema_(),
|
|
medium_info_list_(compaction::ObMediumCompactionInfoList::MEDIUM_LIST_IN_STORAGE),
|
|
table_store_flag_(),
|
|
ddl_start_scn_(),
|
|
ddl_snapshot_version_(OB_INVALID_TIMESTAMP),
|
|
max_sync_storage_schema_version_(0)
|
|
{
|
|
}
|
|
|
|
bool ObMigrationTabletParam::is_valid() const
|
|
{
|
|
return ls_id_.is_valid()
|
|
&& tablet_id_.is_valid()
|
|
&& data_tablet_id_.is_valid()
|
|
//&& create_scn_ > OB_INVALID_TIMESTAMP
|
|
&& multi_version_start_ >= 0
|
|
&& multi_version_start_ <= snapshot_version_
|
|
&& compat_mode_ != lib::Worker::CompatMode::INVALID
|
|
&& medium_info_list_.is_valid()
|
|
&& ha_status_.is_valid()
|
|
&& max_sync_storage_schema_version_ >= 0
|
|
&& (ha_status_.is_restore_status_pending()
|
|
|| (start_scn_ >= SCN::base_scn()
|
|
&& clog_checkpoint_scn_ >= SCN::base_scn()
|
|
&& start_scn_ <= clog_checkpoint_scn_
|
|
&& storage_schema_.is_valid()));
|
|
}
|
|
|
|
int ObMigrationTabletParam::serialize(char *buf, const int64_t len, int64_t &pos) const
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
int64_t new_pos = pos;
|
|
|
|
if (OB_ISNULL(buf)
|
|
|| OB_UNLIKELY(len <= 0)
|
|
|| OB_UNLIKELY(pos < 0)) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), K(buf), K(len), K(pos));
|
|
} else if (OB_UNLIKELY(!is_valid())) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("migration tablet param is invalid", K(ret), K(*this));
|
|
} else if (OB_FAIL(ls_id_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ls id", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(tablet_id_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(data_tablet_id_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize data tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(ref_tablet_id_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ref tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(create_scn_.fixed_serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize clog checkpoint ts", K(ret), K(len), K(new_pos), K_(create_scn));
|
|
} else if (OB_FAIL(start_scn_.fixed_serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize start scn", K(ret), K(len), K(new_pos), K_(start_scn));
|
|
} else if (OB_FAIL(clog_checkpoint_scn_.fixed_serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize clog checkpoint ts", K(ret), K(len), K(new_pos), K_(clog_checkpoint_scn));
|
|
} else if (OB_FAIL(ddl_checkpoint_scn_.fixed_serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ddl checkpoint ts", K(ret), K(len), K(new_pos), K_(ddl_checkpoint_scn));
|
|
} else if (OB_FAIL(serialization::encode_i64(buf, len, new_pos, snapshot_version_))) {
|
|
LOG_WARN("failed to serialize clog checkpoint ts", K(ret), K(len), K(new_pos), K_(snapshot_version));
|
|
} else if (OB_FAIL(serialization::encode_i64(buf, len, new_pos, multi_version_start_))) {
|
|
LOG_WARN("failed to serialize clog checkpoint ts", K(ret), K(len), K(new_pos), K_(multi_version_start));
|
|
} else if (OB_FAIL(serialization::encode_i8(buf, len, new_pos, static_cast<int8_t>(compat_mode_)))) {
|
|
LOG_WARN("failed to serialize compat mode", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(autoinc_seq_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize auto inc seq", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(ha_status_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ha status", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(report_status_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize report status", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(tx_data_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize multi source data", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(ddl_data_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ddl data", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(storage_schema_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize storage schema", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(medium_info_list_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize medium compaction list", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(table_store_flag_.serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize table store flag", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(ddl_start_scn_.fixed_serialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to serialize ddl start log ts", K(ret), K(len), K(new_pos), K_(ddl_start_scn));
|
|
} else if (OB_FAIL(serialization::encode_i64(buf, len, new_pos, ddl_snapshot_version_))) {
|
|
LOG_WARN("failed to serialize ddl snapshot version", K(ret), K(len), K(new_pos), K_(ddl_snapshot_version));
|
|
} else if (OB_FAIL(serialization::encode_i64(buf, len, new_pos, max_sync_storage_schema_version_))) {
|
|
LOG_WARN("failed to serialize max_sync_storage_schema_version", K(ret), K(len), K(new_pos), K_(max_sync_storage_schema_version));
|
|
} else {
|
|
pos = new_pos;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObMigrationTabletParam::deserialize(const char *buf, const int64_t len, int64_t &pos)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
int64_t new_pos = pos;
|
|
int8_t compat_mode = -1;
|
|
|
|
if (OB_ISNULL(buf)
|
|
|| OB_UNLIKELY(len <= 0)
|
|
|| OB_UNLIKELY(pos < 0)
|
|
|| OB_UNLIKELY(len <= pos)) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("invalid args", K(ret), K(buf), K(len), K(pos));
|
|
} else if (OB_FAIL(ls_id_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ls id", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(tablet_id_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(data_tablet_id_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize data tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(ref_tablet_id_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ref tablet id", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(create_scn_.fixed_deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize create scn", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(start_scn_.fixed_deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize start scn", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(clog_checkpoint_scn_.fixed_deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize clog checkpoint ts", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(ddl_checkpoint_scn_.fixed_deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ddl checkpoint ts", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(serialization::decode_i64(buf, len, new_pos, &snapshot_version_))) {
|
|
LOG_WARN("failed to deserialize clog checkpoint ts", K(ret), K(len));
|
|
} else if (OB_FAIL(serialization::decode_i64(buf, len, new_pos, &multi_version_start_))) {
|
|
LOG_WARN("failed to deserialize clog checkpoint ts", K(ret), K(len));
|
|
} else if (OB_FAIL(serialization::decode_i8(buf, len, new_pos, (int8_t*)(&compat_mode)))) {
|
|
LOG_WARN("failed to deserialize compat mode", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(autoinc_seq_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize auto inc seq", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(ha_status_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ha status", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(report_status_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize report status", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(tx_data_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize multi source data", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(ddl_data_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ddl data", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(storage_schema_.deserialize(allocator_, buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize storage schema", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(medium_info_list_.deserialize(allocator_, buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize medium compaction list", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(table_store_flag_.deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize table store flag", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(ddl_start_scn_.fixed_deserialize(buf, len, new_pos))) {
|
|
LOG_WARN("failed to deserialize ddl start log ts", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(serialization::decode_i64(buf, len, new_pos, &ddl_snapshot_version_))) {
|
|
LOG_WARN("failed to deserialize ddl snapshot version", K(ret), K(len), K(new_pos));
|
|
} else if (OB_FAIL(serialization::decode_i64(buf, len, new_pos, &max_sync_storage_schema_version_))) {
|
|
LOG_WARN("failed to deserialize max sync storage schema version", K(ret), K(len), K(new_pos));
|
|
} else {
|
|
compat_mode_ = static_cast<lib::Worker::CompatMode>(compat_mode);
|
|
pos = new_pos;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int64_t ObMigrationTabletParam::get_serialize_size() const
|
|
{
|
|
int64_t size = 0;
|
|
size += ls_id_.get_serialize_size();
|
|
size += tablet_id_.get_serialize_size();
|
|
size += data_tablet_id_.get_serialize_size();
|
|
size += ref_tablet_id_.get_serialize_size();
|
|
size += create_scn_.get_fixed_serialize_size();
|
|
size += start_scn_.get_fixed_serialize_size();
|
|
size += clog_checkpoint_scn_.get_fixed_serialize_size();
|
|
size += ddl_checkpoint_scn_.get_fixed_serialize_size();
|
|
size += serialization::encoded_length_i64(snapshot_version_);
|
|
size += serialization::encoded_length_i64(multi_version_start_);
|
|
size += serialization::encoded_length_i8(static_cast<int8_t>(compat_mode_));
|
|
size += autoinc_seq_.get_serialize_size();
|
|
size += ha_status_.get_serialize_size();
|
|
size += report_status_.get_serialize_size();
|
|
size += tx_data_.get_serialize_size();
|
|
size += ddl_data_.get_serialize_size();
|
|
size += storage_schema_.get_serialize_size();
|
|
size += medium_info_list_.get_serialize_size();
|
|
size += table_store_flag_.get_serialize_size();
|
|
size += ddl_start_scn_.get_fixed_serialize_size();
|
|
size += serialization::encoded_length_i64(ddl_snapshot_version_);
|
|
size += serialization::encoded_length_i64(max_sync_storage_schema_version_);
|
|
return size;
|
|
}
|
|
|
|
void ObMigrationTabletParam::reset()
|
|
{
|
|
tablet_id_.reset();
|
|
data_tablet_id_.reset();
|
|
ref_tablet_id_.reset();
|
|
create_scn_.reset();
|
|
start_scn_.reset();
|
|
clog_checkpoint_scn_.reset();
|
|
ddl_checkpoint_scn_.reset();
|
|
snapshot_version_ = OB_INVALID_TIMESTAMP;
|
|
multi_version_start_ = OB_INVALID_TIMESTAMP;
|
|
compat_mode_ = lib::Worker::CompatMode::INVALID;
|
|
autoinc_seq_.reset();
|
|
ha_status_.reset();
|
|
report_status_.reset();
|
|
tx_data_.reset();
|
|
ddl_data_.reset();
|
|
storage_schema_.reset();
|
|
medium_info_list_.reset();
|
|
table_store_flag_.reset();
|
|
ddl_start_scn_.reset();
|
|
ddl_snapshot_version_ = OB_INVALID_TIMESTAMP;
|
|
max_sync_storage_schema_version_ = 0;
|
|
}
|
|
|
|
int ObMigrationTabletParam::assign(const ObMigrationTabletParam ¶m)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (OB_UNLIKELY(!param.is_valid())) {
|
|
ret = OB_INVALID_ARGUMENT;
|
|
LOG_WARN("migration tablet param is invalid", K(ret), K(param));
|
|
} else {
|
|
ls_id_ = param.ls_id_;
|
|
tablet_id_ = param.tablet_id_;
|
|
data_tablet_id_ = param.data_tablet_id_;
|
|
ref_tablet_id_ = param.ref_tablet_id_;
|
|
create_scn_ = param.create_scn_;
|
|
start_scn_ = param.start_scn_;
|
|
clog_checkpoint_scn_ = param.clog_checkpoint_scn_;
|
|
ddl_checkpoint_scn_ = param.ddl_checkpoint_scn_;
|
|
snapshot_version_ = param.snapshot_version_;
|
|
multi_version_start_ = param.multi_version_start_;
|
|
compat_mode_ = param.compat_mode_;
|
|
ha_status_ = param.ha_status_;
|
|
report_status_ = param.report_status_;
|
|
tx_data_ = param.tx_data_;
|
|
storage_schema_.reset(); // TODO: refactor?
|
|
medium_info_list_.reset();
|
|
table_store_flag_ = param.table_store_flag_;
|
|
ddl_start_scn_ = param.ddl_start_scn_;
|
|
ddl_snapshot_version_ = param.ddl_snapshot_version_;
|
|
max_sync_storage_schema_version_ = param.max_sync_storage_schema_version_;
|
|
|
|
if (OB_FAIL(ddl_data_.assign(param.ddl_data_))) {
|
|
LOG_WARN("failed to assign ddl data", K(ret), K(param), K(*this));
|
|
} else if (OB_FAIL(autoinc_seq_.assign(param.autoinc_seq_))) {
|
|
LOG_WARN("failed to assign autoinc seq", K(ret), K(param), K(*this));
|
|
} else if (OB_FAIL(storage_schema_.init(allocator_, param.storage_schema_))) {
|
|
LOG_WARN("failed to assign storage schema", K(ret), K(param));
|
|
} else if (OB_FAIL(medium_info_list_.init(allocator_, ¶m.medium_info_list_))) {
|
|
LOG_WARN("failed to assign medium info list", K(ret), K(param));
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObMigrationTabletParam::construct_placeholder_storage_schema(
|
|
ObIAllocator &allocator,
|
|
ObStorageSchema &storage_schema)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
storage_schema.reset();
|
|
|
|
storage_schema.allocator_ = &allocator;
|
|
storage_schema.rowkey_array_.set_allocator(&allocator);
|
|
storage_schema.column_array_.set_allocator(&allocator);
|
|
|
|
storage_schema.storage_schema_version_ = ObStorageSchema::STORAGE_SCHEMA_VERSION;
|
|
storage_schema.is_use_bloomfilter_ = false;
|
|
storage_schema.table_type_ = ObTableType::USER_TABLE;
|
|
//storage_schema.table_mode_
|
|
storage_schema.index_type_ = ObIndexType::INDEX_TYPE_PRIMARY;
|
|
storage_schema.index_status_ = ObIndexStatus::INDEX_STATUS_AVAILABLE;
|
|
storage_schema.row_store_type_ = ObRowStoreType::FLAT_ROW_STORE;
|
|
storage_schema.schema_version_ = ObStorageSchema::STORAGE_SCHEMA_VERSION;
|
|
storage_schema.column_cnt_ = 1;
|
|
storage_schema.tablet_size_ = OB_DEFAULT_TABLET_SIZE;
|
|
storage_schema.pctfree_ = OB_DEFAULT_PCTFREE;
|
|
storage_schema.block_size_ = OB_DEFAULT_MACRO_BLOCK_SIZE;
|
|
storage_schema.progressive_merge_round_ = 0;
|
|
storage_schema.master_key_id_ = OB_INVALID_ID;
|
|
|
|
ObStorageRowkeyColumnSchema rowkey_schema;
|
|
rowkey_schema.meta_type_.set_tinyint();
|
|
rowkey_schema.column_idx_ = common::OB_APP_MIN_COLUMN_ID;
|
|
rowkey_schema.order_ = ObOrderType::ASC;
|
|
|
|
ObStorageColumnSchema col_schema;
|
|
col_schema.is_rowkey_column_ = true;
|
|
col_schema.is_column_stored_in_sstable_ = true;
|
|
col_schema.meta_type_ = rowkey_schema.meta_type_;
|
|
col_schema.default_checksum_ = 0;
|
|
|
|
if (OB_FAIL(storage_schema.rowkey_array_.reserve(storage_schema.column_cnt_))) {
|
|
STORAGE_LOG(WARN, "Fail to reserve rowkey column array", K(ret));
|
|
} else if (OB_FAIL(storage_schema.column_array_.reserve(storage_schema.column_cnt_))) {
|
|
STORAGE_LOG(WARN, "Fail to reserve column array", K(ret));
|
|
} else if (OB_FAIL(storage_schema.rowkey_array_.push_back(rowkey_schema))) {
|
|
STORAGE_LOG(WARN, "Fail to add rowkey column id to rowkey array", K(ret));
|
|
} else if (OB_FAIL(storage_schema.column_array_.push_back(col_schema))) {
|
|
STORAGE_LOG(WARN, "Fail to push into column array", K(ret), K(col_schema));
|
|
} else {
|
|
storage_schema.is_inited_ = true;
|
|
}
|
|
|
|
if (OB_SUCC(ret) && OB_UNLIKELY(!storage_schema.is_valid())) {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("placeholder storage schema is not valid", K(ret), K(storage_schema));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
} // namespace storage
|
|
} // namespace oceanbase
|