11 #include <boost/algorithm/string.hpp> 27 inline std::string _toParenString(tinyxml2::XMLElement
const &nodeToConvert) {
28 std::ostringstream oss;
30 for (
auto child = nodeToConvert.FirstChildElement();
child !=
nullptr;
child =
child->NextSiblingElement()) {
31 for (
auto attribute =
child->FirstAttribute(); attribute !=
nullptr; attribute = attribute->Next()) {
32 oss <<
"(" <<
child->Name() << attribute->Name() <<
"=" << attribute->Value() <<
")";
39 static void overrideFromPSet(
char const *iName,
edm::ParameterSet const &iPSet,
T &iHolder,
T const *&iPointer) {
47 const char *safe(
const char *iCheck) {
48 if (iCheck ==
nullptr) {
56 const char *
tmp = std::getenv(
"CMS_PATH");
60 returnValue +=
"/SITECONF/local/JobConfig/site-local-config.xml";
72 : m_url(pset.getUntrackedParameter<
std::
string>(
"siteLocalConfigFileUrl", defaultURL())),
74 m_fallbackDataCatalog(),
93 m_enablePrefetching(
false),
94 m_enablePrefetchingPtr(
nullptr),
97 m_statisticsDestination(),
99 m_statisticsInfoAvail(
false),
116 std::vector<std::string> tmpStatisticsInfo;
117 std::vector<std::string>
const *tmpStatisticsInfoPtr =
nullptr;
118 overrideFromPSet(
"overrideStatisticsInfo", pset, tmpStatisticsInfo, tmpStatisticsInfoPtr);
119 if (tmpStatisticsInfoPtr) {
122 for (
auto &
entry : tmpStatisticsInfo) {
127 if (pset.
exists(
"debugLevel")) {
144 return "file:PoolFileCatalog.xml";
148 throw cms::Exception(
"Incomplete configuration") <<
"Did not find catalog in event-data section in " <<
m_url;
159 return "file:PoolFileCatalog.xml";
168 throw cms::Exception(
"Incomplete configuration") <<
"Valid site-local-config not found at " <<
m_url;
173 <<
"Did not find frontier-connect in calib-data section in " <<
m_url;
176 if (servlet.empty()) {
185 while ((serverurl =
m_frontierConnect.find(
"(serverurl=", nextparen)) != std::string::npos) {
190 complexstr.append(servlet);
200 if (input.substr(0, proto.length()) == proto) {
218 if (endservlet == std::string::npos) {
219 endservlet = input.rfind(
'/', input.length());
221 std::string servlet = input.substr(startservlet, endservlet - startservlet);
222 if ((!servlet.empty()) && (servlet.find_first_of(
":/)[]") == std::string::npos)) {
223 if (servlet ==
"cms_conditions_data") {
270 tinyxml2::XMLDocument
doc;
271 auto loadErr = doc.LoadFile(url.c_str());
272 if (loadErr != tinyxml2::XML_SUCCESS) {
301 auto rootElement = doc.RootElement();
303 for (
auto site = rootElement->FirstChildElement(
"site"); site !=
nullptr;
304 site = site->NextSiblingElement(
"site")) {
310 auto eventData = site->FirstChildElement(
"event-data");
312 auto catalog = eventData->FirstChildElement(
"catalog");
315 catalog = catalog->NextSiblingElement(
"catalog");
320 auto rfiotype = eventData->FirstChildElement(
"rfiotype");
322 m_rfioType = safe(rfiotype->Attribute(
"value"));
329 auto calibData = site->FirstChildElement(
"calib-data");
332 auto frontierConnect = calibData->FirstChildElement(
"frontier-connect");
341 auto sourceConfig = site->FirstChildElement(
"source-config");
344 auto cacheTempDir = sourceConfig->FirstChildElement(
"cache-temp-dir");
351 auto cacheMinFree = sourceConfig->FirstChildElement(
"cache-min-free");
359 auto cacheHint = sourceConfig->FirstChildElement(
"cache-hint");
366 auto cloneCacheHint = sourceConfig->FirstChildElement(
"clone-cache-hint");
368 if (cloneCacheHint) {
373 auto readHint = sourceConfig->FirstChildElement(
"read-hint");
376 m_readHint = safe(readHint->Attribute(
"value"));
380 auto ttreeCacheSize = sourceConfig->FirstChildElement(
"ttree-cache-size");
382 if (ttreeCacheSize) {
387 auto timeout = sourceConfig->FirstChildElement(
"timeout-in-seconds");
394 auto statsDest = sourceConfig->FirstChildElement(
"statistics-destination");
401 std::string tmpStatisticsInfo = safe(statsDest->Attribute(
"info"));
406 auto prefetching = sourceConfig->FirstChildElement(
"prefetching");
413 auto nativeProtocol = sourceConfig->FirstChildElement(
"native-protocols");
415 if (nativeProtocol) {
416 for (
auto child = nativeProtocol->FirstChildElement();
child !=
nullptr;
429 std::vector<std::string> inputStrings;
433 struct addrinfo *
res;
434 struct addrinfo hints;
435 memset(&hints,
'\0',
sizeof(hints));
436 hints.ai_socktype = SOCK_DGRAM;
437 hints.ai_flags = AI_ADDRCONFIG;
438 hints.ai_family = AF_UNSPEC;
439 int e = getaddrinfo(host.c_str(), port.c_str(), &hints, &res);
449 desc.
setComment(
"Service to translate logical file names to physical file names.");
453 "Specify the file containing the site local config. Empty string will load from default directory.");
458 ->setComment(
"Provide an alternate cache hint for fast cloning.");
465 ->setComment(
"Request ROOT to asynchronously prefetch I/O during computation.");
468 "Provide an alternate network destination for I/O statistics (must be in the form of host:port).");
471 "Provide an alternate listing of statistics to send (comma separated list; current options are 'dn' or " 472 "'nodn'). If left blank, all information is snet (including DNs).");
474 descriptions.
add(
"SiteLocalConfigService", desc);
std::vector< std::string_view > split(std::string_view, const char *)
unsigned int const * m_timeoutPtr
~SiteLocalConfigService() override
T getUntrackedParameter(std::string const &, T const &) const
std::string const * m_cacheTempDirPtr
std::string m_frontierConnect
unsigned int const * sourceTTreeCacheSize() const override
void parse(std::string const &url)
static void fillDescriptions(ConfigurationDescriptions &descriptions)
std::string m_fallbackDataCatalog
double const * m_cacheMinFreePtr
std::string const fallbackDataCatalog(void) const override
std::string const * m_cloneCacheHintPtr
static const std::string m_statisticsDefaultPort
bool exists(std::string const ¶meterName) const
checks if a parameter exists
std::string m_cloneCacheHint
std::string m_cacheTempDir
std::string const dataCatalog(void) const override
unsigned int m_ttreeCacheSize
std::vector< std::string > const * m_nativeProtocolsPtr
static std::string const input
std::set< std::string > const * statisticsInfo() const override
void setComment(std::string const &value)
std::string m_statisticsDestination
edm::propagate_const< struct addrinfo * > m_statisticsAddrInfo
bool const * m_enablePrefetchingPtr
unsigned int const * sourceTimeout() const override
std::string const rfioType(void) const override
unsigned int m_debugLevel
std::string const * sourceCloneCacheHint() const override
std::string const & siteName() const override
static char kEmptyString[1]
std::vector< std::string > const * sourceNativeProtocols() const override
std::string const * sourceCacheHint() const override
std::set< std::string > m_statisticsInfo
struct addrinfo const * statisticsDestination() const override
std::vector< std::string > m_nativeProtocols
double const * sourceCacheMinFree() const override
std::string const * sourceReadHint() const override
std::string const lookupCalibConnect(std::string const &input) const override
std::string const * m_cacheHintPtr
std::string const * m_readHintPtr
void computeStatisticsDestination()
bool enablePrefetching() const override
unsigned int const * m_ttreeCacheSizePtr
SiteLocalConfigService(ParameterSet const &pset)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
std::string const * sourceCacheTempDir() const override
ParameterDescriptionBase * addOptionalUntracked(U const &iLabel, T const &value)
std::string const frontierConnect(std::string const &servlet) const
bool m_statisticsInfoAvail
std::string m_dataCatalog
unsigned int debugLevel() const override