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

morningman pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new acbe603da19 [opt](s3) auto retry when meeting 429 error (#35397) 
(#38176)
acbe603da19 is described below

commit acbe603da1921e3104761120dd57e8b9a80535b2
Author: Mingyu Chen <morning...@163.com>
AuthorDate: Mon Jul 22 14:37:39 2024 +0800

    [opt](s3) auto retry when meeting 429 error (#35397) (#38176)
    
    bp #35397
---
 be/src/agent/task_worker_pool.cpp           |   3 +-
 be/src/common/config.cpp                    |   3 +
 be/src/common/config.h                      |   7 ++
 be/src/io/file_factory.cpp                  |   8 +-
 be/src/io/file_factory.h                    |   2 +-
 be/src/io/fs/benchmark/s3_benchmark.hpp     |   4 +-
 be/src/io/fs/s3_file_reader.cpp             | 109 +++++++++++++++++++++++-----
 be/src/io/fs/s3_file_reader.h               |  15 +++-
 be/src/io/fs/s3_file_system.cpp             |  13 ++--
 be/src/io/fs/s3_file_system.h               |   8 +-
 be/src/runtime/snapshot_loader.cpp          |   2 +-
 be/src/vec/runtime/vfile_result_writer.cpp  |   2 +-
 be/test/io/cache/remote_file_cache_test.cpp |   2 +-
 be/test/io/fs/remote_file_system_test.cpp   |   2 +-
 be/test/olap/remote_rowset_gc_test.cpp      |   6 +-
 be/test/olap/rowset/beta_rowset_test.cpp    |   2 +-
 16 files changed, 147 insertions(+), 41 deletions(-)

diff --git a/be/src/agent/task_worker_pool.cpp 
b/be/src/agent/task_worker_pool.cpp
index ea56c2a8a22..0b525354da9 100644
--- a/be/src/agent/task_worker_pool.cpp
+++ b/be/src/agent/task_worker_pool.cpp
@@ -1226,7 +1226,8 @@ void 
TaskWorkerPool::_push_storage_policy_worker_thread_callback() {
                 s3_conf.use_virtual_addressing = 
!resource.s3_storage_param.use_path_style;
                 std::shared_ptr<io::S3FileSystem> fs;
                 if (existed_resource.fs == nullptr) {
-                    st = io::S3FileSystem::create(s3_conf, 
std::to_string(resource.id), &fs);
+                    st = io::S3FileSystem::create(s3_conf, 
std::to_string(resource.id), nullptr,
+                                                  &fs);
                 } else {
                     fs = 
std::static_pointer_cast<io::S3FileSystem>(existed_resource.fs);
                     st = fs->set_conf(s3_conf);
diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp
index 54f90675610..39204ef3760 100644
--- a/be/src/common/config.cpp
+++ b/be/src/common/config.cpp
@@ -1162,6 +1162,9 @@ DEFINE_mInt32(max_s3_client_retry, "10");
 
 DEFINE_String(trino_connector_plugin_dir, "${DORIS_HOME}/connectors");
 
+DEFINE_mInt32(s3_read_base_wait_time_ms, "100");
+DEFINE_mInt32(s3_read_max_wait_time_ms, "800");
+
 // ca_cert_file is in this path by default, Normally no modification is 
required
 // ca cert default path is different from different OS
 DEFINE_mString(ca_cert_file_paths,
diff --git a/be/src/common/config.h b/be/src/common/config.h
index 050987a8398..1174a610c19 100644
--- a/be/src/common/config.h
+++ b/be/src/common/config.h
@@ -1210,6 +1210,13 @@ DECLARE_mBool(check_segment_when_build_rowset_meta);
 
 // max s3 client retry times
 DECLARE_mInt32(max_s3_client_retry);
+// When meet s3 429 error, the "get" request will
+// sleep s3_read_base_wait_time_ms (*1, *2, *3, *4) ms
+// get try again.
+// The max sleep time is s3_read_max_wait_time_ms
+// and the max retry time is max_s3_client_retry
+DECLARE_mInt32(s3_read_base_wait_time_ms);
+DECLARE_mInt32(s3_read_max_wait_time_ms);
 
 // the directory for storing the trino-connector plugins.
 DECLARE_String(trino_connector_plugin_dir);
diff --git a/be/src/io/file_factory.cpp b/be/src/io/file_factory.cpp
index 42d55d5fc03..cc369d13219 100644
--- a/be/src/io/file_factory.cpp
+++ b/be/src/io/file_factory.cpp
@@ -90,7 +90,7 @@ Status FileFactory::create_file_writer(TFileType::type type, 
ExecEnv* env,
         RETURN_IF_ERROR(
                 S3ClientFactory::convert_properties_to_s3_conf(properties, 
s3_uri, &s3_conf));
         std::shared_ptr<io::S3FileSystem> fs;
-        RETURN_IF_ERROR(io::S3FileSystem::create(s3_conf, "", &fs));
+        RETURN_IF_ERROR(io::S3FileSystem::create(s3_conf, "", nullptr, &fs));
         RETURN_IF_ERROR(fs->create_file(path, &file_writer));
         break;
     }
@@ -122,7 +122,7 @@ Status FileFactory::create_file_reader(const 
io::FileSystemProperties& system_pr
     }
     case TFileType::FILE_S3: {
         RETURN_IF_ERROR(create_s3_reader(system_properties.properties, 
file_description,
-                                         reader_options, file_system, 
file_reader));
+                                         reader_options, file_system, 
file_reader, profile));
         break;
     }
     case TFileType::FILE_HDFS: {
@@ -191,13 +191,13 @@ Status FileFactory::create_s3_reader(const 
std::map<std::string, std::string>& p
                                      const io::FileDescription& fd,
                                      const io::FileReaderOptions& 
reader_options,
                                      std::shared_ptr<io::FileSystem>* 
s3_file_system,
-                                     io::FileReaderSPtr* reader) {
+                                     io::FileReaderSPtr* reader, 
RuntimeProfile* profile) {
     S3URI s3_uri(fd.path);
     RETURN_IF_ERROR(s3_uri.parse());
     S3Conf s3_conf;
     RETURN_IF_ERROR(S3ClientFactory::convert_properties_to_s3_conf(prop, 
s3_uri, &s3_conf));
     std::shared_ptr<io::S3FileSystem> fs;
-    RETURN_IF_ERROR(io::S3FileSystem::create(std::move(s3_conf), "", &fs));
+    RETURN_IF_ERROR(io::S3FileSystem::create(std::move(s3_conf), "", profile, 
&fs));
     RETURN_IF_ERROR(fs->open_file(fd, reader_options, reader));
     *s3_file_system = std::move(fs);
     return Status::OK();
diff --git a/be/src/io/file_factory.h b/be/src/io/file_factory.h
index bb412a7d47c..1ae264a1275 100644
--- a/be/src/io/file_factory.h
+++ b/be/src/io/file_factory.h
@@ -77,7 +77,7 @@ public:
                                    const io::FileDescription& fd,
                                    const io::FileReaderOptions& reader_options,
                                    std::shared_ptr<io::FileSystem>* 
s3_file_system,
-                                   io::FileReaderSPtr* reader);
+                                   io::FileReaderSPtr* reader, RuntimeProfile* 
profile);
 
     static Status create_broker_reader(const TNetworkAddress& broker_addr,
                                        const std::map<std::string, 
std::string>& prop,
diff --git a/be/src/io/fs/benchmark/s3_benchmark.hpp 
b/be/src/io/fs/benchmark/s3_benchmark.hpp
index 698129d5467..94e531f96b3 100644
--- a/be/src/io/fs/benchmark/s3_benchmark.hpp
+++ b/be/src/io/fs/benchmark/s3_benchmark.hpp
@@ -42,7 +42,7 @@ public:
         S3Conf s3_conf;
         RETURN_IF_ERROR(
                 S3ClientFactory::convert_properties_to_s3_conf(_conf_map, 
s3_uri, &s3_conf));
-        return io::S3FileSystem::create(std::move(s3_conf), "", fs);
+        return io::S3FileSystem::create(std::move(s3_conf), "", nullptr, fs);
     }
 };
 
@@ -70,7 +70,7 @@ public:
         fd.path = file_path;
         RETURN_IF_ERROR(FileFactory::create_s3_reader(
                 _conf_map, fd, reader_opts, 
reinterpret_cast<std::shared_ptr<io::FileSystem>*>(&fs),
-                &reader));
+                &reader, nullptr));
         return read(state, reader);
     }
 };
