use nullptr auto_inc_seq for empty_shell

This commit is contained in:
obdev 2023-08-25 03:10:36 +00:00 committed by ob-robot
parent d3f3058ecf
commit 5eb8d4f090
5 changed files with 29 additions and 33 deletions

View File

@ -481,7 +481,7 @@ int ObTablet::init(
ObTabletCreateDeleteMdsUserData user_data;
if (OB_FAIL(user_data.deserialize(data.ptr(), data.length(), pos))) {
LOG_WARN("fail to deserialize tablet status cache", K(ret));
} else if (OB_FAIL(mds_data_.init(allocator, user_data))) {
} else if (OB_FAIL(mds_data_.init_empty_shell(user_data))) {
LOG_WARN("failed to init mds data", K(ret), K(user_data));
} else if (OB_FAIL(ObTabletObjLoadHelper::alloc_and_new(allocator, table_store_addr_.ptr_))) {
LOG_WARN("fail to allocate and new rowkey read info", K(ret));
@ -747,8 +747,9 @@ int ObTablet::fetch_autoinc_seq(ObTabletMemberWrapper<ObTabletAutoincSeq> &wrapp
} else if (OB_UNLIKELY(!auto_inc_seq_addr.is_valid())) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid auto inc seq addr", K(ret));
} else if (auto_inc_seq_addr.is_memory_object()
|| auto_inc_seq_addr.is_none_object()) {
} else if (auto_inc_seq_addr.is_none_object()) {
wrapper.set_member(nullptr); // nullptr for none object
} else if (auto_inc_seq_addr.is_memory_object()) {
if (OB_ISNULL(auto_inc_seq_addr.get_ptr())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("auto inc seq addr ptr is null", K(ret), K_(mds_data_.auto_inc_seq));
@ -961,7 +962,7 @@ int ObTablet::init_empty_shell(
LOG_WARN("old tablet status is not deleted", K(ret), K(user_data.tablet_status_));
} else if (OB_FAIL(tablet_meta_.assign(old_tablet.tablet_meta_))) {
LOG_WARN("assign old tablet meta to empty shell failed", K(ret), K(old_tablet.tablet_meta_));
} else if (OB_FAIL(mds_data_.init(allocator, user_data))) {
} else if (OB_FAIL(mds_data_.init_empty_shell(user_data))) {
LOG_WARN("failed to init mds data", K(ret), K(user_data));
} else if (OB_FAIL(wait_release_memtables_())) {
LOG_ERROR("fail to release memtables", K(ret), K(old_tablet));
@ -1531,13 +1532,9 @@ int ObTablet::deserialize(
if (OB_SUCC(ret)) {
ObTabletAutoincSeq *auto_inc_seq = nullptr;
if (mds_data_.auto_inc_seq_.addr_.is_none()) {
if (OB_FAIL(ObTabletObjLoadHelper::alloc_and_new(allocator, auto_inc_seq))) {
LOG_WARN("fail to allocate and new rowkey read info", K(ret));
}
mds_data_.auto_inc_seq_.ptr_ = nullptr;
} else {
IO_AND_DESERIALIZE(allocator, mds_data_.auto_inc_seq_.addr_, auto_inc_seq);
}
if (OB_SUCC(ret)) {
const int auto_inc_seq_size = auto_inc_seq->get_deep_copy_size();
ObIStorageMetaObj *auto_inc_seq_obj = nullptr;
if (OB_UNLIKELY(remain < auto_inc_seq_size)) {

View File

@ -205,7 +205,6 @@ public:
// fetch_$member: member may exist in memory or disk, if in memory, get it directly, if in disk,
// read from disk then put into kv cache, and return kv cache handle for caller
int fetch_table_store(ObTabletMemberWrapper<ObTabletTableStore> &wrapper) const;
int fetch_autoinc_seq(ObTabletMemberWrapper<share::ObTabletAutoincSeq> &wrapper) const;
int load_storage_schema(
common::ObArenaAllocator &allocator,
const ObStorageSchema *&storage_schema) const;
@ -720,6 +719,7 @@ private:
void reset_ddl_memtables();
int wait_release_memtables_();
int mark_mds_table_switched_to_empty_shell_();
int fetch_autoinc_seq(ObTabletMemberWrapper<share::ObTabletAutoincSeq> &wrapper) const;
private:
// ObTabletDDLKvMgr::MAX_DDL_KV_CNT_IN_STORAGE
// Array size is too large, need to shrink it if possible

View File

@ -424,9 +424,7 @@ int ObTabletMdsData::init_with_update_medium_info(
return ret;
}
int ObTabletMdsData::init(
ObArenaAllocator &allocator,
const ObTabletCreateDeleteMdsUserData &tablet_status)
int ObTabletMdsData::init_empty_shell(const ObTabletCreateDeleteMdsUserData &tablet_status)
{
int ret = OB_SUCCESS;
@ -435,8 +433,6 @@ int ObTabletMdsData::init(
LOG_WARN("init twice", K(ret), K_(is_inited));
} else if (OB_FAIL(tablet_status_cache_.assign(tablet_status))) {
LOG_WARN("failed to copy", K(ret), K(tablet_status));
} else if (OB_FAIL(ObTabletObjLoadHelper::alloc_and_new(allocator, auto_inc_seq_.ptr_))) {
LOG_WARN("fail to allocate and new rowkey read info", K(ret));
} else {
tablet_status_.uncommitted_kv_.addr_.set_none_addr();
tablet_status_.committed_kv_.addr_.set_none_addr();
@ -444,6 +440,7 @@ int ObTabletMdsData::init(
aux_tablet_info_.committed_kv_.addr_.set_none_addr();
extra_medium_info_.reset();
medium_info_list_.addr_.set_none_addr();
auto_inc_seq_.ptr_ = nullptr;
auto_inc_seq_.addr_.set_none_addr();
is_inited_ = true;

View File

@ -93,9 +93,7 @@ public:
int init_with_update_medium_info(
common::ObIAllocator &allocator,
const ObTabletMdsData &other);
int init(
ObArenaAllocator &allocator,
const ObTabletCreateDeleteMdsUserData &tablet_status);
int init_empty_shell(const ObTabletCreateDeleteMdsUserData &tablet_status);
int set_tablet_status(
ObArenaAllocator *allocator,
const ObTabletStatus::Status &tablet_status,

View File

@ -73,7 +73,7 @@ void ObTabletTransformArg::reset()
bool ObTabletTransformArg::is_valid() const
{
return nullptr != auto_inc_seq_ptr_
return auto_inc_seq_addr_.is_none() ^ (nullptr != auto_inc_seq_ptr_)
&& table_store_addr_.is_none() ^ (nullptr != rowkey_read_info_ptr_)
&& tablet_meta_.is_valid()
&& table_store_addr_.is_valid()
@ -272,7 +272,7 @@ int ObTabletPersister::persist_and_fill_tablet(
const ObTabletMeta &tablet_meta = old_tablet.get_tablet_meta();
const ObTabletMapKey key(tablet_meta.ls_id_, tablet_meta.tablet_id_);
ObTabletPoolType type = ObTabletPoolType::TP_NORMAL;
ObTabletMemberWrapper<share::ObTabletAutoincSeq> auto_inc_seq;
ObTabletMemberWrapper<share::ObTabletAutoincSeq> auto_inc_seq; // define here to keep auto_inc_seq_ptr safe
bool try_smaller_pool = true;
if (old_tablet.is_empty_shell()) {
@ -524,20 +524,24 @@ int ObTabletPersister::transform(
// auto_inc_seq related
if (OB_SUCC(ret)) {
LOG_DEBUG("TINY TABLET: tablet + rowkey_read_info + tablet store", KP(buf), K(start_pos), K(remain));
ObIStorageMetaObj *auto_inc_obj = nullptr;
const int auto_inc_seq_size = arg.auto_inc_seq_ptr_->get_deep_copy_size();
if (OB_LIKELY((remain - auto_inc_seq_size) > 0)) {
if(CLICK_FAIL(arg.auto_inc_seq_ptr_->deep_copy(buf + start_pos, remain, auto_inc_obj))) {
LOG_WARN("fail to deep copy auto inc seq", K(ret), K(arg.auto_inc_seq_ptr_));
} else {
tiny_tablet->mds_data_.auto_inc_seq_.ptr_ = static_cast<share::ObTabletAutoincSeq *>(auto_inc_obj);
remain -= auto_inc_seq_size;
start_pos += auto_inc_seq_size;
}
if (OB_ISNULL(arg.auto_inc_seq_ptr_)) {
tiny_tablet->mds_data_.auto_inc_seq_.ptr_ = nullptr;
} else {
LOG_DEBUG("TINY TABLET: no enough memory for auto inc seq", K(rowkey_read_info_size), K(remain),
K(auto_inc_seq_size));
LOG_DEBUG("TINY TABLET: tablet + rowkey_read_info + tablet store", KP(buf), K(start_pos), K(remain));
ObIStorageMetaObj *auto_inc_obj = nullptr;
const int auto_inc_seq_size = arg.auto_inc_seq_ptr_->get_deep_copy_size();
if (OB_LIKELY((remain - auto_inc_seq_size) > 0)) {
if(CLICK_FAIL(arg.auto_inc_seq_ptr_->deep_copy(buf + start_pos, remain, auto_inc_obj))) {
LOG_WARN("fail to deep copy auto inc seq", K(ret), K(arg.auto_inc_seq_ptr_));
} else {
tiny_tablet->mds_data_.auto_inc_seq_.ptr_ = static_cast<share::ObTabletAutoincSeq *>(auto_inc_obj);
remain -= auto_inc_seq_size;
start_pos += auto_inc_seq_size;
}
} else {
LOG_DEBUG("TINY TABLET: no enough memory for auto inc seq", K(rowkey_read_info_size), K(remain),
K(auto_inc_seq_size));
}
}
}
if (OB_SUCC(ret)) {