CMS 3D CMS Logo

SiteLocalConfigService.cc
Go to the documentation of this file.
1 //
3 // data catalogs are filled in "parse"
4 //
6 
7 //<<<<<< INCLUDES >>>>>>
8 
14 #include "tinyxml2.h"
15 #include <sstream>
16 #include <memory>
17 #include <boost/algorithm/string.hpp>
18 //<<<<<< PRIVATE DEFINES >>>>>>
19 //<<<<<< PRIVATE CONSTANTS >>>>>>
20 //<<<<<< PRIVATE TYPES >>>>>>
21 //<<<<<< PRIVATE VARIABLE DEFINITIONS >>>>>>
22 //<<<<<< PUBLIC VARIABLE DEFINITIONS >>>>>>
23 //<<<<<< CLASS STRUCTURE INITIALIZATION >>>>>>
24 //<<<<<< PRIVATE FUNCTION DEFINITIONS >>>>>>
25 //<<<<<< PUBLIC FUNCTION DEFINITIONS >>>>>>
26 //<<<<<< MEMBER FUNCTION DEFINITIONS >>>>>>
27 
28 namespace {
29 
30  // concatenate all the XML node attribute/value pairs into a
31  // paren-separated string (for use by CORAL and frontier_client)
32  inline std::string _toParenString(tinyxml2::XMLElement const &nodeToConvert) {
33  std::ostringstream oss;
34 
35  for (auto child = nodeToConvert.FirstChildElement(); child != nullptr; child = child->NextSiblingElement()) {
36  for (auto attribute = child->FirstAttribute(); attribute != nullptr; attribute = attribute->Next()) {
37  oss << "(" << child->Name() << attribute->Name() << "=" << attribute->Value() << ")";
38  }
39  }
40  return oss.str();
41  }
42 
43  template <typename T>
44  static void overrideFromPSet(char const *iName, edm::ParameterSet const &iPSet, T &iHolder, T const *&iPointer) {
45  if (iPSet.exists(iName)) {
46  iHolder = iPSet.getUntrackedParameter<T>(iName);
47  iPointer = &iHolder;
48  }
49  }
50 
51  constexpr char const *const kEmptyString = "";
52  const char *safe(const char *iCheck) {
53  if (iCheck == nullptr) {
54  return kEmptyString;
55  }
56  return iCheck;
57  }
58 
59  std::string defaultURL() {
60  std::string returnValue;
61  const char *tmp = std::getenv("SITECONFIG_PATH");
62  if (tmp) {
63  returnValue = tmp;
64  }
65  returnValue += "/JobConfig/site-local-config.xml";
66  return returnValue;
67  }
68 
69 } // namespace
70 
71 namespace edm {
72  namespace service {
73 
75 
77  : m_url(pset.getUntrackedParameter<std::string>("siteLocalConfigFileUrl", defaultURL())),
78  m_trivialDataCatalogs(),
79  m_dataCatalogs(),
80  m_frontierConnect(),
81  m_rfioType("castor"),
82  m_connected(false),
83  m_cacheTempDir(),
84  m_cacheTempDirPtr(nullptr),
85  m_cacheMinFree(),
86  m_cacheMinFreePtr(nullptr),
87  m_cacheHint(),
88  m_cacheHintPtr(nullptr),
89  m_cloneCacheHint(),
90  m_cloneCacheHintPtr(nullptr),
91  m_readHint(),
92  m_readHintPtr(nullptr),
93  m_ttreeCacheSize(0U),
94  m_ttreeCacheSizePtr(nullptr),
95  m_timeout(0U),
96  m_timeoutPtr(nullptr),
97  m_debugLevel(0U),
98  m_enablePrefetching(false),
99  m_enablePrefetchingPtr(nullptr),
100  m_nativeProtocols(),
101  m_nativeProtocolsPtr(nullptr),
102  m_statisticsDestination(),
103  m_statisticsAddrInfo(nullptr),
104  m_statisticsInfoAvail(false),
105  m_siteName(),
106  m_subSiteName() {
107  this->parse(m_url);
108 
109  //apply overrides
110  overrideFromPSet("overrideSourceCacheTempDir", pset, m_cacheTempDir, m_cacheTempDirPtr);
111  overrideFromPSet("overrideSourceCacheMinFree", pset, m_cacheMinFree, m_cacheMinFreePtr);
112  overrideFromPSet("overrideSourceCacheHintDir", pset, m_cacheHint, m_cacheHintPtr);
113  overrideFromPSet("overrideSourceCloneCacheHintDir", pset, m_cloneCacheHint, m_cloneCacheHintPtr);
114  overrideFromPSet("overrideSourceReadHint", pset, m_readHint, m_readHintPtr);
115  overrideFromPSet("overrideSourceNativeProtocols", pset, m_nativeProtocols, m_nativeProtocolsPtr);
116  overrideFromPSet("overrideSourceTTreeCacheSize", pset, m_ttreeCacheSize, m_ttreeCacheSizePtr);
117  overrideFromPSet("overrideSourceTimeout", pset, m_timeout, m_timeoutPtr);
118  overrideFromPSet("overridePrefetching", pset, m_enablePrefetching, m_enablePrefetchingPtr);
119  const std::string *tmpStringPtr = nullptr;
120  overrideFromPSet("overrideStatisticsDestination", pset, m_statisticsDestination, tmpStringPtr);
122  std::vector<std::string> tmpStatisticsInfo;
123  std::vector<std::string> const *tmpStatisticsInfoPtr = nullptr;
124  overrideFromPSet("overrideStatisticsInfo", pset, tmpStatisticsInfo, tmpStatisticsInfoPtr);
125  if (tmpStatisticsInfoPtr) {
126  m_statisticsInfoAvail = true;
127  m_statisticsInfo.clear();
128  for (auto &entry : tmpStatisticsInfo) {
130  }
131  }
132 
133  if (pset.exists("debugLevel")) {
134  m_debugLevel = pset.getUntrackedParameter<unsigned int>("debugLevel");
135  }
136  if (pset.exists("overrideUseLocalConnectString")) {
137  m_useLocalConnectString = pset.getUntrackedParameter<bool>("overrideUseLocalConnectString");
138  }
139  if (pset.exists("overrideLocalConnectPrefix")) {
140  m_localConnectPrefix = pset.getUntrackedParameter<std::string>("overrideLocalConnectPrefix");
141  }
142  if (pset.exists("overrideLocalConnectSuffix")) {
143  m_localConnectSuffix = pset.getUntrackedParameter<std::string>("overrideLocalConnectSuffix");
144  }
145  }
146 
148  if (m_statisticsAddrInfo) {
149  freeaddrinfo(m_statisticsAddrInfo);
150  m_statisticsAddrInfo = nullptr;
151  }
152  }
153 
154  std::vector<std::string> const &SiteLocalConfigService::trivialDataCatalogs() const {
155  if (!m_connected) {
156  static std::vector<std::string> const tmp{"file:PoolFileCatalog.xml"};
157  return tmp;
158  }
159 
160  if (m_trivialDataCatalogs.empty()) {
161  cms::Exception ex("SiteLocalConfigService");
162  ex << "Did not find catalogs in event-data section in " << m_url;
163  ex.addContext("edm::SiteLocalConfigService::trivialDataCatalogs()");
164  throw ex;
165  }
166 
167  return m_trivialDataCatalogs;
168  }
169 
170  std::vector<edm::CatalogAttributes> const &SiteLocalConfigService::dataCatalogs() const {
171  if (!m_connected) {
172  cms::Exception ex("SiteLocalConfigService");
173  ex << "Incomplete configuration. Valid site-local-config not found at " << m_url;
174  ex.addContext("edm::SiteLocalConfigService::dataCatalogs()");
175  throw ex;
176  }
177  if (m_dataCatalogs.empty()) {
178  cms::Exception ex("SiteLocalConfigService");
179  ex << "Did not find catalogs in data-access section in " << m_url;
180  ex.addContext("edm::SiteLocalConfigService::dataCatalogs()");
181  throw ex;
182  }
183  return m_dataCatalogs;
184  }
185 
187  edm::CatalogAttributes const &aDataCatalog) const {
188  char *tmp = std::getenv("SITECONFIG_PATH");
189  if (tmp == nullptr) {
190  throw cms::Exception("SiteLocalConfigService") << "SITECONFIG_PATH is not set!";
191  }
192  std::string siteconfig_path = std::string(tmp);
193  std::filesystem::path filename_storage;
194  //not a cross site use local path given in SITECONFIG_PATH
195  if (aDataCatalog.site == aDataCatalog.storageSite) {
196  //it is a site (no defined subSite), use local path given in SITECONFIG_PATH
197  if (aDataCatalog.subSite.empty())
198  filename_storage = siteconfig_path;
199  //it is a subsite, move one level up
200  else
201  filename_storage = siteconfig_path + "/..";
202  } else { //cross site
203  //it is a site (no defined subSite), move one level up
204  if (aDataCatalog.subSite.empty())
205  filename_storage = siteconfig_path + "/../" + aDataCatalog.storageSite;
206  //it is a subsite, move two levels up
207  else
208  filename_storage = siteconfig_path + "/../../" + aDataCatalog.storageSite;
209  }
210  filename_storage /= "storage.json";
211  try {
212  filename_storage = std::filesystem::canonical(filename_storage);
213  } catch (std::exception &e) {
214  cms::Exception ex("SiteLocalConfigService");
215  ex << "Fail to convert path to the storage description, " << filename_storage.string()
216  << ", to the canonical absolute path"
217  << ". Path exists?";
218  ex.addContext("edm::SiteLocalConfigService::storageDescriptionPath()");
219  throw ex;
220  }
221  return filename_storage;
222  }
223 
225  if (!m_connected) {
226  throw cms::Exception("Incomplete configuration") << "Valid site-local-config not found at " << m_url;
227  }
228 
229  if (m_frontierConnect.empty()) {
230  throw cms::Exception("Incomplete configuration")
231  << "Did not find frontier-connect in calib-data section in " << m_url;
232  }
233 
234  if (servlet.empty()) {
235  return m_frontierConnect;
236  }
237 
238  // Replace the last component of every "serverurl=" piece (up to the
239  // next close-paren) with the servlet
240  std::string::size_type nextparen = 0;
241  std::string::size_type serverurl, lastslash;
242  std::string complexstr = "";
243  while ((serverurl = m_frontierConnect.find("(serverurl=", nextparen)) != std::string::npos) {
244  complexstr.append(m_frontierConnect, nextparen, serverurl - nextparen);
245  nextparen = m_frontierConnect.find(')', serverurl);
246  lastslash = m_frontierConnect.rfind('/', nextparen);
247  complexstr.append(m_frontierConnect, serverurl, lastslash - serverurl + 1);
248  complexstr.append(servlet);
249  }
250  complexstr.append(m_frontierConnect, nextparen, m_frontierConnect.length() - nextparen);
251 
252  return complexstr;
253  }
254 
256  static std::string const proto = "frontier://";
257 
258  if (input.substr(0, proto.length()) == proto) {
259  // Replace the part after the frontier:// and before either an open-
260  // parentheses (which indicates user-supplied options) or the last
261  // slash (which indicates start of the schema) with the complex
262  // parenthesized string returned from frontierConnect() (which
263  // contains all the information needed to connect to frontier),
264  // if that part is a simple servlet name (non-empty and not
265  // containing special characters)
266  // Example connect strings where servlet is replaced:
267  // frontier://cms_conditions_data/CMS_COND_ECAL
268  // frontier://FrontierInt/CMS_COND_ECAL
269  // frontier://FrontierInt(retrieve-ziplevel=0)/CMS_COND_ECAL
270  // Example connect strings left untouched:
271  // frontier://cmsfrontier.cern.ch:8000/FrontierInt/CMS_COND_ECAL
272  // frontier://(serverurl=cmsfrontier.cern.ch:8000/FrontierInt)/CMS_COND_ECAL
273  std::string::size_type startservlet = proto.length();
274  // if user supplied extra parenthesized options, stop servlet there
275  std::string::size_type endservlet = input.find('(', startservlet);
276  if (endservlet == std::string::npos) {
277  endservlet = input.rfind('/', input.length());
278  }
279  std::string servlet = input.substr(startservlet, endservlet - startservlet);
280  if ((!servlet.empty()) && (servlet.find_first_of(":/)[]") == std::string::npos)) {
281  if (servlet == "cms_conditions_data") {
282  // use the default servlet from site-local-config.xml
283  servlet = "";
284  }
285  return proto + frontierConnect(servlet) + input.substr(endservlet);
286  }
287  }
288  return input;
289  }
290 
292 
294 
296 
298 
300 
302 
304 
305  unsigned int const *SiteLocalConfigService::sourceTimeout() const { return m_timeoutPtr; }
306 
309  }
310 
311  unsigned int SiteLocalConfigService::debugLevel() const { return m_debugLevel; }
312 
313  std::vector<std::string> const *SiteLocalConfigService::sourceNativeProtocols() const {
314  return m_nativeProtocolsPtr;
315  }
316 
318 
319  std::set<std::string> const *SiteLocalConfigService::statisticsInfo() const {
320  return m_statisticsInfoAvail ? &m_statisticsInfo : nullptr;
321  }
322 
328 
329  void SiteLocalConfigService::getCatalog(tinyxml2::XMLElement const &cat, std::string site, std::string subSite) {
330  edm::CatalogAttributes aCatalog;
331  aCatalog.site = site;
332  aCatalog.subSite = subSite;
333  auto tmp_site = std::string(safe(cat.Attribute("site")));
334  //no site attribute in the data catalog defined in <data-access>, so storage site is from <site> block of site_local_config.xml, which is the input parameter "site" of this method
335  if (tmp_site.empty())
336  aCatalog.storageSite = site;
337  //now storage site is explicitly defined in <data-access>
338  else
339  aCatalog.storageSite = tmp_site;
340  aCatalog.volume = std::string(safe(cat.Attribute("volume")));
341  aCatalog.protocol = std::string(safe(cat.Attribute("protocol")));
342  m_dataCatalogs.push_back(aCatalog);
343  }
344 
346  tinyxml2::XMLDocument doc;
347  auto loadErr = doc.LoadFile(url.c_str());
348  if (loadErr != tinyxml2::XML_SUCCESS) {
349  return;
350  }
351 
352  // The Site Config has the following format
353  // <site-local-config>
354  // <site name="FNAL">
355  // <subsite name="FNAL_SUBSITE"/>
356  // <event-data>
357  // <catalog url="trivialcatalog_file:/x/y/z.xml"/>
358  // <rfiotype value="castor"/>
359  // </event-data>
360  // <calib-data>
361  // <catalog url="trivialcatalog_file:/x/y/z.xml"/>
362  // <frontier-connect>
363  // ... frontier-interpreted server/proxy xml ...
364  // </frontier-connect>
365  // <local-connect>
366  // <connectString prefix="anything1" suffix="anything2"/>
367  // </local-connect>
368  // </calib-data>
369  // <source-config>
370  // <cache-temp-dir name="/a/b/c"/>
371  // <cache-hint value="..."/>
372  // <read-hint value="..."/>
373  // <ttree-cache-size value="0"/>
374  // <native-protocols>
375  // <protocol prefix="dcache"/>
376  // <protocol prefix="file"/>
377  // </native-protocols>
378  // </source-config>
379  // </site>
380  // </site-local-config>
381 
382  auto rootElement = doc.RootElement();
383 
384  for (auto site = rootElement->FirstChildElement("site"); site != nullptr;
385  site = site->NextSiblingElement("site")) {
386  auto subSite = site->FirstChildElement("subsite");
387 
388  // Parse the site name
389  m_siteName = safe(site->Attribute("name"));
391  if (subSite) {
392  //check to make sure subSite has no children
393  auto subSite_first_child = subSite->FirstChild();
394  if (subSite_first_child) {
395  cms::Exception ex("SiteLocalConfigService");
396  ex << "Invalid site-local-config.xml. Subsite node has children!";
397  ex.addContext("edm::SiteLocalConfigService::parse()");
398  throw ex;
399  }
400  m_subSiteName = safe(subSite->Attribute("name"));
401  }
402 
403  // Parsing of the event data section
404  auto eventData = site->FirstChildElement("event-data");
405  if (eventData) {
406  auto catalog = eventData->FirstChildElement("catalog");
407  if (catalog) {
408  m_trivialDataCatalogs.push_back(safe(catalog->Attribute("url")));
409  catalog = catalog->NextSiblingElement("catalog");
410  while (catalog) {
411  m_trivialDataCatalogs.push_back(safe(catalog->Attribute("url")));
412  catalog = catalog->NextSiblingElement("catalog");
413  }
414  }
415  auto rfiotype = eventData->FirstChildElement("rfiotype");
416  if (rfiotype) {
417  m_rfioType = safe(rfiotype->Attribute("value"));
418  }
419  }
420 
421  //data-access
422  //let store catalog entry as: SITE,SUBSITE,STORAGE_SITE,VOLUME,PROTOCOL
423  // SITE: from <site name= /> element
424  // SUBSITE: from <subsite name= /> element. SUBSITE=SITE for site
425  // STORAGE_SITE, VOLUME and PROTOCOL: from <catalog site= volume= protocol= /> in <data-access>. If "site" attribute is not defined inside <catalog />, STORAGE_SITE is SITE
426  //Therefore
427  //1. if STORAGE_SITE = SITE, use local storage.json since STORAGE_SITE is not a cross site
428  //2. if SUBSITE is empty, this is a site. Otherwise, this is a subsite. These are used to define the path to locate the storage.json in FileLocator. This path is provided by storageDescriptionPath() method of this class.
429  //get data-access
430  auto dataAccess = site->FirstChildElement("data-access");
431  if (dataAccess) {
432  //get catalogs
433  auto catalog = dataAccess->FirstChildElement("catalog");
434  if (catalog) {
435  //add all info for the first catlog here
437  //get next catlog
438  catalog = catalog->NextSiblingElement("catalog");
439  while (catalog) {
440  //add all info for the current catlog here
442  //get next catlog
443  catalog = catalog->NextSiblingElement("catalog");
444  }
445  }
446  }
447 
448  // Parsing of the calib-data section
449  auto calibData = site->FirstChildElement("calib-data");
450 
451  if (calibData) {
452  auto frontierConnect = calibData->FirstChildElement("frontier-connect");
453 
454  if (frontierConnect) {
455  m_frontierConnect = _toParenString(*frontierConnect);
456  }
457  auto localConnect = calibData->FirstChildElement("local-connect");
458  if (localConnect) {
459  if (frontierConnect) {
460  throw cms::Exception("Illegal site local configuration")
461  << "It is illegal to include both frontier-connect and local-connect in the same XML file";
462  }
464  auto connectString = localConnect->FirstChildElement("connectString");
465  if (connectString) {
466  m_localConnectPrefix = safe(connectString->Attribute("prefix"));
467  m_localConnectSuffix = safe(connectString->Attribute("suffix"));
468  }
469  }
470  }
471 
472  // Parsing of the source config section
473  auto sourceConfig = site->FirstChildElement("source-config");
474 
475  if (sourceConfig) {
476  auto cacheTempDir = sourceConfig->FirstChildElement("cache-temp-dir");
477 
478  if (cacheTempDir) {
479  m_cacheTempDir = safe(cacheTempDir->Attribute("name"));
481  }
482 
483  auto cacheMinFree = sourceConfig->FirstChildElement("cache-min-free");
484 
485  if (cacheMinFree) {
486  //TODO what did xerces do if it couldn't convert?
487  m_cacheMinFree = cacheMinFree->DoubleAttribute("value");
489  }
490 
491  auto cacheHint = sourceConfig->FirstChildElement("cache-hint");
492 
493  if (cacheHint) {
494  m_cacheHint = safe(cacheHint->Attribute("value"));
496  }
497 
498  auto cloneCacheHint = sourceConfig->FirstChildElement("clone-cache-hint");
499 
500  if (cloneCacheHint) {
501  m_cloneCacheHint = safe(cloneCacheHint->Attribute("value"));
503  }
504 
505  auto readHint = sourceConfig->FirstChildElement("read-hint");
506 
507  if (readHint) {
508  m_readHint = safe(readHint->Attribute("value"));
510  }
511 
512  auto ttreeCacheSize = sourceConfig->FirstChildElement("ttree-cache-size");
513 
514  if (ttreeCacheSize) {
515  m_ttreeCacheSize = ttreeCacheSize->UnsignedAttribute("value");
517  }
518 
519  auto timeout = sourceConfig->FirstChildElement("timeout-in-seconds");
520 
521  if (timeout) {
522  m_timeout = timeout->UnsignedAttribute("value");
524  }
525 
526  auto statsDest = sourceConfig->FirstChildElement("statistics-destination");
527 
528  if (statsDest) {
529  m_statisticsDestination = safe(statsDest->Attribute("endpoint"));
530  if (m_statisticsDestination.empty()) {
531  m_statisticsDestination = safe(statsDest->Attribute("name"));
532  }
533  std::string tmpStatisticsInfo = safe(statsDest->Attribute("info"));
534  boost::split(m_statisticsInfo, tmpStatisticsInfo, boost::is_any_of("\t ,"));
535  m_statisticsInfoAvail = !tmpStatisticsInfo.empty();
536  }
537 
538  auto prefetching = sourceConfig->FirstChildElement("prefetching");
539 
540  if (prefetching) {
541  m_enablePrefetching = prefetching->BoolAttribute("value");
543  }
544 
545  auto nativeProtocol = sourceConfig->FirstChildElement("native-protocols");
546 
547  if (nativeProtocol) {
548  for (auto child = nativeProtocol->FirstChildElement(); child != nullptr;
549  child = child->NextSiblingElement()) {
550  m_nativeProtocols.push_back(safe(child->Attribute("prefix")));
551  }
553  }
554  }
555  }
556  m_connected = true;
557  }
558 
560  std::vector<std::string> inputStrings;
561  boost::split(inputStrings, m_statisticsDestination, boost::is_any_of(":"));
562  const std::string &host = inputStrings[0];
563  const std::string &port = (inputStrings.size() > 1) ? inputStrings[1] : m_statisticsDefaultPort;
564  struct addrinfo *res;
565  struct addrinfo hints;
566  memset(&hints, '\0', sizeof(hints));
567  hints.ai_socktype = SOCK_DGRAM;
568  hints.ai_flags = AI_ADDRCONFIG;
569  hints.ai_family = AF_UNSPEC;
570  int e = getaddrinfo(host.c_str(), port.c_str(), &hints, &res);
571  if (e != 0) {
572  // Silent failure - there's no way to report non-fatal failures from here.
573  return;
574  }
576  }
577 
580  desc.setComment("Service to translate logical file names to physical file names.");
581 
582  desc.addOptionalUntracked<std::string>("siteLocalConfigFileUrl", std::string())
583  ->setComment(
584  "Specify the file containing the site local config. Empty string will load from default directory.");
585  desc.addOptionalUntracked<std::string>("overrideSourceCacheTempDir");
586  desc.addOptionalUntracked<double>("overrideSourceCacheMinFree");
587  desc.addOptionalUntracked<std::string>("overrideSourceCacheHintDir");
588  desc.addOptionalUntracked<std::string>("overrideSourceCloneCacheHintDir")
589  ->setComment("Provide an alternate cache hint for fast cloning.");
590  desc.addOptionalUntracked<std::string>("overrideSourceReadHint");
591  desc.addOptionalUntracked<std::vector<std::string> >("overrideSourceNativeProtocols");
592  desc.addOptionalUntracked<unsigned int>("overrideSourceTTreeCacheSize");
593  desc.addOptionalUntracked<unsigned int>("overrideSourceTimeout");
594  desc.addOptionalUntracked<unsigned int>("debugLevel");
595  desc.addOptionalUntracked<bool>("overridePrefetching")
596  ->setComment("Request ROOT to asynchronously prefetch I/O during computation.");
597  desc.addOptionalUntracked<std::string>("overrideStatisticsDestination")
598  ->setComment(
599  "Provide an alternate network destination for I/O statistics (must be in the form of host:port).");
600  desc.addOptionalUntracked<std::vector<std::string> >("overrideStatisticsInfo")
601  ->setComment(
602  "Provide an alternate listing of statistics to send (comma separated list; current options are 'dn' or "
603  "'nodn'). If left blank, all information is snet (including DNs).");
604  desc.addOptionalUntracked<bool>("overrideUseLocalConnectString");
605  desc.addOptionalUntracked<std::string>("overrideLocalConnectPrefix");
606  desc.addOptionalUntracked<std::string>("overrideLocalConnectSuffix");
607  descriptions.add("SiteLocalConfigService", desc);
608  }
609  } // namespace service
610 } // namespace edm
static void fillDescriptions(ConfigurationDescriptions &descriptions)
struct addrinfo const * statisticsDestination() const override
string host
Definition: query.py:115
std::vector< edm::CatalogAttributes > m_dataCatalogs
bool exists(std::string const &parameterName) const
checks if a parameter exists
static const std::string m_statisticsDefaultPort
std::vector< std::string > const & trivialDataCatalogs() const override
std::string const * sourceCacheHint() const override
std::string const * sourceReadHint() const override
unsigned int const * sourceTimeout() const override
int port
Definition: query.py:116
void getCatalog(tinyxml2::XMLElement const &cat, std::string site, std::string subSite)
uint16_t size_type
std::string const & subSiteName() const override
Definition: Electron.h:6
std::vector< std::string > const * sourceNativeProtocols() const override
std::vector< std::string > const * m_nativeProtocolsPtr
std::string const * sourceCacheTempDir() const override
static std::string const input
Definition: EdmProvDump.cc:50
std::string const & localConnectPrefix() const override
T getUntrackedParameter(std::string const &, T const &) const
std::vector< std::string > m_trivialDataCatalogs
def cat(path)
Definition: eostools.py:401
edm::propagate_const< struct addrinfo * > m_statisticsAddrInfo
std::string const rfioType(void) const override
std::string const frontierConnect(std::string const &servlet) const
std::filesystem::path const storageDescriptionPath(edm::CatalogAttributes const &aDataCatalog) const override
std::vector< std::string > m_nativeProtocols
unsigned int const * sourceTTreeCacheSize() const override
std::string const & localConnectSuffix() const override
unsigned int debugLevel() const override
SiteLocalConfigService(ParameterSet const &pset)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void addContext(std::string const &context)
Definition: Exception.cc:169
std::set< std::string > const * statisticsInfo() const override
static const char kEmptyString[1]
double const * sourceCacheMinFree() const override
HLT enums.
std::vector< edm::CatalogAttributes > const & dataCatalogs() const override
std::string const * sourceCloneCacheHint() const override
std::string const lookupCalibConnect(std::string const &input) const override
tmp
align.sh
Definition: createJobs.py:716
long double T
def move(src, dest)
Definition: eostools.py:511
std::string const & siteName() const override