[CP] Mutual exclusion between S3 and archive_lag_target < 60s

This commit is contained in:
LoLolobster 2024-03-08 10:50:44 +00:00 committed by ob-robot
parent 51bf8231d0
commit bcb33900bf
6 changed files with 109 additions and 5 deletions

View File

@ -633,6 +633,7 @@ int ObLogArchiveDestConfigParser::check_before_update_inner_config(obrpc::ObSrvR
int ret = OB_SUCCESS;
ObBackupDestType::TYPE dest_type = ObBackupDestType::TYPE::DEST_TYPE_ARCHIVE_LOG;
ObBackupDestMgr dest_mgr;
ObBackupDest backup_dest;
bool is_running = false;
if (is_empty_) {
} else if (!type_.is_valid()) {
@ -648,10 +649,19 @@ int ObLogArchiveDestConfigParser::check_before_update_inner_config(obrpc::ObSrvR
ret = OB_NOT_SUPPORTED;
LOG_WARN("cannot change archive dest when archive is running.", K(ret), K_(backup_dest));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "change archive dest when archive is running is");
} else if (OB_FAIL(dest_mgr.init(tenant_id_, dest_type, backup_dest_, trans))) {
LOG_WARN("fail to update archive dest config", K(ret), K_(tenant_id));
} else if (OB_FAIL(dest_mgr.check_dest_validity(rpc_proxy, false/*need_format_file*/))) {
LOG_WARN("fail to update archive dest config", K(ret), K_(tenant_id));
} else if (OB_FAIL(backup_dest.set(backup_dest_))) {
LOG_WARN("fail to set backup dest", K(ret));
} else {
omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id_));
const int64_t lag_target = tenant_config.is_valid() ? tenant_config->archive_lag_target : 0L;
if (backup_dest.is_storage_type_s3() && MIN_LAG_TARGET_FOR_S3 > lag_target) {
ret = OB_OP_NOT_ALLOW;
LOG_USER_ERROR(OB_OP_NOT_ALLOW, "archive_lag_target is smaller than 60s, set log_archive_dest to S3 is");
} else if (OB_FAIL(dest_mgr.init(tenant_id_, dest_type, backup_dest_, trans))) {
LOG_WARN("fail to update archive dest config", K(ret), K_(tenant_id));
} else if (OB_FAIL(dest_mgr.check_dest_validity(rpc_proxy, false/*need_format_file*/))) {
LOG_WARN("fail to update archive dest config", K(ret), K_(tenant_id));
}
}
return ret;
}

View File

@ -100,6 +100,7 @@ const int64_t OB_MAX_RESTORE_TYPE_LEN = 8; // LOCATION/SERVICE/RAWPATH
const int64_t OB_MAX_BACKUP_SET_NUM = 1000000;
const int64_t OB_MAX_BACKUP_PIECE_NUM = 1000000;
const int64_t MIN_LAG_TARGET_FOR_S3 = 60 * 1000 * 1000UL/*60s*/;
static constexpr const int64_t MAX_FAKE_PROVIDE_ITEM_COUNT = 128;
static constexpr const int64_t DEFAULT_FAKE_BATCH_COUNT = 32;
@ -918,6 +919,7 @@ public:
bool is_valid() const;
bool is_root_path_equal(const ObBackupDest &backup_dest) const;
int is_backup_path_equal(const ObBackupDest &backup_dest, bool &is_equal) const;
bool is_storage_type_s3(){ return OB_ISNULL(storage_info_) ? false : ObStorageType::OB_STORAGE_S3 == storage_info_->get_type(); }
int get_backup_dest_str(char *buf, const int64_t buf_size) const;
int get_backup_dest_str_with_primary_attr(char *buf, const int64_t buf_size) const;
int get_backup_path_str(char *buf, const int64_t buf_size) const;

View File

@ -33,6 +33,7 @@
#include "share/config/ob_config_mode_name_def.h"
#include "share/schema/ob_schema_struct.h"
#include "share/ob_ddl_common.h"
#include "share/backup/ob_archive_persist_helper.h"
namespace oceanbase
{
using namespace share;
@ -1168,5 +1169,40 @@ bool ObConfigMigrationChooseSourceChecker::check(const ObConfigItem &t) const
|| 0 == v_str.case_compare("region");
}
bool ObConfigArchiveLagTargetChecker::check(const uint64_t tenant_id, const ObAdminSetConfigItem &t)
{
bool is_valid = false;
int ret = OB_SUCCESS;
int64_t value = ObConfigTimeParser::get(t.value_.ptr(), is_valid);
ObArchivePersistHelper archive_op;
ObBackupPathString archive_dest_str;
ObBackupDest archive_dest;
ObStorageType device_type;
const int64_t dest_no = 0;
const bool lock = false;
if (is_valid) {
if (OB_FAIL(archive_op.init(tenant_id))) {
OB_LOG(WARN, "fail to init archive persist helper", K(ret), K(tenant_id));
} else if (OB_FAIL(archive_op.get_archive_dest(*GCTX.sql_proxy_, lock, dest_no, archive_dest_str))) {
if (OB_ENTRY_NOT_EXIST != ret) {
OB_LOG(WARN, "failed to get archive dest", K(ret), K(tenant_id));
} else { // no dest exist, set archive_lag_target is disallowed
is_valid = false;
LOG_USER_ERROR(OB_OP_NOT_ALLOW, "log_archive_dest has not been set, set archive_lag_target is");
}
} else if (OB_FAIL(archive_dest.set(archive_dest_str))) {
OB_LOG(WARN, "fail to set archive dest", K(ret), K(archive_dest_str));
} else if (archive_dest.is_storage_type_s3()) {
is_valid = MIN_LAG_TARGET_FOR_S3 <= value;
if (!is_valid) {
LOG_USER_ERROR(OB_OP_NOT_ALLOW, "set archive_lag_target smaller than 60s when log_archive_dest is S3 is");
}
} else {
is_valid = true;
}
}
return is_valid;
}
} // end of namepace common
} // end of namespace oceanbase

