[CP] Fix invalid mclock and Execute resource_manager related sql in transaction lock

This commit is contained in:
renju96 2023-10-25 07:12:47 +00:00 committed by ob-robot
parent 627c87191f
commit d60182837a
5 changed files with 112 additions and 103 deletions

View File

@ -357,7 +357,7 @@ int ObAllVirtualIOQuota::record_user_group(const uint64_t tenant_id, ObIOUsage &
io_usage.calculate_io_usage();
io_usage.get_io_usage(avg_iops, avg_size, avg_rt);
for (int64_t i = 0; i < io_config.group_num_; ++i) {
if (io_config.group_configs_.at(i).deleted_) {
if (io_config.group_configs_.at(i).deleted_ || io_config.group_configs_.at(i).cleared_) {
continue;
}
for (int64_t j = 0; OB_SUCC(ret) && j < static_cast<int>(ObIOMode::MAX_MODE); ++j) {
@ -608,7 +608,7 @@ int ObAllVirtualIOScheduler::init(const common::ObAddr &addr)
const ObTenantIOConfig &io_config = tenant_holder.get_ptr()->get_io_config();
int64_t group_num = tenant_holder.get_ptr()->get_group_num();
for (int64_t index = 0; OB_SUCC(ret) && index < group_num; ++index) {
if (io_config.group_configs_.at(index).deleted_) {
if (io_config.group_configs_.at(index).deleted_ || io_config.group_configs_.at(i).cleared_) {
continue;
}
ScheduleInfo item;

View File

@ -436,7 +436,7 @@ int ObTenantIOClock::update_io_clock(const int64_t index, const ObTenantIOConfig
const ObTenantIOConfig::GroupConfig &cur_config = io_config.group_configs_.at(index);
if (!group_clocks_.at(index).is_inited()) {
LOG_WARN("clock is not init", K(ret), K(index), K(group_clocks_.at(index)));
} else if (group_clocks_.at(index).is_stop() || cur_config.deleted_) {
} else if (group_clocks_.at(index).is_stop() || cur_config.deleted_ || cur_config.cleared_) {
// group has been deleted, ignore
} else if (!cur_config.is_valid()) {
LOG_WARN("config is not valid", K(ret), K(index), K(cur_config), K(group_clocks_.at(index)));

View File

@ -1149,7 +1149,7 @@ bool ObTenantIOConfig::is_valid() const
int64_t sum_min_percent = 0;
int64_t sum_weight_percent = 0;
for (int64_t i = 0; i < group_num_; ++i) {
if (group_configs_.at(i).is_valid() && !group_configs_.at(i).deleted_) {
if (group_configs_.at(i).is_valid() && !group_configs_.at(i).deleted_ && !group_configs_.at(i).cleared_) {
sum_min_percent += group_configs_.at(i).min_percent_;
sum_weight_percent += group_configs_.at(i).weight_percent_;
}

View File

@ -1202,6 +1202,7 @@ int ObTenantIOManager::delete_consumer_group_config(const int64_t group_id)
} else if (OB_STATE_NOT_MATCH == ret) {
// group delete twice
ret = OB_ERR_UNEXPECTED;
LOG_WARN("group delete twice", K(ret), K(index), K(group_id));
} else {
LOG_WARN("get index from map failed", K(ret), K(group_id), K(index));
}

View File

@ -133,41 +133,43 @@ int ObResourceManagerProxy::delete_plan(
const common::ObString &plan)
{
int ret = OB_SUCCESS;
ObMySQLTransaction trans;
TransGuard trans_guard(trans, tenant_id, ret);
if (trans_guard.ready()) {
int64_t affected_rows = 0;
ObSqlString sql;
// 删除 plan 时要级联删除 directive
const char *tname_directive = OB_ALL_RES_MGR_DIRECTIVE_TNAME;
const char *tname_plan = OB_ALL_RES_MGR_PLAN_TNAME;
if (OB_FAIL(sql.assign_fmt(
"DELETE /* REMOVE_RES_PLAN */ FROM %s "
"WHERE TENANT_ID = %ld AND PLAN = '%.*s'",
tname_plan, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id),
plan.length(), plan.ptr()))) {
LOG_WARN("fail append value", K(ret));
} else if (OB_FAIL(trans.write(
tenant_id,
sql.ptr(),
affected_rows))) {
trans.reset_last_error();
LOG_WARN("fail to execute sql", K(sql), K(ret));
} else if (1 != affected_rows) {
ret = OB_ERR_RES_PLAN_NOT_EXIST;
LOG_USER_ERROR(OB_ERR_RES_PLAN_NOT_EXIST, plan.length(), plan.ptr());
} else if (OB_FAIL(sql.assign_fmt(
"DELETE /* REMOVE_RES_PLAN */ FROM %s "
"WHERE TENANT_ID = %ld AND PLAN = '%.*s'",
tname_directive, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id),
plan.length(), plan.ptr()))) {
LOG_WARN("fail append value", K(ret));
} else if (OB_FAIL(trans.write(
tenant_id,
sql.ptr(),
affected_rows))) {
trans.reset_last_error();
LOG_WARN("fail to execute sql", K(sql), K(ret));
{
ObMySQLTransaction trans;
TransGuard trans_guard(trans, tenant_id, ret);
if (trans_guard.ready()) {
int64_t affected_rows = 0;
ObSqlString sql;
// 删除 plan 时要级联删除 directive
const char *tname_directive = OB_ALL_RES_MGR_DIRECTIVE_TNAME;
const char *tname_plan = OB_ALL_RES_MGR_PLAN_TNAME;
if (OB_FAIL(sql.assign_fmt(
"DELETE /* REMOVE_RES_PLAN */ FROM %s "
"WHERE TENANT_ID = %ld AND PLAN = '%.*s'",
tname_plan, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id),
plan.length(), plan.ptr()))) {
LOG_WARN("fail append value", K(ret));
} else if (OB_FAIL(trans.write(
tenant_id,
sql.ptr(),
affected_rows))) {
trans.reset_last_error();
LOG_WARN("fail to execute sql", K(sql), K(ret));
} else if (1 != affected_rows) {
ret = OB_ERR_RES_PLAN_NOT_EXIST;
LOG_USER_ERROR(OB_ERR_RES_PLAN_NOT_EXIST, plan.length(), plan.ptr());
} else if (OB_FAIL(sql.assign_fmt(
"DELETE /* REMOVE_RES_PLAN */ FROM %s "
"WHERE TENANT_ID = %ld AND PLAN = '%.*s'",
tname_directive, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id),
plan.length(), plan.ptr()))) {
LOG_WARN("fail append value", K(ret));
} else if (OB_FAIL(trans.write(
tenant_id,
sql.ptr(),
affected_rows))) {
trans.reset_last_error();
LOG_WARN("fail to execute sql", K(sql), K(ret));
}
}
}
if (OB_SUCC(ret)) {
@ -306,43 +308,46 @@ int ObResourceManagerProxy::delete_consumer_group(
const common::ObString &consumer_group)
{
int ret = OB_SUCCESS;
ObMySQLTransaction trans;
TransGuard trans_guard(trans, tenant_id, ret);
if (trans_guard.ready()) {
int64_t affected_rows = 0;
ObSqlString sql;
// 删除 group 时要级联删除 directive
const char *tname_consumer_group = OB_ALL_RES_MGR_CONSUMER_GROUP_TNAME;
const char *tname_directive = OB_ALL_RES_MGR_DIRECTIVE_TNAME;
if (OB_FAIL(sql.assign_fmt(
"DELETE /* REMOVE_RES_CONSUMER_GROUP */ FROM %s "
"WHERE TENANT_ID = %ld AND CONSUMER_GROUP = '%.*s'",
tname_consumer_group, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id),
consumer_group.length(), consumer_group.ptr()))) {
LOG_WARN("fail append value", K(ret));
} else if (OB_FAIL(trans.write(
tenant_id,
sql.ptr(),
affected_rows))) {
trans.reset_last_error();
LOG_WARN("fail to execute sql", K(sql), K(ret));
} else if (1 != affected_rows) {
ret = OB_ERR_CONSUMER_GROUP_NOT_EXIST;
LOG_USER_ERROR(OB_ERR_CONSUMER_GROUP_NOT_EXIST, consumer_group.length(), consumer_group.ptr());
} else if (OB_FAIL(sql.assign_fmt(
"DELETE /* REMOVE_RES_CONSUMER_GROUP */ FROM %s "
"WHERE TENANT_ID = %ld AND GROUP_OR_SUBPLAN = '%.*s'",
tname_directive, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id),
consumer_group.length(), consumer_group.ptr()))) {
LOG_WARN("fail append value", K(ret));
} else if (OB_FAIL(trans.write(
tenant_id,
sql.ptr(),
affected_rows))) {
trans.reset_last_error();
LOG_WARN("fail to execute sql", K(sql), K(ret));
{
ObMySQLTransaction trans;
TransGuard trans_guard(trans, tenant_id, ret);
if (trans_guard.ready()) {
int64_t affected_rows = 0;
ObSqlString sql;
// 删除 group 时要级联删除 directive
const char *tname_consumer_group = OB_ALL_RES_MGR_CONSUMER_GROUP_TNAME;
const char *tname_directive = OB_ALL_RES_MGR_DIRECTIVE_TNAME;
if (OB_FAIL(sql.assign_fmt(
"DELETE /* REMOVE_RES_CONSUMER_GROUP */ FROM %s "
"WHERE TENANT_ID = %ld AND CONSUMER_GROUP = '%.*s'",
tname_consumer_group, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id),
consumer_group.length(), consumer_group.ptr()))) {
LOG_WARN("fail append value", K(ret));
} else if (OB_FAIL(trans.write(
tenant_id,
sql.ptr(),
affected_rows))) {
trans.reset_last_error();
LOG_WARN("fail to execute sql", K(sql), K(ret));
} else if (1 != affected_rows) {
ret = OB_ERR_CONSUMER_GROUP_NOT_EXIST;
LOG_USER_ERROR(OB_ERR_CONSUMER_GROUP_NOT_EXIST, consumer_group.length(), consumer_group.ptr());
} else if (OB_FAIL(sql.assign_fmt(
"DELETE /* REMOVE_RES_CONSUMER_GROUP */ FROM %s "
"WHERE TENANT_ID = %ld AND GROUP_OR_SUBPLAN = '%.*s'",
tname_directive, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id),
consumer_group.length(), consumer_group.ptr()))) {
LOG_WARN("fail append value", K(ret));
} else if (OB_FAIL(trans.write(
tenant_id,
sql.ptr(),
affected_rows))) {
trans.reset_last_error();
LOG_WARN("fail to execute sql", K(sql), K(ret));
}
}
}
if (OB_SUCC(ret)) {
// 在这里inner sql之后就stop io_control的原因是,无法从内部表读到被删除group的信息
if (OB_FAIL(GCTX.cgroup_ctrl_->delete_group_iops(tenant_id, 1, consumer_group))) {
@ -986,7 +991,7 @@ int ObResourceManagerProxy::update_plan_directive(
!min_iops.is_null() &&
OB_SUCC(get_percentage("NEW_MIN_IOPS", min_iops, v))) {
new_iops_minimum = v;
ret = sql.append_fmt("%s MIN_IOPS=%ld", comma, v);
ret = sql.append_fmt("%s MIN_IOPS=%ld", comma, new_iops_minimum);
comma = ",";
}
if (OB_SUCC(ret) &&
@ -1002,7 +1007,7 @@ int ObResourceManagerProxy::update_plan_directive(
ret = OB_INVALID_CONFIG;
LOG_WARN("invalid iops config", K(ret), K(tenant_id), K(new_iops_minimum), K(new_iops_maximum));
} else {
ret = sql.append_fmt("%s MAX_IOPS=%ld", comma, v);
ret = sql.append_fmt("%s MAX_IOPS=%ld", comma, new_iops_maximum);
comma = ",";
}
}
@ -1043,35 +1048,38 @@ int ObResourceManagerProxy::delete_plan_directive(
const ObString &group)
{
int ret = OB_SUCCESS;
ObMySQLTransaction trans;
TransGuard trans_guard(trans, tenant_id, ret);
if (trans_guard.ready()) {
int64_t affected_rows = 0;
ObSqlString sql;
const char *tname = OB_ALL_RES_MGR_DIRECTIVE_TNAME;
bool exist = false;
if (OB_FAIL(check_if_plan_directive_exist(trans, tenant_id, plan, group, exist))) {
LOG_WARN("fail check if plan exist", K(tenant_id), K(plan), K(group), K(ret));
} else if (!exist) {
ret = OB_ERR_PLAN_DIRECTIVE_NOT_EXIST;
LOG_USER_ERROR(OB_ERR_PLAN_DIRECTIVE_NOT_EXIST,
plan.length(), plan.ptr(), group.length(), group.ptr());
} else if (OB_FAIL(sql.assign_fmt(
"DELETE /* REMOVE_PLAN_DIRECTIVE */ FROM %s "
"WHERE TENANT_ID = %ld AND PLAN = '%.*s' AND GROUP_OR_SUBPLAN = '%.*s'",
tname, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id),
plan.length(), plan.ptr(), group.length(), group.ptr()))) {
LOG_WARN("fail append value", K(ret));
} else if (OB_FAIL(trans.write(tenant_id,
sql.ptr(),
affected_rows))) {
trans.reset_last_error();
LOG_WARN("fail to execute sql", K(sql), K(ret));
} else if (affected_rows != 1) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("affected row value not expected", K(affected_rows), K(ret));
{
ObMySQLTransaction trans;
TransGuard trans_guard(trans, tenant_id, ret);
if (trans_guard.ready()) {
int64_t affected_rows = 0;
ObSqlString sql;
const char *tname = OB_ALL_RES_MGR_DIRECTIVE_TNAME;
bool exist = false;
if (OB_FAIL(check_if_plan_directive_exist(trans, tenant_id, plan, group, exist))) {
LOG_WARN("fail check if plan exist", K(tenant_id), K(plan), K(group), K(ret));
} else if (!exist) {
ret = OB_ERR_PLAN_DIRECTIVE_NOT_EXIST;
LOG_USER_ERROR(OB_ERR_PLAN_DIRECTIVE_NOT_EXIST,
plan.length(), plan.ptr(), group.length(), group.ptr());
} else if (OB_FAIL(sql.assign_fmt(
"DELETE /* REMOVE_PLAN_DIRECTIVE */ FROM %s "
"WHERE TENANT_ID = %ld AND PLAN = '%.*s' AND GROUP_OR_SUBPLAN = '%.*s'",
tname, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id),
plan.length(), plan.ptr(), group.length(), group.ptr()))) {
LOG_WARN("fail append value", K(ret));
} else if (OB_FAIL(trans.write(tenant_id,
sql.ptr(),
affected_rows))) {
trans.reset_last_error();
LOG_WARN("fail to execute sql", K(sql), K(ret));
} else if (affected_rows != 1) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("affected row value not expected", K(affected_rows), K(ret));
}
}
}
if (OB_SUCC(ret)) {
// 在这里inner sql之后就stop的原因是, 无法从内部表读到被删除group的信息
if (OB_FAIL(GCTX.cgroup_ctrl_->reset_group_iops(