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 9f843c02b4b [feature](StoragePolicy) Add one http action to add
storage policy back (#30879)
9f843c02b4b is described below
commit 9f843c02b4b96848cd7907d3e05304926cf59561
Author: AlexYue <[email protected]>
AuthorDate: Thu Feb 8 11:39:19 2024 +0800
[feature](StoragePolicy) Add one http action to add storage policy back
(#30879)
---
.../httpv2/restv2/AddStoragePolicyAction.java | 89 ++++++++++++++++++++++
.../java/org/apache/doris/policy/PolicyMgr.java | 28 +++++++
2 files changed, 117 insertions(+)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/AddStoragePolicyAction.java
b/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/AddStoragePolicyAction.java
new file mode 100644
index 00000000000..435da3ca195
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/AddStoragePolicyAction.java
@@ -0,0 +1,89 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.httpv2.restv2;
+
+import org.apache.doris.catalog.Env;
+import org.apache.doris.common.Config;
+import org.apache.doris.common.UserException;
+import org.apache.doris.httpv2.entity.ResponseEntityBuilder;
+import org.apache.doris.httpv2.rest.RestBaseController;
+import org.apache.doris.policy.StoragePolicy;
+
+import com.google.common.collect.Maps;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@RestController
+@RequestMapping("/rest/v2")
+public class AddStoragePolicyAction extends RestBaseController {
+
+ private static final Logger LOG =
LogManager.getLogger(AddStoragePolicyAction.class);
+
+ @RequestMapping(path = "/api/storage_policy", method = RequestMethod.POST)
+ public Object clusterOverview(@RequestBody StoragePolicyVo body,
+ HttpServletRequest request, HttpServletResponse response) {
+ if (Config.enable_all_http_auth) {
+ executeCheckPassword(request, response);
+ }
+
+ try {
+ if (!Env.getCurrentEnv().isMaster()) {
+ return redirectToMasterOrException(request, response);
+ }
+ } catch (Exception e) {
+ return ResponseEntityBuilder.okWithCommonError(e.getMessage());
+ }
+
+ StoragePolicy storagePolicy = new StoragePolicy(body.getPolicyId(),
body.getPolicyName());
+ try {
+ storagePolicy.init(body.toPropertiesMap(), true);
+ Env.getCurrentEnv().getPolicyMgr().addPolicy(storagePolicy);
+ return ResponseEntityBuilder.ok();
+ } catch (UserException e) {
+ return ResponseEntityBuilder.okWithCommonError(e.getMessage());
+ }
+ }
+
+ @Getter
+ @Setter
+ public static class StoragePolicyVo {
+ private String policyName;
+ private long policyId;
+ private String storageResource;
+ private long cooldownTimestampMs;
+ private long cooldownTtl;
+
+ public Map<String, String> toPropertiesMap() {
+ Map<String, String> properties = Maps.newHashMap();
+ properties.put("storage_resource", storageResource);
+ properties.put("cooldown_datetime",
Long.toString(cooldownTimestampMs));
+ properties.put("cooldown_ttl", Long.toString(cooldownTtl));
+ return properties;
+ }
+ }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java
b/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java
index 3527b77c1df..c3ce3f8a7d9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java
@@ -143,6 +143,31 @@ public class PolicyMgr implements Writable {
}
}
+ /**
+ * Create policy through http api.
+ **/
+ public void addPolicy(Policy policy) throws UserException {
+ writeLock();
+ try {
+ boolean storagePolicyExists = false;
+ if (PolicyTypeEnum.STORAGE == policy.getType()) {
+ // The name of the storage policy remains globally unique
until it is renamed by user.
+ // So we could just compare the policy name to check if there
are redundant ones.
+ // Otherwise two storage policy share one same name but with
different resource name
+ // will not be filtered. See github #25025 for more details.
+ storagePolicyExists = getPoliciesByType(PolicyTypeEnum.STORAGE)
+ .stream().anyMatch(p ->
p.getPolicyName().equals(policy.getPolicyName()));
+ }
+ if (storagePolicyExists || existPolicy(policy)) {
+ throw new DdlException("the policy " + policy.getPolicyName()
+ " already create");
+ }
+ unprotectedAdd(policy);
+ Env.getCurrentEnv().getEditLog().logCreatePolicy(policy);
+ } finally {
+ writeUnlock();
+ }
+ }
+
/**
* Drop policy through stmt.
**/
@@ -291,6 +316,9 @@ public class PolicyMgr implements Writable {
if (policy.matchPolicy(log)) {
if (policy instanceof StoragePolicy) {
((StoragePolicy) policy).removeResourceReference();
+ StoragePolicy storagePolicy = (StoragePolicy) policy;
+ LOG.info("the policy {} with id {} resource {} has been
dropped",
+ storagePolicy.getPolicyName(),
storagePolicy.getId(), storagePolicy.getStorageResource());
}
if (policy instanceof RowPolicy) {
dropTablePolicies((RowPolicy) policy);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]