diff --git a/be/src/io/fs/s3_file_reader.cpp b/be/src/io/fs/s3_file_reader.cpp
index 29faec47d8e..39452b4f993 100644
--- a/be/src/io/fs/s3_file_reader.cpp
+++ b/be/src/io/fs/s3_file_reader.cpp
@@ -33,6 +33,8 @@
 #include "common/compiler_util.h" // IWYU pragma: keep
 #include "io/fs/s3_common.h"
 #include "util/doris_metrics.h"
+#include "util/runtime_profile.h"
+#include "util/s3_util.h"
 
 namespace doris {
 namespace io {
@@ -41,14 +43,23 @@ bvar::Adder<uint64_t> 
s3_file_reader_read_counter("s3_file_reader", "read_at");
 bvar::Adder<uint64_t> s3_file_reader_total("s3_file_reader", "total_num");
 bvar::Adder<uint64_t> s3_bytes_read_total("s3_file_reader", "bytes_read");
 bvar::Adder<uint64_t> s3_file_being_read("s3_file_reader", "file_being_read");
+bvar::Adder<uint64_t> 
s3_file_reader_too_many_request_counter("s3_file_reader", "too_many_request");
+bvar::LatencyRecorder s3_bytes_per_read("s3_file_reader", "bytes_per_read"); 
// also QPS
+bvar::PerSecond<bvar::Adder<uint64_t>> s3_read_througthput("s3_file_reader", 
"s3_read_throughput",
+                                                           
&s3_bytes_read_total);
+// Although we can get QPS from s3_bytes_per_read, but s3_bytes_per_read only
+// record successfull request, and s3_get_request_qps will record all request.
+bvar::PerSecond<bvar::Adder<uint64_t>> s3_get_request_qps("s3_file_reader", 
"s3_get_request",
+                                                          
&s3_file_reader_read_counter);
 
 S3FileReader::S3FileReader(Path path, size_t file_size, std::string key, 
std::string bucket,
-                           std::shared_ptr<S3FileSystem> fs)
+                           std::shared_ptr<S3FileSystem> fs, RuntimeProfile* 
profile)
         : _path(std::move(path)),
           _file_size(file_size),
           _fs(std::move(fs)),
           _bucket(std::move(bucket)),
-          _key(std::move(key)) {
+          _key(std::move(key)),
+          _profile(profile) {
     DorisMetrics::instance()->s3_file_open_reading->increment(1);
     DorisMetrics::instance()->s3_file_reader_total->increment(1);
     s3_file_reader_total << 1;
@@ -94,23 +105,87 @@ Status S3FileReader::read_at_impl(size_t offset, Slice 
result, size_t* bytes_rea
     if (!client) {
         return Status::InternalError("init s3 client error");
     }
-    auto outcome = client->GetObject(request);
-    if (!outcome.IsSuccess()) {
-        return Status::IOError(
-                "failed to read from {}: {}, exception {}, error code {}, 
request id {}",
-                _path.native(), outcome.GetError().GetMessage(),
-                outcome.GetError().GetExceptionName(), 
outcome.GetError().GetResponseCode(),
-                outcome.GetError().GetRequestId());
+    // auto outcome = client->GetObject(request);
+    // if (!outcome.IsSuccess()) {
+    //     return Status::IOError(
+    //             "failed to read from {}: {}, exception {}, error code {}, 
request id {}",
+    //             _path.native(), outcome.GetError().GetMessage(),
+    //             outcome.GetError().GetExceptionName(), 
outcome.GetError().GetResponseCode(),
+    //             outcome.GetError().GetRequestId());
+    // }
+    // *bytes_read = outcome.GetResult().GetContentLength();
+    // if (*bytes_read != bytes_req) {
+    //     return Status::IOError("failed to read from {}(bytes read: {}, 
bytes req: {})",
+    //                            _path.native(), *bytes_read, bytes_req);
+    // SCOPED_BVAR_LATENCY(s3_bvar::s3_get_latency);
+
+    int retry_count = 0;
+    const int base_wait_time = config::s3_read_base_wait_time_ms; // Base wait 
time in milliseconds
+    const int max_wait_time = config::s3_read_max_wait_time_ms; // Maximum 
wait time in milliseconds
+    const int max_retries = config::max_s3_client_retry; // wait 1s, 2s, 4s, 
8s for each backoff
+
+    int total_sleep_time = 0;
+    while (retry_count <= max_retries) {
+        s3_file_reader_read_counter << 1;
+        auto outcome = client->GetObject(request);
+        _s3_stats.total_get_request_counter++;
+        if (!outcome.IsSuccess()) {
+            auto error = outcome.GetError();
+            if (error.GetResponseCode() == 
Aws::Http::HttpResponseCode::TOO_MANY_REQUESTS) {
+                s3_file_reader_too_many_request_counter << 1;
+                retry_count++;
+                int wait_time = std::min(base_wait_time * (1 << retry_count),
+                                         max_wait_time); // Exponential backoff
+                
std::this_thread::sleep_for(std::chrono::milliseconds(wait_time));
+                _s3_stats.too_many_request_err_counter++;
+                _s3_stats.too_many_request_sleep_time_ms += wait_time;
+                total_sleep_time += wait_time;
+                continue;
+            } else {
+                // Handle other errors
+                return Status::IOError(
+                        "failed to read. msg: {}, exception: {}, error code: 
{}, request id: {}",
+                        _path.native(), outcome.GetError().GetMessage(),
+                        outcome.GetError().GetExceptionName(), 
outcome.GetError().GetResponseCode(),
+                        outcome.GetError().GetRequestId());
+            }
+        }
+        *bytes_read = outcome.GetResult().GetContentLength();
+        if (*bytes_read != bytes_req) {
+            return Status::InternalError("failed to read (bytes read: {}, 
bytes req: {})",
+                                         *bytes_read, bytes_req);
+        }
+        _s3_stats.total_bytes_read += bytes_req;
+        s3_bytes_read_total << bytes_req;
+        s3_bytes_per_read << bytes_req;
+        DorisMetrics::instance()->s3_bytes_read_total->increment(bytes_req);
+        if (retry_count > 0) {
+            LOG(INFO) << fmt::format("read s3 file {} succeed after {} times 
with {} ms sleeping",
+                                     _path.native(), retry_count, 
total_sleep_time);
+        }
+        return Status::OK();
     }
-    *bytes_read = outcome.GetResult().GetContentLength();
-    if (*bytes_read != bytes_req) {
-        return Status::IOError("failed to read from {}(bytes read: {}, bytes 
req: {})",
-                               _path.native(), *bytes_read, bytes_req);
+    return Status::InternalError("failed to read from s3, exceeded maximum 
retries");
+}
+
+void S3FileReader::_collect_profile_before_close() {
+    if (_profile != nullptr) {
+        const char* s3_profile_name = "S3Profile";
+        ADD_TIMER(_profile, s3_profile_name);
+        RuntimeProfile::Counter* total_get_request_counter =
+                ADD_CHILD_COUNTER(_profile, "TotalGetRequest", TUnit::UNIT, 
s3_profile_name);
+        RuntimeProfile::Counter* too_many_request_err_counter =
+                ADD_CHILD_COUNTER(_profile, "TooManyRequestErr", TUnit::UNIT, 
s3_profile_name);
+        RuntimeProfile::Counter* too_many_request_sleep_time = 
ADD_CHILD_COUNTER(
+                _profile, "TooManyRequestSleepTime", TUnit::TIME_MS, 
s3_profile_name);
+        RuntimeProfile::Counter* total_bytes_read =
+                ADD_CHILD_COUNTER(_profile, "TotalBytesRead", TUnit::BYTES, 
s3_profile_name);
+
+        COUNTER_UPDATE(total_get_request_counter, 
_s3_stats.total_get_request_counter);
+        COUNTER_UPDATE(too_many_request_err_counter, 
_s3_stats.too_many_request_err_counter);
+        COUNTER_UPDATE(too_many_request_sleep_time, 
_s3_stats.too_many_request_sleep_time_ms);
+        COUNTER_UPDATE(total_bytes_read, _s3_stats.total_bytes_read);
     }
-    s3_bytes_read_total << *bytes_read;
-    s3_file_reader_read_counter << 1;
-    DorisMetrics::instance()->s3_bytes_read_total->increment(*bytes_read);
-    return Status::OK();
 }
 
 } // namespace io
diff --git a/be/src/io/fs/s3_file_reader.h b/be/src/io/fs/s3_file_reader.h
index 1f53fb58142..cb2bb2e3034 100644
--- a/be/src/io/fs/s3_file_reader.h
+++ b/be/src/io/fs/s3_file_reader.h
@@ -31,13 +31,16 @@
 #include "util/slice.h"
 
 namespace doris {
+
+class RuntimeProfile;
+
 namespace io {
 class IOContext;
 
 class S3FileReader final : public FileReader {
 public:
     S3FileReader(Path path, size_t file_size, std::string key, std::string 
bucket,
-                 std::shared_ptr<S3FileSystem> fs);
+                 std::shared_ptr<S3FileSystem> fs, RuntimeProfile* profile);
 
     ~S3FileReader() override;
 
@@ -55,7 +58,15 @@ protected:
     Status read_at_impl(size_t offset, Slice result, size_t* bytes_read,
                         const IOContext* io_ctx) override;
 
+    void _collect_profile_before_close() override;
+
 private:
+    struct S3Statistics {
+        int64_t total_get_request_counter = 0;
+        int64_t too_many_request_err_counter = 0;
+        int64_t too_many_request_sleep_time_ms = 0;
+        int64_t total_bytes_read = 0;
+    };
     Path _path;
     size_t _file_size;
     std::shared_ptr<S3FileSystem> _fs;
@@ -63,6 +74,8 @@ private:
     std::string _bucket;
     std::string _key;
     std::atomic<bool> _closed = false;
+    RuntimeProfile* _profile = nullptr;
+    S3Statistics _s3_stats;
 };
 
 } // namespace io
diff --git a/be/src/io/fs/s3_file_system.cpp b/be/src/io/fs/s3_file_system.cpp
index fd21c3f2395..7ca3c94b381 100644
--- a/be/src/io/fs/s3_file_system.cpp
+++ b/be/src/io/fs/s3_file_system.cpp
@@ -71,6 +71,7 @@
 #include "io/fs/remote_file_system.h"
 #include "io/fs/s3_file_reader.h"
 #include "io/fs/s3_file_writer.h"
+#include "util/runtime_profile.h"
 #include "util/s3_uri.h"
 #include "util/s3_util.h"
 
@@ -119,14 +120,16 @@ Status S3FileSystem::set_conf(S3Conf s3_conf) {
     return Status::OK();
 }
 
-Status S3FileSystem::create(S3Conf s3_conf, std::string id, 
std::shared_ptr<S3FileSystem>* fs) {
-    (*fs).reset(new S3FileSystem(std::move(s3_conf), std::move(id)));
+Status S3FileSystem::create(S3Conf s3_conf, std::string id, RuntimeProfile* 
profile,
+                            std::shared_ptr<S3FileSystem>* fs) {
+    (*fs).reset(new S3FileSystem(std::move(s3_conf), std::move(id), profile));
     return (*fs)->connect();
 }
 
-S3FileSystem::S3FileSystem(S3Conf&& s3_conf, std::string&& id)
+S3FileSystem::S3FileSystem(S3Conf&& s3_conf, std::string&& id, RuntimeProfile* 
profile)
         : RemoteFileSystem(s3_conf.prefix, std::move(id), FileSystemType::S3),
-          _s3_conf(std::move(s3_conf)) {
+          _s3_conf(std::move(s3_conf)),
+          _profile(profile) {
     // remove the first and last '/'
     if (!_s3_conf.prefix.empty()) {
         if (_s3_conf.prefix[0] == '/') {
@@ -168,7 +171,7 @@ Status S3FileSystem::open_file_internal(const 
FileDescription& fd, const Path& a
     auto fs_path = Path(_s3_conf.endpoint) / _s3_conf.bucket / key;
     *reader = std::make_shared<S3FileReader>(
             std::move(fs_path), fsize, std::move(key), _s3_conf.bucket,
-            std::static_pointer_cast<S3FileSystem>(shared_from_this()));
+            std::static_pointer_cast<S3FileSystem>(shared_from_this()), 
_profile);
     return Status::OK();
 }
 
diff --git a/be/src/io/fs/s3_file_system.h b/be/src/io/fs/s3_file_system.h
index 0044288b3a5..0da142881fe 100644
--- a/be/src/io/fs/s3_file_system.h
+++ b/be/src/io/fs/s3_file_system.h
@@ -40,6 +40,8 @@ class PooledThreadExecutor;
 } // namespace Aws::Utils::Threading
 
 namespace doris {
+class RuntimeProfile;
+
 namespace io {
 struct FileInfo;
 
@@ -56,7 +58,8 @@ struct FileInfo;
 // This class is thread-safe.(Except `set_xxx` method)
 class S3FileSystem final : public RemoteFileSystem {
 public:
-    static Status create(S3Conf s3_conf, std::string id, 
std::shared_ptr<S3FileSystem>* fs);
+    static Status create(S3Conf s3_conf, std::string id, RuntimeProfile* 
profile,
+                         std::shared_ptr<S3FileSystem>* fs);
     ~S3FileSystem() override;
     // Guarded by external lock.
     Status set_conf(S3Conf s3_conf);
@@ -105,7 +108,7 @@ protected:
     }
 
 private:
-    S3FileSystem(S3Conf&& s3_conf, std::string&& id);
+    S3FileSystem(S3Conf&& s3_conf, std::string&& id, RuntimeProfile* profile);
 
     template <typename AwsOutcome>
     std::string error_msg(const std::string& key, const AwsOutcome& outcome) 
const;
@@ -122,6 +125,7 @@ private:
     mutable std::mutex _client_mu;
     std::shared_ptr<Aws::S3::S3Client> _client;
     std::shared_ptr<Aws::Utils::Threading::PooledThreadExecutor> _executor;
+    RuntimeProfile* _profile = nullptr;
 };
 
 } // namespace io
diff --git a/be/src/runtime/snapshot_loader.cpp 
b/be/src/runtime/snapshot_loader.cpp
index 51d543afcc0..661ed17fc17 100644
--- a/be/src/runtime/snapshot_loader.cpp
+++ b/be/src/runtime/snapshot_loader.cpp
@@ -81,7 +81,7 @@ Status SnapshotLoader::init(TStorageBackendType::type type, 
const std::string& l
         RETURN_IF_ERROR(s3_uri.parse());
         RETURN_IF_ERROR(S3ClientFactory::convert_properties_to_s3_conf(_prop, 
s3_uri, &s3_conf));
         std::shared_ptr<io::S3FileSystem> fs;
-        RETURN_IF_ERROR(io::S3FileSystem::create(std::move(s3_conf), "", &fs));
+        RETURN_IF_ERROR(io::S3FileSystem::create(std::move(s3_conf), "", 
nullptr, &fs));
         _remote_fs = std::move(fs);
     } else if (TStorageBackendType::type::HDFS == type) {
         THdfsParams hdfs_params = parse_properties(_prop);
diff --git a/be/src/vec/runtime/vfile_result_writer.cpp 
b/be/src/vec/runtime/vfile_result_writer.cpp
index fb4091b1f49..8da1c7e39ce 100644
--- a/be/src/vec/runtime/vfile_result_writer.cpp
+++ b/be/src/vec/runtime/vfile_result_writer.cpp
@@ -599,7 +599,7 @@ Status VFileResultWriter::_delete_dir() {
         std::shared_ptr<io::S3FileSystem> s3_fs = nullptr;
         RETURN_IF_ERROR(S3ClientFactory::convert_properties_to_s3_conf(
                 _file_opts->broker_properties, s3_uri, &s3_conf));
-        RETURN_IF_ERROR(io::S3FileSystem::create(s3_conf, "", &s3_fs));
+        RETURN_IF_ERROR(io::S3FileSystem::create(s3_conf, "", nullptr, 
&s3_fs));
         file_system = s3_fs;
         break;
     }
diff --git a/be/test/io/cache/remote_file_cache_test.cpp 
b/be/test/io/cache/remote_file_cache_test.cpp
index 18fcb6de149..01f402e0f4f 100644
--- a/be/test/io/cache/remote_file_cache_test.cpp
+++ b/be/test/io/cache/remote_file_cache_test.cpp
@@ -166,7 +166,7 @@ protected:
         // just use to create s3 filesystem, otherwise won't use cache
         S3Conf s3_conf;
         std::shared_ptr<io::S3FileSystem> fs;
-        Status st = io::S3FileSystem::create(std::move(s3_conf), resource_id, 
&fs);
+        Status st = io::S3FileSystem::create(std::move(s3_conf), resource_id, 
nullptr, &fs);
         // io::S3FileSystem::create will call connect, which will fail because 
s3_conf is empty.
         // but it does affect the following unit test
         ASSERT_FALSE(st.ok()) << st;
diff --git a/be/test/io/fs/remote_file_system_test.cpp 
b/be/test/io/fs/remote_file_system_test.cpp
index a24d4e3932b..6409717c48e 100644
--- a/be/test/io/fs/remote_file_system_test.cpp
+++ b/be/test/io/fs/remote_file_system_test.cpp
@@ -420,7 +420,7 @@ TEST_F(RemoteFileSystemTest, TestS3FileSystem) {
     CHECK_STATUS_OK(s3_uri.parse());
     CHECK_STATUS_OK(S3ClientFactory::convert_properties_to_s3_conf(s3_prop, 
s3_uri, &s3_conf));
     std::shared_ptr<io::S3FileSystem> fs;
-    CHECK_STATUS_OK(io::S3FileSystem::create(std::move(s3_conf), "", &fs));
+    CHECK_STATUS_OK(io::S3FileSystem::create(std::move(s3_conf), "", nullptr, 
&fs));
 
     // delete directory
     io::Path delete_path = s3_location + "/tmp1";
diff --git a/be/test/olap/remote_rowset_gc_test.cpp 
b/be/test/olap/remote_rowset_gc_test.cpp
index 779722c9c48..3e66a7e548e 100644
--- a/be/test/olap/remote_rowset_gc_test.cpp
+++ b/be/test/olap/remote_rowset_gc_test.cpp
@@ -78,9 +78,9 @@ public:
         s3_conf.bucket = config::test_s3_bucket;
         s3_conf.prefix = "remote_rowset_gc_test";
         std::shared_ptr<io::S3FileSystem> s3_fs;
-        ASSERT_TRUE(
-                io::S3FileSystem::create(std::move(s3_conf), 
std::to_string(kResourceId), &s3_fs)
-                        .ok());
+        ASSERT_TRUE(io::S3FileSystem::create(std::move(s3_conf), 
std::to_string(kResourceId),
+                                             nullptr, &s3_fs)
+                            .ok());
         put_storage_resource(kResourceId, {s3_fs, 1});
         auto storage_policy = std::make_shared<StoragePolicy>();
         storage_policy->name = "TabletCooldownTest";
diff --git a/be/test/olap/rowset/beta_rowset_test.cpp 
b/be/test/olap/rowset/beta_rowset_test.cpp
index ab984423e88..00c56138fa5 100644
--- a/be/test/olap/rowset/beta_rowset_test.cpp
+++ b/be/test/olap/rowset/beta_rowset_test.cpp
@@ -259,7 +259,7 @@ TEST_F(BetaRowsetTest, ReadTest) {
     s3_conf.prefix = "prefix";
     std::string resource_id = "10000";
     std::shared_ptr<io::S3FileSystem> fs;
-    ASSERT_TRUE(io::S3FileSystem::create(std::move(s3_conf), resource_id, 
&fs).ok());
+    ASSERT_TRUE(io::S3FileSystem::create(std::move(s3_conf), resource_id, 
nullptr, &fs).ok());
     // failed to head object
     {
         Aws::Auth::AWSCredentials aws_cred("ak", "sk");


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

Reply via email to