[FEAT MERGE] Implement tenant cloning mechanism
Co-authored-by: lalalafeier <wufeifei2023@163.com> Co-authored-by: wanyue-wy <345657357@qq.com> Co-authored-by: joseph12138 <17862707376@163.com>
This commit is contained in:
@ -683,7 +683,8 @@ int ObLSServiceHelper::revision_to_equal_status_(const ObLSStatusMachineParamete
|
||||
ls_info.get_ls_group_id(),
|
||||
ls_info.get_create_scn(),
|
||||
working_sw_status,
|
||||
tenant_ls_info, trans, ls_info.get_ls_flag()))) {
|
||||
tenant_ls_info, trans, ls_info.get_ls_flag(),
|
||||
OB_INVALID_TENANT_ID/*source_tenant_id*/))) {
|
||||
LOG_WARN("failed to create new ls in trans", KR(ret), K(ls_info), K(tenant_ls_info), K(working_sw_status));
|
||||
}
|
||||
END_TRANSACTION(trans);
|
||||
@ -821,7 +822,8 @@ int ObLSServiceHelper::create_new_ls_in_trans(
|
||||
const share::ObTenantSwitchoverStatus &working_sw_status,
|
||||
ObTenantLSInfo& tenant_ls_info,
|
||||
ObMySQLTransaction &trans,
|
||||
const share::ObLSFlag &ls_flag)
|
||||
const share::ObLSFlag &ls_flag,
|
||||
const uint64_t source_tenant_id)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
int64_t info_index = OB_INVALID_INDEX_INT64;
|
||||
@ -845,6 +847,144 @@ int ObLSServiceHelper::create_new_ls_in_trans(
|
||||
ObLSLifeAgentManager ls_life_agent(*GCTX.sql_proxy_);
|
||||
ObSqlString zone_priority;
|
||||
uint64_t unit_group_id = 0;
|
||||
if (OB_INVALID_TENANT_ID == source_tenant_id) {
|
||||
if (OB_FAIL(construct_unit_group_id_and_primary_zone_(
|
||||
ls_id,
|
||||
ls_group_id,
|
||||
ls_flag,
|
||||
tenant_ls_info,
|
||||
unit_group_id,
|
||||
primary_zone))) {
|
||||
LOG_WARN("fail to construct unit group id and primary zone", KR(ret), K(ls_id), K(ls_group_id), K(ls_flag), K(tenant_ls_info));
|
||||
}
|
||||
} else {
|
||||
// for clone tenant
|
||||
if (OB_FAIL(construct_unit_group_id_and_primary_zone_for_clone_tenant_(ls_id, source_tenant_id, tenant_id, unit_group_id, primary_zone))) {
|
||||
LOG_WARN("fail to construct unit group id and primary zone for clone tenant", KR(ret), K(ls_id), K(source_tenant_id), K(tenant_id));
|
||||
}
|
||||
}
|
||||
|
||||
if (FAILEDx(new_info.init(tenant_id, ls_id,
|
||||
ls_group_id,
|
||||
share::OB_LS_CREATING,
|
||||
unit_group_id,
|
||||
primary_zone, ls_flag))) {
|
||||
LOG_WARN("failed to init new info", KR(ret), K(tenant_id), K(unit_group_id),
|
||||
K(ls_id), K(ls_group_id), K(group_info), K(primary_zone), K(ls_flag));
|
||||
} else if (OB_FAIL(ObTenantThreadHelper::get_zone_priority(primary_zone,
|
||||
*tenant_ls_info.get_tenant_schema(), zone_priority))) {
|
||||
LOG_WARN("failed to get normalize primary zone", KR(ret), K(primary_zone), K(zone_priority));
|
||||
} else if (OB_FAIL(ls_life_agent.create_new_ls_in_trans(new_info, create_scn,
|
||||
zone_priority.string(), working_sw_status, trans))) {
|
||||
LOG_WARN("failed to insert ls info", KR(ret), K(new_info), K(create_scn), K(zone_priority));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLSServiceHelper::construct_unit_group_id_and_primary_zone_for_clone_tenant_(
|
||||
const share::ObLSID &ls_id,
|
||||
const uint64_t source_tenant_id,
|
||||
const uint64_t tenant_id,
|
||||
uint64_t &unit_group_id,
|
||||
ObZone &primary_zone)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
uint64_t source_unit_group_id = OB_INVALID_ID;
|
||||
unit_group_id = OB_INVALID_ID;
|
||||
primary_zone.reset();
|
||||
if (OB_UNLIKELY(!ls_id.is_valid())
|
||||
|| OB_UNLIKELY(OB_INVALID_TENANT_ID == source_tenant_id)
|
||||
|| OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id)
|
||||
|| OB_ISNULL(GCTX.sql_proxy_)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("ls id is invalid", KR(ret), K(ls_id), K(source_tenant_id), K(tenant_id), KP(GCTX.sql_proxy_));
|
||||
} else {
|
||||
// construct primary zone
|
||||
share::ObLSStatusInfo ls_status_info;
|
||||
MTL_SWITCH(OB_SYS_TENANT_ID) {
|
||||
share::ObLSStatusOperator ls_status_operator;
|
||||
if (OB_FAIL(ls_status_operator.get_ls_status_info(source_tenant_id, ls_id, ls_status_info, *GCTX.sql_proxy_))) {
|
||||
LOG_WARN("fail to get all ls status", KR(ret), K(source_tenant_id), K(ls_id), K(ls_status_info));
|
||||
} else if (OB_UNLIKELY(!ls_status_info.is_valid())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("source ls status info is invalid", KR(ret), K(ls_status_info));
|
||||
} else if (OB_FAIL(primary_zone.assign(ls_status_info.primary_zone_))) {
|
||||
LOG_WARN("fail to assign primary zone", KR(ret), K(ls_status_info));
|
||||
} else {
|
||||
source_unit_group_id = ls_status_info.unit_group_id_;
|
||||
}
|
||||
}
|
||||
// construct sql to fetch unit group id
|
||||
ObSqlString sql;
|
||||
const uint64_t exec_tenant_id = OB_SYS_TENANT_ID;
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (0 == source_unit_group_id) {
|
||||
unit_group_id = 0;
|
||||
} else if (OB_FAIL(sql.assign_fmt("SELECT DISTINCT b.unit_group_id FROM "
|
||||
"(SELECT svr_ip, svr_port FROM %s WHERE tenant_id = %ld AND unit_group_id = %ld) as a "
|
||||
"INNER JOIN "
|
||||
"(SELECT * FROM %s WHERE tenant_id = %ld) as b "
|
||||
"ON a.svr_ip = b.svr_ip AND a.svr_port = b.svr_port",
|
||||
OB_DBA_OB_UNITS_TNAME, source_tenant_id, source_unit_group_id,
|
||||
OB_DBA_OB_UNITS_TNAME, tenant_id))) {
|
||||
LOG_WARN("fail to construct sql to fetch unit group id for new log stream", KR(ret),
|
||||
K(source_tenant_id), K(tenant_id), K(source_unit_group_id));
|
||||
} else {
|
||||
HEAP_VAR(ObMySQLProxy::MySQLResult, res) {
|
||||
common::sqlclient::ObMySQLResult *result = NULL;
|
||||
if (OB_FAIL(GCTX.sql_proxy_->read(res, exec_tenant_id, sql.ptr()))) {
|
||||
LOG_WARN("failed to read", KR(ret), K(exec_tenant_id), K(sql));
|
||||
} else if (OB_ISNULL(result = res.get_result())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("failed to get sql result", KR(ret), K(sql));
|
||||
} else {
|
||||
ret = result->next();
|
||||
if (OB_ITER_END == ret) {
|
||||
ret = OB_ENTRY_NOT_EXIST;
|
||||
LOG_WARN("unit group id not found", KR(ret), K(sql));
|
||||
} else if (OB_FAIL(ret)) {
|
||||
LOG_WARN("failed to get unit group id", KR(ret), K(sql));
|
||||
} else {
|
||||
EXTRACT_INT_FIELD_MYSQL(*result, "unit_group_id", unit_group_id, uint64_t);
|
||||
if (OB_FAIL(ret)) {
|
||||
LOG_WARN("fail to get unit group id from result", KR(ret));
|
||||
} else if (OB_UNLIKELY(OB_INVALID_ID == unit_group_id)) {
|
||||
ret = OB_STATE_NOT_MATCH;
|
||||
LOG_WARN("unexpected unit group id", KR(ret), K(sql), K(unit_group_id));
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_ITER_END != result->next()) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expect only one row", KR(ret), K(sql));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLSServiceHelper::construct_unit_group_id_and_primary_zone_(
|
||||
const share::ObLSID &ls_id,
|
||||
const uint64_t ls_group_id,
|
||||
const share::ObLSFlag &ls_flag,
|
||||
ObTenantLSInfo &tenant_ls_info,
|
||||
uint64_t &unit_group_id,
|
||||
ObZone &primary_zone)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
unit_group_id = 0;
|
||||
primary_zone.reset();
|
||||
if (OB_UNLIKELY(!ls_id.is_valid()
|
||||
|| OB_INVALID_ID == ls_group_id
|
||||
|| !ls_flag.is_valid())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("ls id is invalid", KR(ret), K(ls_id), K(ls_group_id), K(ls_flag));
|
||||
} else {
|
||||
ObLSGroupInfo group_info;
|
||||
if (0 == ls_group_id) {
|
||||
unit_group_id = 0;
|
||||
if (!ls_flag.is_duplicate_ls()) {
|
||||
@ -880,21 +1020,6 @@ int ObLSServiceHelper::create_new_ls_in_trans(
|
||||
} else {
|
||||
LOG_WARN("failed to get ls group info", KR(ret), K(ls_group_id), K(tenant_ls_info));
|
||||
}
|
||||
|
||||
if (FAILEDx(new_info.init(tenant_id, ls_id,
|
||||
ls_group_id,
|
||||
share::OB_LS_CREATING,
|
||||
unit_group_id,
|
||||
primary_zone, ls_flag))) {
|
||||
LOG_WARN("failed to init new info", KR(ret), K(tenant_id), K(unit_group_id),
|
||||
K(ls_id), K(ls_group_id), K(group_info), K(primary_zone), K(ls_flag));
|
||||
} else if (OB_FAIL(ObTenantThreadHelper::get_zone_priority(primary_zone,
|
||||
*tenant_ls_info.get_tenant_schema(), zone_priority))) {
|
||||
LOG_WARN("failed to get normalize primary zone", KR(ret), K(primary_zone), K(zone_priority));
|
||||
} else if (OB_FAIL(ls_life_agent.create_new_ls_in_trans(new_info, create_scn,
|
||||
zone_priority.string(), working_sw_status, trans))) {
|
||||
LOG_WARN("failed to insert ls info", KR(ret), K(new_info), K(create_scn), K(zone_priority));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user