diff --git a/src/storage/blocksstable/ob_shared_macro_block_manager.cpp b/src/storage/blocksstable/ob_shared_macro_block_manager.cpp index 9860c8d8c6..0bd7a9709c 100644 --- a/src/storage/blocksstable/ob_shared_macro_block_manager.cpp +++ b/src/storage/blocksstable/ob_shared_macro_block_manager.cpp @@ -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)); diff --git a/src/storage/blocksstable/ob_sstable.cpp b/src/storage/blocksstable/ob_sstable.cpp index e300d8dab6..eddfa4f79b 100644 --- a/src/storage/blocksstable/ob_sstable.cpp +++ b/src/storage/blocksstable/ob_sstable.cpp @@ -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; } diff --git a/src/storage/blocksstable/ob_sstable.h b/src/storage/blocksstable/ob_sstable.h index dfc673a9de..fe07d7f400 100644 --- a/src/storage/blocksstable/ob_sstable.h +++ b/src/storage/blocksstable/ob_sstable.h @@ -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_; diff --git a/src/storage/high_availability/ob_transfer_struct.cpp b/src/storage/high_availability/ob_transfer_struct.cpp index a13fca4427..b9f44b14ef 100644 --- a/src/storage/high_availability/ob_transfer_struct.cpp +++ b/src/storage/high_availability/ob_transfer_struct.cpp @@ -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; diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index cec4d279e6..a22f2bfa79 100644 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -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(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;