[CP] Fix transfer mistake errors.

This commit is contained in:
godyangfight 2024-06-21 03:21:11 +00:00 committed by ob-robot
parent ba16ddd354
commit d84e65a7b4
2 changed files with 47 additions and 18 deletions

View File

@ -1288,12 +1288,13 @@ int ObTransferReplaceTableTask::init()
return ret;
}
int ObTransferReplaceTableTask::check_src_memtable_is_empty_(
const ObTabletBackfillInfo &tablet_info,
ObTablet *tablet,
const share::SCN &transfer_scn)
{
int ret = OB_SUCCESS;
ObArray<ObTableHandleV2> memtables;
if (OB_ISNULL(tablet) || !transfer_scn.is_valid()) {
if (!tablet_info.is_valid() || OB_ISNULL(tablet) || !transfer_scn.is_valid()) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("tablet should not be nullptr.", KR(ret), K(transfer_scn), KPC(this));
} else if (OB_FAIL(tablet->get_all_memtables(memtables))) {
@ -1311,24 +1312,36 @@ int ObTransferReplaceTableTask::check_src_memtable_is_empty_(
} else if (FALSE_IT(memtable = static_cast<memtable::ObMemtable *>(table))) {
} else if (memtable->is_active_memtable()) {
if (memtable->not_empty()) {
ret = OB_TRANSFER_SYS_ERROR;
LOG_ERROR("memtable should not be active", K(ret), KPC_(ctx),
KPC(memtable), "transfer meta", tablet->get_tablet_meta());
if (tablet_info.is_committed_) {
ret = OB_TRANSFER_SYS_ERROR;
LOG_ERROR("memtable should not be active", K(ret), KPC_(ctx),
KPC(memtable), "transfer meta", tablet->get_tablet_meta());
} else {
ret = OB_EAGAIN;
LOG_WARN("transfer src has active memtable and not empty, maybe transfer transaction rollback, need retry",
K(ret), KPC(memtable), "transfer meta", tablet->get_tablet_meta(), K(tablet_info));
}
}
} else if (!memtable->get_key().scn_range_.is_empty()) {
ret = OB_TRANSFER_SYS_ERROR;
LOG_ERROR("The range of the memtable is not empty", K(ret), KPC(memtable));
if (tablet_info.is_committed_) {
ret = OB_TRANSFER_SYS_ERROR;
LOG_ERROR("The range of the memtable is not empty", K(ret), KPC(memtable));
} else {
ret = OB_EAGAIN;
LOG_WARN("transfer src forzen memtable scn range is not empty, maybe transfer transaction rollback, need retry",
K(ret), KPC(memtable), "transfer meta", tablet->get_tablet_meta(), K(tablet_info));
}
} else if (memtable->not_empty()
&& memtable->get_start_scn() >= transfer_scn) {
LOG_ERROR("There have been transactions in memtable but no data", K(OB_TRANSFER_SYS_ERROR), KPC_(ctx), KPC(memtable));
}
}
}
return ret;
}
int ObTransferReplaceTableTask::check_source_minor_end_scn_(
const ObTabletBackfillInfo &tablet_info,
const ObTabletMemberWrapper<ObTabletTableStore> &wrapper,
const ObTablet *dest_tablet,
bool &need_fill_minor)
@ -1337,9 +1350,9 @@ int ObTransferReplaceTableTask::check_source_minor_end_scn_(
need_fill_minor = false;
if (!wrapper.is_valid() || OB_ISNULL(dest_tablet)) {
if (!tablet_info.is_valid() || !wrapper.is_valid() || OB_ISNULL(dest_tablet)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("wrapper is invalid or tablet be nullptr.", KR(ret), K(wrapper), KPC(this));
LOG_WARN("wrapper is invalid or tablet be nullptr.", KR(ret), K(tablet_info), K(wrapper), KPC(this));
} else {
const ObTabletTableStore &table_store = *(wrapper.get_member());
ObITable *last_minor_mini_sstable = table_store.get_minor_sstables().get_boundary_table(true /*is_last*/);
@ -1356,16 +1369,28 @@ int ObTransferReplaceTableTask::check_source_minor_end_scn_(
} else if (last_minor_mini_sstable->get_start_scn() >= dest_tablet->get_tablet_meta().transfer_info_.transfer_start_scn_) {
ObSSTable *sstable = static_cast<ObSSTable *>(last_minor_mini_sstable);
if (!sstable->is_empty()) {
ret = OB_TRANSFER_SYS_ERROR;
LOG_ERROR("last sstable start scn is bigger than transfer start scn", K(ret), KPC(last_minor_mini_sstable),
"transfer info", dest_tablet->get_tablet_meta().transfer_info_);
if (tablet_info.is_committed_) {
ret = OB_TRANSFER_SYS_ERROR;
LOG_ERROR("last sstable start scn is bigger than transfer start scn", K(ret), KPC(last_minor_mini_sstable),
"transfer info", dest_tablet->get_tablet_meta().transfer_info_);
} else {
ret = OB_EAGAIN;
LOG_WARN("transfer src sstable start scn is bigger than transfer start scn, maybe transfer transaction rollback, need retry",
K(ret), KPC(sstable), K(tablet_info), "dest tablet meta", dest_tablet->get_tablet_meta());
}
}
} else if (last_minor_mini_sstable->get_end_scn() > dest_tablet->get_tablet_meta().transfer_info_.transfer_start_scn_) {
// After adding transfer_freeze_flag_, it can ensure that start is less than transfer_start_scn's sstable,
// and end_scn will not be greater than transfer_start_scn
ret = OB_TRANSFER_SYS_ERROR;
LOG_ERROR("last sstable end scn is bigger than transfer start scn", K(ret), KPC(last_minor_mini_sstable),
"transfer info", dest_tablet->get_tablet_meta().transfer_info_);
if (tablet_info.is_committed_) {
ret = OB_TRANSFER_SYS_ERROR;
LOG_ERROR("last sstable end scn is bigger than transfer start scn", K(ret), KPC(last_minor_mini_sstable),
"transfer info", dest_tablet->get_tablet_meta().transfer_info_);
} else {
ret = OB_EAGAIN;
LOG_WARN("transfer src sstable end scn is bigger than transfer start scn, maybe transfer transaction rollback, need retry",
K(ret), KPC(last_minor_mini_sstable), K(tablet_info), "dest tablet meta", dest_tablet->get_tablet_meta());
}
}
}
return ret;
@ -1560,9 +1585,9 @@ int ObTransferReplaceTableTask::get_source_tablet_tables_(
LOG_WARN("failed to get tablet restore status", K(ret));
} else if (OB_FAIL(tablet->fetch_table_store(wrapper))) {
LOG_WARN("fetch table store fail", K(ret), KP(tablet));
} else if (OB_FAIL(check_src_memtable_is_empty_(tablet, transfer_scn))) {
} else if (OB_FAIL(check_src_memtable_is_empty_(tablet_info, tablet, transfer_scn))) {
LOG_WARN("failed to check src memtable", K(ret), KPC(tablet));
} else if (OB_FAIL(check_source_minor_end_scn_(wrapper, dest_tablet, need_backill))) {
} else if (OB_FAIL(check_source_minor_end_scn_(tablet_info, wrapper, dest_tablet, need_backill))) {
LOG_WARN("fail to check source max end scn from tablet", K(ret), KPC(tablet));
} else if (OB_FAIL(get_all_sstable_handles_(tablet, wrapper, sstable_iter, tables_handle))) {
LOG_WARN("failed to get all sstable handles", K(ret), KPC(tablet));

View File

@ -234,6 +234,7 @@ private:
ObTablesHandleArray &sstable_handles);
int check_src_tablet_sstables_(const ObTablet *tablet, ObTablesHandleArray &tables_handle);
int check_source_minor_end_scn_(
const ObTabletBackfillInfo &tablet_info,
const ObTabletMemberWrapper<ObTabletTableStore> &wrapper,
const ObTablet *dest_tablet,
bool &need_fill_minor);
@ -244,7 +245,10 @@ private:
const ObTabletMemberWrapper<ObTabletTableStore> &wrapper,
common::ObArenaAllocator &allocator,
ObTablesHandleArray &tables_handle);
int check_src_memtable_is_empty_(ObTablet *tablet, const share::SCN &transfer_scn);
int check_src_memtable_is_empty_(
const ObTabletBackfillInfo &tablet_info,
ObTablet *tablet,
const share::SCN &transfer_scn);
int build_migration_param_(
const ObTablet *tablet,
ObTabletHandle &src_tablet_handle,