[CP] Mutual exclusion between S3 and archive_lag_target < 60s
This commit is contained in:
parent
51bf8231d0
commit
bcb33900bf
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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_);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user