From 128330ada0cc13b496d1325dc7a20298b2a1b4c8 Mon Sep 17 00:00:00 2001 From: Alja Mrak-Tadel Date: Thu, 20 Nov 2014 09:54:23 -0800 Subject: [PATCH 1/7] Use pfc prefix in config file to set XrdFileCacheOptions. --- src/XrdFileCache/XrdFileCacheFactory.cc | 287 ++++++++++++------------ src/XrdFileCache/XrdFileCacheFactory.hh | 4 +- 2 files changed, 147 insertions(+), 144 deletions(-) diff --git a/src/XrdFileCache/XrdFileCacheFactory.cc b/src/XrdFileCache/XrdFileCacheFactory.cc index 62775f810bd..86775bd5c84 100644 --- a/src/XrdFileCache/XrdFileCacheFactory.cc +++ b/src/XrdFileCache/XrdFileCacheFactory.cc @@ -20,6 +20,8 @@ #include #include #include + + #include @@ -43,8 +45,6 @@ using namespace XrdFileCache; namespace { static long long s_diskSpacePrecisionFactor = 10000000; } -#define TS_Xeq(x,m) if (!strcmp(x,var)) return m(Config); - XrdVERSIONINFO(XrdOucGetCache, XrdFileCache); @@ -99,6 +99,86 @@ XrdOucCache *Factory::Create(Parms & parms, XrdOucCacheIO::aprParms * prParms) return new Cache(m_stats); } + +/* Function: xdlib + + Purpose: To parse the directive: decisionlib [] + + the path of the decision library to be used. + optional parameters to be passed. + + + Output: true upon success or false upon failure. + */ +bool Factory::xdlib(XrdOucStream &Config) +{ + const char* val; + + std::string libp; + if (!(val = Config.GetWord()) || !val[0]) + { + clLog()->Info(XrdCl::AppMsg, " Factory:;Config() decisionlib not specified; always caching files"); + return true; + } + else + { + libp = val; + } + + const char* params; + params = (val[0]) ? Config.GetWord() : 0; + + + XrdOucPinLoader* myLib = new XrdOucPinLoader(&m_log, 0, "decisionlib", + libp.c_str()); + + Decision *(*ep)(XrdSysError&); + ep = (Decision *(*)(XrdSysError&))myLib->Resolve("XrdFileCacheGetDecision"); + if (!ep) {myLib->Unload(true); return false;} + + Decision * d = ep(m_log); + if (!d) + { + clLog()->Error(XrdCl::AppMsg, "Factory::Config() decisionlib was not able to create a decision object"); + return false; + } + if (params) + d->ConfigDecision(params); + + m_decisionpoints.push_back(d); + return true; +} +//______________________________________________________________________________ + + +bool Factory::Decide(XrdOucCacheIO* io) +{ + // if ( CheckFileForDiskSpace(io->Path(), io->FSize()) == false ) + // return false; + + if(!m_decisionpoints.empty()) + { + std::string filename = io->Path(); + std::vector::const_iterator it; + for ( it = m_decisionpoints.begin(); it != m_decisionpoints.end(); ++it) + { + XrdFileCache::Decision *d = *it; + if (!d) continue; + if (!d->Decide(filename, *m_output_fs)) + { + return false; + } + } + } + + return true; +} + + + +//______________________________________________________________________________ + + bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const char *parameters) { m_log.logger(logger); @@ -127,7 +207,7 @@ bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const ch // Obtain plugin configurator XrdOfsConfigPI *ofsCfg = XrdOfsConfigPI::New(config_filename,&Config,&m_log, - &XrdVERSIONINFOVAR(XrdOucGetCache)); + &XrdVERSIONINFOVAR(XrdOucGetCache)); if (!ofsCfg) return false; // Actual parsing of the config file. @@ -136,15 +216,19 @@ bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const ch char *var; while((var = Config.GetMyFirstWord())) { - if ((!strcmp(var,"pfc.osslib") && !ofsCfg->Parse(XrdOfsConfigPI::theOssLib)) - || (!strncmp(var,"pfc.", 4) && !ConfigXeq(var+4, Config))) + if (!strcmp(var,"pfc.osslib")) { - Config.Echo(); - retval = false; - break; + ofsCfg->Parse(XrdOfsConfigPI::theOssLib); + } + else if (!strcmp(var,"pfc.decisionlib")) + { + xdlib(Config); + } + else if (!strncmp(var,"pfc.", 4)) + { + ConfigParameters(std::string(var+4), Config); } } - if ((retc = Config.LastError())) { retval = false; @@ -154,9 +238,6 @@ bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const ch Config.Close(); - if (retval) - retval = ConfigParameters(parameters); - if (retval) { if (ofsCfg->Load(XrdOfsConfigPI::theOssLib)) ofsCfg->Plugin(m_output_fs); @@ -178,162 +259,84 @@ bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const ch return retval; } -bool Factory::ConfigXeq(char *var, XrdOucStream &Config) -{ - TS_Xeq("decisionlib", xdlib); - return true; -} - -/* Function: xdlib - - Purpose: To parse the directive: decisionlib [] - - the path of the decision library to be used. - optional parameters to be passed. +//______________________________________________________________________________ - Output: true upon success or false upon failure. - */ -bool Factory::xdlib(XrdOucStream &Config) +bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) { - const char* val; - - std::string libp; - if (!(val = Config.GetWord()) || !val[0]) - { - clLog()->Info(XrdCl::AppMsg, " Factory:;Config() decisionlib not specified; always caching files"); - return true; - } - else - { - libp = val; - } - - const char* params; - params = (val[0]) ? Config.GetWord() : 0; - - XrdOucPinLoader* myLib = new XrdOucPinLoader(&m_log, 0, "decisionlib", - libp.c_str()); - Decision *(*ep)(XrdSysError&); - ep = (Decision *(*)(XrdSysError&))myLib->Resolve("XrdFileCacheGetDecision"); - if (!ep) {myLib->Unload(true); return false;} - - Decision * d = ep(m_log); - if (!d) + + if ( part == "user" ) { - clLog()->Error(XrdCl::AppMsg, "Factory::Config() decisionlib was not able to create a decision object"); - return false; + m_configuration.m_username = config.GetWord(); + clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() set user to %s", m_configuration.m_username.c_str()); } - if (params) - d->ConfigDecision(params); - - m_decisionpoints.push_back(d); - return true; -} - -bool Factory::ConfigParameters(const char * parameters) -{ - if (!parameters || (!(*parameters))) + else if ( part == "cacheDir" ) { - return true; + m_configuration.m_cache_dir = config.GetWord(); + clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() set temp. directory to %s", m_configuration.m_cache_dir.c_str()); } - - std::istringstream is(parameters); - std::string part; - while (getline(is, part, ' ')) + else if ( part == "diskUsage" ) { - // cout << part << endl; - if ( part == "-prefetchFileBlock" ) - { - m_configuration.m_prefetchFileBlocks = true; - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() enable block prefetch."); - } - else if ( part == "-user" ) - { - getline(is, part, ' '); - m_configuration.m_username = part.c_str(); - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() set user to %s", m_configuration.m_username.c_str()); - } - else if ( part == "-cacheDir" ) - { - getline(is, part, ' '); - m_configuration.m_cache_dir = part.c_str(); - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() set temp. directory to %s", m_configuration.m_cache_dir.c_str()); - } - else if ( part == "-lwm" ) - { - getline(is, part, ' '); - m_configuration.m_lwm = ::atof(part.c_str()); - } - else if ( part == "-hwm" ) - { - getline(is, part, ' '); - m_configuration.m_hwm = ::atof(part.c_str()); - } - else if ( part == "-bufferSize" ) - { - getline(is, part, ' '); - long long minBSize = 64 * 1024; - long long maxBSize = 16 * 1024 * 1024; - if ( XrdOuca2x::a2sz(m_log, "get buffer size", part.c_str(), &m_configuration.m_bufferSize, minBSize, maxBSize)) - { - return false; + const char* minV = config.GetWord(); + if (minV) { + m_configuration.m_lwm = ::atof(minV); + const char* maxV = config.GetWord(); + if (maxV) { + m_configuration.m_hwm = ::atof(maxV); + clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() disk usage [%.2f-%.2f] %%", m_configuration.m_lwm, m_configuration.m_hwm); } - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() bufferSize %lld", m_configuration.m_bufferSize); } - else if (part == "-NRamBuffersRead") - { - getline(is, part, ' '); - m_configuration.m_NRamBuffersRead = ::atoi(part.c_str()); - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() NRamBuffersRead = %d", m_configuration.m_NRamBuffersRead); + else { + clLog()->Error(XrdCl::AppMsg, "Factory::ConfigParameters() pss.diskUsage min max value not specified"); } - else if (part == "-NRamBuffersPrefetch") + } + else if ( part == "bufferSize" ) + { + long long minBSize = 64 * 1024; + long long maxBSize = 16 * 1024 * 1024; + if ( XrdOuca2x::a2sz(m_log, "get buffer size", config.GetWord(), &m_configuration.m_bufferSize, minBSize, maxBSize)) { - getline(is, part, ' '); - m_configuration.m_NRamBuffersPrefetch = ::atoi(part.c_str()); - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() NRamBuffersPrefetch = %d", m_configuration.m_NRamBuffersPrefetch); + return false; } - else if ( part == "-blockSize" ) - { - getline(is, part, ' '); + clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() bufferSize %lld", m_configuration.m_bufferSize); + } + else if (part == "NRamBuffersRead") + { + m_configuration.m_NRamBuffersRead = ::atoi(config.GetWord()); + clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() NRamBuffersRead = %d", m_configuration.m_NRamBuffersRead); + } + else if (part == "NRamBuffersPrefetch") + { + m_configuration.m_NRamBuffersPrefetch = ::atoi(config.GetWord()); + clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() NRamBuffersPrefetch = %d", m_configuration.m_NRamBuffersPrefetch); + } + else if ( part == "prefetchFileBlocks" ) + { + m_configuration.m_prefetchFileBlocks = true; + clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() enable block prefetch."); + + const char* params = config.GetWord(); + if (params) { long long minBlSize = 128 * 1024; long long maxBlSize = 1024 * 1024 * 1024; - - if ( XrdOuca2x::a2sz(m_log, "get block size", part.c_str(), &m_configuration.m_blockSize, minBlSize, maxBlSize)) + if ( XrdOuca2x::a2sz(m_log, "get block size", params, &m_configuration.m_blockSize, minBlSize, maxBlSize)) { return false; } - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() blockSize = %lld", m_configuration.m_blockSize); + clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() file blockSize = %lld", m_configuration.m_blockSize); } } - - return true; -} - -bool Factory::Decide(XrdOucCacheIO* io) -{ - // if ( CheckFileForDiskSpace(io->Path(), io->FSize()) == false ) - // return false; - - if(!m_decisionpoints.empty()) + else { - std::string filename = io->Path(); - std::vector::const_iterator it; - for ( it = m_decisionpoints.begin(); it != m_decisionpoints.end(); ++it) - { - XrdFileCache::Decision *d = *it; - if (!d) continue; - if (!d->Decide(filename, *m_output_fs)) - { - return false; - } - } + clLog()->Error(XrdCl::AppMsg, "Factory::ConfigParameters() unmatched pfc parameter %s", part.c_str()); + return false; } + assert ( config.GetWord() == 0 && "Factory::ConfigParameters() lost argument"); + return true; } - //______________________________________________________________________________ diff --git a/src/XrdFileCache/XrdFileCacheFactory.hh b/src/XrdFileCache/XrdFileCacheFactory.hh index 20eb68539f8..45d036e8c83 100644 --- a/src/XrdFileCache/XrdFileCacheFactory.hh +++ b/src/XrdFileCache/XrdFileCacheFactory.hh @@ -24,9 +24,9 @@ #include "XrdSys/XrdSysPthread.hh" #include "XrdOuc/XrdOucCache.hh" + #include "XrdCl/XrdClDefaultEnv.hh" #include "XrdVersion.hh" - #include "XrdFileCacheDecision.hh" class XrdOucStream; @@ -149,7 +149,7 @@ namespace XrdFileCache bool CheckFileForDiskSpace(const char* path, long long fsize); void UnCheckFileForDiskSpace(const char* path); - bool ConfigParameters(const char *); + bool ConfigParameters(std::string, XrdOucStream&); bool ConfigXeq(char *, XrdOucStream &); bool xdlib(XrdOucStream &); From 05c9bb030a2c197531f8d5083dda93752d3b3488 Mon Sep 17 00:00:00 2001 From: Alja Mrak-Tadel Date: Thu, 20 Nov 2014 10:14:54 -0800 Subject: [PATCH 2/7] Update configuration entry. --- src/XrdFileCache/README | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/XrdFileCache/README b/src/XrdFileCache/README index 43814b8291b..002e4d68f8e 100644 --- a/src/XrdFileCache/README +++ b/src/XrdFileCache/README @@ -112,36 +112,37 @@ Partial file block-based prefetching is enabled with option '-prefetchFileBlock' CONFIGURATION --bufferSize: prefetch buffer size, default 1M +pfc.cacheDir : directory path to cache location --NRamBuffersRead: number of in memmory cached blocks reserved for read tasks +pfc.bufferSize: prefetch buffer size, default 1M --NRamBuffersRead: number of in memmory cached blocks reserved for prefetch tasks +pfc.NRamBuffersRead: number of in memory cached blocks reserved for read tasks --hwm / -lwm : high / low watermarks for disk cache purge - operation (default 0.7 and 0.9) +pfc.NRamBuffersRead: number of in memory cached blocks reserved for prefetch tasks --cacheDir : directory path to cache location +pfc.diskUsage : high / low watermarks for disk cache +purge operation (default 0.7 and 0.9) --user : username required by the XrdOss plugin +pfc.user : username used by XrdOss plugin +pfc.prefetchFileBlocks -- enable prefetching a unit of a file, +with default block size -Options for block-based cache: +pfc.decisionlib [] path to decision library and plugin parameters --prefetchFileBlocks -- enable prefetching a unit of a file +pfc.osslib [] path to alternative plign for output file system --blockSize : default size of a file-block on the local disk +Examples +a) Enable proxy file prefetching: +pps.cachelib libXrdFileCache.so +pfc.cachedir /data/xrd-file-cache +pfc.NRamBuffersPrefetch 1 -Examples: -pss.cachelib /home/alja/xrd/hdfs/xfc/src/libXrdFileCache.so - -user alja -NRamBuffersRead 4M -NRamBuffersPrefetch 1 -cacheDir /data/xrd-file-cache - - -pss.cachelib /home/alja/xrd/hdfs/xfc/src/libXrdFileCache.so - -user alja -cacheDir /data/hdfs-file-cache - -prefetchFileBlocks -blockSize 64M +b) enable file block mode, with block size 64 MB: +pss.cachelib libXrdFileCache.so +pfc.prefetchFileBlocks 64m //============================================================================== From 3b654ba61e77408c8958511fd70dc60431a4f7da Mon Sep 17 00:00:00 2001 From: Alja Mrak-Tadel Date: Fri, 21 Nov 2014 08:57:51 -0800 Subject: [PATCH 3/7] Make all options lowcase. --- src/XrdFileCache/README | 20 ++++++++++---------- src/XrdFileCache/XrdFileCacheFactory.cc | 14 +++++++++----- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/XrdFileCache/README b/src/XrdFileCache/README index 002e4d68f8e..43a082bfe89 100644 --- a/src/XrdFileCache/README +++ b/src/XrdFileCache/README @@ -112,37 +112,37 @@ Partial file block-based prefetching is enabled with option '-prefetchFileBlock' CONFIGURATION -pfc.cacheDir : directory path to cache location +pfc.cachedir : directory path to cache location -pfc.bufferSize: prefetch buffer size, default 1M +pfc.buffersize: prefetch buffer size, default 1M -pfc.NRamBuffersRead: number of in memory cached blocks reserved for read tasks +pfc.nread: number of in memory cached blocks reserved for read tasks -pfc.NRamBuffersRead: number of in memory cached blocks reserved for prefetch tasks +pfc.nprefetch: number of in memory cached blocks reserved for prefetch tasks -pfc.diskUsage : high / low watermarks for disk cache +pfc.diskusage : high / low watermarks for disk cache purge operation (default 0.7 and 0.9) pfc.user : username used by XrdOss plugin -pfc.prefetchFileBlocks -- enable prefetching a unit of a file, +pfc.fileblockmode [blocksize ] -- enable prefetching a unit of a file, with default block size -pfc.decisionlib [] path to decision library and plugin parameters - pfc.osslib [] path to alternative plign for output file system +pfc.decisionlib [] path to decision library and plugin parameters + Examples a) Enable proxy file prefetching: pps.cachelib libXrdFileCache.so pfc.cachedir /data/xrd-file-cache -pfc.NRamBuffersPrefetch 1 +pfc.nprefetch 1 b) enable file block mode, with block size 64 MB: pss.cachelib libXrdFileCache.so -pfc.prefetchFileBlocks 64m +pfc.prefetchFileBlocks blocksize 64m //============================================================================== diff --git a/src/XrdFileCache/XrdFileCacheFactory.cc b/src/XrdFileCache/XrdFileCacheFactory.cc index 86775bd5c84..aa255701b7e 100644 --- a/src/XrdFileCache/XrdFileCacheFactory.cc +++ b/src/XrdFileCache/XrdFileCacheFactory.cc @@ -275,7 +275,7 @@ bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) m_configuration.m_cache_dir = config.GetWord(); clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() set temp. directory to %s", m_configuration.m_cache_dir.c_str()); } - else if ( part == "diskUsage" ) + else if ( part == "diskusage" ) { const char* minV = config.GetWord(); if (minV) { @@ -290,7 +290,7 @@ bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) clLog()->Error(XrdCl::AppMsg, "Factory::ConfigParameters() pss.diskUsage min max value not specified"); } } - else if ( part == "bufferSize" ) + else if ( part == "buffersize" ) { long long minBSize = 64 * 1024; long long maxBSize = 16 * 1024 * 1024; @@ -300,23 +300,27 @@ bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) } clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() bufferSize %lld", m_configuration.m_bufferSize); } - else if (part == "NRamBuffersRead") + else if (part == "nramread") { m_configuration.m_NRamBuffersRead = ::atoi(config.GetWord()); clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() NRamBuffersRead = %d", m_configuration.m_NRamBuffersRead); } - else if (part == "NRamBuffersPrefetch") + else if (part == "nramprefetch") { m_configuration.m_NRamBuffersPrefetch = ::atoi(config.GetWord()); clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() NRamBuffersPrefetch = %d", m_configuration.m_NRamBuffersPrefetch); } - else if ( part == "prefetchFileBlocks" ) + else if ( part == "fileblockmode" ) { m_configuration.m_prefetchFileBlocks = true; clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() enable block prefetch."); const char* params = config.GetWord(); if (params) { + params = config.GetWord(); + if (strncmp("blocksize", params, 9)) + return false; + long long minBlSize = 128 * 1024; long long maxBlSize = 1024 * 1024 * 1024; if ( XrdOuca2x::a2sz(m_log, "get block size", params, &m_configuration.m_blockSize, minBlSize, maxBlSize)) From a3d69d5340a9a0fc65927fa53b3bdaaec2d12bab Mon Sep 17 00:00:00 2001 From: Alja Mrak-Tadel Date: Fri, 21 Nov 2014 09:06:04 -0800 Subject: [PATCH 4/7] Make all options lowcase. --- src/XrdFileCache/XrdFileCacheFactory.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/XrdFileCache/XrdFileCacheFactory.cc b/src/XrdFileCache/XrdFileCacheFactory.cc index aa255701b7e..399dbb554d3 100644 --- a/src/XrdFileCache/XrdFileCacheFactory.cc +++ b/src/XrdFileCache/XrdFileCacheFactory.cc @@ -270,7 +270,7 @@ bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) m_configuration.m_username = config.GetWord(); clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() set user to %s", m_configuration.m_username.c_str()); } - else if ( part == "cacheDir" ) + else if ( part == "cachedir" ) { m_configuration.m_cache_dir = config.GetWord(); clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() set temp. directory to %s", m_configuration.m_cache_dir.c_str()); From 2391e79e854e988b8281dfcd920c6a249419d11e Mon Sep 17 00:00:00 2001 From: Alja Mrak-Tadel Date: Fri, 21 Nov 2014 11:58:53 -0800 Subject: [PATCH 5/7] Rename buffersize to blocksize. Rename fileblockmode to filefragmentmode. --- src/XrdFileCache/README | 6 +++--- src/XrdFileCache/XrdFileCacheFactory.cc | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/XrdFileCache/README b/src/XrdFileCache/README index 43a082bfe89..0a75fc03ff0 100644 --- a/src/XrdFileCache/README +++ b/src/XrdFileCache/README @@ -114,7 +114,7 @@ CONFIGURATION pfc.cachedir : directory path to cache location -pfc.buffersize: prefetch buffer size, default 1M +pfc.blocksize: prefetch buffer size, default 1M pfc.nread: number of in memory cached blocks reserved for read tasks @@ -125,7 +125,7 @@ purge operation (default 0.7 and 0.9) pfc.user : username used by XrdOss plugin -pfc.fileblockmode [blocksize ] -- enable prefetching a unit of a file, +pfc.filefragmentmode [fragmentsize ] -- enable prefetching a unit of a file, with default block size pfc.osslib [] path to alternative plign for output file system @@ -142,7 +142,7 @@ pfc.nprefetch 1 b) enable file block mode, with block size 64 MB: pss.cachelib libXrdFileCache.so -pfc.prefetchFileBlocks blocksize 64m +pfc.filefragmentmode fragmentsize 64m //============================================================================== diff --git a/src/XrdFileCache/XrdFileCacheFactory.cc b/src/XrdFileCache/XrdFileCacheFactory.cc index 399dbb554d3..7a10a19d3f3 100644 --- a/src/XrdFileCache/XrdFileCacheFactory.cc +++ b/src/XrdFileCache/XrdFileCacheFactory.cc @@ -248,9 +248,9 @@ bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const ch m_output_fs = 0; } - clLog()->Info(XrdCl::AppMsg, "Factory::Config() user name %s", m_configuration.m_username.c_str()); - clLog()->Info(XrdCl::AppMsg, "Factory::Config() cache directory %s", m_configuration.m_cache_dir.c_str()); - clLog()->Info(XrdCl::AppMsg, "Factory::Config() purge file cache within %f-%f", m_configuration.m_lwm, m_configuration.m_hwm); + // clLog()->Info(XrdCl::AppMsg, "Factory::Config() user name %s", m_configuration.m_username.c_str()); + // clLog()->Info(XrdCl::AppMsg, "Factory::Config() cache directory %s", m_configuration.m_cache_dir.c_str()); + // clLog()->Info(XrdCl::AppMsg, "Factory::Config() purge file cache within %f-%f", m_configuration.m_lwm, m_configuration.m_hwm); } clLog()->Info(XrdCl::AppMsg, "Factory::Config() Configuration = %s ", retval ? "Success" : "Fail"); @@ -290,15 +290,15 @@ bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) clLog()->Error(XrdCl::AppMsg, "Factory::ConfigParameters() pss.diskUsage min max value not specified"); } } - else if ( part == "buffersize" ) + else if ( part == "blocksize" ) { long long minBSize = 64 * 1024; long long maxBSize = 16 * 1024 * 1024; - if ( XrdOuca2x::a2sz(m_log, "get buffer size", config.GetWord(), &m_configuration.m_bufferSize, minBSize, maxBSize)) + if ( XrdOuca2x::a2sz(m_log, "get block size", config.GetWord(), &m_configuration.m_bufferSize, minBSize, maxBSize)) { return false; } - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() bufferSize %lld", m_configuration.m_bufferSize); + clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() blocksize %lld", m_configuration.m_bufferSize); } else if (part == "nramread") { @@ -310,15 +310,15 @@ bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) m_configuration.m_NRamBuffersPrefetch = ::atoi(config.GetWord()); clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() NRamBuffersPrefetch = %d", m_configuration.m_NRamBuffersPrefetch); } - else if ( part == "fileblockmode" ) + else if ( part == "filefragmentmode" ) { m_configuration.m_prefetchFileBlocks = true; - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() enable block prefetch."); + clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() enable file fragment prefetch."); const char* params = config.GetWord(); if (params) { params = config.GetWord(); - if (strncmp("blocksize", params, 9)) + if (strncmp("fragmentsize", params, 9)) return false; long long minBlSize = 128 * 1024; From bf2df4f32a445fa408047c089ae08c0ca4fba353 Mon Sep 17 00:00:00 2001 From: Alja Mrak-Tadel Date: Fri, 21 Nov 2014 14:08:27 -0800 Subject: [PATCH 6/7] Use XrdSysError to print configuration status instead of XrdCl logger. --- src/XrdFileCache/XrdFileCacheFactory.cc | 83 +++++++++++++++---------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/src/XrdFileCache/XrdFileCacheFactory.cc b/src/XrdFileCache/XrdFileCacheFactory.cc index 7a10a19d3f3..2abf3397b59 100644 --- a/src/XrdFileCache/XrdFileCacheFactory.cc +++ b/src/XrdFileCache/XrdFileCacheFactory.cc @@ -26,6 +26,8 @@ #include "XrdSys/XrdSysPthread.hh" +#include "XrdSys/XrdSysError.hh" +#include "XrdSys/XrdSysLogger.hh" #include "XrdOuc/XrdOucEnv.hh" #include "XrdOuc/XrdOucPinLoader.hh" #include "XrdOuc/XrdOucStream.hh" @@ -212,7 +214,6 @@ bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const ch // Actual parsing of the config file. bool retval = true; - int retc; char *var; while((var = Config.GetMyFirstWord())) { @@ -226,13 +227,16 @@ bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const ch } else if (!strncmp(var,"pfc.", 4)) { - ConfigParameters(std::string(var+4), Config); + retval = ConfigParameters(std::string(var+4), Config); } - } - if ((retc = Config.LastError())) - { - retval = false; - clLog()->Error(XrdCl::AppMsg, "Factory::Config() error in parsing"); + + if (!retval) + { + retval = false; + clLog()->Error(XrdCl::AppMsg, "Factory::Config() error in parsing"); + break; + } + } Config.Close(); @@ -241,19 +245,37 @@ bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const ch if (retval) { if (ofsCfg->Load(XrdOfsConfigPI::theOssLib)) ofsCfg->Plugin(m_output_fs); - else + else { clLog()->Error(XrdCl::AppMsg, "Factory::Config() Unable to create an OSS object"); retval = false; m_output_fs = 0; } - // clLog()->Info(XrdCl::AppMsg, "Factory::Config() user name %s", m_configuration.m_username.c_str()); - // clLog()->Info(XrdCl::AppMsg, "Factory::Config() cache directory %s", m_configuration.m_cache_dir.c_str()); - // clLog()->Info(XrdCl::AppMsg, "Factory::Config() purge file cache within %f-%f", m_configuration.m_lwm, m_configuration.m_hwm); + + char buff[2048]; + snprintf(buff, sizeof(buff), "result\n" + "\tpfc.cachedir %s\n" + "\tpfc.blocksize %lld\n" + "\tpfc.nramread %d\n\tpfc.nramprefetch %d\n", + m_configuration.m_cache_dir.c_str() , + m_configuration.m_bufferSize, + m_configuration.m_NRamBuffersRead, m_configuration.m_NRamBuffersPrefetch ); + + + if (m_configuration.m_prefetchFileBlocks) + { + char buff2[512]; + snprintf(buff2, sizeof(buff2), "\tpfc.filefragmentmode filefragmentsize %lld \n", m_configuration.m_blockSize); + m_log.Emsg("", buff, buff2); + } + else { + + m_log.Emsg("Config", buff); + } } - clLog()->Info(XrdCl::AppMsg, "Factory::Config() Configuration = %s ", retval ? "Success" : "Fail"); + m_log.Emsg("Config", "Configuration = ", retval ? "Success" : "Fail"); if (ofsCfg) delete ofsCfg; return retval; @@ -263,17 +285,15 @@ bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const ch bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) -{ - +{ + XrdSysError err(0, ""); if ( part == "user" ) { m_configuration.m_username = config.GetWord(); - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() set user to %s", m_configuration.m_username.c_str()); } else if ( part == "cachedir" ) { m_configuration.m_cache_dir = config.GetWord(); - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() set temp. directory to %s", m_configuration.m_cache_dir.c_str()); } else if ( part == "diskusage" ) { @@ -283,7 +303,6 @@ bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) const char* maxV = config.GetWord(); if (maxV) { m_configuration.m_hwm = ::atof(maxV); - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() disk usage [%.2f-%.2f] %%", m_configuration.m_lwm, m_configuration.m_hwm); } } else { @@ -298,41 +317,39 @@ bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) { return false; } - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() blocksize %lld", m_configuration.m_bufferSize); } else if (part == "nramread") { m_configuration.m_NRamBuffersRead = ::atoi(config.GetWord()); - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() NRamBuffersRead = %d", m_configuration.m_NRamBuffersRead); } else if (part == "nramprefetch") { m_configuration.m_NRamBuffersPrefetch = ::atoi(config.GetWord()); - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() NRamBuffersPrefetch = %d", m_configuration.m_NRamBuffersPrefetch); } else if ( part == "filefragmentmode" ) { m_configuration.m_prefetchFileBlocks = true; - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() enable file fragment prefetch."); const char* params = config.GetWord(); if (params) { - params = config.GetWord(); - if (strncmp("fragmentsize", params, 9)) - return false; - - long long minBlSize = 128 * 1024; - long long maxBlSize = 1024 * 1024 * 1024; - if ( XrdOuca2x::a2sz(m_log, "get block size", params, &m_configuration.m_blockSize, minBlSize, maxBlSize)) - { - return false; + if (!strncmp("filefragmentsize", params, 9)) { + long long minBlSize = 128 * 1024; + long long maxBlSize = 1024 * 1024 * 1024; + params = config.GetWord(); + if ( XrdOuca2x::a2sz(m_log, "Error getting file fragment size", params, &m_configuration.m_blockSize, minBlSize, maxBlSize)) + { + return false; + } } - clLog()->Info(XrdCl::AppMsg, "Factory::ConfigParameters() file blockSize = %lld", m_configuration.m_blockSize); - } + else { + m_log.Emsg("Config", "Error setting the fragment size parameter name"); + return false; + } + } } else { - clLog()->Error(XrdCl::AppMsg, "Factory::ConfigParameters() unmatched pfc parameter %s", part.c_str()); + m_log.Emsg("Factory::ConfigParameters() unmatched pfc parameter", part.c_str()); return false; } From 041ee21419b85e73d140a06907476c4866211991 Mon Sep 17 00:00:00 2001 From: Alja Mrak-Tadel Date: Fri, 21 Nov 2014 14:27:42 -0800 Subject: [PATCH 7/7] Rename variable from m_blockSize to m_fileFragmentSize. --- src/XrdFileCache/XrdFileCacheFactory.cc | 4 ++-- src/XrdFileCache/XrdFileCacheFactory.hh | 4 ++-- src/XrdFileCache/XrdFileCacheIOFileBlock.cc | 26 ++++++++++----------- src/XrdFileCache/XrdFileCacheIOFileBlock.hh | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/XrdFileCache/XrdFileCacheFactory.cc b/src/XrdFileCache/XrdFileCacheFactory.cc index 2abf3397b59..8e92cdf3344 100644 --- a/src/XrdFileCache/XrdFileCacheFactory.cc +++ b/src/XrdFileCache/XrdFileCacheFactory.cc @@ -266,7 +266,7 @@ bool Factory::Config(XrdSysLogger *logger, const char *config_filename, const ch if (m_configuration.m_prefetchFileBlocks) { char buff2[512]; - snprintf(buff2, sizeof(buff2), "\tpfc.filefragmentmode filefragmentsize %lld \n", m_configuration.m_blockSize); + snprintf(buff2, sizeof(buff2), "\tpfc.filefragmentmode filefragmentsize %lld \n", m_configuration.m_fileFragmentSize); m_log.Emsg("", buff, buff2); } else { @@ -336,7 +336,7 @@ bool Factory::ConfigParameters(std::string part, XrdOucStream& config ) long long minBlSize = 128 * 1024; long long maxBlSize = 1024 * 1024 * 1024; params = config.GetWord(); - if ( XrdOuca2x::a2sz(m_log, "Error getting file fragment size", params, &m_configuration.m_blockSize, minBlSize, maxBlSize)) + if ( XrdOuca2x::a2sz(m_log, "Error getting file fragment size", params, &m_configuration.m_fileFragmentSize, minBlSize, maxBlSize)) { return false; } diff --git a/src/XrdFileCache/XrdFileCacheFactory.hh b/src/XrdFileCache/XrdFileCacheFactory.hh index 45d036e8c83..9cea9cca095 100644 --- a/src/XrdFileCache/XrdFileCacheFactory.hh +++ b/src/XrdFileCache/XrdFileCacheFactory.hh @@ -53,7 +53,7 @@ namespace XrdFileCache m_bufferSize(1024*1024), m_NRamBuffersRead(8), m_NRamBuffersPrefetch(1), - m_blockSize(128*1024*1024) {} + m_fileFragmentSize(128*1024*1024) {} bool m_prefetchFileBlocks; //!< flag for enabling block-level operation std::string m_cache_dir; //!< path of disk cache @@ -65,7 +65,7 @@ namespace XrdFileCache long long m_bufferSize; //!< prefetch buffer size, default 1MB int m_NRamBuffersRead; //!< number of read in-memory cache blocks int m_NRamBuffersPrefetch; //!< number of prefetch in-memory cache blocks - long long m_blockSize; //!< used with m_prefetchFileBlocks, default 128MB + long long m_fileFragmentSize; //!< used with m_prefetchFileBlocks, default 128MB }; diff --git a/src/XrdFileCache/XrdFileCacheIOFileBlock.cc b/src/XrdFileCache/XrdFileCacheIOFileBlock.cc index 336c6ee68a1..1ab13fc9330 100644 --- a/src/XrdFileCache/XrdFileCacheIOFileBlock.cc +++ b/src/XrdFileCache/XrdFileCacheIOFileBlock.cc @@ -44,7 +44,7 @@ void *PrefetchRunnerBl(void * prefetch_void) IOFileBlock::IOFileBlock(XrdOucCacheIO &io, XrdOucCacheStats &statsGlobal, Cache & cache) : IO(io, statsGlobal, cache) { - m_blockSize = Factory::GetInstance().RefConfiguration().m_blockSize; + m_fileFragmentSize = Factory::GetInstance().RefConfiguration().m_fileFragmentSize; } //______________________________________________________________________________ @@ -74,7 +74,7 @@ Prefetch* IOFileBlock::newBlockPrefetcher(long long off, int blocksize, XrdOucCa ss << fname; char offExt[64]; // filename like ____ - sprintf(&offExt[0],"___%lld_%lld", m_blockSize, off ); + sprintf(&offExt[0],"___%lld_%lld", m_fileFragmentSize, off ); ss << &offExt[0]; fname = ss.str(); @@ -102,8 +102,8 @@ bool IOFileBlock::ioActive() int IOFileBlock::Read (char *buff, long long off, int size) { long long off0 = off; - int idx_first = off0/m_blockSize; - int idx_last = (off0+size-1)/m_blockSize; + int idx_first = off0/m_fileFragmentSize; + int idx_last = (off0+size-1)/m_fileFragmentSize; int bytes_read = 0; clLog()->Debug(XrdCl::AppMsg, "IOFileBlock::Read() %lld@%d block range [%d-%d] \n %s", off, size, idx_first, idx_last, m_io.Path()); @@ -119,16 +119,16 @@ int IOFileBlock::Read (char *buff, long long off, int size) } else { - size_t pbs = m_blockSize; + size_t pbs = m_fileFragmentSize; // check if this is last block - int lastIOFileBlock = (m_io.FSize()-1)/m_blockSize; + int lastIOFileBlock = (m_io.FSize()-1)/m_fileFragmentSize; if (blockIdx == lastIOFileBlock ) { - pbs = m_io.FSize() - blockIdx*m_blockSize; + pbs = m_io.FSize() - blockIdx*m_fileFragmentSize; clLog()->Debug(XrdCl::AppMsg, "IOFileBlock::Read() last block, change output file size to %lld \n %s", pbs, m_io.Path()); } - fb = newBlockPrefetcher(blockIdx*m_blockSize, pbs, &m_io); + fb = newBlockPrefetcher(blockIdx*m_fileFragmentSize, pbs, &m_io); m_blocks.insert(std::pair(blockIdx, (Prefetch*) fb)); } m_mutex.UnLock(); @@ -139,26 +139,26 @@ int IOFileBlock::Read (char *buff, long long off, int size) { if (blockIdx == idx_first) { - readBlockSize = (blockIdx + 1) *m_blockSize - off0; + readBlockSize = (blockIdx + 1) *m_fileFragmentSize - off0; clLog()->Debug(XrdCl::AppMsg, "Read partially till the end of the block %s", m_io.Path()); } else if (blockIdx == idx_last) { - readBlockSize = (off0+size) - blockIdx*m_blockSize; + readBlockSize = (off0+size) - blockIdx*m_fileFragmentSize; clLog()->Debug(XrdCl::AppMsg, "Read partially from beginning of block %s", m_io.Path()); } else { - readBlockSize = m_blockSize; + readBlockSize = m_fileFragmentSize; } } assert(readBlockSize); clLog()->Info(XrdCl::AppMsg, "IOFileBlock::Read() block[%d] read-block-size[%d], offset[%lld] %s", blockIdx, readBlockSize, off, m_io.Path()); - long long min = blockIdx*m_blockSize; + long long min = blockIdx*m_fileFragmentSize; if ( off < min) { assert(0); } - assert(off+readBlockSize <= (min + m_blockSize)); + assert(off+readBlockSize <= (min + m_fileFragmentSize)); int retvalBlock = fb->Read(buff, off, readBlockSize); clLog()->Debug(XrdCl::AppMsg, "IOFileBlock::Read() Block read returned %d %s", retvalBlock , m_io.Path()); diff --git a/src/XrdFileCache/XrdFileCacheIOFileBlock.hh b/src/XrdFileCache/XrdFileCacheIOFileBlock.hh index fc9057312c5..0070c70b0bd 100644 --- a/src/XrdFileCache/XrdFileCacheIOFileBlock.hh +++ b/src/XrdFileCache/XrdFileCacheIOFileBlock.hh @@ -66,7 +66,7 @@ namespace XrdFileCache virtual bool ioActive(); private: - long long m_blockSize; //!< size of file-block + long long m_fileFragmentSize; //!< size of file-block std::map m_blocks; //!< map of created blocks XrdSysMutex m_mutex; //!< map mutex