diff --git a/src/observer/virtual_table/ob_all_virtual_io_status.cpp b/src/observer/virtual_table/ob_all_virtual_io_status.cpp index 7f3d4162b..1665eb00e 100644 --- a/src/observer/virtual_table/ob_all_virtual_io_status.cpp +++ b/src/observer/virtual_table/ob_all_virtual_io_status.cpp @@ -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(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; diff --git a/src/share/io/io_schedule/ob_io_mclock.cpp b/src/share/io/io_schedule/ob_io_mclock.cpp index 525d1548a..9b53a1edd 100644 --- a/src/share/io/io_schedule/ob_io_mclock.cpp +++ b/src/share/io/io_schedule/ob_io_mclock.cpp @@ -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))); diff --git a/src/share/io/ob_io_define.cpp b/src/share/io/ob_io_define.cpp index 677a1de5e..6875c56fd 100644 --- a/src/share/io/ob_io_define.cpp +++ b/src/share/io/ob_io_define.cpp @@ -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_; } diff --git a/src/share/io/ob_io_manager.cpp b/src/share/io/ob_io_manager.cpp index 9f5434942..99378e51c 100644 --- a/src/share/io/ob_io_manager.cpp +++ b/src/share/io/ob_io_manager.cpp @@ -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)); } diff --git a/src/share/resource_manager/ob_resource_manager_proxy.cpp b/src/share/resource_manager/ob_resource_manager_proxy.cpp index 36dbb7eb4..ec42cf1e1 100644 --- a/src/share/resource_manager/ob_resource_manager_proxy.cpp +++ b/src/share/resource_manager/ob_resource_manager_proxy.cpp @@ -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(