[FEAT MERGE] impl new type materialized view support fast refresh by major merge

Co-authored-by: fforkboat <fforkboat@gmail.com>
Co-authored-by: haitaoyang <haitaoy3.14@gmail.com>
Co-authored-by: chimyue <chimyue@gmail.com>
This commit is contained in:
obdev
2024-09-27 14:16:08 +00:00
committed by ob-robot
parent 87bade3652
commit 22aa6dbb84
297 changed files with 12817 additions and 990 deletions

View File

@ -90,6 +90,7 @@
#include "logservice/ob_server_log_block_mgr.h"
#include "rootserver/ob_admin_drtask_util.h"
#include "storage/ddl/ob_tablet_ddl_kv.h"
#include "storage/mview/ob_major_mv_merge_info.h"
#ifdef OB_BUILD_SHARED_STORAGE
#include "close_modules/shared_storage/storage/shared_storage/ob_ss_micro_cache.h"
#include "close_modules/shared_storage/storage/shared_storage/ob_ss_micro_cache_io_helper.h"
@ -3583,6 +3584,97 @@ int ObResourceLimitCalculatorP::process()
return ret;
}
int ObCollectMvMergeInfoP::process()
{
int ret = OB_SUCCESS;
ObMajorMVMergeInfo merge_info;
const share::ObLSID ls_id = arg_.get_ls_id();
const uint64_t tenant_id = arg_.get_tenant_id();
int64_t proposal_id = 0;
MTL_SWITCH(tenant_id) {
if (arg_.need_update() &&
OB_FAIL(ObMVCheckReplicaHelper::get_and_update_merge_info(ls_id, merge_info))) {
LOG_WARN("get and update merge info failed", K(ret));
} else if (!arg_.need_update() &&
OB_FAIL(ObMVCheckReplicaHelper::get_merge_info(ls_id, merge_info))) {
LOG_WARN("get merge info failed", K(ret));
} else if (arg_.need_check_leader()) {
ObRole role;
logservice::ObLogService *log_service = nullptr;
if (OB_ISNULL(log_service = MTL(logservice::ObLogService*))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("log service should not be NULL", K(ret), KP(log_service));
} else if (OB_FAIL(log_service->get_palf_role(ls_id, role, proposal_id))) {
LOG_WARN("failed to get role", K(ret), K(arg_));
} else if (!is_strong_leader(role)) {
ret = OB_LS_NOT_LEADER;
LOG_WARN("it is not leader, cannot collect merge info", K(ret), K(ls_id), K(role), K(arg_));
}
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(result_.init(merge_info, ret))) {
LOG_WARN("init collect mv merge info result failed", K(ret));
}
}
return ret;
}
int ObFetchStableMemberListP::process()
{
int ret = OB_SUCCESS;
const share::ObLSID ls_id = arg_.get_ls_id();
const uint64_t tenant_id = arg_.get_tenant_id();
// todo siyu :: use new stable member list interface
MTL_SWITCH(tenant_id) {
ObLSService *ls_svr = NULL;
ObLSHandle ls_handle;
ObLS *ls = NULL;
logservice::ObLogHandler *log_handler = NULL;
common::ObMemberList member_list;
GlobalLearnerList learn_list;
int64_t paxos_replica_num = 0;
logservice::ObLogService *log_service = nullptr;
palf::LogConfigVersion log_config_version;
ObRole role;
int64_t proposal_id = 0;
int64_t proposal_id_new = 0;
if (OB_ISNULL(log_service = MTL(logservice::ObLogService*))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("log service should not be NULL", K(ret), KP(log_service));
} else if (OB_FAIL(log_service->get_palf_role(ls_id, role, proposal_id))) {
LOG_WARN("failed to get role", K(ret), K(arg_));
} else if (!is_strong_leader(role)) {
ret = OB_LS_NOT_LEADER;
LOG_WARN("ls is not leader, cannot get member list", K(ret), K(role), K(arg_));
} else if (OB_ISNULL(ls_svr = MTL(ObLSService *))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("ls service should not be null", K(ret));
} else if (OB_FAIL(ls_svr->get_ls(ls_id, ls_handle, ObLSGetMod::STORAGE_MOD))) {
LOG_WARN("failed to get ls", K(ret), K(ls_id));
} else if (OB_ISNULL(ls = ls_handle.get_ls())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("ls should not be null", K(ret));
} else if (OB_ISNULL(log_handler = ls->get_log_handler())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("log handler should not be NULL", K(ret));
} else if (OB_FAIL(log_handler->get_stable_membership(log_config_version, member_list,
paxos_replica_num, learn_list))) {
LOG_WARN("failed to get paxos member list and log config version", K(ret));
} else if (OB_FAIL(result_.init(member_list, log_config_version))) {
LOG_WARN("failed to int member list and config version", K(ret), K(member_list), K(log_config_version));
} else if (OB_FAIL(log_service->get_palf_role(ls_id, role, proposal_id_new))) {
LOG_WARN("failed to get role", K(ret), K(arg_));
} else if (proposal_id_new != proposal_id || !is_strong_leader(role)) {
// double check for get stable memberlist
ret = OB_LS_NOT_LEADER;
LOG_WARN("ls is not leader, cannot get member list", K(ret), K(role), K(arg_));
}
}
return ret;
}
#ifdef OB_BUILD_SHARED_STORAGE
int ObGetSSMacroBlockP::process()
{