[FEAT MERGE] merge transfer

Co-authored-by: wxhwang <wxhwang@126.com>
Co-authored-by: godyangfight <godyangfight@gmail.com>
Co-authored-by: Tyshawn <tuyunshan@gmail.com>
This commit is contained in:
xuhuleon
2023-06-21 11:42:26 +00:00
committed by ob-robot
parent d06678002e
commit 9dae112952
1280 changed files with 149724 additions and 48813 deletions

View File

@ -345,206 +345,5 @@ int ObTabletAutoincrementService::get_tablet_cache_interval(const uint64_t tenan
return ret;
}
ObTabletAutoincSeqRpcHandler::ObTabletAutoincSeqRpcHandler()
: is_inited_(false), bucket_lock_()
{
}
ObTabletAutoincSeqRpcHandler::~ObTabletAutoincSeqRpcHandler()
{
}
ObTabletAutoincSeqRpcHandler &ObTabletAutoincSeqRpcHandler::get_instance()
{
static ObTabletAutoincSeqRpcHandler autoinc_rpc_handler;
return autoinc_rpc_handler;
}
int ObTabletAutoincSeqRpcHandler::init()
{
int ret = OB_SUCCESS;
if (OB_FAIL(bucket_lock_.init(BUCKET_LOCK_BUCKET_CNT))) {
LOG_WARN("fail to init bucket lock", K(ret));
} else {
is_inited_ = true;
}
return ret;
}
int ObTabletAutoincSeqRpcHandler::fetch_tablet_autoinc_seq_cache(
const ObFetchTabletSeqArg &arg,
ObFetchTabletSeqRes &res)
{
int ret = OB_SUCCESS;
uint64_t tenant_id = arg.tenant_id_;
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
LOG_WARN("not inited", K(ret), K_(is_inited));
} else {
MTL_SWITCH(tenant_id) {
ObLSHandle ls_handle;
share::ObLSID ls_id = arg.ls_id_;
ObRole role = common::INVALID_ROLE;
ObTabletHandle tablet_handle;
ObTabletAutoincInterval autoinc_interval;
const ObTabletID &tablet_id = arg.tablet_id_;
int64_t proposal_id = -1;
ObBucketHashWLockGuard lock_guard(bucket_lock_, tablet_id.hash());
if (OB_FAIL(MTL(logservice::ObLogService*)->get_palf_role(ls_id, role, proposal_id))) {
LOG_WARN("get palf role failed", K(ret));
} else if (!is_strong_leader(role)) {
ret = OB_NOT_MASTER;
LOG_WARN("follwer received FetchTabletsSeq rpc", K(ret), K(ls_id));
} else if (OB_FAIL(MTL(ObLSService*)->get_ls(ls_id, ls_handle, ObLSGetMod::OBSERVER_MOD))) {
LOG_WARN("get ls failed", K(ret), K(ls_id));
} else if (OB_FAIL(ls_handle.get_ls()->get_tablet(tablet_id, tablet_handle))) {
LOG_WARN("failed to get tablet", KR(ret), K(arg));
} else if (OB_FAIL(tablet_handle.get_obj()->fetch_tablet_autoinc_seq_cache(
arg.cache_size_, autoinc_interval))) {
LOG_WARN("failed to fetch tablet autoinc seq on tablet", K(ret), K(tablet_id));
} else {
res.cache_interval_ = autoinc_interval;
}
}
}
return ret;
}
int ObTabletAutoincSeqRpcHandler::batch_get_tablet_autoinc_seq(
const obrpc::ObBatchGetTabletAutoincSeqArg &arg,
obrpc::ObBatchGetTabletAutoincSeqRes &res)
{
int ret = OB_SUCCESS;
uint64_t tenant_id = arg.tenant_id_;
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
LOG_WARN("not inited", K(ret), K_(is_inited));
} else if (OB_UNLIKELY(!arg.is_valid())) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid argument", K(ret), K(arg));
} else {
MTL_SWITCH(tenant_id) {
ObLSHandle ls_handle;
share::ObLSID ls_id = arg.ls_id_;
ObRole role = common::INVALID_ROLE;
int64_t proposal_id = -1;
if (OB_FAIL(MTL(logservice::ObLogService*)->get_palf_role(ls_id, role, proposal_id))) {
LOG_WARN("get palf role failed", K(ret));
} else if (!is_strong_leader(role)) {
ret = OB_NOT_MASTER;
LOG_WARN("follwer received FetchTabletsSeq rpc", K(ret), K(ls_id));
} else if (OB_FAIL(MTL(ObLSService*)->get_ls(ls_id, ls_handle, ObLSGetMod::OBSERVER_MOD))) {
LOG_WARN("get ls failed", K(ret), K(ls_id));
} else if (OB_FAIL(res.autoinc_params_.reserve(arg.src_tablet_ids_.count()))) {
LOG_WARN("failed to reserve autoinc param", K(ret));
} else {
for (int64_t i = 0; OB_SUCC(ret) && i < arg.src_tablet_ids_.count(); i++) {
int tmp_ret = OB_SUCCESS;
const ObTabletID &src_tablet_id = arg.src_tablet_ids_.at(i);
ObTabletHandle tablet_handle;
share::ObMigrateTabletAutoincSeqParam autoinc_param;
autoinc_param.src_tablet_id_ = src_tablet_id;
autoinc_param.dest_tablet_id_ = arg.dest_tablet_ids_.at(i);
ObBucketHashRLockGuard lock_guard(bucket_lock_, src_tablet_id.hash());
ObTabletAutoincSeq autoinc_seq;
if (OB_TMP_FAIL(ls_handle.get_ls()->get_tablet(src_tablet_id, tablet_handle))) {
LOG_WARN("failed to get tablet", K(tmp_ret), K(src_tablet_id));
} else if (OB_TMP_FAIL(tablet_handle.get_obj()->get_latest_autoinc_seq(autoinc_seq))) {
LOG_WARN("failed to get latest autoinc seq", K(tmp_ret));
} else if (OB_TMP_FAIL(autoinc_seq.get_autoinc_seq_value(autoinc_param.autoinc_seq_))) {
LOG_WARN("failed to get autoinc seq value", K(tmp_ret));
}
autoinc_param.ret_code_ = tmp_ret;
if (OB_FAIL(res.autoinc_params_.push_back(autoinc_param))) {
LOG_WARN("failed to push autoinc param", K(ret), K(autoinc_param));
}
}
}
}
}
return ret;
}
int ObTabletAutoincSeqRpcHandler::batch_set_tablet_autoinc_seq(
const obrpc::ObBatchSetTabletAutoincSeqArg &arg,
obrpc::ObBatchSetTabletAutoincSeqRes &res)
{
int ret = OB_SUCCESS;
uint64_t tenant_id = arg.tenant_id_;
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
LOG_WARN("not inited", K(ret), K_(is_inited));
} else if (OB_UNLIKELY(!arg.is_valid())) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid argument", K(ret), K(arg));
} else if (OB_FAIL(res.autoinc_params_.assign(arg.autoinc_params_))) {
LOG_WARN("failed to assign autoinc params", K(ret), K(arg));
} else {
MTL_SWITCH(tenant_id) {
ObLSHandle ls_handle;
ObLS *ls = nullptr;
share::ObLSID ls_id = arg.ls_id_;
ObRole role = common::INVALID_ROLE;
int64_t proposal_id = -1;
if (OB_FAIL(MTL(logservice::ObLogService*)->get_palf_role(ls_id, role, proposal_id))) {
LOG_WARN("get palf role failed", K(ret));
} else if (!is_strong_leader(role)) {
ret = OB_NOT_MASTER;
LOG_WARN("follwer received FetchTabletsSeq rpc", K(ret), K(ls_id));
} else if (OB_FAIL(MTL(ObLSService*)->get_ls(ls_id, ls_handle, ObLSGetMod::OBSERVER_MOD))) {
LOG_WARN("get ls failed", K(ret), K(ls_id));
} else {
for (int64_t i = 0; OB_SUCC(ret) && i < res.autoinc_params_.count(); i++) {
int tmp_ret = OB_SUCCESS;
ObTabletHandle tablet_handle;
share::ObMigrateTabletAutoincSeqParam &autoinc_param = res.autoinc_params_.at(i);
ObBucketHashWLockGuard lock_guard(bucket_lock_, autoinc_param.dest_tablet_id_.hash());
if (OB_TMP_FAIL(ls_handle.get_ls()->get_tablet(autoinc_param.dest_tablet_id_, tablet_handle))) {
LOG_WARN("failed to get tablet", K(tmp_ret), K(autoinc_param));
} else if (OB_TMP_FAIL(tablet_handle.get_obj()->update_tablet_autoinc_seq(autoinc_param.autoinc_seq_,
SCN::max_scn()))) {
LOG_WARN("failed to update tablet autoinc seq", K(tmp_ret), K(autoinc_param));
}
autoinc_param.ret_code_ = tmp_ret;
}
}
}
}
return ret;
}
int ObTabletAutoincSeqRpcHandler::replay_update_tablet_autoinc_seq(
const ObLS *ls,
const ObTabletID &tablet_id,
const uint64_t autoinc_seq,
const SCN &replay_scn)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(ls == nullptr || !tablet_id.is_valid() || autoinc_seq == 0 || !replay_scn.is_valid_and_not_min())) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid argument", K(ret), K(tablet_id), K(autoinc_seq), K(replay_scn));
} else {
ObTabletHandle tablet_handle;
ObBucketHashWLockGuard guard(bucket_lock_, tablet_id.hash());
if (OB_FAIL(ls->replay_get_tablet(tablet_id,
replay_scn,
tablet_handle))) {
if (OB_TABLET_NOT_EXIST == ret) {
LOG_INFO("tablet may be deleted, skip this log", K(ret), K(tablet_id), K(replay_scn));
ret = OB_SUCCESS;
} else if (OB_EAGAIN == ret) {
// retry replay again
} else {
LOG_WARN("fail to replay get tablet, retry again", K(ret), K(tablet_id), K(replay_scn));
ret = OB_EAGAIN;
}
} else if (OB_FAIL(tablet_handle.get_obj()->update_tablet_autoinc_seq(autoinc_seq, replay_scn))) {
LOG_WARN("failed to update tablet auto inc seq", K(ret), K(autoinc_seq), K(replay_scn));
}
}
return ret;
}
}
}