fix logic of advancing multi version start for skip merge tablet && fix core

This commit is contained in:
Fengjingkun 2024-10-18 11:43:34 +00:00 committed by ob-robot
parent b0f35f33a9
commit 28859fa1e7
5 changed files with 61 additions and 39 deletions

View File

@ -1293,7 +1293,9 @@ int ObCOMergeDagNet::inner_create_and_schedule_dags(ObIDag *parent_dag)
if (EN_COMPACTION_ADD_CO_MREGE_FINISH_DAG_INTO_DAG_NET_FAILED) {
ret = EN_COMPACTION_ADD_CO_MREGE_FINISH_DAG_INTO_DAG_NET_FAILED;
LOG_INFO("ERRSIM EN_COMPACTION_ADD_CO_MREGE_FINISH_DAG_INTO_DAG_NET_FAILED", K(ret), KPC(parent_dag));
SERVER_EVENT_SYNC_ADD("merge_errsim", "co_merge_finish_dag_add_failed", "ret_code", ret);
}
#endif
ObCOMergeFinishDag *tmp_finish_dag = nullptr;
// add into dag_scheduler after parent-child relation generated

View File

@ -162,9 +162,8 @@ public:
int64_t get_result_progressive_merge_step(const int64_t column_group_idx) const
{
return progressive_merge_mgr_.is_inited()
? progressive_merge_mgr_.get_result_progressive_merge_step(
get_tablet_id(), column_group_idx)
: 0;
? progressive_merge_mgr_.get_result_progressive_merge_step(get_tablet_id(), column_group_idx)
: 0;
}
OB_INLINE int filter(const blocksstable::ObDatumRow &row, ObICompactionFilter::ObFilterRet &filter_ret)
{

View File

@ -35,6 +35,7 @@
#include "storage/access/ob_table_estimator.h"
#include "storage/access/ob_index_sstable_estimator.h"
#include "storage/ddl/ob_tablet_ddl_kv.h"
#include "observer/ob_server_event_history_table_operator.h"
namespace oceanbase
{
@ -1958,6 +1959,7 @@ int ObCOMajorMergePolicy::decide_co_major_merge_type(
} else if (OB_UNLIKELY(EN_COMPACTION_DISABLE_ROW_COL_SWITCH)) {
major_merge_type = is_major_sstable_match_schema(major_sstable_status) ? BUILD_COLUMN_STORE_MERGE : USE_RS_BUILD_SCHEMA_MATCH_MERGE;
LOG_INFO("[RowColSwitch] disable row col switch, only allow co major merge", K(tablet_id), K(co_sstable), K(tables), K(major_sstable_status), K(major_merge_type));
SERVER_EVENT_SYNC_ADD("row_col_switch", "disable_row_col_switch", "tablet_id", tablet_id);
} else if (OB_FAIL(accumulate_physical_row_cnt(tables, physical_row_cnt))) {
// if accumulate row cnt failed, make major sstable match schema
major_merge_type = is_major_sstable_match_schema(major_sstable_status) ? BUILD_COLUMN_STORE_MERGE : USE_RS_BUILD_SCHEMA_MATCH_MERGE;

View File

@ -90,26 +90,24 @@ int ObProgressiveMergeMgr::init(
}
int64_t ObProgressiveMergeMgr::get_result_progressive_merge_step(
const ObTabletID &tablet_id,
const int64_t column_group_idx) const // parameters are used for print log
const ObTabletID &tablet_id,
const int64_t column_group_idx) const // parameters are used for print log
{
int64_t result_step = MIN(progressive_merge_num_, progressive_merge_step_ + 1);
if (data_version_ >= DATA_VERSION_4_3_3_0
&& finish_cur_round_
&& result_step < progressive_merge_num_) {
if (data_version_ >= DATA_VERSION_4_3_3_0 && finish_cur_round_ && result_step < progressive_merge_num_) {
if (0 == column_group_idx) { // only print once
FLOG_INFO("finish cur progressive_merge_round", K(tablet_id), K(result_step), K_(progressive_merge_round),
K_(progressive_merge_step), K_(progressive_merge_num));
}
result_step = progressive_merge_num_; // this result will be used to update pregressive merge step on sstable meta
#ifdef ERRSIM
SERVER_EVENT_SYNC_ADD("merge_errsim", "progressive_merge_finish",
"tablet_id", tablet_id.id(),
"progressive_merge_round", progressive_merge_round_,
"progressive_merge_step", progressive_merge_step_,
"progressive_merge_step", result_step,
"progressive_merge_num", progressive_merge_num_);
#endif
}
result_step = progressive_merge_num_;
}
return result_step;
}

View File

@ -94,6 +94,7 @@
#include "storage/ob_direct_load_table_guard.h"
#include "share/ob_tablet_replica_checksum_operator.h"
#include "storage/blocksstable/ob_datum_row_utils.h"
#include "storage/compaction/ob_partition_merge_policy.h"
namespace oceanbase
{
@ -5843,45 +5844,65 @@ int ObTablet::get_kept_snapshot_info(
int ret = OB_SUCCESS;
int tmp_ret = OB_SUCCESS;
snapshot_info.reset();
int64_t max_merged_snapshot = 0;
int64_t min_medium_snapshot = INT64_MAX;
int64_t old_min_reserved_snapshot = 0;
const share::ObLSID &ls_id = tablet_meta_.ls_id_;
const common::ObTabletID &tablet_id = tablet_meta_.tablet_id_;
if (0 < get_major_table_count()) {
max_merged_snapshot = get_last_major_snapshot_version();
const int64_t last_major_snapshot_version = get_last_major_snapshot_version();
bool need_check_medium_info = false;
int64_t max_merged_snapshot = 0;
if (0 == last_major_snapshot_version) {
// do nothing
} else if (!GCTX.is_shared_storage_mode() || last_major_snapshot_version >= MERGE_SCHEDULER_PTR->get_inner_table_merged_scn()) {
max_merged_snapshot = last_major_snapshot_version;
#ifdef OB_BUILD_SHARED_STORAGE
} else {
max_merged_snapshot = MERGE_SCHEDULER_PTR->get_inner_table_merged_scn();
need_check_medium_info = true;
#endif
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(MTL(ObTenantFreezeInfoMgr*)->get_min_reserved_snapshot(
tablet_id, max_merged_snapshot, snapshot_info))) {
LOG_WARN("failed to get multi version from freeze info mgr", K(ret), K(tablet_id));
} else if (!is_ls_inner_tablet()) {
int64_t min_medium_snapshot = INT64_MAX;
if (!is_ls_inner_tablet()) {
common::ObArenaAllocator allocator;
SMART_VARS_2((ObTableScanParam, scan_param), (ObTabletMediumInfoReader, medium_info_reader)) {
if (OB_FAIL(ObMdsScanParamHelper::build_medium_info_scan_param(
allocator,
ls_id,
tablet_id,
scan_param))) {
if (OB_FAIL(ObMdsScanParamHelper::build_medium_info_scan_param(allocator, ls_id, tablet_id, scan_param))) {
LOG_WARN("fail to build scan param", K(ret), K(ls_id), K(tablet_id));
} else if (OB_FAIL(medium_info_reader.init(*this, scan_param))) {
LOG_WARN("failed to init medium info reader", K(ret));
} else if (OB_FAIL(medium_info_reader.get_min_medium_snapshot(max_merged_snapshot, min_medium_snapshot))) {
} else if (need_check_medium_info) {
ObMediumCompactionInfoKey medium_info_key(max_merged_snapshot);
ObMediumCompactionInfo *medium_info = nullptr;
if (OB_FAIL(ObTabletObjLoadHelper::alloc_and_new(allocator, medium_info))) {
LOG_WARN("fail to alloc and new", K(ret));
} else if (OB_FAIL(medium_info_reader.get_specified_medium_info(allocator, medium_info_key, *medium_info))) {
if (OB_ENTRY_NOT_EXIST == ret) {
ret = OB_SUCCESS;
max_merged_snapshot = last_major_snapshot_version;
} else {
LOG_WARN("failed to get specified scn info", K(ret), K(max_merged_snapshot));
}
} else if (ObAdaptiveMergePolicy::DURING_DDL != medium_info->medium_merge_reason_) {
max_merged_snapshot = last_major_snapshot_version;
}
}
if (FAILEDx(medium_info_reader.get_min_medium_snapshot(max_merged_snapshot, min_medium_snapshot))) {
LOG_WARN("failed to get min medium snapshot", K(ret), K(tablet_id));
}
}
}
if (OB_SUCC(ret)) {
ObStorageSnapshotInfo old_snapshot_info;
if (FAILEDx(MTL(ObTenantFreezeInfoMgr*)->get_min_reserved_snapshot(tablet_id, max_merged_snapshot, snapshot_info))) {
LOG_WARN("failed to get multi version from freeze info mgr", K(ret), K(tablet_id));
} else {
old_snapshot_info = snapshot_info;
bool use_multi_version_start_on_tablet = false;
old_min_reserved_snapshot = snapshot_info.snapshot_;
const bool is_new_mv_in_restore = ObSnapShotType::SNAPSHOT_FOR_MAJOR_REFRESH_MV == snapshot_info.snapshot_type_ &&
0 == snapshot_info.snapshot_;
// if exist new mv in restore, use special snapshot info
if (!tablet_meta_.ha_status_.is_data_status_complete()) {
use_multi_version_start_on_tablet = true;
} else if (ObSnapShotType::SNAPSHOT_FOR_MAJOR_REFRESH_MV == snapshot_info.snapshot_type_ && 0 == snapshot_info.snapshot_) {
use_multi_version_start_on_tablet = true; // if exist new mv in restore, use special snapshot info
} else if (min_reserved_snapshot_on_ls > 0) {
snapshot_info.update_by_smaller_snapshot(ObStorageSnapshotInfo::SNAPSHOT_FOR_LS_RESERVED, min_reserved_snapshot_on_ls);
snapshot_info.update_by_smaller_snapshot(ObStorageSnapshotInfo::SNAPSHOT_FOR_MIN_MEDIUM, min_medium_snapshot);
@ -5892,7 +5913,7 @@ int ObTablet::get_kept_snapshot_info(
// if not sync ls_reserved_snapshot yet, should use multi_version_start on tablet
use_multi_version_start_on_tablet = true;
}
if (use_multi_version_start_on_tablet || is_new_mv_in_restore) {
if (use_multi_version_start_on_tablet) {
snapshot_info.snapshot_type_ = ObStorageSnapshotInfo::SNAPSHOT_MULTI_VERSION_START_ON_TABLET;
snapshot_info.snapshot_ = get_multi_version_start();
}
@ -5902,9 +5923,9 @@ int ObTablet::get_kept_snapshot_info(
if (current_time - (snapshot_info.snapshot_ / 1000 /*use microsecond here*/) > 2_hour) {
if (REACH_TENANT_TIME_INTERVAL(10_s)) {
LOG_INFO("tablet multi version start not advance for a long time", K(ret),
"ls_id", get_tablet_meta().ls_id_, K(tablet_id),
K(snapshot_info), K(old_min_reserved_snapshot), K(min_medium_snapshot),
K(min_reserved_snapshot_on_ls));
"ls_id", get_tablet_meta().ls_id_, K(tablet_id),
K(snapshot_info), K(old_snapshot_info), K(min_medium_snapshot),
K(min_reserved_snapshot_on_ls));
}
}
}
@ -5913,8 +5934,8 @@ int ObTablet::get_kept_snapshot_info(
LOG_WARN("snapshot info is invalid", KR(ret), K(snapshot_info));
}
LOG_INFO("get multi version start", "ls_id", get_tablet_meta().ls_id_, K(tablet_id),
K(snapshot_info), K(old_min_reserved_snapshot),
K(min_medium_snapshot), K(min_reserved_snapshot_on_ls), K(max_merged_snapshot));
K(snapshot_info), K(old_snapshot_info),
K(min_medium_snapshot), K(min_reserved_snapshot_on_ls), K(max_merged_snapshot));
return ret;
}