[BUG] fix snapshot version after transfer

This commit is contained in:
Handora 2024-07-04 14:16:15 +00:00 committed by ob-robot
parent ffed357f8f
commit 179e3b75f5
3 changed files with 47 additions and 2 deletions

View File

@ -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))) {

View File

@ -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

View File

@ -312,7 +312,11 @@ private:
ObIArray<ObTableHandleV2> &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,