From 179e3b75f52fb3c1cea18d60fc9b00fb079d562b Mon Sep 17 00:00:00 2001 From: Handora Date: Thu, 4 Jul 2024 14:16:15 +0000 Subject: [PATCH] [BUG] fix snapshot version after transfer --- .../ob_transfer_backfill_tx.cpp | 3 ++ src/storage/ls/ob_freezer.cpp | 40 ++++++++++++++++++- src/storage/ls/ob_freezer.h | 6 ++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/storage/high_availability/ob_transfer_backfill_tx.cpp b/src/storage/high_availability/ob_transfer_backfill_tx.cpp index 0f6846120..36a9df803 100644 --- a/src/storage/high_availability/ob_transfer_backfill_tx.cpp +++ b/src/storage/high_availability/ob_transfer_backfill_tx.cpp @@ -1827,6 +1827,9 @@ int ObTransferReplaceTableTask::build_transfer_backfill_tablet_param_( } else if (OB_ISNULL(src_tablet = src_tablet_handle.get_obj())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("src tablet should not be NULL", K(ret), KP(src_tablet)); + } else if (src_tablet->get_tablet_meta().snapshot_version_ > ctx_->backfill_scn_.get_val_for_tx()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("transfer src tablet snapshot version is bigger than backfill scn, unexpected", K(ret), KPC(ctx_), KPC(src_tablet)); } else if (OB_FAIL(src_tablet->load_storage_schema(allocator, src_storage_schema))) { LOG_WARN("failed to load storage schema", K(ret), KPC(tablet)); } else if (OB_FAIL(tablet->build_transfer_backfill_tablet_param(src_tablet->get_tablet_meta(), *src_storage_schema, param))) { diff --git a/src/storage/ls/ob_freezer.cpp b/src/storage/ls/ob_freezer.cpp index b77693501..125a374ae 100644 --- a/src/storage/ls/ob_freezer.cpp +++ b/src/storage/ls/ob_freezer.cpp @@ -983,15 +983,53 @@ void ObFreezer::handle_set_tablet_freeze_failed(const bool need_rewrite_meta, } } +int ObFreezer::decide_real_snapshot_version_(const ObTabletID &tablet_id, + const ObTablet *tablet, + const SCN freeze_snapshot_version, + SCN &real_snapshot_version) +{ + int ret = OB_SUCCESS; + ObTabletCreateDeleteMdsUserData user_data; + bool is_committed = false; + share::SCN transfer_scn = share::SCN::max_scn(); + + if (tablet_id.is_ls_inner_tablet()) { + //do nothing + } else if (OB_FAIL(tablet->ObITabletMdsInterface::get_latest_tablet_status(user_data, + is_committed))) { + LOG_WARN("fail to get latest tablet status", K(ret), KPC(tablet)); + } else if (ObTabletStatus::TRANSFER_OUT != user_data.tablet_status_ + && ObTabletStatus::TRANSFER_OUT_DELETED != user_data.tablet_status_) { + //do nothing + } else if (user_data.transfer_scn_.is_valid()) { + transfer_scn = user_data.transfer_scn_; + } + + if (OB_SUCC(ret)) { + real_snapshot_version = MIN(freeze_snapshot_version, transfer_scn); + if (real_snapshot_version != freeze_snapshot_version) { + FLOG_INFO("update tablet snapshot version changed snapshot version for transfer", + K(real_snapshot_version), K(freeze_snapshot_version), K(transfer_scn), K(user_data)); + } + } + + return ret; +} + int ObFreezer::handle_no_active_memtable_(const ObTabletID &tablet_id, const ObTablet *tablet, - const SCN freeze_snapshot_version) + SCN freeze_snapshot_version) { int ret = OB_SUCCESS; share::ObLSID ls_id = get_ls_id(); ObProtectedMemtableMgrHandle *protected_handle = NULL; if (OB_FAIL(tablet->get_protected_memtable_mgr_handle(protected_handle))) { LOG_WARN("failed to get_protected_memtable_mgr_handle", K(ret), KPC(tablet)); + } else if (OB_FAIL(decide_real_snapshot_version_(tablet_id, + tablet, + freeze_snapshot_version, + freeze_snapshot_version))) { + LOG_WARN("failed to decide real snapshot version", K(ret), KPC(tablet)); } else if (!protected_handle->has_memtable()) { // We need trigger a dag to rewrite the snapshot version of tablet // meta for the major merge and medium merge. While the implementation diff --git a/src/storage/ls/ob_freezer.h b/src/storage/ls/ob_freezer.h index 6d05c4043..5e33e26fb 100644 --- a/src/storage/ls/ob_freezer.h +++ b/src/storage/ls/ob_freezer.h @@ -312,7 +312,11 @@ private: ObIArray &frozen_memtable_handles); int handle_no_active_memtable_(const ObTabletID &tablet_id, const ObTablet *tablet, - const share::SCN freeze_snapshot_version); + share::SCN freeze_snapshot_version); + int decide_real_snapshot_version_(const ObTabletID &tablet_id, + const ObTablet *tablet, + const SCN freeze_snapshot_version, + SCN &real_snapshot_version); void handle_set_tablet_freeze_failed(const bool need_rewrite_meta, const ObTabletID &tablet_id, const ObLSID &ls_id,