4141#include " runtime/workload_management/io_throttle.h"
4242#include " util/async_io.h"
4343#include " util/debug_points.h"
44+ #include " util/defer_op.h"
4445#include " util/doris_metrics.h"
4546
4647namespace doris {
4748namespace io {
49+ // 1: initing 2: inited 0: before init
50+ std::atomic_int BeConfDataDirReader::be_config_data_dir_list_state = 0 ;
4851
4952std::vector<doris::DataDirInfo> BeConfDataDirReader::be_config_data_dir_list;
5053
5154void BeConfDataDirReader::get_data_dir_by_file_path (io::Path* file_path,
5255 std::string* data_dir_arg) {
56+ int state = be_config_data_dir_list_state.load (std::memory_order_acquire);
57+ if (state == 0 ) [[unlikely]] {
58+ return ;
59+ } else if (state == 1 ) [[unlikely]] {
60+ be_config_data_dir_list_state.wait (1 );
61+ }
62+
5363 for (const auto & data_dir_info : be_config_data_dir_list) {
5464 if (data_dir_info.path .size () >= file_path->string ().size ()) {
5565 continue ;
@@ -65,6 +75,11 @@ void BeConfDataDirReader::init_be_conf_data_dir(
6575 const std::vector<doris::StorePath>& store_paths,
6676 const std::vector<doris::StorePath>& spill_store_paths,
6777 const std::vector<doris::CachePath>& cache_paths) {
78+ be_config_data_dir_list_state.store (1 , std::memory_order_release);
79+ Defer defer {[]() {
80+ be_config_data_dir_list_state.store (2 , std::memory_order_release);
81+ be_config_data_dir_list_state.notify_all ();
82+ }};
6883 for (int i = 0 ; i < store_paths.size (); i++) {
6984 DataDirInfo data_dir_info;
7085 data_dir_info.path = store_paths[i].path ;
0 commit comments