Fix transfer create empty sstable with INT64_MAX upper trans version bug.
This commit is contained in:
@ -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));
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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_;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user