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