This is an automated email from the ASF dual-hosted git repository.
dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new c4732ca7088 [improve](cloud) unify snapshot properties to enum name
(#56337)
c4732ca7088 is described below
commit c4732ca70887607c118623761feac53e7d1f6589
Author: walter <[email protected]>
AuthorDate: Fri Sep 26 15:27:34 2025 +0800
[improve](cloud) unify snapshot properties to enum name (#56337)
---
cloud/src/meta-service/meta_service_http.cpp | 14 +++
cloud/src/meta-service/meta_service_resource.cpp | 127 +++++++++------------
cloud/test/meta_service_test.cpp | 100 +++++++++++-----
.../AdminSetAutoClusterSnapshotCommand.java | 10 +-
...dminSetClusterSnapshotFeatureSwitchCommand.java | 3 +-
gensrc/proto/cloud.proto | 10 +-
6 files changed, 162 insertions(+), 102 deletions(-)
diff --git a/cloud/src/meta-service/meta_service_http.cpp
b/cloud/src/meta-service/meta_service_http.cpp
index 54588ff4980..7eaa7dd6fd3 100644
--- a/cloud/src/meta-service/meta_service_http.cpp
+++ b/cloud/src/meta-service/meta_service_http.cpp
@@ -678,6 +678,20 @@ static HttpResponse
process_set_snapshot_property(MetaServiceImpl* service,
brpc::Controller* ctrl) {
AlterInstanceRequest req;
PARSE_MESSAGE_OR_RETURN(ctrl, req);
+ auto* properties = req.mutable_properties();
+ if (properties->contains("status")) {
+ std::string status = properties->at("status");
+ if (status != "ENABLED" && status != "DISABLED") {
+ return http_json_reply(MetaServiceCode::INVALID_ARGUMENT,
+ "Invalid value for status property: " +
status +
+ ", expected 'ENABLED' or 'DISABLED'
(case insensitive)");
+ }
+ std::string_view is_enable = (status == "ENABLED") ? "true" : "false";
+ const std::string& property_name =
+
AlterInstanceRequest::SnapshotProperty_Name(AlterInstanceRequest::ENABLE_SNAPSHOT);
+ (*properties)[property_name] = is_enable;
+ properties->erase("status");
+ }
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
AlterInstanceResponse resp;
service->alter_instance(ctrl, &req, &resp, nullptr);
diff --git a/cloud/src/meta-service/meta_service_resource.cpp
b/cloud/src/meta-service/meta_service_resource.cpp
index 0701cc1db76..4bb5a99c5ad 100644
--- a/cloud/src/meta-service/meta_service_resource.cpp
+++ b/cloud/src/meta-service/meta_service_resource.cpp
@@ -48,10 +48,6 @@ using namespace std::chrono;
namespace {
constexpr char pattern_str[] = "^[a-zA-Z][0-9a-zA-Z_]*$";
-constexpr char SNAPSHOT_STATUS_KEY[] = "status";
-constexpr char SNAPSHOT_MAX_RESERVED_KEY[] = "max_reserved_snapshots";
-constexpr char SNAPSHOT_INTERVAL_SECONDS_KEY[] = "snapshot_interval_seconds";
-
bool is_valid_storage_vault_name(const std::string& str) {
const std::regex pattern(pattern_str);
return std::regex_match(str, pattern);
@@ -1818,17 +1814,14 @@ void
MetaServiceImpl::create_instance(google::protobuf::RpcController* controlle
}
std::pair<MetaServiceCode, std::string> handle_snapshot_switch(const
std::string& instance_id,
- const
std::string& key,
const
std::string& value,
InstanceInfoPB*
instance) {
- // Only allow "ENABLED" and "DISABLED" values (case insensitive)
- std::string value_upper = value;
- std::ranges::transform(value_upper, value_upper.begin(), ::toupper);
-
- if (value_upper != "ENABLED" && value_upper != "DISABLED") {
+ const std::string& property_name =
+
AlterInstanceRequest::SnapshotProperty_Name(AlterInstanceRequest::ENABLE_SNAPSHOT);
+ if (value != "true" && value != "false") {
return std::make_pair(MetaServiceCode::INVALID_ARGUMENT,
- "Invalid value for enabled property: " + value +
- ", expected 'ENABLED' or 'DISABLED'
(case insensitive)" +
+ "Invalid value for " + property_name + "
property: " + value +
+ ", expected 'true' or 'false'" +
", instance_id: " + instance_id);
}
@@ -1836,56 +1829,48 @@ std::pair<MetaServiceCode, std::string>
handle_snapshot_switch(const std::string
if (instance->snapshot_switch_status() == SNAPSHOT_SWITCH_DISABLED) {
return std::make_pair(MetaServiceCode::INVALID_ARGUMENT,
"Snapshot not ready, instance_id: " +
instance_id);
- }
-
- // Determine target status
- SnapshotSwitchStatus target_status =
- (value_upper == "ENABLED") ? SNAPSHOT_SWITCH_ON :
SNAPSHOT_SWITCH_OFF;
-
- // Check if the status is already set to the target value
- if (instance->snapshot_switch_status() == target_status) {
- std::string status_name = (target_status == SNAPSHOT_SWITCH_ON) ?
"ENABLED" : "DISABLED";
+ } else if (value == "false" && instance->snapshot_switch_status() ==
SNAPSHOT_SWITCH_OFF) {
return std::make_pair(
MetaServiceCode::INVALID_ARGUMENT,
- "Snapshot is already set to " + status_name + ", instance_id:
" + instance_id);
- }
-
- // Set the new status
- instance->set_snapshot_switch_status(target_status);
+ "Snapshot is already set to SNAPSHOT_SWITCH_OFF, instance_id:
" + instance_id);
+ } else if (value == "true") {
+ instance->set_snapshot_switch_status(SNAPSHOT_SWITCH_ON);
- // Set default values when first enabling snapshot
- if (target_status == SNAPSHOT_SWITCH_ON) {
+ // Set default values when first enabling snapshot
if (!instance->has_snapshot_interval_seconds() ||
instance->snapshot_interval_seconds() == 0) {
- instance->set_snapshot_interval_seconds(3600);
- LOG(INFO) << "Set default snapshot_interval_seconds to 3600 for
instance "
- << instance_id;
+
instance->set_snapshot_interval_seconds(config::snapshot_min_interval_seconds);
+ LOG(INFO) << "Set default snapshot_interval_seconds to "
+ << config::snapshot_min_interval_seconds << " for
instance " << instance_id;
}
if (!instance->has_max_reserved_snapshot() ||
instance->max_reserved_snapshot() == 0) {
instance->set_max_reserved_snapshot(1);
LOG(INFO) << "Set default max_reserved_snapshots to 1 for instance
" << instance_id;
}
+ } else {
+ instance->set_snapshot_switch_status(SNAPSHOT_SWITCH_OFF);
}
- std::string msg = "Set snapshot enabled to " + value + " for instance " +
instance_id;
- LOG(INFO) << msg;
+ LOG(INFO) << "Set snapshot " + property_name + " to " + value + " for
instance " + instance_id;
return std::make_pair(MetaServiceCode::OK, "");
}
std::pair<MetaServiceCode, std::string> handle_max_reserved_snapshots(
- const std::string& instance_id, const std::string& key, const
std::string& value,
- InstanceInfoPB* instance) {
+ const std::string& instance_id, const std::string& value,
InstanceInfoPB* instance) {
+ const std::string& property_name =
AlterInstanceRequest::SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS);
+
int max_snapshots;
try {
max_snapshots = std::stoi(value);
if (max_snapshots < 0) {
return std::make_pair(MetaServiceCode::INVALID_ARGUMENT,
- "max_reserved_snapshots must be
non-negative, got: " + value);
+ property_name + " must be non-negative, got:
" + value);
}
if (max_snapshots > config::snapshot_max_reserved_num) {
return std::make_pair(MetaServiceCode::INVALID_ARGUMENT,
- "max_reserved_snapshots too large, maximum
is " +
+ property_name + " too large, maximum is " +
std::to_string(config::snapshot_max_reserved_num) +
", got: " + value);
}
@@ -1896,34 +1881,34 @@ std::pair<MetaServiceCode, std::string>
handle_max_reserved_snapshots(
instance->set_max_reserved_snapshot(max_snapshots);
- std::string msg = "Set max_reserved_snapshots to " + value + " for
instance " + instance_id;
- LOG(INFO) << msg;
+ LOG(INFO) << "Set " + property_name + " to " + value + " for instance " +
instance_id;
return std::make_pair(MetaServiceCode::OK, "");
}
std::pair<MetaServiceCode, std::string> handle_snapshot_intervals(const
std::string& instance_id,
- const
std::string& key,
const
std::string& value,
InstanceInfoPB* instance) {
+ const std::string& property_name =
AlterInstanceRequest::SnapshotProperty_Name(
+ AlterInstanceRequest::SNAPSHOT_INTERVAL_SECONDS);
+
int intervals;
try {
intervals = std::stoi(value);
if (intervals < config::snapshot_min_interval_seconds) {
return std::make_pair(MetaServiceCode::INVALID_ARGUMENT,
- "snapshot_intervals too small, minimum is " +
+ property_name + " too small, minimum is " +
std::to_string(config::snapshot_min_interval_seconds) +
" seconds, got: " + value);
}
} catch (const std::exception& e) {
return std::make_pair(MetaServiceCode::INVALID_ARGUMENT,
- "Invalid numeric value for snapshot_intervals: "
+ value);
+ "Invalid numeric value for " + property_name +
": " + value);
}
instance->set_snapshot_interval_seconds(intervals);
- std::string msg = "Set snapshot_intervals to " + value + " seconds for
instance " + instance_id;
- LOG(INFO) << msg;
+ LOG(INFO) << "Set " + property_name + " to " + value + " seconds for
instance " + instance_id;
return std::make_pair(MetaServiceCode::OK, "");
}
@@ -2119,56 +2104,58 @@ void
MetaServiceImpl::alter_instance(google::protobuf::RpcController* controller
} break;
/**
* Handle SET_SNAPSHOT_PROPERTY operation - configures snapshot-related
properties for an instance.
- *
+ *
* Supported property keys and their expected values:
- * - "status": "UNSUPPORTED" | "ENABLED" | "DISABLED"
- * Controls the snapshot functionality status for the instance
- *
- * - "max_reserved_snapshots": numeric string (0-35)
+ * - "ENABLE_SNAPSHOT": "true" | "false"
+ * Controls whether snapshot functionality is enabled for the instance
+ *
+ * - "MAX_RESERVED_SNAPSHOTS": numeric string
(0-config::snapshot_max_reserved_num)
* Sets the maximum number of snapshots to retain for the instance
- *
- * - "snapshot_intervals": numeric string (60-max)
- * Sets the snapshot creation interval in seconds (minimum 60s)
- *
+ *
+ * - "SNAPSHOT_INTERVAL_SECONDS": numeric string
(config::snapshot_min_interval_seconds-max)
+ * Sets the snapshot creation interval in seconds (minimum controlled by
config)
+ *
* Each property is validated by its respective handler function which
ensures
* the provided values conform to the expected format and constraints.
*/
case AlterInstanceRequest::SET_SNAPSHOT_PROPERTY: {
- ret = alter_instance(request, [&request](InstanceInfoPB* instance) {
+ ret = alter_instance(request, [&request, &instance_id](InstanceInfoPB*
instance) {
std::string msg;
auto properties = request->properties();
if (properties.empty()) {
- msg = "propertiy is empty, instance_id = " +
request->instance_id();
+ msg = "snapshot properties is empty, instance_id = " +
request->instance_id();
LOG(WARNING) << msg;
return std::make_pair(MetaServiceCode::INVALID_ARGUMENT, msg);
}
for (const auto& property : properties) {
std::string key = property.first;
std::string value = property.second;
+ AlterInstanceRequest::SnapshotProperty snapshot_property =
+ AlterInstanceRequest::UNKNOWN_PROPERTY;
+ if (!AlterInstanceRequest_SnapshotProperty_Parse(key,
&snapshot_property) ||
+ snapshot_property ==
AlterInstanceRequest::UNKNOWN_PROPERTY) {
+ msg = "unknown snapshot property: " + key;
+ LOG(WARNING) << "alter instance failed: " << msg
+ << ", instance_id = " << instance_id;
+ return std::make_pair(MetaServiceCode::INVALID_ARGUMENT,
msg);
+ }
std::pair<MetaServiceCode, std::string> result;
- if (key == SNAPSHOT_STATUS_KEY) {
- result = handle_snapshot_switch(request->instance_id(),
key, value, instance);
- } else if (key == SNAPSHOT_MAX_RESERVED_KEY) {
- result =
handle_max_reserved_snapshots(request->instance_id(), key, value,
- instance);
- } else if (key == SNAPSHOT_INTERVAL_SECONDS_KEY) {
- result =
- handle_snapshot_intervals(request->instance_id(),
key, value, instance);
+ if (snapshot_property ==
AlterInstanceRequest::ENABLE_SNAPSHOT) {
+ result = handle_snapshot_switch(request->instance_id(),
value, instance);
+ } else if (snapshot_property ==
AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS) {
+ result =
handle_max_reserved_snapshots(request->instance_id(), value, instance);
+ } else if (snapshot_property ==
AlterInstanceRequest::SNAPSHOT_INTERVAL_SECONDS) {
+ result = handle_snapshot_intervals(request->instance_id(),
value, instance);
} else {
msg = "unsupported property: " + key;
- LOG(WARNING) << msg;
+ LOG(WARNING) << "alter instance failed: " << msg
+ << ", instance_id = " << instance_id;
return std::make_pair(MetaServiceCode::INVALID_ARGUMENT,
msg);
}
- LOG(INFO) << "Property handling result for key=" << key
- << ", result_code=" << static_cast<int>(result.first)
- << ", result_msg=" << result.second;
-
if (result.first != MetaServiceCode::OK) {
- msg = result.second;
- LOG(WARNING) << msg;
return result;
}
}
diff --git a/cloud/test/meta_service_test.cpp b/cloud/test/meta_service_test.cpp
index d5185913c04..ecb9c2e5fad 100644
--- a/cloud/test/meta_service_test.cpp
+++ b/cloud/test/meta_service_test.cpp
@@ -11563,7 +11563,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["status"] = "ENABLED";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::ENABLE_SNAPSHOT)] = "true";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11595,7 +11596,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["status"] = "ENABLED";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::ENABLE_SNAPSHOT)] = "true";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11609,7 +11611,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["status"] = "DISABLED";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::ENABLE_SNAPSHOT)] = "false";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11623,7 +11626,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["status"] = "invalid";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::ENABLE_SNAPSHOT)] = "invalid";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11637,7 +11641,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["max_reserved_snapshots"] = "0";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS)] = "0";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11651,7 +11656,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["max_reserved_snapshots"] = "35";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS)] = "35";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11665,7 +11671,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["max_reserved_snapshots"] = "10";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS)] = "10";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11679,7 +11686,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["max_reserved_snapshots"] = "-1";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS)] = "-1";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11693,7 +11701,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["max_reserved_snapshots"] = "36";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS)] = "36";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11707,7 +11716,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["max_reserved_snapshots"] = "abc";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS)] = "abc";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11721,7 +11731,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["snapshot_interval_seconds"] = "3600";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::SNAPSHOT_INTERVAL_SECONDS)] = "3600";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11735,7 +11746,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["snapshot_interval_seconds"] = "14400";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::SNAPSHOT_INTERVAL_SECONDS)] = "14400";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11749,7 +11761,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["snapshot_interval_seconds"] = "3599";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::SNAPSHOT_INTERVAL_SECONDS)] = "3599";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11763,7 +11776,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["snapshot_interval_seconds"] = "invalid";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::SNAPSHOT_INTERVAL_SECONDS)] = "invalid";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11805,9 +11819,12 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["status"] = "ENABLED";
- (*req.mutable_properties())["max_reserved_snapshots"] = "20";
- (*req.mutable_properties())["snapshot_interval_seconds"] = "12000";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::ENABLE_SNAPSHOT)] = "true";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS)] = "20";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::SNAPSHOT_INTERVAL_SECONDS)] = "12000";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11821,13 +11838,17 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_instance");
- (*req.mutable_properties())["status"] = "ENABLED";
- (*req.mutable_properties())["invalid_property"] = "value";
- (*req.mutable_properties())["max_reserved_snapshots"] = "10";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::ENABLE_SNAPSHOT)] = "true";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS)] = "10";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::SNAPSHOT_INTERVAL_SECONDS)] = "12000";
+ (*req.mutable_properties())["unsupported_property"] = "value";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
- ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT);
+ ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT) <<
res.ShortDebugString();
}
// Test case 19: Non-existent instance ID
@@ -11837,7 +11858,8 @@ TEST(MetaServiceTest, SetSnapshotPropertyTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("non_existent_instance");
- (*req.mutable_properties())["status"] = "ENABLED";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::ENABLE_SNAPSHOT)] = "true";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11908,7 +11930,8 @@ TEST(MetaServiceTest, SnapshotConfigLimitsTest) {
AlterInstanceResponse alter_res;
alter_req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
alter_req.set_instance_id("test_snapshot_config_instance");
- (*alter_req.mutable_properties())["status"] = "enabled";
+
(*alter_req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::ENABLE_SNAPSHOT)] = "true";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&alter_req, &alter_res, nullptr);
@@ -11930,7 +11953,8 @@ TEST(MetaServiceTest, SnapshotConfigLimitsTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_config_instance");
- (*req.mutable_properties())["snapshot_interval_seconds"] = "1799"; //
Below min limit
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::SNAPSHOT_INTERVAL_SECONDS)] = "1799"; //
Below min limit
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11945,7 +11969,8 @@ TEST(MetaServiceTest, SnapshotConfigLimitsTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_config_instance");
- (*req.mutable_properties())["snapshot_interval_seconds"] = "3600"; //
Within limits
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::SNAPSHOT_INTERVAL_SECONDS)] = "3600"; //
Within limits
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11959,7 +11984,8 @@ TEST(MetaServiceTest, SnapshotConfigLimitsTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_config_instance");
- (*req.mutable_properties())["max_reserved_snapshots"] = "21"; // Above
max limit
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS)] = "21"; //
Above max limit
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
@@ -11974,13 +12000,30 @@ TEST(MetaServiceTest, SnapshotConfigLimitsTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_snapshot_config_instance");
- (*req.mutable_properties())["max_reserved_snapshots"] = "10"; //
Within limits
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::MAX_RESERVED_SNAPSHOTS)] = "10"; //
Within limits
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::OK);
}
+ // Test case 5: unknown property should fail
+ {
+ brpc::Controller cntl;
+ AlterInstanceRequest req;
+ AlterInstanceResponse res;
+ req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
+ req.set_instance_id("test_snapshot_config_instance");
+ (*req.mutable_properties())["unknown_property"] = "value";
+
+
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
+ &req, &res, nullptr);
+ ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT);
+ ASSERT_TRUE(res.status().msg().find("unknown snapshot property:
unknown_property") !=
+ std::string::npos);
+ }
+
// Restore original config values
config::snapshot_min_interval_seconds = orig_min_interval;
config::snapshot_max_reserved_num = orig_max_reserved;
@@ -12045,7 +12088,8 @@ TEST(MetaServiceTest, SnapshotDefaultValuesTest) {
AlterInstanceResponse res;
req.set_op(AlterInstanceRequest::SET_SNAPSHOT_PROPERTY);
req.set_instance_id("test_instance");
- (*req.mutable_properties())["status"] = "ENABLED";
+ (*req.mutable_properties())[AlterInstanceRequest_SnapshotProperty_Name(
+ AlterInstanceRequest::ENABLE_SNAPSHOT)] = "true";
meta_service->alter_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AdminSetAutoClusterSnapshotCommand.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AdminSetAutoClusterSnapshotCommand.java
index 3d61e1ad656..688de52cba4 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AdminSetAutoClusterSnapshotCommand.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AdminSetAutoClusterSnapshotCommand.java
@@ -68,7 +68,15 @@ public class AdminSetAutoClusterSnapshotCommand extends
Command implements Forwa
.setInstanceId(((CloudEnv)
Env.getCurrentEnv()).getCloudInstanceId())
.setOp(Cloud.AlterInstanceRequest.Operation.SET_SNAPSHOT_PROPERTY);
for (Map.Entry<String, String> entry : properties.entrySet()) {
- builder.putProperties(entry.getKey().toLowerCase(),
entry.getValue().toLowerCase());
+ String property;
+ if (entry.getKey().equalsIgnoreCase(PROP_MAX_RESERVED_SNAPSHOTS)) {
+ property =
Cloud.AlterInstanceRequest.SnapshotProperty.MAX_RESERVED_SNAPSHOTS.name();
+ } else if
(entry.getKey().equalsIgnoreCase(PROP_SNAPSHOT_INTERVAL_SECONDS)) {
+ property =
Cloud.AlterInstanceRequest.SnapshotProperty.SNAPSHOT_INTERVAL_SECONDS.name();
+ } else {
+ throw new RuntimeException("Unknown property: " +
entry.getKey());
+ }
+ builder.putProperties(property, entry.getValue().toLowerCase());
}
CloudSnapshotHandler cloudSnapshotHandler = ((CloudEnv)
ctx.getEnv()).getCloudSnapshotHandler();
cloudSnapshotHandler.alterInstance(builder.build());
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AdminSetClusterSnapshotFeatureSwitchCommand.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AdminSetClusterSnapshotFeatureSwitchCommand.java
index ceadd609746..371a3d14272 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AdminSetClusterSnapshotFeatureSwitchCommand.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/AdminSetClusterSnapshotFeatureSwitchCommand.java
@@ -40,7 +40,6 @@ import org.apache.logging.log4j.Logger;
*/
public class AdminSetClusterSnapshotFeatureSwitchCommand extends Command
implements ForwardWithSync {
- public static final String PROP_ENABLED = "enabled";
private static final Logger LOG =
LogManager.getLogger(AdminSetClusterSnapshotFeatureSwitchCommand.class);
private boolean on;
@@ -59,7 +58,7 @@ public class AdminSetClusterSnapshotFeatureSwitchCommand
extends Command impleme
Cloud.AlterInstanceRequest.Builder builder =
Cloud.AlterInstanceRequest.newBuilder()
.setInstanceId(((CloudEnv)
Env.getCurrentEnv()).getCloudInstanceId())
.setOp(Cloud.AlterInstanceRequest.Operation.SET_SNAPSHOT_PROPERTY)
- .putProperties(PROP_ENABLED, String.valueOf(on));
+
.putProperties(Cloud.AlterInstanceRequest.SnapshotProperty.ENABLE_SNAPSHOT.name(),
String.valueOf(on));
CloudSnapshotHandler cloudSnapshotHandler = ((CloudEnv)
ctx.getEnv()).getCloudSnapshotHandler();
cloudSnapshotHandler.alterInstance(builder.build());
cloudSnapshotHandler.refreshAutoSnapshotJob();
diff --git a/gensrc/proto/cloud.proto b/gensrc/proto/cloud.proto
index 253ec7318b5..5234ac10eea 100644
--- a/gensrc/proto/cloud.proto
+++ b/gensrc/proto/cloud.proto
@@ -1374,11 +1374,19 @@ message AlterInstanceRequest {
SET_NORMAL = 7;
SET_SNAPSHOT_PROPERTY = 8;
}
+
+ enum SnapshotProperty {
+ UNKNOWN_PROPERTY = 0;
+ ENABLE_SNAPSHOT = 1; // true or false
+ MAX_RESERVED_SNAPSHOTS = 2; // in [0,
max_reserved_snapshots]
+ SNAPSHOT_INTERVAL_SECONDS = 3; // in [min_interval_seconds,
+inf)
+ }
+
optional string instance_id = 1;
optional Operation op = 2;
optional string name = 3;
optional string request_ip = 4;
- map<string, string> properties = 5;
+ map<string, string> properties = 5; // key is the Name of SnapshotProperty
value.
}
message AlterInstanceResponse {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]