62bool OpenFile(
const std::string &entity, std::string &open_error_message);
65void Apply(
int reqsize,
int reqops,
int uid);
69bool IsThrottling() {
return (m_ops_per_second > 0) || (m_bytes_per_second > 0);}
76void SetThrottles(
float reqbyterate,
float reqoprate,
int concurrency,
float interval_length)
77 {m_interval_length_seconds = interval_length; m_bytes_per_second = reqbyterate;
78 m_ops_per_second = reqoprate; m_concurrency_limit = concurrency;}
80void SetLoadShed(std::string &hostname,
unsigned port,
unsigned frequency)
81 {m_loadshed_host = hostname; m_loadshed_port = port; m_loadshed_frequency = frequency;}
83void SetMaxOpen(
unsigned long max_open) {m_max_open = max_open;}
85void SetMaxConns(
unsigned long max_conns) {m_max_conns = max_conns;}
87void SetMaxWait(
unsigned long max_wait) {m_max_wait_time = std::chrono::seconds(max_wait);}
99void PrepLoadShed(
const char *opaque, std::string &lsOpaque);
103void PerformLoadShed(
const std::string &opaque, std::string &host,
unsigned &port);
114void StopIOTimer(std::chrono::steady_clock::duration & event_duration, uint16_t uid);
121uint16_t GetUid(
const std::string &);
125void RecomputeInternal();
128void * RecomputeBootstrap(
void *pp);
131void ComputeWaiterOrder();
138void UserIOAccounting();
142void GetShares(
int &shares,
int &request);
144void StealShares(
int uid,
int &reqsize,
int &reqops);
150static unsigned GetTimerListHash();
161float m_interval_length_seconds;
162float m_bytes_per_second;
163float m_ops_per_second;
164int m_concurrency_limit;
168static constexpr int m_max_users = 1024;
169std::vector<int> m_primary_bytes_shares;
170std::vector<int> m_secondary_bytes_shares;
171std::vector<int> m_primary_ops_shares;
172std::vector<int> m_secondary_ops_shares;
173int m_last_round_allocation;
176struct alignas(64) Waiter
178 std::condition_variable m_cv;
180 unsigned m_waiting{0};
185 XrdSys::RAtomic<float> m_concurrency{0};
189 XrdSys::RAtomic<std::chrono::steady_clock::duration::rep> m_io_time{0};
198 void NotifyOne(std::unique_lock<std::mutex> lock)
203std::array<Waiter, m_max_users> m_waiter_info;
216std::array<XrdSys::RAtomic<int16_t>, m_max_users> m_wake_order_0;
217std::array<XrdSys::RAtomic<int16_t>, m_max_users> m_wake_order_1;
218XrdSys::RAtomic<char> m_wake_order_active;
219std::atomic<size_t> m_waiter_offset{0};
220std::chrono::steady_clock::time_point m_last_waiter_recompute_time;
221XrdSys::RAtomic<unsigned> m_waiting_users{0};
223std::atomic<uint32_t> m_io_active;
224XrdSys::RAtomic<std::chrono::steady_clock::duration::rep> m_io_active_time;
225XrdSys::RAtomic<uint64_t> m_io_total{0};
227int m_stable_io_active{0};
228uint64_t m_stable_io_total{0};
230std::chrono::steady_clock::duration m_stable_io_wait;
233std::string m_loadshed_host;
234unsigned m_loadshed_port;
235unsigned m_loadshed_frequency;
240XrdSys::RAtomic<int> m_loadshed_limit_hit;
243unsigned long m_max_open{0};
244unsigned long m_max_conns{0};
245std::unordered_map<std::string, unsigned long> m_file_counters;
246std::unordered_map<std::string, unsigned long> m_conn_counters;
247std::unordered_map<std::string, std::unique_ptr<std::unordered_map<pid_t, unsigned long>>> m_active_conns;
248std::mutex m_file_mutex;
259#if defined(__linux__)
260static constexpr size_t m_timer_list_size = 32;
262static constexpr size_t m_timer_list_size = 1;
264std::array<TimerList, m_timer_list_size> m_timer_list;
269std::chrono::steady_clock::duration m_max_wait_time{std::chrono::seconds(30)};
272XrdXrootdGStream* m_gstream{
nullptr};
274static const char *TraceID;
295 m_start_time(std::chrono::steady_clock::time_point::min())
302 m_start_time(std::chrono::steady_clock::now())
307 auto &timerList = m_manager->m_timer_list[m_timer_list_entry];
308 std::lock_guard<std::mutex> lock(timerList.m_mutex);
309 if (timerList.m_first ==
nullptr) {
310 timerList.m_first =
this;
312 m_prev = timerList.m_last;
313 m_prev->m_next =
this;
315 timerList.m_last =
this;
318std::chrono::steady_clock::duration
Reset() {
319 auto now = std::chrono::steady_clock::now();
320 auto last_start = m_start_time.exchange(now);
321 return now - last_start;
328 if (!m_manager)
return;
330 auto event_duration =
Reset();
331 auto &timerList = m_manager->m_timer_list[m_timer_list_entry];
333 std::unique_lock<std::mutex> lock(timerList.m_mutex);
335 m_prev->m_next = m_next;
337 m_next->m_prev = m_prev;
339 timerList.m_last = m_prev;
342 timerList.m_first = m_next;
344 m_next->m_prev =
nullptr;
346 timerList.m_last =
nullptr;
350 m_manager->StopIOTimer(event_duration, m_owner);
353 const uint16_t m_owner{0};
354 const uint16_t m_timer_list_entry{0};
358 XrdSys::RAtomic<std::chrono::steady_clock::time_point> m_start_time;