View File

@ -753,6 +753,15 @@ private:
DISALLOW_COPY_AND_ASSIGN(ObConfigMigrationChooseSourceChecker);
};
class ObConfigArchiveLagTargetChecker {
public:
ObConfigArchiveLagTargetChecker(){}
virtual ~ObConfigArchiveLagTargetChecker(){}
static bool check(const uint64_t tenant_id, const obrpc::ObAdminSetConfigItem &t);
private:
DISALLOW_COPY_AND_ASSIGN(ObConfigArchiveLagTargetChecker);
};
typedef __ObConfigContainer<ObConfigStringKey,
ObConfigItem, OB_MAX_CONFIG_NUMBER> ObConfigContainer;
} // namespace common

View File

@ -65,6 +65,7 @@ const char* const PARTITION_BALANCE_SCHEDULE_INTERVAL = "partition_balance_sched
const char* const BALANCER_IDLE_TIME = "balancer_idle_time";
const char* const LOG_DISK_UTILIZATION_LIMIT_THRESHOLD = "log_disk_utilization_limit_threshold";
const char* const LOG_DISK_THROTTLING_PERCENTAGE = "log_disk_throttling_percentage";
const char* const ARCHIVE_LAG_TARGET = "archive_lag_target";
class ObServerMemoryConfig;

View File

@ -2253,6 +2253,40 @@ int ObSetConfigResolver::resolve(const ParseNode &parse_tree)
LOG_WARN("fail to check param valid", K(ret));
}
#endif
} else if (0 == config_name.case_compare(ARCHIVE_LAG_TARGET)) {
ObSArray <uint64_t> tenant_ids;
bool affect_all;
bool affect_all_user;
bool affect_all_meta;
if (OB_FAIL(ObAlterSystemResolverUtil::resolve_tenant(*n,
tenant_id,
tenant_ids,
affect_all,
affect_all_user,
affect_all_meta))) {
LOG_WARN("fail to get reslove tenant", K(ret), "exec_tenant_id", tenant_id);
} else if (affect_all || affect_all_user || affect_all_meta) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("all/all_user/all_meta is not supported by ALTER SYSTEM SET ARCHILVE_LAG_TARGET",
KR(ret), K(affect_all), K(affect_all_user), K(affect_all_meta));
LOG_USER_ERROR(OB_NOT_SUPPORTED,
"use all/all_user/all_meta in 'ALTER SYSTEM SET ARCHILVE_LAG_TARGET' syntax is");
} else if (tenant_ids.empty()) {
if (OB_FAIL(tenant_ids.push_back(tenant_id))) {
LOG_WARN("fail to push back", K(ret), K(tenant_id));
}
}
if (OB_SUCC(ret) && !tenant_ids.empty()) {
bool valid = true;
for (int i = 0; i < tenant_ids.count() && valid; i++) {
const uint64_t tenant_id = tenant_ids.at(i);
valid = valid && ObConfigArchiveLagTargetChecker::check(tenant_id, item);
if (!valid) {
ret = OB_OP_NOT_ALLOW; //log_user_error is handled in checker
LOG_WARN("can not set archive_lag_target", "item", item, K(ret), K(i), K(tenant_id));
}
}
}
}
}
} else {
@ -2260,7 +2294,13 @@ int ObSetConfigResolver::resolve(const ParseNode &parse_tree)
LOG_WARN("resolve tenant name failed", K(ret));
break;
}
} // if
} else if (OB_SUCC(ret) && (0 == STRCASECMP(item.name_.ptr(), ARCHIVE_LAG_TARGET))) {
bool valid = ObConfigArchiveLagTargetChecker::check(item.exec_tenant_id_, item);
if (!valid) {
ret = OB_OP_NOT_ALLOW;
LOG_WARN("can not set archive_lag_target", "item", item, K(ret), "tenant_id", item.exec_tenant_id_);
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(alter_system_set_reset_constraint_check_and_add_item_mysql_mode(stmt->get_rpc_arg(), item, session_info_))) {
@ -3997,6 +4037,12 @@ int ObAlterSystemSetResolver::resolve(const ParseNode &parse_tree)
if (OB_FAIL(alter_system_set_reset_constraint_check_and_add_item_oracle_mode(
setconfig_stmt->get_rpc_arg(), item, tenant_id, schema_checker_))) {
LOG_WARN("constraint check failed", K(ret));
} else if (OB_SUCC(ret) && (0 == STRCASECMP(item.name_.ptr(), ARCHIVE_LAG_TARGET))) {
bool valid = ObConfigArchiveLagTargetChecker::check(item.exec_tenant_id_, item);
if (!valid) {
ret = OB_OP_NOT_ALLOW;
LOG_WARN("can not set archive_lag_target", "item", item, K(ret), "tenant_id", item.exec_tenant_id_);
}
}
}
}