13#include "XrdVersion.hh"
63bool Cache::cfg2bytes(
const std::string &str,
long long &store,
long long totalSpace,
const char *name)
66 snprintf(errStr, 1024,
"ConfigParameters() Error parsing parameter %s", name);
68 if (::isalpha(*(str.rbegin())))
79 double frac = strtod(str.c_str(), &eP);
80 if (errno || eP == str.c_str())
82 m_log.Emsg(errStr, str.c_str());
86 store =
static_cast<long long>(totalSpace * frac + 0.5);
89 if (store < 0 || store > totalSpace)
91 snprintf(errStr, 1024,
"ConfigParameters() Error: parameter %s should be between 0 and total available disk space (%lld) - it is %lld (given as %s)",
92 name, totalSpace, store, str.c_str());
93 m_log.Emsg(errStr,
"");
119bool Cache::xcschk(XrdOucStream &Config)
121 const char *val, *val2;
122 struct cschkopts {
const char *opname;
int opval;} csopts[] =
129 int i, numopts =
sizeof(csopts)/
sizeof(
struct cschkopts);
132 if (! (val =
Config.GetWord()))
133 {m_log.Emsg(
"Config",
"cschk parameter not specified");
return false; }
137 if ((
isNo = strncmp(val,
"no", 2) == 0))
141 for (i = 0; i < numopts; i++)
143 if (!strcmp(val2, csopts[i].opname))
146 m_configuration.m_cs_Chk &= ~csopts[i].opval;
147 else if (csopts[i].opval)
148 m_configuration.m_cs_Chk |= csopts[i].opval;
150 m_configuration.m_cs_Chk = csopts[i].opval;
156 if (strcmp(val,
"uvkeep"))
158 m_log.Emsg(
"Config",
"invalid cschk option -", val);
161 if (!(val =
Config.GetWord()))
163 m_log.Emsg(
"Config",
"cschk uvkeep value not specified");
166 if (!strcmp(val,
"lru"))
167 m_configuration.m_cs_UVKeep = -1;
173 m_configuration.m_cs_UVKeep = uvkeep;
179 m_configuration.m_cs_ChkTLS = m_configuration.m_cs_Chk &
CSChk_TLS;
180 m_configuration.m_cs_Chk &= ~CSChk_TLS;
182 m_env->Put(
"psx.CSNet", m_configuration.is_cschk_net() ? (m_configuration.m_cs_ChkTLS ?
"2" :
"1") :
"0");
198bool Cache::xdlib(XrdOucStream &Config)
203 if (! (val =
Config.GetWord()) || ! val[0])
205 TRACE(Info,
" Cache::Config() decisionlib not specified; always caching files");
215 Config.GetRest(params, 4096);
219 XrdOucPinLoader* myLib =
new XrdOucPinLoader(&m_log, 0,
"decisionlib",
222 Decision *(*ep)(XrdSysError&);
223 ep = (Decision *(*)(XrdSysError&))myLib->
Resolve(
"XrdPfcGetDecision");
224 if (! ep) {myLib->
Unload(
true);
return false; }
226 Decision * d = ep(m_log);
229 TRACE(
Error,
"Config() decisionlib was not able to create a decision object");
235 m_decisionpoints.push_back(d);
244bool Cache::xtrace(XrdOucStream &Config)
247 static struct traceopts {
const char *opname;
int opval; } tropts[] =
257 int numopts =
sizeof(tropts)/
sizeof(
struct traceopts);
259 if (! (val =
Config.GetWord()))
260 {m_log.Emsg(
"Config",
"trace option not specified");
return 1; }
262 for (
int i = 0; i < numopts; i++)
264 if (! strcmp(val, tropts[i].opname))
266 m_trace->What = tropts[i].opval;
270 m_log.Emsg(
"Config",
"invalid trace option -", val);
275bool Cache::test_oss_basics_and_features()
277 static const char *epfx =
"test_oss_basics_and_features()";
279 const auto &conf = m_configuration;
280 const char *user = conf.m_username.c_str();
283 auto check_space = [&](
const char *space,
bool &has_xattr)
285 std::string fname(
"__prerun_test_pfc_");
288 env.
Put(
"oss.cgroup", space);
290 int res = m_oss->Create(user, fname.c_str(), 0600, env,
XRDOSS_mkpath);
292 m_log.Emsg(epfx,
"Can not create a file on space", space);
295 XrdOssDF *oss_file = m_oss->newFile(user);
296 res = oss_file->
Open(fname.c_str(), O_RDWR, 0600, env);
298 m_log.Emsg(epfx,
"Can not open a file on space", space);
301 res = oss_file->
Write(fname.data(), 0, fname.length());
302 if (res != (
int) fname.length()) {
303 m_log.Emsg(epfx,
"Can not write into a file on space", space);
308 long long fsize = fname.length();
311 m_log.Emsg(epfx,
"Can not write xattr to a file on space", space);
319 m_oss->Lfn2Pfn(fname.c_str(), pfn, 4096);
322 if (res !=
sizeof(
long long) || fsize != (
long long) fname.length())
324 m_log.Emsg(epfx,
"Can not read xattr from a file on space", space);
329 res = m_oss->Unlink(fname.c_str());
331 m_log.Emsg(epfx,
"Can not unlink a file on space", space);
339 aOK &= check_space(conf.m_data_space.c_str(), m_dataXattr);
340 aOK &= check_space(conf.m_meta_space.c_str(), m_metaXattr);
354 const char *theINS = getenv(
"XRDINSTANCE");
355 m_isClient = (theINS != 0 && strncmp(
"*client ", theINS, 8) == 0);
363 if (! config_filename || ! *config_filename)
365 TRACE(
Error,
"Config() configuration file not specified.");
370 if ( (fd =
open(config_filename, O_RDONLY, 0)) < 0)
372 TRACE(
Error,
"Config() can't open configuration file " << config_filename);
377 static const char *cvec[] = {
"*** pfc plugin config:", 0 };
383 if (! ofsCfg)
return false;
390 m_configuration.m_bufferSize = 128 * 1024;
391 m_configuration.m_wqueue_blocks = 8;
392 m_configuration.m_wqueue_threads = 1;
396 if (m_configuration.is_cschk_net()) m_env->Put(
"psx.CSNet", m_configuration.m_cs_ChkTLS ?
"2" :
"1");
399 bool retval =
true, aOK =
true;
401 while ((var =
Config.GetMyFirstWord()))
403 if (! strcmp(var,
"pfc.osslib"))
407 else if (! strcmp(var,
"pfc.cschk"))
411 else if (! strcmp(var,
"pfc.decisionlib"))
415 else if (! strcmp(var,
"pfc.trace"))
419 else if (! strcmp(var,
"pfc.allow_xrdpfc_command"))
421 m_configuration.m_allow_xrdpfc_command =
true;
423 else if (! strncmp(var,
"pfc.", 4))
425 retval = ConfigParameters(std::string(var+4),
Config, tmpc);
438 myEnv.
Put(
"oss.runmode",
"pfc");
439 if (m_configuration.is_cschk_cache())
442 if (snprintf(csi_conf, 128,
"space=%s nofill", m_configuration.m_meta_space.c_str()) < 128)
446 TRACE(
Error,
"Config() buffer too small for libXrdOssCsi params.");
456 TRACE(
Error,
"Config() Unable to create an OSS object");
461 aOK &= test_oss_basics_and_features();
466 if (m_oss->StatVS(&sP, m_configuration.m_data_space.c_str(), 1) < 0)
468 m_log.Emsg(
"ConfigParameters()",
"error obtaining stat info for data space ", m_configuration.m_data_space.c_str());
471 if (sP.
Total < 10ll << 20)
473 m_log.Emsg(
"ConfigParameters()",
"available data space is less than 10 MB (can be due to a mistake in oss.localroot directive) for space ",
474 m_configuration.m_data_space.c_str());
478 m_configuration.m_diskTotalSpace = sP.
Total;
480 if (cfg2bytes(tmpc.
m_diskUsageLWM, m_configuration.m_diskUsageLWM, sP.
Total,
"lowWatermark") &&
483 if (m_configuration.m_diskUsageLWM >= m_configuration.m_diskUsageHWM) {
484 m_log.Emsg(
"ConfigParameters()",
"pfc.diskusage should have lowWatermark < highWatermark.");
496 if (m_configuration.m_fileUsageBaseline >= m_configuration.m_fileUsageNominal ||
497 m_configuration.m_fileUsageBaseline >= m_configuration.m_fileUsageMax ||
498 m_configuration.m_fileUsageNominal >= m_configuration.m_fileUsageMax)
500 m_log.Emsg(
"ConfigParameters()",
"pfc.diskusage files should have baseline < nominal < max.");
514 &m_configuration.m_flushCnt,
515 100 * m_configuration.m_bufferSize , 100000 * m_configuration.m_bufferSize))
519 m_configuration.m_flushCnt /= m_configuration.m_bufferSize;
524 &m_configuration.m_flushCnt, 100, 100000))
532 if (m_configuration.m_RamAbsAvailable == 0)
534 m_configuration.m_RamAbsAvailable = m_isClient ? 256ll * 1024 * 1024 : 1024ll * 1024 * 1024;
536 snprintf(buff,
sizeof(buff),
"RAM usage pfc.ram is not specified. Default value %s is used.", m_isClient ?
"256m" :
"1g");
537 m_log.Say(
"Config info: ", buff);
540 m_configuration.m_RamKeepStdBlocks = (m_configuration.m_RamAbsAvailable / m_configuration.m_bufferSize + 1) * 5 / 100;
543 char* cenv = getenv(
"XRDDEBUG");
544 if (cenv && ! strcmp(cenv,
"1") && m_trace->What < 4) m_trace->What = 4;
550 const char *csc[] = {
"off",
"cache nonet",
"nocache net notls",
554 "off",
"cache nonet",
"nocache net tls",
557 char buff[8192], uvk[32];
558 if (m_configuration.m_cs_UVKeep < 0)
561 sprintf(uvk,
"%lld", (
long long) m_configuration.m_cs_UVKeep);
562 float rg = (m_configuration.m_RamAbsAvailable) /
float(1024*1024*1024);
563 loff = snprintf(buff,
sizeof(buff),
"Config effective %s pfc configuration:\n"
564 " pfc.cschk %s uvkeep %s\n"
565 " pfc.blocksize %lld\n"
568 " pfc.writequeue %d %d\n"
569 " # Total available disk: %lld\n"
570 " pfc.diskusage %lld %lld files %lld %lld %lld purgeinterval %d purgecoldfiles %d\n"
571 " pfc.spaces %s %s\n"
574 " pfc.acchistorysize %d\n"
575 " pfc.onlyIfCachedMinBytes %lld\n"
576 " pfc.onlyIfCachedMinFrac %.2f\n",
578 csc[
int(m_configuration.m_cs_Chk)], uvk,
579 m_configuration.m_bufferSize,
580 m_configuration.m_prefetch_max_blocks,
582 m_configuration.m_wqueue_blocks, m_configuration.m_wqueue_threads,
584 m_configuration.m_diskUsageLWM, m_configuration.m_diskUsageHWM,
585 m_configuration.m_fileUsageBaseline, m_configuration.m_fileUsageNominal, m_configuration.m_fileUsageMax,
586 m_configuration.m_purgeInterval, m_configuration.m_purgeColdFilesAge,
587 m_configuration.m_data_space.c_str(),
588 m_configuration.m_meta_space.c_str(),
590 m_configuration.m_flushCnt,
591 m_configuration.m_accHistorySize,
592 m_configuration.m_onlyIfCachedMinSize,
593 m_configuration.m_onlyIfCachedMinFrac);
595 if (m_configuration.is_dir_stat_reporting_on())
597 loff += snprintf(buff + loff,
sizeof(buff) - loff,
598 " pfc.dirstats maxdepth %d ((internal: store_depth %d, size_of_dirlist %d, size_of_globlist %d))\n",
599 m_configuration.m_dirStatsMaxDepth, m_configuration.m_dirStatsStoreDepth,
600 (
int) m_configuration.m_dirStatsDirs.size(), (
int) m_configuration.m_dirStatsDirGlobs.size());
601 loff += snprintf(buff + loff,
sizeof(buff) - loff,
" dirlist:\n");
602 for (std::set<std::string>::iterator i = m_configuration.m_dirStatsDirs.begin(); i != m_configuration.m_dirStatsDirs.end(); ++i)
603 loff += snprintf(buff + loff,
sizeof(buff) - loff,
" %s\n", i->c_str());
604 loff += snprintf(buff + loff,
sizeof(buff) - loff,
" globlist:\n");
605 for (std::set<std::string>::iterator i = m_configuration.m_dirStatsDirGlobs.begin(); i != m_configuration.m_dirStatsDirGlobs.end(); ++i)
606 loff += snprintf(buff + loff,
sizeof(buff) - loff,
" %s/*\n", i->c_str());
609 if (m_configuration.m_hdfsmode)
611 loff += snprintf(buff + loff,
sizeof(buff) - loff,
" pfc.hdfsmode hdfsbsize %lld\n", m_configuration.m_hdfsbsize);
614 if (m_configuration.m_username.empty())
618 m_configuration.m_username = unameBuff;
622 loff += snprintf(buff + loff,
sizeof(buff) - loff,
" pfc.user %s\n", m_configuration.m_username.c_str());
627 m_env->Put(
"XRDPFC.SEGSIZE", std::to_string(m_configuration.m_bufferSize).c_str());
631 m_prefetch_enabled = m_configuration.m_prefetch_max_blocks > 0;
636 m_log.Say(
"Config Proxy File Cache g-stream has", m_gstream ?
"" :
" NOT",
" been configured via xrootd.monitor directive");
638 m_log.Say(
"------ Proxy File Cache configuration parsing ", aOK ?
"completed" :
"failed");
640 if (ofsCfg)
delete ofsCfg;
644#ifdef XRDPFC_CKSUM_TEST
646 int xxx = m_configuration.m_cs_Chk;
648 for (m_configuration.m_cs_Chk =
CSChk_None; m_configuration.m_cs_Chk <=
CSChk_Both; ++m_configuration.m_cs_Chk)
650 Info::TestCksumStuff();
653 m_configuration.m_cs_Chk = xxx;
664 struct ConfWordGetter
669 ConfWordGetter(
XrdOucStream& c) : m_config(c), m_last_word((char*)1) {}
671 const char* GetWord() {
if (HasLast()) m_last_word = m_config.
GetWord();
return HasLast() ? m_last_word :
""; }
672 bool HasLast() {
return (m_last_word != 0); }
675 ConfWordGetter cwg(config);
677 XrdSysError err(0,
"");
678 if ( part ==
"user" )
680 m_configuration.m_username = cwg.GetWord();
681 if ( ! cwg.HasLast())
683 m_log.Emsg(
"Config",
"Error: pfc.user requires a parameter.");
687 else if ( part ==
"diskusage" )
694 m_log.Emsg(
"Config",
"Error: pfc.diskusage parameter requires at least two arguments.");
699 while ((p = cwg.GetWord()) && cwg.HasLast())
701 if (strcmp(p,
"files") == 0)
707 if ( ! cwg.HasLast())
709 m_log.Emsg(
"Config",
"Error: pfc.diskusage files directive requires three arguments.");
713 else if (strcmp(p,
"sleep") == 0 || strcmp(p,
"purgeinterval") == 0)
715 if (strcmp(p,
"sleep") == 0) m_log.Emsg(
"Config",
"warning sleep directive is deprecated in pfc.diskusage. Please use purgeinterval instead.");
717 if (
XrdOuca2x::a2tm(m_log,
"Error getting purgeinterval", cwg.GetWord(), &m_configuration.m_purgeInterval, 60, 3600))
722 else if (strcmp(p,
"purgecoldfiles") == 0)
724 if (
XrdOuca2x::a2tm(m_log,
"Error getting purgecoldfiles age", cwg.GetWord(), &m_configuration.m_purgeColdFilesAge, 3600, 3600*24*360))
728 if (
XrdOuca2x::a2i(m_log,
"Error getting purgecoldfiles period", cwg.GetWord(), &m_configuration.m_purgeAgeBasedPeriod, 1, 1000))
735 m_log.Emsg(
"Config",
"Error: diskusage stanza contains unknown directive", p);
739 else if ( part ==
"acchistorysize" )
741 if (
XrdOuca2x::a2i(m_log,
"Error getting access-history-size", cwg.GetWord(), &m_configuration.m_accHistorySize, 20, 200))
746 else if ( part ==
"dirstats" )
749 while ((p = cwg.GetWord()) && cwg.HasLast())
751 if (strcmp(p,
"maxdepth") == 0)
753 if (
XrdOuca2x::a2i(m_log,
"Error getting maxdepth value", cwg.GetWord(), &m_configuration.m_dirStatsMaxDepth, 0, 16))
757 m_configuration.m_dirStatsStoreDepth = std::max(m_configuration.m_dirStatsStoreDepth, m_configuration.m_dirStatsMaxDepth);
759 else if (strcmp(p,
"dir") == 0)
762 if (p && p[0] ==
'/')
766 char d[1024]; d[0] = 0;
774 if (*(pd - 1) ==
'/')
786 if (*pd ==
'/' && pd != d) *pd = 0;
789 if (ld >= 2 && d[ld-1] ==
'*' && d[ld-2] ==
'/')
793 m_configuration.m_dirStatsDirGlobs.insert(d);
794 printf(
"Glob %s -> %s -- depth = %d\n", p, d, depth);
798 m_configuration.m_dirStatsDirs.insert(d);
799 printf(
"Dir %s -> %s -- depth = %d\n", p, d, depth);
802 m_configuration.m_dirStatsStoreDepth = std::max(m_configuration.m_dirStatsStoreDepth, depth);
806 m_log.Emsg(
"Config",
"Error: dirstats dir parameter requires a directory argument starting with a '/'.");
812 m_log.Emsg(
"Config",
"Error: dirstats stanza contains unknown directive '", p,
"'");
817 else if ( part ==
"blocksize" )
819 long long minBSize = 4 * 1024;
820 long long maxBSize = 512 * 1024 * 1024;
821 if (
XrdOuca2x::a2sz(m_log,
"Error reading block-size", cwg.GetWord(), &m_configuration.m_bufferSize, minBSize, maxBSize))
825 if (m_configuration.m_bufferSize & 0xFFF)
827 m_configuration.m_bufferSize &= ~0x0FFF;
828 m_configuration.m_bufferSize += 0x1000;
829 m_log.Emsg(
"Config",
"pfc.blocksize must be a multiple of 4 kB. Rounded up.");
832 else if ( part ==
"prefetch" || part ==
"nramprefetch" )
834 if (part ==
"nramprefetch")
836 m_log.Emsg(
"Config",
"pfc.nramprefetch is deprecated, please use pfc.prefetch instead. Replacing the directive internally.");
839 if (
XrdOuca2x::a2i(m_log,
"Error setting prefetch block count", cwg.GetWord(), &m_configuration.m_prefetch_max_blocks, 0, 128))
845 else if ( part ==
"nramread" )
847 m_log.Emsg(
"Config",
"pfc.nramread is deprecated, please use pfc.ram instead. Ignoring this directive.");
850 else if ( part ==
"ram" )
852 long long minRAM = m_isClient ? 256 * 1024 * 1024 : 1024 * 1024 * 1024;
853 long long maxRAM = 256 * minRAM;
854 if (
XrdOuca2x::a2sz(m_log,
"get RAM available", cwg.GetWord(), &m_configuration.m_RamAbsAvailable, minRAM, maxRAM))
859 else if ( part ==
"writequeue")
861 if (
XrdOuca2x::a2i(m_log,
"Error getting pfc.writequeue num-blocks", cwg.GetWord(), &m_configuration.m_wqueue_blocks, 1, 1024))
865 if (
XrdOuca2x::a2i(m_log,
"Error getting pfc.writequeue num-threads", cwg.GetWord(), &m_configuration.m_wqueue_threads, 1, 64))
870 else if ( part ==
"spaces" )
872 m_configuration.m_data_space = cwg.GetWord();
873 m_configuration.m_meta_space = cwg.GetWord();
874 if ( ! cwg.HasLast())
876 m_log.Emsg(
"Config",
"spacenames requires two parameters: <data-space> <metadata-space>.");
880 else if ( part ==
"hdfsmode" )
882 m_log.Emsg(
"Config",
"pfc.hdfsmode is currently unsupported.");
885 m_configuration.m_hdfsmode =
true;
887 const char* params = cwg.GetWord();
890 if (! strncmp(
"hdfsbsize", params, 9))
892 long long minBlSize = 32 * 1024;
893 long long maxBlSize = 128 * 1024 * 1024;
894 if (
XrdOuca2x::a2sz(m_log,
"Error getting file fragment size", cwg.GetWord(), &m_configuration.m_hdfsbsize, minBlSize, maxBlSize))
901 m_log.Emsg(
"Config",
"Error setting the fragment size parameter name");
906 else if ( part ==
"flush" )
909 if ( ! cwg.HasLast())
911 m_log.Emsg(
"Config",
"Error: pfc.flush requires a parameter.");
915 else if ( part ==
"onlyifcached" )
918 while ((p = cwg.GetWord()) && cwg.HasLast())
920 if (strcmp(p,
"minsize") == 0)
922 std::string minBytes = cwg.GetWord();
923 long long minBytesTop = 1024 * 1024 * 1024;
924 if (::isalpha(*(minBytes.rbegin())))
926 if (
XrdOuca2x::a2sz(m_log,
"Error in parsing minsize value for onlyifcached parameter", minBytes.c_str(), &m_configuration.m_onlyIfCachedMinSize, 0, minBytesTop))
933 if (
XrdOuca2x::a2ll(m_log,
"Error in parsing numeric minsize value for onlyifcached parameter", minBytes.c_str(),&m_configuration.m_onlyIfCachedMinSize, 0, minBytesTop))
939 if (strcmp(p,
"minfrac") == 0)
941 std::string minFrac = cwg.GetWord();
944 double frac = strtod(minFrac.c_str(), &eP);
945 if (errno || eP == minFrac.c_str())
947 m_log.Emsg(
"Config",
"Error setting fraction for only-if-cached directive");
950 m_configuration.m_onlyIfCachedMinFrac = frac;
954 m_log.Emsg(
"Config",
"Error: onlyifcached stanza contains unknown directive", p);
960 m_log.Emsg(
"ConfigParameters() unmatched pfc parameter", part.c_str());
XrdVERSIONINFO(XrdOucGetCache, XrdPfc)
XrdSysXAttr * XrdSysXAttrActive
XrdOucCache * XrdOucGetCache(XrdSysLogger *logger, const char *config_filename, const char *parameters, XrdOucEnv *env)
int isNo(int dflt, const char *Msg1, const char *Msg2, const char *Msg3)
bool Plugin(XrdAccAuthorize *&piP)
Get Authorization plugin.
static XrdOfsConfigPI * New(const char *cfn, XrdOucStream *cfgP, XrdSysError *errP, XrdVersionInfo *verP=0, XrdSfsFileSystem *sfsP=0)
bool Load(int what, XrdOucEnv *envP=0)
bool Push(TheLib what, const char *plugP, const char *parmP=0)
virtual int Close(long long *retsz=0)=0
virtual int Open(const char *path, int Oflag, mode_t Mode, XrdOucEnv &env)
virtual ssize_t Write(const void *buffer, off_t offset, size_t size)
static int Export(const char *Var, const char *Val)
void Put(const char *varname, const char *value)
void * Resolve(const char *symbl, int mcnt=1)
void Unload(bool dodel=false)
char * GetWord(int lowcase=0)
static int UserName(uid_t uID, char *uName, int uNsz)
static int a2i(XrdSysError &, const char *emsg, const char *item, int *val, int minv=-1, int maxv=-1)
static int a2sz(XrdSysError &, const char *emsg, const char *item, long long *val, long long minv=-1, long long maxv=-1)
static int a2ll(XrdSysError &, const char *emsg, const char *item, long long *val, long long minv=-1, long long maxv=-1)
static int a2tm(XrdSysError &, const char *emsg, const char *item, int *val, int minv=-1, int maxv=-1)
bool Config(const char *config_filename, const char *parameters)
Parse configuration file.
virtual bool ConfigDecision(const char *params)
static size_t s_maxNumAccess
virtual int Get(const char *Aname, void *Aval, int Avsz, const char *Path, int fd=-1)=0
virtual int Set(const char *Aname, const void *Aval, int Avsz, const char *Path, int fd=-1, int isNew=0)=0
const char * trace_what_strings[]
long long m_hdfsbsize
used with m_hdfsmode, default 128MB
long long m_RamAbsAvailable
available from configuration
long long m_flushCnt
nuber of unsynced blcoks on disk before flush is called
int m_accHistorySize
max number of entries in access history part of cinfo file
int m_wqueue_threads
number of threads writing blocks to disk
long long m_diskTotalSpace
total disk space on configured partition or oss space
long long m_fileUsageMax
cache purge - files usage maximum
long long m_fileUsageBaseline
cache purge - files usage baseline
int m_dirStatsStoreDepth
depth to which statistics should be collected
bool m_allow_xrdpfc_command
flag for enabling access to /xrdpfc-command/ functionality.
long long m_diskUsageHWM
cache purge - disk usage high water mark
int m_prefetch_max_blocks
maximum number of blocks to prefetch per file
bool m_cs_ChkTLS
Allow TLS.
long long m_fileUsageNominal
cache purge - files usage nominal
int m_cs_Chk
Checksum check.
int m_purgeAgeBasedPeriod
peform cold file / uvkeep purge every this many purge cycles
bool m_hdfsmode
flag for enabling block-level operation
int m_purgeColdFilesAge
purge files older than this age
std::string m_data_space
oss space for data files
long long m_diskUsageLWM
cache purge - disk usage low water mark
int m_RamKeepStdBlocks
number of standard-sized blocks kept after release
long long m_bufferSize
prefetch buffer size, default 1MB
std::string m_meta_space
oss space for metadata files (cinfo)
int m_wqueue_blocks
maximum number of blocks written per write-queue loop
double m_onlyIfCachedMinFrac
minimum fraction of downloaded file, used by only-if-cached CGI option
time_t m_cs_UVKeep
unverified checksum cache keep
int m_dirStatsMaxDepth
maximum depth for statistics write out
int m_purgeInterval
sleep interval between cache purges
long long m_onlyIfCachedMinSize
minumum size of downloaded file, used by only-if-cached CGI option
std::string m_diskUsageLWM
std::string m_diskUsageHWM
std::string m_fileUsageBaseline
std::string m_fileUsageNominal
std::string m_fileUsageMax