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;
119 XrdSysMutex m_queue_mutex;
120 unsigned int m_queue_swap_u1 = 0u;
122 DataFsState &m_fs_state;
129 const std::string &f_lfn;
130 XrdSysCondVar &f_cond;
134 XrdSysMutex m_dir_scan_mutex;
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,