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

yangzhg 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 52b1bd2c81 [clone](download) fix be clone action download tablet 
content length overflow (#18851)
52b1bd2c81 is described below

commit 52b1bd2c8142a0e0d5542954aec374879ec7e641
Author: Zhengguo Yang <yangz...@gmail.com>
AuthorDate: Fri Apr 28 11:35:17 2023 +0800

    [clone](download) fix be clone action download tablet content length 
overflow (#18851)
---
 be/src/common/status.h                 |  3 ++
 be/src/http/action/download_action.cpp | 53 ++++++++++++++++++++++++++--------
 be/src/http/http_client.h              |  6 ++++
 be/src/olap/task/engine_clone_task.cpp | 12 ++++++--
 4 files changed, 59 insertions(+), 15 deletions(-)

diff --git a/be/src/common/status.h b/be/src/common/status.h
index f33993af64..2a54dcd609 100644
--- a/be/src/common/status.h
+++ b/be/src/common/status.h
@@ -55,6 +55,7 @@ TStatusError(UNINITIALIZED);
 TStatusError(ABORTED);
 TStatusError(DATA_QUALITY_ERROR);
 TStatusError(LABEL_ALREADY_EXISTS);
+TStatusError(NOT_AUTHORIZED);
 #undef TStatusError
 // BE internal errors
 E(OS_ERROR, -100);
@@ -403,6 +404,7 @@ public:
     ERROR_CTOR(Uninitialized, UNINITIALIZED)
     ERROR_CTOR(Aborted, ABORTED)
     ERROR_CTOR(DataQualityError, DATA_QUALITY_ERROR)
+    ERROR_CTOR(NotAuthorized, NOT_AUTHORIZED)
 #undef ERROR_CTOR
 
     template <int code>
@@ -421,6 +423,7 @@ public:
     bool is_invalid_argument() const { return ErrorCode::INVALID_ARGUMENT == 
_code; }
 
     bool is_not_found() const { return _code == ErrorCode::NOT_FOUND; }
+    bool is_not_authorized() const { return code() == 
TStatusCode::NOT_AUTHORIZED; }
 
     // Convert into TStatus. Call this if 'status_container' contains an 
optional
     // TStatus field named 'status'. This also sets __isset.status.
diff --git a/be/src/http/action/download_action.cpp 
b/be/src/http/action/download_action.cpp
index 074baf5ec1..d258842f65 100644
--- a/be/src/http/action/download_action.cpp
+++ b/be/src/http/action/download_action.cpp
@@ -61,15 +61,30 @@ void DownloadAction::handle_normal(HttpRequest* req, const 
std::string& file_par
     if (config::enable_token_check) {
         status = check_token(req);
         if (!status.ok()) {
-            HttpChannel::send_reply(req, status.to_string());
-            return;
+            std::string error_msg = status.to_string();
+            if (status.is_not_authorized()) {
+                HttpChannel::send_reply(req, HttpStatus::UNAUTHORIZED, 
error_msg);
+                return;
+            } else {
+                HttpChannel::send_reply(req, 
HttpStatus::INTERNAL_SERVER_ERROR, error_msg);
+                return;
+            }
         }
     }
 
     status = check_path_is_allowed(file_param);
     if (!status.ok()) {
-        HttpChannel::send_reply(req, status.to_string());
-        return;
+        std::string error_msg = status.to_string();
+        if (status.is_not_found() || status.is_io_error()) {
+            HttpChannel::send_reply(req, HttpStatus::NOT_FOUND, error_msg);
+            return;
+        } else if (status.is_not_authorized()) {
+            HttpChannel::send_reply(req, HttpStatus::UNAUTHORIZED, error_msg);
+            return;
+        } else {
+            HttpChannel::send_reply(req, HttpStatus::INTERNAL_SERVER_ERROR, 
error_msg);
+            return;
+        }
     }
 
     bool is_dir = false;
@@ -92,15 +107,29 @@ void DownloadAction::handle_error_log(HttpRequest* req, 
const std::string& file_
     Status status = check_log_path_is_allowed(absolute_path);
     if (!status.ok()) {
         std::string error_msg = status.to_string();
-        HttpChannel::send_reply(req, error_msg);
-        return;
+        if (status.is_not_authorized()) {
+            HttpChannel::send_reply(req, HttpStatus::UNAUTHORIZED, error_msg);
+            return;
+        } else {
+            HttpChannel::send_reply(req, HttpStatus::INTERNAL_SERVER_ERROR, 
error_msg);
+            return;
+        }
     }
 
     bool is_dir = false;
     status = io::global_local_filesystem()->is_directory(absolute_path, 
&is_dir);
     if (!status.ok()) {
-        HttpChannel::send_reply(req, status.to_string());
-        return;
+        std::string error_msg = status.to_string();
+        if (status.is_not_found() || status.is_io_error()) {
+            HttpChannel::send_reply(req, HttpStatus::NOT_FOUND, error_msg);
+            return;
+        } else if (status.is_not_authorized()) {
+            HttpChannel::send_reply(req, HttpStatus::UNAUTHORIZED, error_msg);
+            return;
+        } else {
+            HttpChannel::send_reply(req, HttpStatus::INTERNAL_SERVER_ERROR, 
error_msg);
+            return;
+        }
     }
     if (is_dir) {
         std::string error_msg = "error log can only be file.";
@@ -135,11 +164,11 @@ void DownloadAction::handle(HttpRequest* req) {
 Status DownloadAction::check_token(HttpRequest* req) {
     const std::string& token_str = req->param(TOKEN_PARAMETER);
     if (token_str.empty()) {
-        return Status::InternalError("token is not specified.");
+        return Status::NotAuthorized("token is not specified.");
     }
 
     if (token_str != _exec_env->token()) {
-        return Status::InternalError("invalid token.");
+        return Status::NotAuthorized("invalid token.");
     }
 
     return Status::OK();
@@ -156,7 +185,7 @@ Status DownloadAction::check_path_is_allowed(const 
std::string& file_path) {
         }
     }
 
-    return Status::InternalError("file path is not allowed: {}", 
canonical_file_path);
+    return Status::NotAuthorized("file path is not allowed: {}", 
canonical_file_path);
 }
 
 Status DownloadAction::check_log_path_is_allowed(const std::string& file_path) 
{
@@ -168,7 +197,7 @@ Status DownloadAction::check_log_path_is_allowed(const 
std::string& file_path) {
         return Status::OK();
     }
 
-    return Status::InternalError("file path is not allowed: {}", file_path);
+    return Status::NotAuthorized("file path is not allowed: {}", file_path);
 }
 
 } // end namespace doris
diff --git a/be/src/http/http_client.h b/be/src/http/http_client.h
index c194c29c88..c80d0c6f56 100644
--- a/be/src/http/http_client.h
+++ b/be/src/http/http_client.h
@@ -103,6 +103,12 @@ public:
         curl_off_t cl;
         auto code = curl_easy_getinfo(_curl, 
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &cl);
         if (!code) {
+            if (cl < 0) {
+                return Status::InternalError(
+                        fmt::format("failed to get content length, it should 
be a positive value, "
+                                    "actrual is : {}",
+                                    cl));
+            }
             *length = cl;
             return Status::OK();
         }
diff --git a/be/src/olap/task/engine_clone_task.cpp 
b/be/src/olap/task/engine_clone_task.cpp
index dfb18ee376..0c7d917a50 100644
--- a/be/src/olap/task/engine_clone_task.cpp
+++ b/be/src/olap/task/engine_clone_task.cpp
@@ -281,9 +281,15 @@ Status 
EngineCloneTask::_make_and_download_snapshots(DataDir& data_dir,
             // TODO(zc): if snapshot path has been returned from source, it is 
some strange to
             // concat tablet_id and schema hash here.
             std::stringstream ss;
-            ss << "http://"; << get_host_port(src.host, src.http_port) << 
HTTP_REQUEST_PREFIX
-               << HTTP_REQUEST_TOKEN_PARAM << token << HTTP_REQUEST_FILE_PARAM 
<< *snapshot_path
-               << "/" << _clone_req.tablet_id << "/" << _clone_req.schema_hash 
<< "/";
+            if (snapshot_path->back() == '/') {
+                ss << "http://"; << src.host << ":" << src.http_port << 
HTTP_REQUEST_PREFIX
+                   << HTTP_REQUEST_TOKEN_PARAM << token << 
HTTP_REQUEST_FILE_PARAM << *snapshot_path
+                   << _clone_req.tablet_id << "/" << _clone_req.schema_hash << 
"/";
+            } else {
+                ss << "http://"; << src.host << ":" << src.http_port << 
HTTP_REQUEST_PREFIX
+                   << HTTP_REQUEST_TOKEN_PARAM << token << 
HTTP_REQUEST_FILE_PARAM << *snapshot_path
+                   << "/" << _clone_req.tablet_id << "/" << 
_clone_req.schema_hash << "/";
+            }
 
             remote_url_prefix = ss.str();
         }


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

Reply via email to