This is an automated email from the ASF dual-hosted git repository.

gavinchou 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 81aa4968b77 [feature](Azure) Consider delete non-existent file always 
successful on Azure (#36932)
81aa4968b77 is described below

commit 81aa4968b77e671cdca7d82ff109333f5446a137
Author: AlexYue <yj976240...@gmail.com>
AuthorDate: Fri Jun 28 12:58:50 2024 +0800

    [feature](Azure) Consider delete non-existent file always successful on 
Azure (#36932)
    
    When deleting non-existent files on object storage like S3, the result
    would be considered as always true. This pr makes azure client acts the
    same way.
    
    As for the added compare string, you can refer to this
    
[doc](https://github.com/microsoft/api-guidelines/blob/vNext/azure/ConsiderationsForServiceDesign.md)
    
    
    
![image](https://github.com/apache/doris/assets/43750022/4f67d801-d743-4aaa-94c1-673f4800e86e)
---
 be/src/io/fs/azure_obj_storage_client.cpp | 34 ++++++++++++++++++++++---------
 cloud/src/recycler/azure_obj_client.cpp   | 32 +++++++++++++++++++----------
 2 files changed, 45 insertions(+), 21 deletions(-)

diff --git a/be/src/io/fs/azure_obj_storage_client.cpp 
b/be/src/io/fs/azure_obj_storage_client.cpp
index b7ff0a88887..043886672a2 100644
--- a/be/src/io/fs/azure_obj_storage_client.cpp
+++ b/be/src/io/fs/azure_obj_storage_client.cpp
@@ -58,6 +58,7 @@ auto base64_encode_part_num(int part_num) {
 }
 
 constexpr char SAS_TOKEN_URL_TEMPLATE[] = 
"https://{}.blob.core.windows.net/{}/{}{}";;
+constexpr char BlobNotFound[] = "BlobNotFound";
 } // namespace
 
 namespace doris::io {
@@ -105,17 +106,30 @@ struct AzureBatchDeleter {
             return resp;
         }
 
-        auto get_defer_response = [](const auto& defer) {
-            // DeferredResponse<Models::DeleteBlobResult> might throw exception
-            if (!defer.GetResponse().Value.Deleted) {
-                throw Exception(Status::IOError<false>("Batch delete failed"));
-            }
-        };
         for (auto&& defer_response : deferred_resps) {
-            auto response =
-                    do_azure_client_call([&]() { 
get_defer_response(defer_response); }, _opts);
-            if (response.status.code != ErrorCode::OK) {
-                return response;
+            try {
+                auto r = defer_response.GetResponse();
+                if (!r.Value.Deleted) {
+                    auto msg = fmt::format("Azure batch delete failed, path 
msg {}",
+                                           
wrap_object_storage_path_msg(_opts));
+                    LOG_WARNING(msg);
+                    return {.status = convert_to_obj_response(
+                                    
Status::InternalError<false>(std::move(msg)))};
+                }
+            } catch (Azure::Core::RequestFailedException& e) {
+                if (Azure::Core::Http::HttpStatusCode::NotFound == 
e.StatusCode &&
+                    0 == strcmp(e.ErrorCode.c_str(), BlobNotFound)) {
+                    continue;
+                }
+                auto msg = fmt::format(
+                        "Azure request failed because {}, error msg {}, http 
code {}, path msg {}",
+                        e.what(), e.Message, static_cast<int>(e.StatusCode),
+                        wrap_object_storage_path_msg(_opts));
+                LOG_WARNING(msg);
+                return {.status = convert_to_obj_response(
+                                Status::InternalError<false>(std::move(msg))),
+                        .http_code = static_cast<int>(e.StatusCode),
+                        .request_id = std::move(e.RequestId)};
             }
         }
 
diff --git a/cloud/src/recycler/azure_obj_client.cpp 
b/cloud/src/recycler/azure_obj_client.cpp
index b5cd3e76d8e..163c9b43559 100644
--- a/cloud/src/recycler/azure_obj_client.cpp
+++ b/cloud/src/recycler/azure_obj_client.cpp
@@ -39,6 +39,7 @@ using namespace Azure::Storage::Blobs;
 namespace doris::cloud {
 
 constexpr size_t BlobBatchMaxOperations = 256;
+constexpr char BlobNotFound[] = "BlobNotFound";
 
 template <typename Func>
 ObjectStorageResponse do_azure_client_call(Func f, const 
ObjectStoragePathOptions& opts) {
@@ -78,18 +79,27 @@ struct AzureBatchDeleter {
             return resp;
         }
 
-        auto get_defer_response = [](const auto& defer) {
-            // DeferredResponse<Models::DeleteBlobResult> might throw exception
-            if (!defer.GetResponse().Value.Deleted) {
-                throw std::runtime_error("Batch delete blobs failed");
-            }
-        };
-
         for (auto&& defer_response : deferred_resps) {
-            auto response =
-                    do_azure_client_call([&]() { 
get_defer_response(defer_response); }, _opts);
-            if (response.ret != 0) {
-                return response;
+            try {
+                auto r = defer_response.GetResponse();
+                if (!r.Value.Deleted) {
+                    LOG_INFO("Azure batch delete failed, bucket {}, key {}, 
prefix {}, endpoint {}",
+                             _opts.bucket, _opts.key, _opts.prefix, 
_opts.endpoint);
+                    return {-1};
+                }
+            } catch (Azure::Storage::StorageException& e) {
+                if (Azure::Core::Http::HttpStatusCode::NotFound == 
e.StatusCode &&
+                    0 == strcmp(e.ErrorCode.c_str(), BlobNotFound)) {
+                    continue;
+                }
+                auto msg = fmt::format(
+                        "Azure request failed because {}, http code {}, 
request id {}, bucket {}, "
+                        "key {}, "
+                        "prefix {}, endpoint {}",
+                        e.Message, static_cast<int>(e.StatusCode), 
e.RequestId, _opts.bucket,
+                        _opts.key, _opts.prefix, _opts.endpoint);
+                LOG_WARNING(msg);
+                return {-1, std::move(msg)};
             }
         }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to