BUGFIX: make sure write throttle trigger is greater than freeze trigger

This commit is contained in:
obdev
2022-11-22 10:35:49 +00:00
committed by wangzelin.wzl
parent 5429c2fc0a
commit 779289c1cd
4 changed files with 104 additions and 1 deletions

View File

@ -39,6 +39,7 @@
#include "share/schema/ob_schema_mgr.h" #include "share/schema/ob_schema_mgr.h"
#include "share/ob_lease_struct.h" #include "share/ob_lease_struct.h"
#include "share/ob_common_rpc_proxy.h" #include "share/ob_common_rpc_proxy.h"
#include "share/config/ob_config_helper.h"
#include "share/config/ob_config_manager.h" #include "share/config/ob_config_manager.h"
#include "share/inner_table/ob_inner_table_schema.h" #include "share/inner_table/ob_inner_table_schema.h"
#include "share/schema/ob_part_mgr_util.h" #include "share/schema/ob_part_mgr_util.h"
@ -8667,10 +8668,28 @@ int ObRootService::set_config_pre_hook(obrpc::ObAdminSetConfigArg &arg)
LOG_WARN("invalid argument", K(ret), K(arg)); LOG_WARN("invalid argument", K(ret), K(arg));
} }
FOREACH_X(item, arg.items_, OB_SUCCESS == ret) { FOREACH_X(item, arg.items_, OB_SUCCESS == ret) {
bool valid; bool valid = true;
if (item->name_.is_empty()) { if (item->name_.is_empty()) {
ret = OB_INVALID_ARGUMENT; ret = OB_INVALID_ARGUMENT;
LOG_WARN("empty config name", "item", *item, K(ret)); LOG_WARN("empty config name", "item", *item, K(ret));
} else if (0 == STRCMP(item->name_.ptr(), FREEZE_TRIGGER_PERCENTAGE)) {
// check write throttle percentage
for (int i = 0; i < item->tenant_ids_.count() && valid; i++) {
valid = valid && ObConfigFreezeTriggerIntChecker::check(item->tenant_ids_.at(i), *item);
if (!valid) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("config invalid", "item", *item, K(ret), K(i), K(item->tenant_ids_.at(i)));
}
}
} else if (0 == STRCMP(item->name_.ptr(), WRITING_THROTTLEIUNG_TRIGGER_PERCENTAGE)) {
// check freeze trigger
for (int i = 0; i < item->tenant_ids_.count() && valid; i++) {
valid = valid && ObConfigWriteThrottleTriggerIntChecker::check(item->tenant_ids_.at(i), *item);
if (!valid) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("config invalid", "item", *item, K(ret), K(i), K(item->tenant_ids_.at(i)));
}
}
} }
} }
return ret; return ret;

View File

@ -31,6 +31,7 @@
namespace oceanbase namespace oceanbase
{ {
using namespace share; using namespace share;
using namespace obrpc;
namespace common namespace common
{ {
@ -86,6 +87,62 @@ bool ObConfigEvenIntChecker::check(const ObConfigItem &t) const
return is_valid; return is_valid;
} }
bool ObConfigFreezeTriggerIntChecker::check(const uint64_t tenant_id,
const ObAdminSetConfigItem &t)
{
bool is_valid = false;
int64_t value = ObConfigIntParser::get(t.value_.ptr(), is_valid);
int64_t write_throttle_trigger = get_write_throttle_trigger_percentage_(tenant_id);
if (is_valid) {
is_valid = value > 0 && value < 100;
}
if (is_valid) {
is_valid = write_throttle_trigger != 0;
}
if (is_valid) {
is_valid = value < write_throttle_trigger;
}
return is_valid;
}
int64_t ObConfigFreezeTriggerIntChecker::get_write_throttle_trigger_percentage_(const uint64_t tenant_id)
{
int64_t percent = 0;
omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id));
if (tenant_config.is_valid()) {
percent = tenant_config->writing_throttling_trigger_percentage;
}
return percent;
}
bool ObConfigWriteThrottleTriggerIntChecker::check(const uint64_t tenant_id,
const ObAdminSetConfigItem &t)
{
bool is_valid = false;
int64_t value = ObConfigIntParser::get(t.value_.ptr(), is_valid);
int64_t freeze_trigger = get_freeze_trigger_percentage_(tenant_id);
if (is_valid) {
is_valid = value > 0 && value <= 100;
}
if (is_valid) {
is_valid = freeze_trigger != 0;
}
if (is_valid) {
is_valid = value > freeze_trigger;
}
return is_valid;
}
int64_t ObConfigWriteThrottleTriggerIntChecker::get_freeze_trigger_percentage_(const uint64_t tenant_id)
{
int64_t percent = 0;
omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id));
if (tenant_config.is_valid()) {
percent = tenant_config->freeze_trigger_percentage;
}
return percent;
}
bool ObConfigTabletSizeChecker::check(const ObConfigItem &t) const bool ObConfigTabletSizeChecker::check(const ObConfigItem &t) const
{ {
bool is_valid = false; bool is_valid = false;

View File

@ -21,6 +21,11 @@
namespace oceanbase namespace oceanbase
{ {
namespace obrpc
{
struct ObAdminSetConfigItem;
}
namespace common namespace common
{ {
class ObConfigItem; class ObConfigItem;
@ -157,6 +162,26 @@ private:
DISALLOW_COPY_AND_ASSIGN(ObConfigEvenIntChecker); DISALLOW_COPY_AND_ASSIGN(ObConfigEvenIntChecker);
}; };
class ObConfigFreezeTriggerIntChecker
{
public:
static bool check(const uint64_t tenant_id,
const obrpc::ObAdminSetConfigItem &t);
private:
static int64_t get_write_throttle_trigger_percentage_(const uint64_t tenant_id);
DISALLOW_COPY_AND_ASSIGN(ObConfigFreezeTriggerIntChecker);
};
class ObConfigWriteThrottleTriggerIntChecker
{
public:
static bool check(const uint64_t tenant_id,
const obrpc::ObAdminSetConfigItem &t);
private:
static int64_t get_freeze_trigger_percentage_(const uint64_t tenant_id);
DISALLOW_COPY_AND_ASSIGN(ObConfigWriteThrottleTriggerIntChecker);
};
class ObConfigTabletSizeChecker class ObConfigTabletSizeChecker
: public ObConfigChecker : public ObConfigChecker
{ {

View File

@ -50,6 +50,8 @@ const char* const EXTERNAL_KMS_INFO = "external_kms_info";
const char* const SSL_EXTERNAL_KMS_INFO = "ssl_external_kms_info"; const char* const SSL_EXTERNAL_KMS_INFO = "ssl_external_kms_info";
const char* const CLUSTER_ID = "cluster_id"; const char* const CLUSTER_ID = "cluster_id";
const char* const CLUSTER_NAME = "cluster"; const char* const CLUSTER_NAME = "cluster";
const char* const FREEZE_TRIGGER_PERCENTAGE = "freeze_trigger_percentage";
const char* const WRITING_THROTTLEIUNG_TRIGGER_PERCENTAGE = "writing_throttling_trigger_percentage";
class ObServerMemoryConfig; class ObServerMemoryConfig;
class ObServerConfig : public ObCommonConfig class ObServerConfig : public ObCommonConfig