Fix transfer create empty sstable with INT64_MAX upper trans version bug.

This commit is contained in:
godyangfight
2024-02-09 00:52:18 +00:00
committed by ob-robot
parent 9d088dff7e
commit ab5189ef2c
5 changed files with 20 additions and 8 deletions

View File

@ -690,7 +690,7 @@ int ObSharedMacroBlockMgr::rebuild_sstable(
LOG_WARN("fail to close sstable index builder", K(ret));
} else if (OB_FAIL(create_new_sstable(allocator, res, old_sstable, block_info, new_sstable))) {
LOG_WARN("fail to create new sstable", K(ret), K(tablet.get_tablet_meta()), K(old_sstable));
} else if (OB_FAIL(new_sstable.set_upper_trans_version(old_sstable.get_upper_trans_version()))) {
} else if (OB_FAIL(new_sstable.set_upper_trans_version(old_sstable.get_upper_trans_version(), false/*force_update*/))) {
LOG_WARN("fail to update upper trans version", K(ret), K(old_sstable.get_upper_trans_version()));
} else if (OB_FAIL(new_sstable.get_meta(new_meta_handle))) {
LOG_WARN("get meta handle fail", K(ret), K(new_sstable));

View File

@ -949,18 +949,23 @@ int ObSSTable::check_row_locked(
return ret;
}
int ObSSTable::set_upper_trans_version(const int64_t upper_trans_version)
int ObSSTable::set_upper_trans_version(
const int64_t upper_trans_version,
const bool force_update)
{
int ret = OB_SUCCESS;
const int64_t old_val = ATOMIC_LOAD(&meta_cache_.upper_trans_version_);
// only set once
if (INT64_MAX == old_val && INT64_MAX != upper_trans_version) {
const int64_t new_val = std::max(upper_trans_version, meta_cache_.max_merged_trans_version_);
int64_t new_val = upper_trans_version;
if (OB_LIKELY(!force_update)) {
new_val = std::max(new_val, meta_cache_.max_merged_trans_version_);
}
ATOMIC_CAS(&meta_cache_.upper_trans_version_, old_val, new_val);
}
LOG_INFO("succeed to set upper trans version", K(key_),
LOG_INFO("succeed to set upper trans version", K(force_update), K(key_),
K(upper_trans_version), K(meta_cache_.upper_trans_version_));
return ret;
}

View File

@ -202,7 +202,7 @@ public:
storage::ObTableAccessContext &context,
share::SCN &max_trans_version,
ObRowsInfo &rows_info);
int set_upper_trans_version(const int64_t upper_trans_version);
int set_upper_trans_version(const int64_t upper_trans_version, const bool force_update);
virtual int64_t get_upper_trans_version() const override
{
return meta_cache_.upper_trans_version_;

View File

@ -425,7 +425,7 @@ int ObTXTransferUtils::build_empty_minor_sstable_param_(
param.table_key_.tablet_id_ = tablet_id;
param.table_key_.scn_range_.start_scn_ = start_scn;
param.table_key_.scn_range_.end_scn_ = end_scn;
param.max_merged_trans_version_ = INT64_MAX; //Set max merged trans version avoild sstable recycle;
param.max_merged_trans_version_ = 0;
param.schema_version_ = table_schema.get_schema_version();
param.create_snapshot_version_ = 0;

View File

@ -3667,7 +3667,14 @@ int ObTablet::update_upper_trans_version(ObLS &ls, bool &is_updated)
LOG_WARN("unexpected error, table is nullptr", K(ret), KPC(table));
} else {
ObSSTable *sstable = reinterpret_cast<ObSSTable *>(table);
if (INT64_MAX == sstable->get_upper_trans_version()) {
if (INT64_MAX != sstable->get_upper_trans_version()) {
} else if (0 == sstable->get_data_macro_block_count() && INT64_MAX == sstable->get_max_merged_trans_version()) {
if (OB_FAIL(sstable->set_upper_trans_version(0, true/*force_update*/))) {
LOG_WARN("failed to force set upper trans version", K(ret), KPC(sstable));
} else {
FLOG_INFO("sstable has no data but max merged version is INT64_MAX, force set upper trans version", K(ret), KPC(sstable));
}
} else {
int64_t max_trans_version = INT64_MAX;
SCN tmp_scn = SCN::max_scn();
if (OB_FAIL(ls.get_upper_trans_version_before_given_scn(sstable->get_end_scn(), tmp_scn))) {
@ -3681,7 +3688,7 @@ int ObTablet::update_upper_trans_version(ObLS &ls, bool &is_updated)
FLOG_INFO("get max_trans_version = 0, maybe all the trans have been rollbacked", K(ret), K(ls_id), K(tablet_id),
K(max_trans_version), KPC(sstable));
}
if (OB_FAIL(sstable->set_upper_trans_version(max_trans_version))) {
if (OB_FAIL(sstable->set_upper_trans_version(max_trans_version, false/*force_update*/))) {
LOG_WARN("failed to set_upper_trans_version", K(ret), KPC(sstable));
} else {
is_updated = true;