XRootD
Loading...
Searching...
No Matches
XrdPfc.hh
Go to the documentation of this file.
1#ifndef __XRDPFC_CACHE_HH__
2#define __XRDPFC_CACHE_HH__
3//----------------------------------------------------------------------------------
4// Copyright (c) 2014 by Board of Trustees of the Leland Stanford, Jr., University
5// Author: Alja Mrak-Tadel, Matevz Tadel, Brian Bockelman
6//----------------------------------------------------------------------------------
7// XRootD is free software: you can redistribute it and/or modify
8// it under the terms of the GNU Lesser General Public License as published by
9// the Free Software Foundation, either version 3 of the License, or
10// (at your option) any later version.
11//
12// XRootD is distributed in the hope that it will be useful,
13// but WITHOUT ANY emacs WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16//
17// You should have received a copy of the GNU Lesser General Public License
18// along with XRootD. If not, see <http://www.gnu.org/licenses/>.
19//----------------------------------------------------------------------------------
20#include <string>
21#include <list>
22#include <map>
23#include <set>
24
25#include "Xrd/XrdScheduler.hh"
27#include "XrdOuc/XrdOucCache.hh"
29
30#include "XrdCl/XrdClURL.hh"
31
32#include "XrdPfcFile.hh"
33#include "XrdPfcDecision.hh"
34
35class XrdOss;
36class XrdOucStream;
37class XrdSysError;
38class XrdSysTrace;
40
41struct XrdVersionInfo;
42
43namespace XrdPfc
44{
45class File;
46class IO;
47class PurgePin;
48class ResourceMonitor;
49
50
51template<class MOO>
53 MOO &mutex;
54 MutexHolder(MOO &m) : mutex(m) { mutex.Lock(); }
55 ~MutexHolder() { mutex.UnLock(); }
56};
57}
58
59
60namespace XrdPfc
61{
62
63//----------------------------------------------------------------------------
65//----------------------------------------------------------------------------
67{
69
70 bool are_file_usage_limits_set() const { return m_fileUsageMax > 0; }
72 bool is_uvkeep_purge_in_effect() const { return m_cs_UVKeep >= 0; }
73 bool is_dir_stat_reporting_on() const { return m_dirStatsStoreDepth >= 0 || ! m_dirStatsDirs.empty() || ! m_dirStatsDirGlobs.empty(); }
74 bool is_purge_plugin_set_up() const { return false; }
75
77
78 bool is_cschk_cache() const { return m_cs_Chk & CSChk_Cache; }
79 bool is_cschk_net() const { return m_cs_Chk & CSChk_Net; }
80 bool is_cschk_any() const { return m_cs_Chk & CSChk_Both; }
81 bool is_cschk_both() const { return (m_cs_Chk & CSChk_Both) == CSChk_Both; }
82
83 bool does_cschk_have_missing_bits(CkSumCheck_e cks_on_file) const { return m_cs_Chk & ~cks_on_file; }
84
85 bool should_uvkeep_purge(time_t delta) const { return m_cs_UVKeep >= 0 && delta > m_cs_UVKeep; }
86
90
91 std::string m_username;
92 std::string m_data_space;
93 std::string m_meta_space;
94
95 long long m_diskTotalSpace;
96 long long m_diskUsageLWM;
97 long long m_diskUsageHWM;
100 long long m_fileUsageMax;
105
106 std::set<std::string> m_dirStatsDirs;
107 std::set<std::string> m_dirStatsDirGlobs;
110
111 long long m_bufferSize;
117
118 long long m_cgi_min_bufferSize = 0;
119 long long m_cgi_max_bufferSize = 0;
124
125 long long m_hdfsbsize;
126 long long m_flushCnt;
127
128 time_t m_cs_UVKeep;
131
134
135 static constexpr long long s_min_bufferSize = 4 * 1024;
136 static constexpr long long s_max_bufferSize = 512 * 1024 * 1024;
137
138 static constexpr int s_max_prefetch_max_blocks = 4096;
139
140 bool m_httpcc;
142};
143
144//------------------------------------------------------------------------------
145
147{
148 std::string m_diskUsageLWM;
149 std::string m_diskUsageHWM;
152 std::string m_fileUsageMax;
153 std::string m_flushRaw;
154
156 m_diskUsageLWM("0.90"), m_diskUsageHWM("0.95"),
157 m_flushRaw("")
158 {}
159};
160
161//------------------------------------------------------------------------------
162
164 std::vector<char> f_string;
165 size_t f_pos;
166 std::string f_exc_prefix;
167
168 static const size_t s_MAX_SIZE;
169
170 snprintf_wrapper(const std::string& exc_prefix, int size = 1024);
171
172 void operator()(const char *fmt, ...);
173
174 const char* c_str() const { return f_string.data(); }
175};
176
177//==============================================================================
178// Cache
179//==============================================================================
180
181//----------------------------------------------------------------------------
183//----------------------------------------------------------------------------
184class Cache : public XrdOucCache
185{
186public:
187 //---------------------------------------------------------------------
189 //---------------------------------------------------------------------
190 Cache(XrdSysLogger *logger, XrdOucEnv *env);
191
192 //---------------------------------------------------------------------
194 //---------------------------------------------------------------------
196
197 virtual XrdOucCacheIO *Attach(XrdOucCacheIO *, int Options = 0);
198
199 //---------------------------------------------------------------------
200 // Virtual function of XrdOucCache. Used for redirection to a local
201 // file on a distributed FS.
202 virtual int LocalFilePath(const char *url, char *buff=0, int blen=0,
203 LFP_Reason why=ForAccess, bool forall=false);
204
205 //---------------------------------------------------------------------
206 // Virtual function of XrdOucCache. Used for deferred open.
207 virtual int Prepare(const char *url, int oflags, mode_t mode);
208
209 // virtual function of XrdOucCache.
210 virtual int Stat(const char *url, struct stat &sbuff);
211
212 // virtual function of XrdOucCache.
213 virtual int Unlink(const char *url);
214
215 //---------------------------------------------------------------------
216 // Used by PfcFstcl::Fsctl function.
217 // Test if file is cached taking in onlyifcached configuration parameters.
218 //---------------------------------------------------------------------
219 virtual int ConsiderCached(const char *url);
220
221 bool DecideIfConsideredCached(long long file_size, long long bytes_on_disk);
222 void WriteCacheControlXAttr(int cinfo_fd, const char* path, const std::string& cc);
223 void WriteFileSizeXAttr(int cinfo_fd, long long file_size);
224 long long DetermineFullFileSize(const std::string &cinfo_fname);
225 int GetCacheControlXAttr(const std::string &cinfo_fname, std::string& res) const;
226 int GetCacheControlXAttr(int fd, std::string& res) const;
227
228
229 //--------------------------------------------------------------------
235 //--------------------------------------------------------------------
236 bool Decide(XrdOucCacheIO*);
237
238 //------------------------------------------------------------------------
240 //------------------------------------------------------------------------
241 const Configuration& RefConfiguration() const { return m_configuration; }
242
243 //---------------------------------------------------------------------
251 //---------------------------------------------------------------------
252 bool Config(const char *config_filename, const char *parameters, XrdOucEnv *env);
253
254 //---------------------------------------------------------------------
256 //---------------------------------------------------------------------
257 static Cache &CreateInstance(XrdSysLogger *logger, XrdOucEnv *env);
258
259 //---------------------------------------------------------------------
261 //---------------------------------------------------------------------
262 static Cache &GetInstance();
263 static const Cache &TheOne();
264 static const Configuration &Conf();
265
266 static ResourceMonitor &ResMon();
267
268 //---------------------------------------------------------------------
270 //---------------------------------------------------------------------
271 static bool VCheck(XrdVersionInfo &urVersion) { return true; }
272
273 //---------------------------------------------------------------------
275 //---------------------------------------------------------------------
276 int UnlinkFile(const std::string& f_name, bool fail_if_open);
277
278 //---------------------------------------------------------------------
280 //---------------------------------------------------------------------
281 void AddWriteTask(Block* b, bool from_read);
282
283 //---------------------------------------------------------------------
286 //---------------------------------------------------------------------
288
289 //---------------------------------------------------------------------
291 //---------------------------------------------------------------------
292 void ProcessWriteTasks();
293
294 long long WritesSinceLastCall();
295
296 char* RequestRAM(long long size);
297 void ReleaseRAM(char* buf, long long size);
298
301
303
304 void Prefetch();
305
306 XrdOss* GetOss() const { return m_oss; }
307
308 bool IsFileActiveOrPurgeProtected(const std::string&) const;
310 PurgePin* GetPurgePin() const { return m_purge_pin; }
311
312 File* GetFile(const std::string&, IO*, long long off = 0, long long filesize = 0);
313
314 void ReleaseFile(File*, IO*);
315
316 void ScheduleFileSync(File* f) { schedule_file_sync(f, false, false); }
317
318 void FileSyncDone(File*, bool high_debug);
319
320 XrdSysError* GetLog() const { return &m_log; }
321 XrdSysTrace* GetTrace() const { return m_trace; }
322
323 ResourceMonitor& RefResMon() { return *m_res_mon; }
324 XrdXrootdGStream* GetGStream() { return m_gstream; }
325
326 void ExecuteCommandUrl(const std::string& command_url);
327
329
330 bool blocksize_str2value(const char *from, const char *str, long long &val, long long min, long long max) const;
331 bool prefetch_str2value(const char *from, const char *str, int &val, int min, int max) const;
332
333 bool is_prefetch_enabled() const { return m_prefetch_enabled; }
334
335private:
336 bool ConfigParameters(std::string, XrdOucStream&, TmpConfiguration &tmpc);
337 bool ConfigXeq(char *, XrdOucStream &);
338 bool xcschk(XrdOucStream &);
339 bool xdlib(XrdOucStream &);
340 bool xplib(XrdOucStream &);
341 bool xtrace(XrdOucStream &);
342 bool test_oss_basics_and_features();
343
344 bool cfg2bytes(const std::string &str, long long &store, long long totalSpace, const char *name) const;
345
346 static Cache *m_instance;
347
348 XrdOucEnv *m_env;
349 mutable XrdSysError m_log;
350 XrdSysTrace *m_trace;
351 const char *m_traceID;
352
353 XrdOss *m_oss;
354
355 XrdXrootdGStream *m_gstream;
356
357 ResourceMonitor *m_res_mon;
358
359 std::vector<Decision*> m_decisionpoints;
360 PurgePin* m_purge_pin;
361
362 Configuration m_configuration;
363
364 XrdSysCondVar m_prefetch_condVar;
365 bool m_prefetch_enabled;
366
367 XrdSysMutex m_RAM_mutex;
368 long long m_RAM_used;
369 long long m_RAM_write_queue;
370 std::list<char*> m_RAM_std_blocks;
371 int m_RAM_std_size;
372
373 bool m_isClient;
374 bool m_dataXattr = false;
375 bool m_metaXattr = false;
376
377 struct WriteQ
378 {
379 WriteQ() : condVar(0), writes_between_purges(0), size(0) {}
380
381 XrdSysCondVar condVar;
382 std::list<Block*> queue;
383 long long writes_between_purges;
384 int size;
385 };
386
387 WriteQ m_writeQ;
388
389 // active map, purge delay set
390 typedef std::map<std::string, File*> ActiveMap_t;
391 typedef ActiveMap_t::iterator ActiveMap_i;
392 typedef std::set<std::string> FNameSet_t;
393
394 ActiveMap_t m_active;
395 FNameSet_t m_purge_delay_set;
396 mutable XrdSysCondVar m_active_cond;
397
398 void inc_ref_cnt(File*, bool lock, bool high_debug);
399 void dec_ref_cnt(File*, bool high_debug);
400
401 void schedule_file_sync(File*, bool ref_cnt_already_set, bool high_debug);
402
403 bool is_http_cache_valid(const std::string& fname, const std::string& iname, XrdCl::URL& url);
404
405 // prefetching
406 typedef std::vector<File*> PrefetchList;
407 PrefetchList m_prefetchList;
408};
409
410}
411
412#endif
#define stat(a, b)
Definition XrdPosix.hh:105
XrdOucString File
virtual XrdOucCacheIO * Attach(XrdOucCacheIO *ioP, int opts=0)=0
XrdOucCache(const char *ctype)
Attaches/creates and detaches/deletes cache-io objects for disk based cache.
Definition XrdPfc.hh:185
XrdSysError * GetLog() const
Definition XrdPfc.hh:320
long long DetermineFullFileSize(const std::string &cinfo_fname)
Definition XrdPfc.cc:949
void FileSyncDone(File *, bool high_debug)
Definition XrdPfc.cc:551
File * GetFile(const std::string &, IO *, long long off=0, long long filesize=0)
Definition XrdPfc.cc:397
bool prefetch_str2value(const char *from, const char *str, int &val, int min, int max) const
static const Configuration & Conf()
Definition XrdPfc.cc:138
bool Config(const char *config_filename, const char *parameters, XrdOucEnv *env)
Parse configuration file.
virtual int LocalFilePath(const char *url, char *buff=0, int blen=0, LFP_Reason why=ForAccess, bool forall=false)
Definition XrdPfc.cc:803
virtual int Stat(const char *url, struct stat &sbuff)
Definition XrdPfc.cc:1193
const Configuration & RefConfiguration() const
Reference XrdPfc configuration.
Definition XrdPfc.hh:241
static ResourceMonitor & ResMon()
Definition XrdPfc.cc:139
bool IsFileActiveOrPurgeProtected(const std::string &) const
Definition XrdPfc.cc:686
void ClearPurgeProtectedSet()
Definition XrdPfc.cc:694
void ReleaseRAM(char *buf, long long size)
Definition XrdPfc.cc:379
virtual int ConsiderCached(const char *url)
Definition XrdPfc.cc:1064
static Cache & GetInstance()
Singleton access.
Definition XrdPfc.cc:136
int GetCacheControlXAttr(const std::string &cinfo_fname, std::string &res) const
Definition XrdPfc.cc:989
void DeRegisterPrefetchFile(File *)
Definition XrdPfc.cc:720
void ExecuteCommandUrl(const std::string &command_url)
void RegisterPrefetchFile(File *)
Definition XrdPfc.cc:704
void WriteFileSizeXAttr(int cinfo_fd, long long file_size)
Definition XrdPfc.cc:934
void Prefetch()
Definition XrdPfc.cc:761
void ReleaseFile(File *, IO *)
Definition XrdPfc.cc:480
void AddWriteTask(Block *b, bool from_read)
Add downloaded block in write queue.
Definition XrdPfc.cc:229
XrdSysTrace * GetTrace() const
Definition XrdPfc.hh:321
Cache(XrdSysLogger *logger, XrdOucEnv *env)
Constructor.
Definition XrdPfc.cc:162
XrdXrootdGStream * GetGStream()
Definition XrdPfc.hh:324
bool Decide(XrdOucCacheIO *)
Makes decision if the original XrdOucCacheIO should be cached.
Definition XrdPfc.cc:141
int UnlinkFile(const std::string &f_name, bool fail_if_open)
Remove cinfo and data files from cache.
Definition XrdPfc.cc:1264
static XrdScheduler * schedP
Definition XrdPfc.hh:328
ResourceMonitor & RefResMon()
Definition XrdPfc.hh:323
File * GetNextFileToPrefetch()
Definition XrdPfc.cc:742
long long WritesSinceLastCall()
Definition XrdPfc.cc:328
void ProcessWriteTasks()
Separate task which writes blocks from ram to disk.
Definition XrdPfc.cc:281
virtual int Unlink(const char *url)
Definition XrdPfc.cc:1254
void WriteCacheControlXAttr(int cinfo_fd, const char *path, const std::string &cc)
Definition XrdPfc.cc:921
void RemoveWriteQEntriesFor(File *f)
Remove blocks from write queue which belong to given prefetch. This method is used at the time of Fil...
Definition XrdPfc.cc:248
virtual XrdOucCacheIO * Attach(XrdOucCacheIO *, int Options=0)
Definition XrdPfc.cc:183
static const Cache & TheOne()
Definition XrdPfc.cc:137
PurgePin * GetPurgePin() const
Definition XrdPfc.hh:310
XrdOss * GetOss() const
Definition XrdPfc.hh:306
static bool VCheck(XrdVersionInfo &urVersion)
Version check.
Definition XrdPfc.hh:271
char * RequestRAM(long long size)
Definition XrdPfc.cc:339
virtual int Prepare(const char *url, int oflags, mode_t mode)
Definition XrdPfc.cc:1130
bool DecideIfConsideredCached(long long file_size, long long bytes_on_disk)
Definition XrdPfc.cc:1031
bool blocksize_str2value(const char *from, const char *str, long long &val, long long min, long long max) const
static Cache & CreateInstance(XrdSysLogger *logger, XrdOucEnv *env)
Singleton creation.
Definition XrdPfc.cc:129
bool is_prefetch_enabled() const
Definition XrdPfc.hh:333
void ScheduleFileSync(File *f)
Definition XrdPfc.hh:316
Base cache-io class that implements some XrdOucCacheIO abstract methods.
Definition XrdPfcIO.hh:16
Base class for reguesting directory space to obtain.
@ CSChk_Cache
Contains parameters configurable from the xrootd config file.
Definition XrdPfc.hh:67
long long m_hdfsbsize
used with m_hdfsmode, default 128MB
Definition XrdPfc.hh:125
long long m_RamAbsAvailable
available from configuration
Definition XrdPfc.hh:112
long long m_flushCnt
nuber of unsynced blcoks on disk before flush is called
Definition XrdPfc.hh:126
long long m_cgi_max_bufferSize
max buffer size allowed in pfc.blocksize
Definition XrdPfc.hh:119
int m_accHistorySize
max number of entries in access history part of cinfo file
Definition XrdPfc.hh:104
int m_cgi_min_prefetch_max_blocks
min prefetch block count allowed in pfc.prefetch
Definition XrdPfc.hh:120
bool does_cschk_have_missing_bits(CkSumCheck_e cks_on_file) const
Definition XrdPfc.hh:83
bool m_httpcc
enable http cache control
Definition XrdPfc.hh:140
bool m_cgi_prefetch_allowed
allow cgi setting of prefetch
Definition XrdPfc.hh:123
int m_wqueue_threads
number of threads writing blocks to disk
Definition XrdPfc.hh:115
bool m_write_through
flag indicating write-through mode is enabled
Definition XrdPfc.hh:87
long long m_diskTotalSpace
total disk space on configured partition or oss space
Definition XrdPfc.hh:95
long long m_fileUsageMax
cache purge - files usage maximum
Definition XrdPfc.hh:100
long long m_fileUsageBaseline
cache purge - files usage baseline
Definition XrdPfc.hh:98
int m_dirStatsStoreDepth
maximum depth for statistics write out
Definition XrdPfc.hh:109
bool m_allow_xrdpfc_command
flag for enabling access to /xrdpfc-command/ functionality.
Definition XrdPfc.hh:89
bool is_purge_plugin_set_up() const
Definition XrdPfc.hh:74
long long m_diskUsageHWM
cache purge - disk usage high water mark
Definition XrdPfc.hh:97
bool is_cschk_cache() const
Definition XrdPfc.hh:78
std::set< std::string > m_dirStatsDirGlobs
directory globs for which stat reporting was requested
Definition XrdPfc.hh:107
static constexpr long long s_min_bufferSize
Definition XrdPfc.hh:135
CkSumCheck_e get_cs_Chk() const
Definition XrdPfc.hh:76
static constexpr long long s_max_bufferSize
Definition XrdPfc.hh:136
bool is_uvkeep_purge_in_effect() const
Definition XrdPfc.hh:72
int m_prefetch_max_blocks
default maximum number of blocks to prefetch per file
Definition XrdPfc.hh:116
bool are_file_usage_limits_set() const
Definition XrdPfc.hh:70
bool is_cschk_any() const
Definition XrdPfc.hh:80
bool m_cs_ChkTLS
Allow TLS.
Definition XrdPfc.hh:130
long long m_fileUsageNominal
cache purge - files usage nominal
Definition XrdPfc.hh:99
int m_cs_Chk
Checksum check.
Definition XrdPfc.hh:129
bool should_uvkeep_purge(time_t delta) const
Definition XrdPfc.hh:85
int m_purgeAgeBasedPeriod
peform cold file / uvkeep purge every this many purge cycles
Definition XrdPfc.hh:103
bool m_qfsredir
redirect file system query to the origin
Definition XrdPfc.hh:141
bool m_hdfsmode
flag for enabling block-level operation
Definition XrdPfc.hh:88
int m_purgeColdFilesAge
purge files older than this age
Definition XrdPfc.hh:102
std::string m_data_space
oss space for data files
Definition XrdPfc.hh:92
bool is_cschk_both() const
Definition XrdPfc.hh:81
std::set< std::string > m_dirStatsDirs
directories for which stat reporting was requested
Definition XrdPfc.hh:106
long long m_diskUsageLWM
cache purge - disk usage low water mark
Definition XrdPfc.hh:96
int m_RamKeepStdBlocks
number of standard-sized blocks kept after release
Definition XrdPfc.hh:113
long long m_bufferSize
cache block size, default 128 kB
Definition XrdPfc.hh:111
long long m_cgi_min_bufferSize
min buffer size allowed in pfc.blocksize
Definition XrdPfc.hh:118
int m_dirStatsInterval
time between resource monitor statistics dump in seconds
Definition XrdPfc.hh:108
std::string m_meta_space
oss space for metadata files (cinfo)
Definition XrdPfc.hh:93
int m_wqueue_blocks
maximum number of blocks written per write-queue loop
Definition XrdPfc.hh:114
bool is_age_based_purge_in_effect() const
Definition XrdPfc.hh:71
int m_cgi_max_prefetch_max_blocks
max prefetch block count allowed in pfc.prefetch
Definition XrdPfc.hh:121
std::string m_username
username passed to oss plugin
Definition XrdPfc.hh:91
static constexpr int s_max_prefetch_max_blocks
Definition XrdPfc.hh:138
bool m_cgi_blocksize_allowed
allow cgi setting of blocksize
Definition XrdPfc.hh:122
bool is_cschk_net() const
Definition XrdPfc.hh:79
double m_onlyIfCachedMinFrac
minimum fraction of downloaded file, used by only-if-cached CGI option
Definition XrdPfc.hh:133
time_t m_cs_UVKeep
unverified checksum cache keep
Definition XrdPfc.hh:128
int m_purgeInterval
sleep interval between cache purges
Definition XrdPfc.hh:101
long long m_onlyIfCachedMinSize
minumum size of downloaded file, used by only-if-cached CGI option
Definition XrdPfc.hh:132
bool is_dir_stat_reporting_on() const
Definition XrdPfc.hh:73
MutexHolder(MOO &m)
Definition XrdPfc.hh:54
std::string m_diskUsageLWM
Definition XrdPfc.hh:148
std::string m_diskUsageHWM
Definition XrdPfc.hh:149
std::string m_fileUsageBaseline
Definition XrdPfc.hh:150
std::string m_fileUsageNominal
Definition XrdPfc.hh:151
std::string m_flushRaw
Definition XrdPfc.hh:153
std::string m_fileUsageMax
Definition XrdPfc.hh:152
static const size_t s_MAX_SIZE
Definition XrdPfc.hh:168
snprintf_wrapper(const std::string &exc_prefix, int size=1024)
const char * c_str() const
Definition XrdPfc.hh:174
void operator()(const char *fmt,...)
std::string f_exc_prefix
Definition XrdPfc.hh:166
std::vector< char > f_string
Definition XrdPfc.hh:164