1 #ifndef __XRDPFC_RESOURCEMONITOR_HH__
2 #define __XRDPFC_RESOURCEMONITOR_HH__
19 struct DirStateElement;
20 struct DataFsSnapshot;
21 struct DirPurgeElement;
22 struct DataFsPurgeshot;
40 template<
typename ID,
typename RECORD>
47 using queue_type = std::vector<Entry>;
48 using iterator =
typename queue_type::iterator;
52 int write_queue_size()
const {
return m_write_queue.size(); }
53 bool read_queue_empty()
const {
return m_read_queue.empty(); }
54 int read_queue_size()
const {
return m_read_queue.size(); }
57 void push(
ID id, RECORD
stat) { m_write_queue.push_back({ id,
stat }); }
59 RECORD& write_record(
int pos) {
return m_write_queue[pos].record; }
62 int swap_queues() { m_read_queue.clear(); m_write_queue.swap(m_read_queue);
return read_queue_size(); }
63 const queue_type& read_queue()
const {
return m_read_queue; }
64 iterator begin()
const {
return m_read_queue.begin(); }
65 iterator end()
const {
return m_read_queue.end(); }
68 void shrink_read_queue() { m_read_queue.clear(); m_read_queue.shrink_to_fit(); }
71 queue_type m_write_queue, m_read_queue;
75 std::string m_filename;
76 unsigned int m_last_queue_swap_u1 = 0xffffffff;
77 int m_last_write_queue_pos = -1;
78 DirState *m_dir_state =
nullptr;
82 m_last_queue_swap_u1 = 0xffffffff;
83 m_last_write_queue_pos = -1;
84 m_dir_state =
nullptr;
90 StableChunkPool<AccessToken, 12, 1024> m_access_tokens;
103 long long m_size_in_st_blocks;
107 Queue<int, OpenRecord> m_file_open_q;
108 Queue<int, Stats> m_file_update_stats_q;
109 Queue<int, CloseRecord> m_file_close_q;
110 Queue<DirState*, PurgeRecord> m_file_purge_q1;
111 Queue<std::string, PurgeRecord> m_file_purge_q2;
112 Queue<std::string, long long> m_file_purge_q3;
115 long long m_current_usage_in_st_blocks = 0;
116 int m_dir_count_discrepancy = 0;
117 long long m_token_alloc_failures = 0;
120 unsigned int m_queue_swap_u1 = 0u;
122 DataFsState &m_fs_state;
129 const std::string &f_lfn;
135 std::list<LfnCondRecord> m_dir_scan_open_requests;
136 int m_dir_scan_check_counter = 0;
137 bool m_dir_scan_in_progress =
true;
139 void process_inter_dir_scan_open_requests(FsTraversal &fst);
140 void cross_check_or_process_oob_lfn(
const std::string &lfn, FsTraversal &fst);
141 long long get_file_usage_bytes_to_remove(
const DataFsPurgeshot &ps,
long long previous_file_usage,
int logLeve);
157 int token_id = m_access_tokens.acquire();
160 ++m_token_alloc_failures;
163 AccessToken &at = m_access_tokens[token_id];
164 at.m_filename = filename;
165 at.m_last_queue_swap_u1 = m_queue_swap_u1 - 1;
167 m_file_open_q.push(token_id, {open_timestamp, existing_file});
172 if (token_id < 0)
return;
174 AccessToken &at =
token(token_id);
176 if (at.m_last_queue_swap_u1 != m_queue_swap_u1) {
177 m_file_update_stats_q.push(token_id, stats);
178 at.m_last_queue_swap_u1 = m_queue_swap_u1;
179 at.m_last_write_queue_pos = m_file_update_stats_q.write_queue_size() - 1;
181 Stats &existing_stats = m_file_update_stats_q.write_record(at.m_last_write_queue_pos);
182 existing_stats.
AddUp(stats);
191 if (token_id < 0)
return;
193 m_file_close_q.push(token_id, {close_timestamp, full_stats});
200 m_file_purge_q1.push(target, {size_in_st_blocks, 1});
204 m_file_purge_q1.push(target, {size_in_st_blocks, n_files});
208 m_file_purge_q2.push(target, {size_in_st_blocks, n_files});
212 m_file_purge_q3.push(filename, size_in_st_blocks);
223 AccessToken&
token(
int i) {
return m_access_tokens[i]; }
235 std::vector<DirStateElement> &vec,
240 std::vector<DirPurgeElement> &vec,
bool m_purge_task_complete
void CrossCheckIfScanIsInProgress(const std::string &lfn, XrdSysCondVar &cond)
int register_file_open(const std::string &filename, time_t open_timestamp, bool existing_file)
void perform_purge_check(bool purge_cold_files, int tl)
void fill_sshot_vec_children(const DirState &parent_ds, int parent_idx, std::vector< DirStateElement > &vec, int max_depth)
ResourceMonitor(XrdOss &oss)
void perform_purge_task(DataFsPurgeshot &ps)
void register_file_purge(const std::string &filename, long long size_in_st_blocks)
void scan_dir_and_recurse(FsTraversal &fst)
void register_file_purge(DirState *target, long long size_in_st_blocks)
void fill_pshot_vec_children(const DirState &parent_ds, int parent_idx, std::vector< DirPurgeElement > &vec, int max_depth)
XrdSysCondVar m_purge_task_cond
void perform_purge_task_cleanup()
void register_multi_file_purge(DirState *target, long long size_in_st_blocks, int n_files)
void register_file_update_stats(int token_id, const Stats &stats)
void update_vs_and_file_usage_info()
bool perform_initial_scan()
AccessToken & token(int i)
time_t m_purge_task_start
void register_multi_file_purge(const std::string &target, long long size_in_st_blocks, int n_files)
void main_thread_function()
void register_file_close(int token_id, time_t close_timestamp, const Stats &full_stats)
Statistics of cache utilisation by a File object.
void AddUp(const Stats &s)