Merge branch 'column_store'

Co-authored-by: wangt1xiuyi <13547954130@163.com>
Co-authored-by: yangqise7en <877793735@qq.com>
Co-authored-by: Zach41 <zach_41@163.com>
This commit is contained in:
chaser-ch
2023-10-31 15:39:20 +00:00
committed by ob-robot
parent 4057fbc4ae
commit 566e920620
1375 changed files with 239147 additions and 56014 deletions

View File

@ -28,21 +28,20 @@
#include "storage/compaction/ob_compaction_diagnose.h"
#include "storage/compaction/ob_tenant_compaction_progress.h"
#include "observer/omt/ob_tenant_config_mgr.h"
#include "storage/column_store/ob_column_oriented_sstable.h"
#include "share/scn.h"
#include "storage/compaction/ob_tenant_tablet_scheduler.h"
#include "storage/compaction/ob_medium_compaction_func.h"
using namespace oceanbase;
namespace oceanbase
{
using namespace common;
using namespace share;
using namespace storage;
using namespace blocksstable;
using namespace memtable;
using namespace share::schema;
using namespace blocksstable;
namespace oceanbase
{
namespace compaction
{
@ -59,23 +58,31 @@ ObPartitionMergePolicy::GetMergeTables ObPartitionMergePolicy::get_merge_tables[
int ObPartitionMergePolicy::get_neighbour_freeze_info(
const int64_t snapshot_version,
const ObITable *last_major,
ObTenantFreezeInfoMgr::NeighbourFreezeInfo &freeze_info)
const int64_t last_major_snapshot_version,
ObTenantFreezeInfoMgr::NeighbourFreezeInfo &freeze_info,
const bool is_multi_version_merge)
{
int ret = OB_SUCCESS;
if (OB_FAIL(MTL(ObTenantFreezeInfoMgr *)->get_neighbour_major_freeze(snapshot_version, freeze_info))) {
if (OB_ENTRY_NOT_EXIST == ret) {
LOG_WARN("Failed to get freeze info, use snapshot_gc_ts instead", K(ret), K(snapshot_version));
LOG_INFO("Failed to get freeze info, use snapshot_gc_ts instead", K(ret), K(snapshot_version));
ret = OB_SUCCESS;
freeze_info.reset();
freeze_info.next.freeze_version = INT64_MAX;
if (OB_NOT_NULL(last_major)) {
freeze_info.prev.freeze_version = last_major->get_snapshot_version();
freeze_info.next.frozen_scn_.set_max();
if (last_major_snapshot_version > 0) {
if (OB_FAIL(freeze_info.prev.frozen_scn_.convert_for_tx(last_major_snapshot_version))) {
LOG_WARN("fail to convert for tx", K(ret), K(last_major_snapshot_version));
}
} else { // no major
freeze_info.prev.frozen_scn_.set_min();
}
} else {
LOG_WARN("Failed to get neighbour major freeze info", K(ret), K(snapshot_version));
LOG_WARN("Failed to get neighbour major freeze info", K(ret), K(snapshot_version), K(last_major_snapshot_version));
}
}
if (OB_SUCC(ret) && freeze_info.next.frozen_scn_.is_max() && is_multi_version_merge) {
freeze_info.next.frozen_scn_ = MTL(ObTenantFreezeInfoMgr*)->get_snapshot_gc_scn();
}
return ret;
}
@ -89,7 +96,6 @@ int ObPartitionMergePolicy::get_medium_merge_tables(
ObSSTable *base_table = nullptr;
result.reset();
result.merge_version_ = param.merge_version_;
result.suggest_merge_type_ = param.merge_type_;
ObTabletMemberWrapper<ObTabletTableStore> table_store_wrapper;
DEBUG_SYNC(BEFORE_GET_MAJOR_MGERGE_TABLES);
if (OB_FAIL(tablet.fetch_table_store(table_store_wrapper))) {
@ -134,6 +140,7 @@ int ObPartitionMergePolicy::get_medium_merge_tables(
}
if (OB_SUCC(ret) && OB_FAIL(result.handle_.check_continues(nullptr))) {
LOG_WARN("failed to check continues for major merge", K(ret));
SET_DIAGNOSE_LOCATION(result.error_location_);
}
}
@ -145,14 +152,55 @@ int ObPartitionMergePolicy::get_medium_merge_tables(
result.version_range_.base_version_ = base_table->get_upper_trans_version();
result.version_range_.multi_version_start_ = tablet.get_multi_version_start();
result.version_range_.snapshot_version_ = param.merge_version_;
ObSSTableMetaHandle sstable_meta_hdl;
if (OB_FAIL(get_multi_version_start(param.merge_type_, ls, tablet, result.version_range_))) {
if (OB_FAIL(get_multi_version_start(param.merge_type_, ls, tablet, result.version_range_, result.snapshot_info_))) {
LOG_WARN("failed to get multi version_start", K(ret));
} else if (OB_FAIL(base_table->get_meta(sstable_meta_hdl))) {
LOG_WARN("failed to get base table meta", K(ret));
} else {
result.read_base_version_ = base_table->get_snapshot_version();
result.create_snapshot_version_ = sstable_meta_hdl.get_sstable_meta().get_basic_meta().create_snapshot_version_;
result.create_snapshot_version_ = base_table->get_snapshot_version();
}
}
return ret;
}
int ObPartitionMergePolicy::get_result_by_snapshot(
ObTablet &tablet,
const int64_t snapshot,
ObGetMergeTablesResult &result)
{
int ret = OB_SUCCESS;
ObSSTable *base_table = nullptr;
ObTabletMemberWrapper<ObTabletTableStore> table_store_wrapper;
if (OB_FAIL(tablet.fetch_table_store(table_store_wrapper))) {
LOG_WARN("fail to fetch table store", K(ret));
} else if (OB_UNLIKELY(snapshot <= 0)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid argument", K(ret), K(snapshot));
} else if (OB_ISNULL(base_table = static_cast<ObSSTable *>(
table_store_wrapper.get_member()->get_major_sstables().get_boundary_table(true/*last*/)))) {
ret = OB_ENTRY_NOT_EXIST;
LOG_WARN("major sstable not exist", K(ret), KPC(table_store_wrapper.get_member()));
} else if (base_table->get_snapshot_version() >= snapshot) {
ret = OB_NO_NEED_MERGE;
} else if (OB_FAIL(result.handle_.add_sstable(base_table, table_store_wrapper.get_meta_handle()))) {
LOG_WARN("failed to add table into iterator", K(ret), KP(base_table));
} else {
const ObSSTableArray &minor_tables = table_store_wrapper.get_member()->get_minor_sstables();
int64_t start_idx = 0;
bool start_add_table_flag = false;
for (int64_t i = 0; OB_SUCC(ret) && i < minor_tables.count(); ++i) {
if (OB_ISNULL(minor_tables[i])) {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("table must not null", K(ret), K(i), K(minor_tables));
} else if (!start_add_table_flag
&& minor_tables[i]->get_upper_trans_version() >= base_table->get_snapshot_version()) {
start_add_table_flag = true;
}
if (OB_SUCC(ret) && start_add_table_flag) {
if (OB_FAIL(result.handle_.add_sstable(minor_tables[i], table_store_wrapper.get_meta_handle()))) {
LOG_WARN("failed to add table", K(ret));
}
}
}
}
return ret;
@ -160,7 +208,18 @@ int ObPartitionMergePolicy::get_medium_merge_tables(
bool ObPartitionMergePolicy::is_sstable_count_not_safe(const int64_t minor_table_cnt)
{
return minor_table_cnt + 1 /*major_sstable*/ >= MAX_SSTABLE_CNT_IN_STORAGE;
bool bret = minor_table_cnt + 1/*major*/ >= MAX_SSTABLE_CNT_IN_STORAGE;
#ifdef ERRSIM
if (!bret) {
int ret = OB_SUCCESS;
ret = OB_E(EventTable::EN_COMPACTION_DIAGNOSE_TABLE_STORE_UNSAFE_FAILED) ret;
if (OB_FAIL(ret)) {
bret = true;
LOG_INFO("ERRSIM EN_COMPACTION_DIAGNOSE_TABLE_STORE_UNSAFE_FAILED with errsim", K(ret), K(bret), K(minor_table_cnt));
}
}
#endif
return bret;
}
int ObPartitionMergePolicy::get_mini_merge_tables(
@ -174,30 +233,28 @@ int ObPartitionMergePolicy::get_mini_merge_tables(
ObTenantFreezeInfoMgr::NeighbourFreezeInfo freeze_info;
int64_t merge_inc_base_version = tablet.get_snapshot_version();
const ObMergeType merge_type = param.merge_type_;
ObSEArray<ObTableHandleV2, BASIC_MEMSTORE_CNT> memtable_handles;
result.reset();
ObTabletMemberWrapper<ObTabletTableStore> table_store_wrapper;
ObSEArray<ObTableHandleV2, MAX_MEMSTORE_CNT> memtable_handles;
DEBUG_SYNC(BEFORE_GET_MINOR_MGERGE_TABLES);
if (OB_FAIL(tablet.fetch_table_store(table_store_wrapper))) {
LOG_WARN("fail to fetch table store", K(ret));
} else if (OB_UNLIKELY(MINI_MERGE != merge_type)) {
if (OB_UNLIKELY(MINI_MERGE != merge_type)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid args", K(ret), K(merge_type));
} else if (OB_UNLIKELY(nullptr == tablet.get_memtable_mgr() || !table_store_wrapper.get_member()->is_valid())) {
LOG_WARN("invalid args", K(ret), "merge_type", merge_type_to_str(merge_type));
} else if (OB_UNLIKELY(nullptr == tablet.get_memtable_mgr())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null memtable mgr from tablet or invalid table store", K(ret), K(tablet), K(table_store_wrapper));
} else if (is_sstable_count_not_safe(table_store_wrapper.get_member()->get_minor_sstables().count())) {
LOG_WARN("get unexpected null memtable mgr from tablet or invalid table store", K(ret), K(tablet));
} else if (is_sstable_count_not_safe(tablet.get_minor_table_count())) {
ret = OB_SIZE_OVERFLOW;
LOG_ERROR("Too many sstables, delay mini merge until sstable count falls below MAX_SSTABLE_CNT",
K(ret), K(PRINT_TS_WRAPPER(table_store_wrapper)), K(tablet));
K(ret), K(tablet));
// add compaction diagnose info
ObPartitionMergePolicy::diagnose_table_count_unsafe(MINI_MERGE, tablet);
ObPartitionMergePolicy::diagnose_table_count_unsafe(MINI_MERGE, ObDiagnoseTabletType::TYPE_MINI_MERGE, tablet);
} else if (OB_FAIL(tablet.get_memtable_mgr()->get_all_memtables(memtable_handles))) {
LOG_WARN("failed to get all memtables from memtable mgr", K(ret));
} else if (OB_FAIL(get_neighbour_freeze_info(merge_inc_base_version,
table_store_wrapper.get_member()->get_major_sstables().get_boundary_table(true),
freeze_info))) {
LOG_WARN("failed to get next major freeze", K(ret), K(merge_inc_base_version), K(PRINT_TS_WRAPPER(table_store_wrapper)));
tablet.get_last_major_snapshot_version(),
freeze_info,
true/*is_multi_version_merge*/))) {
LOG_WARN("failed to get next major freeze", K(ret), K(merge_inc_base_version), K(tablet));
} else if (OB_FAIL(find_mini_merge_tables(param, freeze_info, ls, tablet, memtable_handles, result))) {
if (OB_NO_NEED_MERGE != ret) {
LOG_WARN("failed to find mini merge tables", K(ret), K(freeze_info));
@ -223,7 +280,7 @@ int ObPartitionMergePolicy::find_mini_merge_tables(
result.reset();
// TODO: @dengzhi.ldz, remove max_snapshot_version, merge all forzen memtables
// Keep max_snapshot_version currently because major merge must be done step by step
int64_t max_snapshot_version = freeze_info.next.freeze_version;
int64_t max_snapshot_version = freeze_info.next.frozen_scn_.get_val_for_tx();
const SCN &clog_checkpoint_scn = tablet.get_clog_checkpoint_scn();
// Freezing in the restart phase may not satisfy end >= last_max_sstable,
@ -275,9 +332,8 @@ int ObPartitionMergePolicy::find_mini_merge_tables(
}
} // end for
bool need_check_tablet = false;
if (OB_SUCC(ret)) {
bool need_check_tablet = false;
result.suggest_merge_type_ = param.merge_type_;
result.version_range_.multi_version_start_ = tablet.get_multi_version_start();
if (result.scn_range_.end_scn_ <= clog_checkpoint_scn) {
@ -325,14 +381,14 @@ int ObPartitionMergePolicy::deal_with_minor_result(
int ret = OB_SUCCESS;
if (result.handle_.empty()) {
ret = OB_NO_NEED_MERGE;
LOG_INFO("no need to minor merge", K(ret), K(merge_type), K(result));
LOG_INFO("no need to minor merge", K(ret), "merge_type", merge_type_to_str(merge_type), K(result));
} else if (OB_UNLIKELY(!result.scn_range_.is_valid())) {
ret = OB_INVALID_ARGUMENT;
LOG_ERROR("Invalid argument to check result", K(ret), K(result));
} else if (OB_FAIL(result.handle_.check_continues(&result.scn_range_))) {
LOG_WARN("failed to check continues", K(ret), K(result));
} else if (OB_FAIL(get_multi_version_start(merge_type, ls, tablet, result.version_range_))) {
LOG_WARN("failed to get kept multi_version_start", K(ret), K(merge_type), K(tablet));
} else if (OB_FAIL(get_multi_version_start(merge_type, ls, tablet, result.version_range_, result.snapshot_info_))) {
LOG_WARN("failed to get kept multi_version_start", K(ret), "merge_type", merge_type_to_str(merge_type), K(tablet));
} else {
result.version_range_.base_version_ = 0;
if (OB_SUCC(ret) && !is_mini_merge(merge_type)) {
@ -360,7 +416,7 @@ int ObPartitionMergePolicy::get_minor_merge_tables(
// no need to distinguish data tablet and tx tablet, all minor tables included
if (OB_UNLIKELY(!is_minor_merge(merge_type))) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("get invalid arguments", K(ret), K(merge_type));
LOG_WARN("get invalid arguments", K(ret), "merge_type", merge_type_to_str(merge_type));
} else if (tablet.is_ls_inner_tablet()) {
min_snapshot_version = 0;
max_snapshot_version = INT64_MAX;
@ -395,39 +451,37 @@ int ObPartitionMergePolicy::get_boundary_snapshot_version(
int ret = OB_SUCCESS;
int64_t merge_inc_base_version = tablet.get_snapshot_version();
ObTenantFreezeInfoMgr::NeighbourFreezeInfo freeze_info;
ObTabletMemberWrapper<ObTabletTableStore> table_store_wrapper;
ObITable *last_major_table = nullptr;
int64_t last_major_snapshot_version = 0;
int64_t tablet_table_cnt = 0;
if (OB_UNLIKELY(tablet.is_ls_inner_tablet())) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("not supported for special tablet", K(ret), K(tablet));
} else if (OB_FAIL(tablet.fetch_table_store(table_store_wrapper))) {
LOG_WARN("fail to fetch table store", K(ret));
} else if (OB_UNLIKELY(!table_store_wrapper.get_member()->is_valid())) {
ret = OB_ERR_SYS;
LOG_WARN("table store not valid", K(ret), K(table_store_wrapper));
} else if (FALSE_IT(last_major_table = table_store_wrapper.get_member()->get_major_sstables().get_boundary_table(true))) {
} else if (FALSE_IT(last_major_snapshot_version = tablet.get_last_major_snapshot_version())) {
} else if (FALSE_IT(tablet_table_cnt = tablet.get_major_table_count() + tablet.get_minor_table_count())) {
} else if (OB_FAIL(get_neighbour_freeze_info(merge_inc_base_version,
last_major_table,
freeze_info))) {
LOG_WARN("failed to get freeze info", K(ret), K(merge_inc_base_version), K(PRINT_TS_WRAPPER(table_store_wrapper)));
} else if (check_table_cnt && table_store_wrapper.get_member()->get_table_count() >= OB_UNSAFE_TABLE_CNT) {
last_major_snapshot_version,
freeze_info,
is_multi_version_merge))) {
LOG_WARN("failed to get freeze info", K(ret), K(merge_inc_base_version), K(tablet));
} else if (check_table_cnt && tablet_table_cnt >= OB_UNSAFE_TABLE_CNT) {
max_snapshot = INT64_MAX;
if (table_store_wrapper.get_member()->get_table_count() >= OB_EMERGENCY_TABLE_CNT) {
if (tablet_table_cnt >= OB_EMERGENCY_TABLE_CNT) {
min_snapshot = 0;
} else if (OB_NOT_NULL(last_major_table)) {
min_snapshot = last_major_table->get_snapshot_version();
} else if (last_major_snapshot_version > 0) {
min_snapshot = last_major_snapshot_version;
}
} else {
if (OB_NOT_NULL(last_major_table)) {
min_snapshot = max(last_major_table->get_snapshot_version(), freeze_info.prev.freeze_version);
if (last_major_snapshot_version > 0) {
min_snapshot = max(last_major_snapshot_version, freeze_info.prev.frozen_scn_.get_val_for_tx());
} else {
min_snapshot = freeze_info.prev.freeze_version;
min_snapshot = freeze_info.prev.frozen_scn_.get_val_for_tx();
}
if (INT64_MAX == freeze_info.next.freeze_version && is_multi_version_merge) {
if (INT64_MAX == freeze_info.next.frozen_scn_.is_max() && is_multi_version_merge) {
max_snapshot = MTL(ObTenantFreezeInfoMgr*)->get_snapshot_gc_ts();
} else {
max_snapshot = freeze_info.next.freeze_version;
max_snapshot = freeze_info.next.frozen_scn_.get_val_for_tx();
}
int64_t max_medium_scn = 0;
@ -441,8 +495,8 @@ int ObPartitionMergePolicy::get_boundary_snapshot_version(
} else {
min_snapshot = max(min_snapshot, max_medium_scn);
}
LOG_DEBUG("get boundary snapshot", K(ret), "tablet_id", tablet.get_tablet_meta().tablet_id_, K(table_store_wrapper),
K(min_snapshot), K(max_snapshot), K(max_medium_scn), KPC(last_major_table), K(freeze_info));
LOG_DEBUG("get boundary snapshot", K(ret), "tablet_id", tablet.get_tablet_meta().tablet_id_, K(tablet),
K(min_snapshot), K(max_snapshot), K(max_medium_scn), K(last_major_snapshot_version), K(freeze_info));
}
return ret;
}
@ -456,17 +510,12 @@ int ObPartitionMergePolicy::find_minor_merge_tables(
ObGetMergeTablesResult &result)
{
int ret = OB_SUCCESS;
int tmp_ret = OB_SUCCESS;
result.reset_handle_and_range();
ObTableStoreIterator minor_table_iter;
int64_t minor_compact_trigger = DEFAULT_MINOR_COMPACT_TRIGGER;
ObTabletMemberWrapper<ObTabletTableStore> table_store_wrapper;
if (OB_FAIL(tablet.fetch_table_store(table_store_wrapper))) {
LOG_WARN("fail to fetch table store", K(ret));
} else if (OB_UNLIKELY(!table_store_wrapper.get_member()->is_valid())) {
ret = OB_ERR_SYS;
LOG_WARN("unexpected table store", K(ret), K(table_store_wrapper));
} else if (OB_FAIL(tablet.get_mini_minor_sstables(minor_table_iter))) {
if (OB_FAIL(tablet.get_mini_minor_sstables(minor_table_iter))) {
LOG_WARN("failed to get mini minor sstables", K(ret));
} else {
ObSSTable *table = nullptr;
@ -497,7 +546,7 @@ int ObPartitionMergePolicy::find_minor_merge_tables(
if (0 == minor_merge_candidates.get_count()) {
} else if (is_history_minor_merge(param.merge_type_) && table->get_upper_trans_version() > max_snapshot_version) {
break;
} else if (table_store_wrapper.get_member()->get_table_count() < OB_UNSAFE_TABLE_CNT &&
} else if (tablet.get_minor_table_count() + tablet.get_major_table_count() < OB_UNSAFE_TABLE_CNT &&
table->get_max_merged_trans_version() > max_snapshot_version) {
LOG_INFO("max_snapshot_version reached, stop find more tables", K(param), K(max_snapshot_version), KPC(table));
break;
@ -537,11 +586,24 @@ int ObPartitionMergePolicy::find_minor_merge_tables(
}
}
#ifdef ERRSIM
if (OB_SUCC(ret)) {
result.suggest_merge_type_ = param.merge_type_;
if (OB_FAIL(refine_minor_merge_result(minor_compact_trigger, result))) {
ret = OB_E(EventTable::EN_CAN_NOT_SCHEDULE_MINOR) OB_SUCCESS;
if (OB_FAIL(ret)) {
STORAGE_LOG(INFO, "ERRSIM EN_CAN_NOT_SCHEDULE_MINOR", K(ret));
}
}
const int64_t diagnose_table_cnt = 2;
#else
const int64_t diagnose_table_cnt = DIAGNOSE_TABLE_CNT_IN_STORAGE;
#endif
if (OB_SUCC(ret)) {
DEL_SUSPECT_INFO(MINOR_MERGE,
tablet.get_tablet_meta().ls_id_, tablet.get_tablet_meta().tablet_id_,
ObDiagnoseTabletType::TYPE_MINOR_MERGE);
if (OB_FAIL(refine_minor_merge_result(param.merge_type_, minor_compact_trigger, result))) {
if (OB_NO_NEED_MERGE != ret) {
LOG_WARN("failed to refine_minor_merge_result", K(ret));
LOG_WARN("failed to refine minor_merge result", K(ret));
}
} else if (FALSE_IT(result.version_range_.snapshot_version_ = tablet.get_snapshot_version())) {
} else {
@ -552,14 +614,12 @@ int ObPartitionMergePolicy::find_minor_merge_tables(
K(result), K(tablet));
}
}
} else if (OB_NO_NEED_MERGE == ret
&& table_store_wrapper.get_member()->get_minor_sstables().count() >= DIAGNOSE_TABLE_CNT_IN_STORAGE) {
int tmp_ret = OB_SUCCESS;
if (OB_TMP_FAIL(ADD_SUSPECT_INFO(MINOR_MERGE,
} else if (OB_NO_NEED_MERGE == ret && tablet.get_minor_table_count() >= diagnose_table_cnt) {
if (OB_TMP_FAIL(ADD_SUSPECT_INFO(MINOR_MERGE, ObDiagnoseTabletType::TYPE_MINOR_MERGE,
tablet.get_tablet_meta().ls_id_,
tablet.get_tablet_meta().tablet_id_,
ObSuspectInfoType::SUSPECT_CANT_SCHEDULE_MINOR_MERGE,
min_snapshot_version, max_snapshot_version, table_store_wrapper.get_member()->get_minor_sstables().count()))) {
min_snapshot_version, max_snapshot_version, tablet.get_minor_table_count()))) {
LOG_WARN("failed to add suspect info", K(tmp_ret));
}
}
@ -622,7 +682,7 @@ int ObPartitionMergePolicy::get_hist_minor_merge_tables(
if (OB_UNLIKELY(!is_history_minor_merge(merge_type))) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid args", K(ret), K(merge_type));
LOG_WARN("invalid args", K(ret), "merge_type", merge_type_to_str(merge_type));
} else if (OB_FAIL(deal_hist_minor_merge(tablet, max_snapshot_version))) {
if (OB_NO_NEED_MERGE != ret) {
LOG_WARN("failed to deal hist minor merge", K(ret));
@ -661,8 +721,7 @@ int ObPartitionMergePolicy::deal_hist_minor_merge(
LOG_WARN("No freeze range to do hist minor merge for buiding index", K(ret), K(PRINT_TS_WRAPPER(table_store_wrapper)));
}
} else {
ObTenantFreezeInfoMgr::NeighbourFreezeInfo freeze_info;
ObSEArray<ObTenantFreezeInfoMgr::FreezeInfo, 8> freeze_infos;
ObSEArray<share::ObFreezeInfo, 8> freeze_infos;
if (OB_FAIL(MTL(ObTenantFreezeInfoMgr *)->get_freeze_info_behind_major_snapshot(
first_major_table->get_snapshot_version(),
freeze_infos))) {
@ -741,23 +800,23 @@ int ObPartitionMergePolicy::diagnose_minor_dag(
int ObPartitionMergePolicy::diagnose_table_count_unsafe(
const ObMergeType merge_type,
const share::ObDiagnoseTabletType diagnose_type,
const storage::ObTablet &tablet)
{
int ret = OB_SUCCESS;
int tmp_ret = OB_SUCCESS;
const int64_t buf_len = ObScheduleSuspectInfoMgr::EXTRA_INFO_LEN;
char tmp_str[buf_len] = "\0";
if (OB_TMP_FAIL(ObCompactionDiagnoseMgr::check_system_compaction_config(tmp_str, buf_len))) {
LOG_WARN("failed to check system compaction config", K(tmp_ret), K(tmp_str));
int64_t minor_compact_trigger = DEFAULT_MINOR_COMPACT_TRIGGER;
{
omt::ObTenantConfigGuard tenant_config(TENANT_CONF(MTL_ID()));
minor_compact_trigger = tenant_config->minor_compact_trigger;
}
// check min_reserved_snapshot
const ObLSID &ls_id = tablet.get_tablet_meta().ls_id_;
const ObTabletID &tablet_id = tablet.get_tablet_meta().tablet_id_;
int64_t min_reserved_snapshot = 0;
int64_t min_merged_snapshot = INT64_MAX;
int64_t first_minor_start_scn = 0;
ObString snapshot_from_str;
ObStorageSnapshotInfo snapshot_info;
ObTabletMemberWrapper<ObTabletTableStore> table_store_wrapper;
if (OB_FAIL(tablet.fetch_table_store(table_store_wrapper))) {
@ -768,32 +827,33 @@ int ObPartitionMergePolicy::diagnose_table_count_unsafe(
// add sstable info
const int64_t major_table_count = major_tables.count();
const int64_t minor_table_count = minor_tables.count();
ADD_COMPACTION_INFO_PARAM(tmp_str, buf_len, K(major_table_count), K(minor_table_count));
const ObSSTable *major_sstable = static_cast<const ObSSTable *>(major_tables.get_boundary_table(false/*last*/));
if (OB_ISNULL(major_sstable)) {
const ObSSTable *minor_sstable = static_cast<const ObSSTable *>(minor_tables.get_boundary_table(false/*last*/));
first_minor_start_scn = minor_sstable->get_start_scn().get_val_for_tx();
} else if (FALSE_IT(min_merged_snapshot = major_sstable->get_snapshot_version())) {
} else if (OB_FAIL(MTL_CALL_FREEZE_INFO_MGR(diagnose_min_reserved_snapshot,
} else if (OB_FAIL(MTL_CALL_FREEZE_INFO_MGR(get_min_reserved_snapshot,
tablet_id,
min_merged_snapshot,
min_reserved_snapshot,
snapshot_from_str))) {
snapshot_info))) {
LOG_WARN("failed to get min reserved snapshot", K(ret), K(tablet_id));
} else if (snapshot_from_str.length() > 0) {
ADD_COMPACTION_INFO_PARAM(tmp_str, buf_len, "snapstho_type", snapshot_from_str, K(min_reserved_snapshot));
}
// check have minor merge DAG
if (OB_TMP_FAIL(diagnose_minor_dag(MINOR_MERGE, ls_id, tablet_id, tmp_str, buf_len))) {
LOG_WARN("failed to diagnose minor dag", K(tmp_ret), K(ls_id), K(tablet_id), K(tmp_str));
const int64_t buf_len = compaction::OB_DIAGNOSE_INFO_PARAM_STR_LENGTH;
char dag_str[buf_len] = "\0";
if (OB_TMP_FAIL(diagnose_minor_dag(MINOR_MERGE, ls_id, tablet_id, dag_str, buf_len))) {
LOG_WARN("failed to diagnose minor dag", K(tmp_ret), K(ls_id), K(tablet_id), K(dag_str));
}
if (OB_TMP_FAIL(diagnose_minor_dag(HISTORY_MINOR_MERGE, ls_id, tablet_id, tmp_str, buf_len))) {
LOG_WARN("failed to diagnose history minor dag", K(tmp_ret), K(ls_id), K(tablet_id), K(tmp_str));
if (OB_TMP_FAIL(diagnose_minor_dag(HISTORY_MINOR_MERGE, ls_id, tablet_id, dag_str, buf_len))) {
LOG_WARN("failed to diagnose history minor dag", K(tmp_ret), K(ls_id), K(tablet_id), K(dag_str));
}
if (OB_TMP_FAIL(ADD_SUSPECT_INFO(MINI_MERGE, ls_id, tablet_id, ObSuspectInfoType::SUSPECT_SSTABLE_COUNT_NOT_SAFE,
major_table_count, minor_table_count, first_minor_start_scn, "extra_info", tmp_str))) {
if (OB_TMP_FAIL(ADD_SUSPECT_INFO(merge_type, diagnose_type,
ls_id, tablet_id, ObSuspectInfoType::SUSPECT_SSTABLE_COUNT_NOT_SAFE,
minor_compact_trigger,
major_table_count, minor_table_count, first_minor_start_scn,
"snapshot", snapshot_info, "dag", dag_str))) {
LOG_WARN("failed to add suspect info", K(tmp_ret));
}
}
@ -837,11 +897,11 @@ int ObPartitionMergePolicy::refine_mini_merge_result(
}
int ObPartitionMergePolicy::refine_minor_merge_result(
const ObMergeType merge_type,
const int64_t minor_compact_trigger,
ObGetMergeTablesResult &result)
{
int ret = OB_SUCCESS;
ObMergeType &merge_type = result.suggest_merge_type_;
if (result.handle_.get_count() <= MAX(minor_compact_trigger, 1)) {
ret = OB_NO_NEED_MERGE;
LOG_DEBUG("minor refine, no need to do minor merge", K(result));
@ -859,7 +919,6 @@ int ObPartitionMergePolicy::refine_minor_merge_result(
int64_t large_sstable_row_cnt = 0;
int64_t mini_sstable_row_cnt = 0;
for (int64_t i = 0; OB_SUCC(ret) && i < result.handle_.get_count(); ++i) {
ObSSTableMetaHandle sstable_meta_hdl;
ObTableHandleV2 tmp_table_handle;
if (OB_FAIL(result.handle_.get_table(i, tmp_table_handle))) {
LOG_WARN("failed to get table from handles array", K(ret), K(i));
@ -867,12 +926,10 @@ int ObPartitionMergePolicy::refine_minor_merge_result(
ret = OB_ERR_SYS;
LOG_ERROR("get unexpected table", KP(table), K(ret));
} else if (FALSE_IT(sstable = reinterpret_cast<ObSSTable*>(table))) {
} else if (OB_FAIL(sstable->get_meta(sstable_meta_hdl))) {
LOG_WARN("failed to get sstable meta handle", K(ret));
} else {
if (sstable_meta_hdl.get_sstable_meta().get_basic_meta().row_count_ > OB_LARGE_MINOR_SSTABLE_ROW_COUNT) { // large sstable
if (sstable->get_row_count() > OB_LARGE_MINOR_SSTABLE_ROW_COUNT) { // large sstable
++large_sstable_cnt;
large_sstable_row_cnt += sstable_meta_hdl.get_sstable_meta().get_basic_meta().row_count_;
large_sstable_row_cnt += sstable->get_row_count();
if (mini_tables.get_count() > minor_compact_trigger) {
break;
} else {
@ -880,7 +937,7 @@ int ObPartitionMergePolicy::refine_minor_merge_result(
continue;
}
} else {
mini_sstable_row_cnt += sstable_meta_hdl.get_sstable_meta().get_basic_meta().row_count_;
mini_sstable_row_cnt += sstable->get_row_count();
}
if (OB_FAIL(mini_tables.add_table(tmp_table_handle))) {
LOG_WARN("Failed to push mini minor table into array", K(ret));
@ -938,23 +995,23 @@ int ObPartitionMergePolicy::check_need_medium_merge(
bool &need_force_freeze)
{
int ret = OB_SUCCESS;
int tmp_ret = OB_SUCCESS;
need_merge = false;
can_merge = false;
const ObTabletID &tablet_id = tablet.get_tablet_meta().tablet_id_;
ObITable *last_major = nullptr;
const bool is_tablet_data_status_complete = tablet.is_data_complete();
ObTabletMemberWrapper<ObTabletTableStore> table_store_wrapper;
const ObLSID &ls_id = tablet.get_tablet_meta().ls_id_;
const int64_t last_major_snapshot_version = tablet.get_last_major_snapshot_version();
const bool is_tablet_data_status_complete = tablet.get_tablet_meta().ha_status_.is_data_status_complete();
if (OB_FAIL(tablet.fetch_table_store(table_store_wrapper))) {
LOG_WARN("fail to fetch table store", K(ret));
} else if (OB_ISNULL(last_major =
table_store_wrapper.get_member()->get_major_sstables().get_boundary_table(true/*last*/))) {
bool ls_weak_read_ts_ready = ObTenantTabletScheduler::check_weak_read_ts_ready(medium_snapshot, ls);
if (0 >= last_major_snapshot_version) {
// no major, no medium
} else {
need_merge = last_major->get_snapshot_version() < medium_snapshot;
need_merge = last_major_snapshot_version < medium_snapshot;
if (need_merge
&& is_tablet_data_status_complete
&& ObTenantTabletScheduler::check_weak_read_ts_ready(medium_snapshot, ls)) {
&& ls_weak_read_ts_ready) {
can_merge = tablet.get_snapshot_version() >= medium_snapshot;
if (!can_merge) {
ObTabletMemtableMgr *memtable_mgr = nullptr;
@ -981,19 +1038,32 @@ int ObPartitionMergePolicy::check_need_medium_merge(
}
}
}
#ifdef ERRSIM
if (OB_SUCC(ret)) {
ret = OB_E(EventTable::EN_COMPACTION_DIAGNOSE_CANNOT_MAJOR) OB_SUCCESS;
if (OB_FAIL(ret)) {
STORAGE_LOG(INFO, "ERRSIM EN_COMPACTION_DIAGNOSE_CANNOT_MAJOR", K(ret));
can_merge = false;
ret = OB_SUCCESS;
}
}
#endif
if (need_merge && !can_merge && REACH_TENANT_TIME_INTERVAL(60L * 1000L * 1000L)) {
LOG_INFO("check_need_medium_merge", K(ret), "ls_id", tablet.get_tablet_meta().ls_id_, K(tablet_id),
K(need_merge), K(can_merge), K(medium_snapshot), K(is_tablet_data_status_complete));
int tmp_ret = OB_SUCCESS;
if (OB_TMP_FAIL(ADD_SUSPECT_INFO(MAJOR_MERGE,
tablet.get_tablet_meta().ls_id_,
tablet_id,
ObSuspectInfoType::SUSPECT_CANT_MAJOR_MERGE,
medium_snapshot, static_cast<int64_t>(is_tablet_data_status_complete),
static_cast<int64_t>(need_force_freeze)))) {
LOG_WARN("failed to add suspect info", K(tmp_ret));
}
LOG_INFO("check_need_medium_merge", K(ret), K(ls_id), K(tablet_id),
K(need_merge), K(can_merge), K(medium_snapshot),
K(need_force_freeze), K(is_tablet_data_status_complete), K(ls_weak_read_ts_ready));
if (OB_TMP_FAIL(ADD_SUSPECT_INFO(MEDIUM_MERGE, ObDiagnoseTabletType::TYPE_MEDIUM_MERGE,
ls_id,
tablet_id,
ObSuspectInfoType::SUSPECT_CANT_MAJOR_MERGE,
medium_snapshot,
tablet.get_snapshot_version(),
static_cast<int64_t>(is_tablet_data_status_complete),
static_cast<int64_t>(ls_weak_read_ts_ready),
static_cast<int64_t>(need_force_freeze),
tablet.get_tablet_meta().max_serialized_medium_scn_))) {
LOG_WARN("failed to add suspect info", K(tmp_ret));
}
}
return ret;
}
@ -1012,17 +1082,20 @@ int ObPartitionMergePolicy::get_multi_version_start(
const ObMergeType merge_type,
ObLS &ls,
const ObTablet &tablet,
ObVersionRange &result_version_range)
ObVersionRange &result_version_range,
ObStorageSnapshotInfo &snapshot_info)
{
int ret = OB_SUCCESS;
int64_t expect_multi_version_start = 0;
snapshot_info.reset();
if (tablet.is_ls_inner_tablet()) {
result_version_range.multi_version_start_ = INT64_MAX;
} else if (OB_FAIL(ObTablet::get_kept_multi_version_start(ls, tablet, expect_multi_version_start))) {
} else if (OB_FAIL(tablet.get_kept_snapshot_info(ls.get_min_reserved_snapshot(), snapshot_info))) {
if (is_mini_merge(merge_type) || OB_TENANT_NOT_EXIST == ret) {
expect_multi_version_start = tablet.get_multi_version_start();
snapshot_info.reset();
snapshot_info.snapshot_type_ = ObStorageSnapshotInfo::SNAPSHOT_MULTI_VERSION_START_ON_TABLET;
snapshot_info.snapshot_ = tablet.get_multi_version_start();
FLOG_INFO("failed to get multi_version_start, use multi_version_start on tablet", K(ret),
K(merge_type), K(expect_multi_version_start));
"merge_type", merge_type_to_str(merge_type), K(snapshot_info));
ret = OB_SUCCESS; // clear errno
} else {
LOG_WARN("failed to get kept multi_version_start", K(ret),
@ -1031,24 +1104,22 @@ int ObPartitionMergePolicy::get_multi_version_start(
}
if (OB_SUCC(ret) && !tablet.is_ls_inner_tablet()) {
// update multi_version_start
if (expect_multi_version_start < result_version_range.multi_version_start_) {
if (snapshot_info.snapshot_ < result_version_range.multi_version_start_) {
LOG_WARN("cannot reserve multi_version_start", "multi_version_start", result_version_range.multi_version_start_,
K(expect_multi_version_start));
} else if (expect_multi_version_start < result_version_range.snapshot_version_) {
result_version_range.multi_version_start_ = expect_multi_version_start;
K(snapshot_info));
} else if (snapshot_info.snapshot_ < result_version_range.snapshot_version_) {
result_version_range.multi_version_start_ = snapshot_info.snapshot_;
LOG_DEBUG("succ reserve multi_version_start", "multi_version_start", result_version_range.multi_version_start_,
K(expect_multi_version_start));
K(snapshot_info));
} else {
result_version_range.multi_version_start_ = result_version_range.snapshot_version_;
LOG_DEBUG("no need keep multi version", "multi_version_start", result_version_range.multi_version_start_,
K(expect_multi_version_start));
LOG_DEBUG("no need keep multi version", K(snapshot_info), "multi_version_start", result_version_range.multi_version_start_);
}
}
return ret;
}
int add_table_with_check(ObGetMergeTablesResult &result, ObTableHandleV2 &table_handle)
int ObPartitionMergePolicy::add_table_with_check(ObGetMergeTablesResult &result, ObTableHandleV2 &table_handle)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(!table_handle.is_valid())) {
@ -1107,7 +1178,7 @@ int ObPartitionMergePolicy::generate_input_result_array(
} else if (OB_FAIL(add_table_with_check(tmp_result, tmp_table_handle))) {
LOG_WARN("failed to add table into result", K(ret), K(tmp_result), K(tmp_table_handle));
}
}
} // end of for
if (OB_FAIL(ret) || tmp_result.handle_.get_count() < 2) {
} else if (OB_FAIL(input_result_array.push_back(tmp_result))) {
@ -1168,6 +1239,7 @@ int ObPartitionMergePolicy::split_parallel_minor_range(
}
int ObPartitionMergePolicy::generate_parallel_minor_interval(
const ObMergeType merge_type,
const int64_t minor_compact_trigger,
const ObGetMergeTablesResult &input_result,
ObMinorExecuteRangeMgr &minor_range_mgr,
@ -1178,7 +1250,7 @@ int ObPartitionMergePolicy::generate_parallel_minor_interval(
ObSEArray<ObGetMergeTablesResult, 2> input_result_array;
int64_t fixed_input_table_cnt = 0;
if (!storage::is_minor_merge(input_result.suggest_merge_type_)) {
if (!compaction::is_minor_merge(merge_type)) {
ret = OB_NO_NEED_MERGE;
} else if (input_result.handle_.get_count() < minor_compact_trigger) {
ret = OB_NO_NEED_MERGE;
@ -1224,7 +1296,7 @@ int ObMinorExecuteRangeMgr::get_merge_ranges(
param.merge_version_ = ObVersion::MIN_VERSION;
param.ls_id_ = ls_id;
param.tablet_id_ = tablet_id;
param.for_diagnose_ = true;
param.skip_get_tablet_ = true;
if (OB_FAIL(MTL(ObTenantDagScheduler*)->get_minor_exe_dag_info(param, exe_range_array_))) {
LOG_WARN("failed to get minor exe dag info", K(ret));
@ -1274,7 +1346,9 @@ const char * ObAdaptiveMergeReasonStr[] = {
"TOMBSTONE_SCENE",
"INEFFICIENT_QUERY",
"FREQUENT_WRITE",
"TENANT_MAJOR"
"TENANT_MAJOR",
"USER_REQUEST",
"REBUILD_COLUMN_GROUP"
};
const char* ObAdaptiveMergePolicy::merge_reason_to_str(const int64_t merge_reason)
@ -1305,31 +1379,24 @@ int ObAdaptiveMergePolicy::get_meta_merge_tables(
int ret = OB_SUCCESS;
const ObMergeType merge_type = param.merge_type_;
result.reset();
ObTabletMemberWrapper<ObTabletTableStore> table_store_wrapper;
if (OB_FAIL(tablet.fetch_table_store(table_store_wrapper))) {
LOG_WARN("fail to fetch table store", K(ret));
} else if (OB_UNLIKELY(!table_store_wrapper.get_member()->is_valid())) {
ret = OB_ERR_SYS;
LOG_WARN("table store not valid", K(ret), K(table_store_wrapper));
} else if (OB_UNLIKELY(META_MAJOR_MERGE != merge_type)) {
if (OB_UNLIKELY(META_MAJOR_MERGE != merge_type)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid args", K(ret), K(merge_type));
LOG_WARN("invalid args", K(ret), "merge_type", merge_type_to_str(merge_type));
} else if (OB_FAIL(find_meta_major_tables(tablet, result))) {
if (OB_NO_NEED_MERGE != ret) {
LOG_WARN("Failed to find minor merge tables", K(ret));
}
} else if (OB_FAIL(result.handle_.check_continues(nullptr))) {
LOG_WARN("failed to check continues", K(ret), K(result));
} else if (FALSE_IT(result.suggest_merge_type_ = META_MAJOR_MERGE)) {
} else if (FALSE_IT(result.version_range_.snapshot_version_ =
MIN(tablet.get_snapshot_version(), result.version_range_.snapshot_version_))) {
// chosen version should less than tablet::snapshot
} else if (OB_FAIL(ObPartitionMergePolicy::get_multi_version_start(
param.merge_type_, ls, tablet, result.version_range_))) {
param.merge_type_, ls, tablet, result.version_range_, result.snapshot_info_))) {
LOG_WARN("failed to get multi version_start", K(ret));
} else {
FLOG_INFO("succeed to get meta major merge tables", K(result), K(PRINT_TS_WRAPPER(table_store_wrapper)));
FLOG_INFO("succeed to get meta major merge tables", K(result), K(tablet));
}
return ret;
}
@ -1344,7 +1411,6 @@ int ObAdaptiveMergePolicy::find_meta_major_tables(
int64_t base_row_cnt = 0;
int64_t inc_row_cnt = 0;
int64_t tx_determ_table_cnt = 0;
ObSSTableMetaHandle meta_handle;
ObTabletMemberWrapper<ObTabletTableStore> table_store_wrapper;
const ObTabletTableStore *table_store = nullptr;
@ -1354,17 +1420,18 @@ int ObAdaptiveMergePolicy::find_meta_major_tables(
ret = OB_ERR_UNEXPECTED;
LOG_WARN("ObTabletTableStore is not valid", K(ret), K(table_store_wrapper));
} else {
ObITable *last_major = table_store->get_major_sstables().get_boundary_table(true);
ObITable *base_table = nullptr;
const ObSSTableArray &minor_tables = table_store->get_minor_sstables();
ObITable *last_major = table_store_wrapper.get_member()->get_major_sstables().get_boundary_table(true);
ObITable *base_table = table_store_wrapper.get_member()->get_meta_major_sstable();
const ObSSTableArray &minor_tables = table_store_wrapper.get_member()->get_minor_sstables();
if (minor_tables.empty() || nullptr == last_major) {
ret = OB_NO_NEED_MERGE;
LOG_WARN("no minor/major sstable to do meta major merge", K(ret), K(minor_tables), KPC(last_major));
LOG_DEBUG("no minor/major sstable to do meta major merge", K(ret), K(minor_tables), KPC(last_major));
} else if (FALSE_IT(base_table = nullptr == table_store->get_meta_major_sstable()
? last_major
: table_store->get_meta_major_sstable())) {
} else if (OB_FAIL(ObPartitionMergePolicy::get_boundary_snapshot_version(
tablet, min_snapshot, max_snapshot, false/*check_table_cnt*/, false/*is_multi_version_merge*/))) {
tablet, min_snapshot, max_snapshot, false/*check_table_cnt*/, false/*is_multi_version_merge*/))) {
if (OB_NO_NEED_MERGE != ret) {
LOG_WARN("Failed to find meta merge base table", K(ret), KPC(last_major), KPC(base_table));
}
@ -1374,10 +1441,8 @@ int ObAdaptiveMergePolicy::find_meta_major_tables(
LOG_DEBUG("no need meta merge when the tablet is doing major merge", K(ret), K(min_snapshot), K(max_snapshot), KPC(base_table));
} else if (OB_FAIL(add_meta_merge_result(base_table, table_store_wrapper.get_meta_handle(), result, true/*update_snapshot*/))) {
LOG_WARN("failed to add base table to meta merge result", K(ret), KPC(base_table), K(result));
} else if (OB_FAIL(static_cast<ObSSTable *>(base_table)->get_meta(meta_handle))) {
LOG_WARN("failed to base table meta", K(ret), KPC(base_table));
} else {
base_row_cnt = meta_handle.get_sstable_meta().get_row_count();
base_row_cnt = static_cast<ObSSTable *>(base_table)->get_row_count();
++tx_determ_table_cnt; // inc for base_table
}
@ -1402,7 +1467,7 @@ int ObAdaptiveMergePolicy::find_meta_major_tables(
}
if (FAILEDx(add_meta_merge_result(
table, table_store_wrapper.get_meta_handle(), result, !found_undeterm_table))) {
table, table_store_wrapper.get_meta_handle(), result, !found_undeterm_table))) {
LOG_WARN("failed to add minor table to meta merge result", K(ret));
}
}
@ -1484,7 +1549,6 @@ int ObAdaptiveMergePolicy::add_meta_merge_result(
const bool update_snapshot_flag)
{
int ret = OB_SUCCESS;
ObSSTableMetaHandle meta_handle;
if (OB_ISNULL(table)) {
ret = OB_INVALID_ARGUMENT;
@ -1492,14 +1556,10 @@ int ObAdaptiveMergePolicy::add_meta_merge_result(
} else if (OB_FAIL(result.handle_.add_sstable(table, table_meta_handle))) {
LOG_WARN("failed to add table", K(ret), KPC(table));
} else if (table->is_meta_major_sstable() || table->is_major_sstable()) {
if (OB_FAIL(static_cast<ObSSTable *>(table)->get_meta(meta_handle))) {
LOG_WARN("faile to get sstable meta", K(ret), KPC(table));
} else {
result.version_range_.base_version_ = 0;
result.version_range_.multi_version_start_ = table->get_snapshot_version();
result.version_range_.snapshot_version_ = table->get_snapshot_version();
result.create_snapshot_version_ = meta_handle.get_sstable_meta().get_basic_meta().create_snapshot_version_;
}
result.version_range_.base_version_ = 0;
result.version_range_.multi_version_start_ = table->get_snapshot_version();
result.version_range_.snapshot_version_ = table->get_snapshot_version();
result.create_snapshot_version_ = table->get_snapshot_version();
} else if (update_snapshot_flag) {
int64_t max_snapshot = MAX(result.version_range_.snapshot_version_, table->get_max_merged_trans_version());
result.version_range_.multi_version_start_ = max_snapshot;
@ -1563,27 +1623,21 @@ int ObAdaptiveMergePolicy::check_inc_sstable_row_cnt_percentage(
int64_t base_row_count = 0;
int64_t inc_row_count = 0;
ObSSTable *sstable = nullptr;
ObSSTableMetaHandle major_meta_hdl;
ObTabletMemberWrapper<ObTabletTableStore> table_store_wrapper;
if (OB_FAIL(tablet.fetch_table_store(table_store_wrapper))) {
LOG_WARN("fail to fetch table store", K(ret));
} else if (FALSE_IT(last_major = static_cast<ObSSTable *>(
table_store_wrapper.get_member()->get_major_sstables().get_boundary_table(true)))) {
} else if (nullptr != last_major && OB_FAIL(last_major->get_meta(major_meta_hdl))) {
LOG_WARN("fail to get major meta", K(ret), KPC(last_major));
} else {
base_row_count = major_meta_hdl.get_sstable_meta().get_row_count();
base_row_count = (nullptr == last_major) ? 0 : last_major->get_row_count();
const ObSSTableArray &minor_sstables = table_store_wrapper.get_member()->get_minor_sstables();
for (int i = 0; OB_SUCC(ret) && i < minor_sstables.count(); ++i) {
ObSSTableMetaHandle inc_meta_hdl;
if (OB_ISNULL(sstable = minor_sstables.at(i))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("sstable is null", K(ret), K(i));
} else if (OB_FAIL(sstable->get_meta(inc_meta_hdl))) {
LOG_WARN("fail to get sstable meta", K(ret), KPC(sstable));
} else {
inc_row_count += inc_meta_hdl.get_sstable_meta().get_row_count();
inc_row_count += sstable->get_row_count();
}
}
}