support tenant config compatible dump to file before effective in memory
This commit is contained in:
parent
a401951741
commit
323d256e7a
@ -347,7 +347,7 @@ int ObTenantConfig::update_local(int64_t expected_version, ObMySQLProxy::MySQLRe
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(read_config())) {
|
||||
LOG_ERROR("Read tenant config failed", K_(tenant_id), K(ret));
|
||||
} else if (save2file && OB_FAIL(config_mgr_->dump2file())) {
|
||||
} else if (save2file && OB_FAIL(config_mgr_->dump2file(tenant_id_))) {
|
||||
LOG_WARN("Dump to file failed", K(ret));
|
||||
}
|
||||
print();
|
||||
@ -357,6 +357,23 @@ int ObTenantConfig::update_local(int64_t expected_version, ObMySQLProxy::MySQLRe
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTenantConfig::read_dump_config(int64_t tenant_id)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObConfigItem *const *pp_item = NULL;
|
||||
DRWLock::WRLockGuardRetryTimeout guard(lock_, LOCK_TIMEOUT);
|
||||
if (OB_ISNULL(pp_item = container_.get(ObConfigStringKey(COMPATIBLE)))) {
|
||||
ret = OB_INVALID_CONFIG;
|
||||
LOG_WARN("Invalid config string", K(tenant_id), K(ret));
|
||||
} else if (!(*pp_item)->set_value((*pp_item)->spfile_str())) {
|
||||
ret = OB_INVALID_CONFIG;
|
||||
LOG_WARN("Invalid config value", K(tenant_id), K((*pp_item)->spfile_str()), K(ret));
|
||||
} else {
|
||||
LOG_INFO("read dump config succ", K(tenant_id), K((*pp_item)->spfile_str()), K((*pp_item)->str()));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTenantConfig::add_extra_config(const char *config_str,
|
||||
int64_t version /* = 0 */ ,
|
||||
bool check_name /* = false */)
|
||||
@ -381,6 +398,7 @@ int ObTenantConfig::add_extra_config(const char *config_str,
|
||||
buf[config_str_length] = '\0';
|
||||
DRWLock::WRLockGuardRetryTimeout guard(lock_, LOCK_TIMEOUT);
|
||||
token = STRTOK_R(buf, ",\n", &saveptr);
|
||||
const ObString compatible_cfg(COMPATIBLE);
|
||||
while (OB_SUCC(ret) && OB_LIKELY(NULL != token)) {
|
||||
char *saveptr_one = NULL;
|
||||
const char *name = NULL;
|
||||
@ -411,20 +429,31 @@ int ObTenantConfig::add_extra_config(const char *config_str,
|
||||
LOG_WARN("Invalid config string, no such config item", K(name), K(value), K(ret));
|
||||
}
|
||||
if (OB_FAIL(ret) || OB_ISNULL(pp_item)) {
|
||||
} else if (!(*pp_item)->set_value(value)) {
|
||||
ret = OB_INVALID_CONFIG;
|
||||
LOG_WARN("Invalid config value", K(name), K(value), K(ret));
|
||||
} else if (!(*pp_item)->check()) {
|
||||
ret = OB_INVALID_CONFIG;
|
||||
const char* range = (*pp_item)->range();
|
||||
if (OB_ISNULL(range) || strlen(range) == 0) {
|
||||
LOG_ERROR("Invalid config, value out of range", K(name), K(value), K(ret));
|
||||
} else if (compatible_cfg.case_compare(name) == 0) {
|
||||
if (!(*pp_item)->set_dump_value(value)) {
|
||||
ret = OB_INVALID_CONFIG;
|
||||
LOG_WARN("Invalid config value", K(name), K(value), K(ret));
|
||||
} else {
|
||||
_LOG_ERROR("Invalid config, value out of %s (for reference only). name=%s, value=%s, ret=%d", range, name, value, ret);
|
||||
(*pp_item)->set_dump_value_updated();
|
||||
(*pp_item)->set_version(version);
|
||||
LOG_INFO("Load tenant config dump value succ", K(name), K((*pp_item)->spfile_str()), K((*pp_item)->str()));
|
||||
}
|
||||
} else {
|
||||
(*pp_item)->set_version(version);
|
||||
LOG_INFO("Load tenant config succ", K(name), K(value));
|
||||
if (!(*pp_item)->set_value(value)) {
|
||||
ret = OB_INVALID_CONFIG;
|
||||
LOG_WARN("Invalid config value", K(name), K(value), K(ret));
|
||||
} else if (!(*pp_item)->check()) {
|
||||
ret = OB_INVALID_CONFIG;
|
||||
const char* range = (*pp_item)->range();
|
||||
if (OB_ISNULL(range) || strlen(range) == 0) {
|
||||
LOG_ERROR("Invalid config, value out of range", K(name), K(value), K(ret));
|
||||
} else {
|
||||
_LOG_ERROR("Invalid config, value out of %s (for reference only). name=%s, value=%s, ret=%d", range, name, value, ret);
|
||||
}
|
||||
} else {
|
||||
(*pp_item)->set_version(version);
|
||||
LOG_INFO("Load tenant config succ", K(name), K(value));
|
||||
}
|
||||
}
|
||||
token = STRTOK_R(NULL, ",\n", &saveptr);
|
||||
}
|
||||
|
@ -85,6 +85,7 @@ public:
|
||||
int wrunlock();
|
||||
|
||||
int read_config();
|
||||
int read_dump_config(int64_t tenant_id);
|
||||
uint64_t get_tenant_id() const { return tenant_id_; }
|
||||
int64_t get_current_version() const { return current_version_; }
|
||||
const TenantConfigUpdateTask &get_update_task() const { return update_task_; }
|
||||
|
@ -256,7 +256,7 @@ int ObTenantConfigMgr::init_tenant_config(const obrpc::ObTenantConfigArg &arg)
|
||||
LOG_WARN("fail to add tenant config", KR(ret), K(arg));
|
||||
} else if (OB_FAIL(add_extra_config(arg))) {
|
||||
LOG_WARN("fail to add extra config", KR(ret), K(arg));
|
||||
} else if (OB_FAIL(dump2file())) {
|
||||
} else if (OB_FAIL(dump2file(arg.tenant_id_))) {
|
||||
LOG_WARN("fail to dump config to file", KR(ret), K(arg));
|
||||
}
|
||||
return ret;
|
||||
@ -418,11 +418,28 @@ void ObTenantConfigMgr::print() const
|
||||
} // for
|
||||
}
|
||||
|
||||
int ObTenantConfigMgr::dump2file(const char *path) const
|
||||
int ObTenantConfigMgr::dump2file(const int64_t tenant_id)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_SUCC(sys_config_mgr_->dump2file(path))) {
|
||||
ret = sys_config_mgr_->config_backup();
|
||||
if (OB_FAIL(sys_config_mgr_->dump2file())) {
|
||||
LOG_WARN("failed to dump2file", K(ret));
|
||||
} else if (OB_FAIL(sys_config_mgr_->config_backup())) {
|
||||
LOG_WARN("failed to dump2file backup", K(ret));
|
||||
} else if (OB_FAIL(read_dump_config(tenant_id))) {
|
||||
LOG_WARN("failed to read_dump_config", K(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTenantConfigMgr::read_dump_config(int64_t tenant_id)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
DRWLock::RDLockGuard guard(rwlock_);
|
||||
ObTenantConfig *config = nullptr;
|
||||
if (OB_FAIL(config_map_.get_refactored(ObTenantID(tenant_id), config))) {
|
||||
LOG_WARN("No tenant config found", K(tenant_id), K(ret));
|
||||
} else {
|
||||
ret = config->read_dump_config(tenant_id);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -131,7 +131,8 @@ public:
|
||||
int64_t get_tenant_newest_version(uint64_t tenant_id) const;
|
||||
int64_t get_tenant_current_version(uint64_t tenant_id) const;
|
||||
void print() const;
|
||||
int dump2file(const char *path = nullptr) const;
|
||||
int dump2file(const int64_t tenant_id = 0);
|
||||
int read_dump_config(const int64_t tenant_id);
|
||||
|
||||
void refresh_config_version_map(const common::ObIArray<uint64_t> &tenants);
|
||||
void reset_version_has_refreshed() { version_has_refreshed_ = false; }
|
||||
|
@ -56,11 +56,12 @@ const char *log_archive_encryption_algorithm_values[] =
|
||||
// ObConfigItem
|
||||
ObConfigItem::ObConfigItem()
|
||||
: ck_(NULL), version_(0), dumped_version_(0), inited_(false), initial_value_set_(false),
|
||||
value_updated_(false), value_valid_(false), name_str_(nullptr), info_str_(nullptr),
|
||||
value_updated_(false), dump_value_updated_(false), value_valid_(false), name_str_(nullptr), info_str_(nullptr),
|
||||
range_str_(nullptr), lock_()
|
||||
{
|
||||
MEMSET(value_str_, 0, sizeof(value_str_));
|
||||
MEMSET(value_reboot_str_, 0, sizeof(value_reboot_str_));
|
||||
MEMSET(value_dump_str_, 0, sizeof(value_dump_str_));
|
||||
}
|
||||
|
||||
ObConfigItem::~ObConfigItem()
|
||||
|
@ -106,6 +106,21 @@ public:
|
||||
ret = databuff_printf(value_reboot_str_, sizeof(value_reboot_str_), pos, "%s", str);
|
||||
return ret == OB_SUCCESS;
|
||||
}
|
||||
bool set_dump_value(const char *str)
|
||||
{
|
||||
int64_t pos = 0;
|
||||
int ret = OB_SUCCESS;
|
||||
ret = databuff_printf(value_dump_str_, sizeof(value_dump_str_), pos, "%s", str);
|
||||
return ret == OB_SUCCESS;
|
||||
}
|
||||
void set_dump_value_updated()
|
||||
{
|
||||
dump_value_updated_ = true;
|
||||
}
|
||||
bool dump_value_updated() const
|
||||
{
|
||||
return dump_value_updated_;
|
||||
}
|
||||
void set_value_updated()
|
||||
{
|
||||
value_updated_ = true;
|
||||
@ -138,7 +153,9 @@ public:
|
||||
{
|
||||
const char *ret = nullptr;
|
||||
ObLatchRGuard rd_guard(const_cast<ObLatch&>(lock_), ObLatchIds::CONFIG_LOCK);
|
||||
if (reboot_effective() && is_initial_value_set()) {
|
||||
if (dump_value_updated()) {
|
||||
ret = value_dump_str_;
|
||||
} else if (reboot_effective() && is_initial_value_set()) {
|
||||
ret = value_reboot_str_;
|
||||
} else {
|
||||
ret = value_str_;
|
||||
@ -191,9 +208,11 @@ protected:
|
||||
bool inited_;
|
||||
bool initial_value_set_;
|
||||
bool value_updated_;
|
||||
bool dump_value_updated_;
|
||||
bool value_valid_;
|
||||
char value_str_[OB_MAX_CONFIG_VALUE_LEN];
|
||||
char value_reboot_str_[OB_MAX_CONFIG_VALUE_LEN];
|
||||
char value_dump_str_[OB_MAX_CONFIG_VALUE_LEN];
|
||||
const char* name_str_;
|
||||
const char* info_str_;
|
||||
const char* range_str_;
|
||||
|
@ -52,6 +52,7 @@ const char* const CLUSTER_ID = "cluster_id";
|
||||
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";
|
||||
const char* const COMPATIBLE = "compatible";
|
||||
class ObServerMemoryConfig;
|
||||
|
||||
class ObServerConfig : public ObCommonConfig
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
#include "share/config/ob_system_config.h"
|
||||
#include "share/config/ob_config.h"
|
||||
#include "share/config/ob_server_config.h"
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
@ -342,7 +343,20 @@ int ObSystemConfig::read_config(const ObSystemConfigKey &key,
|
||||
}
|
||||
}
|
||||
|
||||
if (item.reboot_effective()) {
|
||||
const ObString compatible_cfg(COMPATIBLE);
|
||||
if (compatible_cfg.case_compare(key.name()) == 0) {
|
||||
if (!item.set_dump_value(pvalue->value())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
SHARE_LOG(WARN, "set config item dump value failed",
|
||||
K(ret), K(key.name()), K(pvalue->value()), K(version));
|
||||
} else {
|
||||
item.set_value_updated();
|
||||
item.set_dump_value_updated();
|
||||
item.set_version(version);
|
||||
SHARE_LOG(INFO, "set config item dump value success",
|
||||
K(ret), K(key.name()), K(item.spfile_str()), K(item.str()), K(version));
|
||||
}
|
||||
} else if (item.reboot_effective()) {
|
||||
// 以 STATIC_EFFECTIVE 的 stack_size 举例说明:
|
||||
// > show parameters like 'stack_size'
|
||||
// stack_size = 4M
|
||||
|
Loading…
x
Reference in New Issue
Block a user