add force freeze before medium
This commit is contained in:
@ -803,14 +803,18 @@ int ObMediumCompactionScheduleFunc::check_need_merge_and_schedule(
|
|||||||
int tmp_ret = OB_SUCCESS;
|
int tmp_ret = OB_SUCCESS;
|
||||||
need_merge = false;
|
need_merge = false;
|
||||||
bool can_merge = false;
|
bool can_merge = false;
|
||||||
|
bool need_force_freeze = false;
|
||||||
|
const ObLSID &ls_id = ls.get_ls_id();
|
||||||
|
const ObTabletID &tablet_id = tablet.get_tablet_meta().tablet_id_;
|
||||||
|
|
||||||
if (OB_FAIL(ObPartitionMergePolicy::check_need_medium_merge(
|
if (OB_FAIL(ObPartitionMergePolicy::check_need_medium_merge(
|
||||||
ls,
|
ls,
|
||||||
tablet,
|
tablet,
|
||||||
schedule_scn,
|
schedule_scn,
|
||||||
need_merge,
|
need_merge,
|
||||||
can_merge))) { // check merge finish
|
can_merge,
|
||||||
LOG_WARN("failed to check medium merge", K(ret), K(ls_id), "tablet_id", tablet.get_tablet_meta().tablet_id_);
|
need_force_freeze))) { // check merge finish
|
||||||
|
LOG_WARN("failed to check medium merge", K(ret), K(ls_id), K(tablet_id));
|
||||||
} else if (need_merge && can_merge) {
|
} else if (need_merge && can_merge) {
|
||||||
const ObMediumCompactionInfo *medium_info = nullptr;
|
const ObMediumCompactionInfo *medium_info = nullptr;
|
||||||
if (OB_FAIL(tablet.get_medium_compaction_info_list().get_specified_scn_info(schedule_scn, medium_info))) {
|
if (OB_FAIL(tablet.get_medium_compaction_info_list().get_specified_scn_info(schedule_scn, medium_info))) {
|
||||||
@ -823,12 +827,15 @@ int ObMediumCompactionScheduleFunc::check_need_merge_and_schedule(
|
|||||||
medium_info->is_major_compaction()))) {
|
medium_info->is_major_compaction()))) {
|
||||||
if (OB_SIZE_OVERFLOW != tmp_ret && OB_EAGAIN != tmp_ret) {
|
if (OB_SIZE_OVERFLOW != tmp_ret && OB_EAGAIN != tmp_ret) {
|
||||||
ret = tmp_ret;
|
ret = tmp_ret;
|
||||||
LOG_WARN("failed to schedule medium merge dag", K(ret), K(ls_id),
|
LOG_WARN("failed to schedule medium merge dag", K(ret), K(ls_id), K(tablet_id));
|
||||||
"tablet_id", tablet.get_tablet_meta().tablet_id_);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_DEBUG("success to schedule medium merge dag", K(ret), K(schedule_scn));
|
LOG_DEBUG("success to schedule medium merge dag", K(ret), K(schedule_scn));
|
||||||
}
|
}
|
||||||
|
} else if (need_force_freeze) {
|
||||||
|
if (OB_FAIL(MTL(ObTenantFreezer *)->tablet_freeze(tablet_id, true/*force_freeze*/))) {
|
||||||
|
LOG_WARN("failed to force freeze tablet", K(ret), K(ls_id), K(tablet_id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -868,7 +868,8 @@ int ObPartitionMergePolicy::check_need_medium_merge(
|
|||||||
storage::ObTablet &tablet,
|
storage::ObTablet &tablet,
|
||||||
const int64_t medium_snapshot,
|
const int64_t medium_snapshot,
|
||||||
bool &need_merge,
|
bool &need_merge,
|
||||||
bool &can_merge)
|
bool &can_merge,
|
||||||
|
bool &need_force_freeze)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
need_merge = false;
|
need_merge = false;
|
||||||
@ -883,9 +884,31 @@ int ObPartitionMergePolicy::check_need_medium_merge(
|
|||||||
need_merge = last_major->get_snapshot_version() < medium_snapshot;
|
need_merge = last_major->get_snapshot_version() < medium_snapshot;
|
||||||
if (need_merge
|
if (need_merge
|
||||||
&& is_tablet_data_status_complete
|
&& is_tablet_data_status_complete
|
||||||
&& tablet.get_tablet_meta().max_serialized_medium_scn_ >= medium_snapshot
|
|
||||||
&& ObTenantTabletScheduler::check_weak_read_ts_ready(medium_snapshot, ls)) {
|
&& ObTenantTabletScheduler::check_weak_read_ts_ready(medium_snapshot, ls)) {
|
||||||
can_merge = true;
|
can_merge = tablet.get_snapshot_version() >= medium_snapshot;
|
||||||
|
if (!can_merge) {
|
||||||
|
ObTabletMemtableMgr *memtable_mgr = nullptr;
|
||||||
|
ObTableHandleV2 memtable_handle;
|
||||||
|
memtable::ObMemtable *last_frozen_memtable = nullptr;
|
||||||
|
if (OB_ISNULL(memtable_mgr = static_cast<ObTabletMemtableMgr *>(tablet.get_memtable_mgr()))) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("memtable mgr is unexpected null", K(ret), K(tablet));
|
||||||
|
} else if (OB_FAIL(memtable_mgr->get_last_frozen_memtable(memtable_handle))) {
|
||||||
|
if (OB_ENTRY_NOT_EXIST == ret) { // no frozen memtable, need force freeze
|
||||||
|
need_force_freeze = true;
|
||||||
|
ret = OB_SUCCESS;
|
||||||
|
} else {
|
||||||
|
LOG_WARN("failed to get last frozen memtable", K(ret));
|
||||||
|
}
|
||||||
|
} else if (OB_FAIL(memtable_handle.get_data_memtable(last_frozen_memtable))) {
|
||||||
|
LOG_WARN("failed to get last frozen memtable", K(ret));
|
||||||
|
} else {
|
||||||
|
need_force_freeze = last_frozen_memtable->get_snapshot_version() < medium_snapshot;
|
||||||
|
if (!need_force_freeze) {
|
||||||
|
LOG_INFO("tablet no need force freeze", K(ret), K(tablet_id), K(medium_snapshot), KPC(last_frozen_memtable));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -894,7 +917,7 @@ int ObPartitionMergePolicy::check_need_medium_merge(
|
|||||||
K(need_merge), K(can_merge), K(medium_snapshot), K(is_tablet_data_status_complete));
|
K(need_merge), K(can_merge), K(medium_snapshot), K(is_tablet_data_status_complete));
|
||||||
ADD_SUSPECT_INFO(MAJOR_MERGE, tablet.get_tablet_meta().ls_id_, tablet_id,
|
ADD_SUSPECT_INFO(MAJOR_MERGE, tablet.get_tablet_meta().ls_id_, tablet_id,
|
||||||
"need major merge but can't merge now",
|
"need major merge but can't merge now",
|
||||||
K(medium_snapshot), K(is_tablet_data_status_complete),
|
K(medium_snapshot), K(is_tablet_data_status_complete), K(need_force_freeze),
|
||||||
"max_serialized_medium_scn", tablet.get_tablet_meta().max_serialized_medium_scn_);
|
"max_serialized_medium_scn", tablet.get_tablet_meta().max_serialized_medium_scn_);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@ -75,7 +75,8 @@ public:
|
|||||||
storage::ObTablet &tablet,
|
storage::ObTablet &tablet,
|
||||||
const int64_t medium_snapshot,
|
const int64_t medium_snapshot,
|
||||||
bool &need_merge,
|
bool &need_merge,
|
||||||
bool &can_merge);
|
bool &can_merge,
|
||||||
|
bool &need_force_freeze);
|
||||||
static int generate_parallel_minor_interval(
|
static int generate_parallel_minor_interval(
|
||||||
const ObGetMergeTablesResult &input_result,
|
const ObGetMergeTablesResult &input_result,
|
||||||
ObMinorExecuteRangeMgr &minor_range_mgr,
|
ObMinorExecuteRangeMgr &minor_range_mgr,
|
||||||
|
|||||||
Reference in New Issue
Block a user