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  std::string siteconfig_path = std::string(std::getenv("SITECONFIG_PATH"));
189  std::filesystem::path filename_storage;
190  //not a cross site use local path given in SITECONFIG_PATH
191  if (aDataCatalog.site == aDataCatalog.storageSite) {
192  //it is a site (no defined subSite), use local path given in SITECONFIG_PATH
193  if (aDataCatalog.subSite.empty())
194  filename_storage = siteconfig_path;
195  //it is a subsite, move one level up
196  else
197  filename_storage = siteconfig_path + "/..";
198  } else { //cross site
199  //it is a site (no defined subSite), move one level up
200  if (aDataCatalog.subSite.empty())
201  filename_storage = siteconfig_path + "/../" + aDataCatalog.storageSite;
202  //it is a subsite, move two levels up
203  else
204  filename_storage = siteconfig_path + "/../../" + aDataCatalog.storageSite;
205  }
206  filename_storage /= "storage.json";
207  try {
208  filename_storage = std::filesystem::canonical(filename_storage);
209  } catch (std::exception &e) {
210  cms::Exception ex("SiteLocalConfigService");
211  ex << "Fail to convert path to the storage description, " << filename_storage.string()
212  << ", to the canonical absolute path"
213  << ". Path exists?";
214  ex.addContext("edm::SiteLocalConfigService::storageDescriptionPath()");
215  throw ex;
216  }
217  return filename_storage;
218  }
219 
221  if (!m_connected) {
222  throw cms::Exception("Incomplete configuration") << "Valid site-local-config not found at " << m_url;
223  }
224 
225  if (m_frontierConnect.empty()) {
226  throw cms::Exception("Incomplete configuration")
227  << "Did not find frontier-connect in calib-data section in " << m_url;
228  }
229 
230  if (servlet.empty()) {
231  return m_frontierConnect;
232  }
233 
234  // Replace the last component of every "serverurl=" piece (up to the
235  // next close-paren) with the servlet
236  std::string::size_type nextparen = 0;
237  std::string::size_type serverurl, lastslash;
238  std::string complexstr = "";
239  while ((serverurl = m_frontierConnect.find("(serverurl=", nextparen)) != std::string::npos) {
240  complexstr.append(m_frontierConnect, nextparen, serverurl - nextparen);
241  nextparen = m_frontierConnect.find(')', serverurl);
242  lastslash = m_frontierConnect.rfind('/', nextparen);
243  complexstr.append(m_frontierConnect, serverurl, lastslash - serverurl + 1);
244  complexstr.append(servlet);
245  }
246  complexstr.append(m_frontierConnect, nextparen, m_frontierConnect.length() - nextparen);
247 
248  return complexstr;
249  }
250 
252  static std::string const proto = "frontier://";
253 
254  if (input.substr(0, proto.length()) == proto) {
255  // Replace the part after the frontier:// and before either an open-
256  // parentheses (which indicates user-supplied options) or the last
257  // slash (which indicates start of the schema) with the complex
258  // parenthesized string returned from frontierConnect() (which
259  // contains all the information needed to connect to frontier),
260  // if that part is a simple servlet name (non-empty and not
261  // containing special characters)
262  // Example connect strings where servlet is replaced:
263  // frontier://cms_conditions_data/CMS_COND_ECAL
264  // frontier://FrontierInt/CMS_COND_ECAL
265  // frontier://FrontierInt(retrieve-ziplevel=0)/CMS_COND_ECAL
266  // Example connect strings left untouched:
267  // frontier://cmsfrontier.cern.ch:8000/FrontierInt/CMS_COND_ECAL
268  // frontier://(serverurl=cmsfrontier.cern.ch:8000/FrontierInt)/CMS_COND_ECAL
269  std::string::size_type startservlet = proto.length();
270  // if user supplied extra parenthesized options, stop servlet there
271  std::string::size_type endservlet = input.find('(', startservlet);
272  if (endservlet == std::string::npos) {
273  endservlet = input.rfind('/', input.length());
274  }
275  std::string servlet = input.substr(startservlet, endservlet - startservlet);
276  if ((!servlet.empty()) && (servlet.find_first_of(":/)[]") == std::string::npos)) {
277  if (servlet == "cms_conditions_data") {
278  // use the default servlet from site-local-config.xml
279  servlet = "";
280  }
281  return proto + frontierConnect(servlet) + input.substr(endservlet);
282  }
283  }
284  return input;
285  }
286 
288 
290 
292 
294 
296 
298 
300 
301  unsigned int const *SiteLocalConfigService::sourceTimeout() const { return m_timeoutPtr; }
302 
305  }
306 
307  unsigned int SiteLocalConfigService::debugLevel() const { return m_debugLevel; }
308 
309  std::vector<std::string> const *SiteLocalConfigService::sourceNativeProtocols() const {
310  return m_nativeProtocolsPtr;
311  }
312 
314  return m_statisticsAddrInfo;
315  }
316 
317  std::set<std::string> const *SiteLocalConfigService::statisticsInfo() const {
318  return m_statisticsInfoAvail ? &m_statisticsInfo : nullptr;
319  }
320 
326 
327  void SiteLocalConfigService::getCatalog(tinyxml2::XMLElement const &cat, std::string site, std::string subSite) {
328  edm::CatalogAttributes aCatalog;
329  aCatalog.site = site;
330  aCatalog.subSite = subSite;
331  auto tmp_site = std::string(safe(cat.Attribute("site")));
332  //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
333  if (tmp_site.empty())
334  aCatalog.storageSite = site;
335  //now storage site is explicitly defined in <data-access>
336  else
337  aCatalog.storageSite = tmp_site;
338  aCatalog.volume = std::string(safe(cat.Attribute("volume")));
339  aCatalog.protocol = std::string(safe(cat.Attribute("protocol")));
340  m_dataCatalogs.push_back(aCatalog);
341  }
342 
344  tinyxml2::XMLDocument doc;
345  auto loadErr = doc.LoadFile(url.c_str());
346  if (loadErr != tinyxml2::XML_SUCCESS) {
347  return;
348  }
349 
350  // The Site Config has the following format
351  // <site-local-config>
352  // <site name="FNAL">
353  // <subsite name="FNAL_SUBSITE"/>
354  // <event-data>
355  // <catalog url="trivialcatalog_file:/x/y/z.xml"/>
356  // <rfiotype value="castor"/>
357  // </event-data>
358  // <calib-data>
359  // <catalog url="trivialcatalog_file:/x/y/z.xml"/>
360  // <frontier-connect>
361  // ... frontier-interpreted server/proxy xml ...
362  // </frontier-connect>
363  // <local-connect>
364  // <connectString prefix="anything1" suffix="anything2"/>
365  // </local-connect>
366  // </calib-data>
367  // <source-config>
368  // <cache-temp-dir name="/a/b/c"/>
369  // <cache-hint value="..."/>
370  // <read-hint value="..."/>
371  // <ttree-cache-size value="0"/>
372  // <native-protocols>
373  // <protocol prefix="dcache"/>
374  // <protocol prefix="file"/>
375  // </native-protocols>
376  // </source-config>
377  // </site>
378  // </site-local-config>
379 
380  auto rootElement = doc.RootElement();
381 
382  for (auto site = rootElement->FirstChildElement("site"); site != nullptr;
383  site = site->NextSiblingElement("site")) {
384  auto subSite = site->FirstChildElement("subsite");
385 
386  // Parse the site name
387  m_siteName = safe(site->Attribute("name"));
389  if (subSite) {
390  //check to make sure subSite has no children
391  auto subSite_first_child = subSite->FirstChild();
392  if (subSite_first_child) {
393  cms::Exception ex("SiteLocalConfigService");
394  ex << "Invalid site-local-config.xml. Subsite node has children!";
395  ex.addContext("edm::SiteLocalConfigService::parse()");
396  throw ex;
397  }
398  m_subSiteName = safe(subSite->Attribute("name"));
399  }
400 
401  // Parsing of the event data section
402  auto eventData = site->FirstChildElement("event-data");
403  if (eventData) {
404  auto catalog = eventData->FirstChildElement("catalog");
405  if (catalog) {
406  m_trivialDataCatalogs.push_back(safe(catalog->Attribute("url")));
407  catalog = catalog->NextSiblingElement("catalog");
408  while (catalog) {
409  m_trivialDataCatalogs.push_back(safe(catalog->Attribute("url")));
410  catalog = catalog->NextSiblingElement("catalog");
411  }
412  }
413  auto rfiotype = eventData->FirstChildElement("rfiotype");
414  if (rfiotype) {
415  m_rfioType = safe(rfiotype->Attribute("value"));
416  }
417  }
418 
419  //data-access
420  //let store catalog entry as: SITE,SUBSITE,STORAGE_SITE,VOLUME,PROTOCOL
421  // SITE: from <site name= /> element
422  // SUBSITE: from <subsite name= /> element. SUBSITE=SITE for site
423  // 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
424  //Therefore
425  //1. if STORAGE_SITE = SITE, use local storage.json since STORAGE_SITE is not a cross site
426  //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.
427  //get data-access
428  auto dataAccess = site->FirstChildElement("data-access");
429  if (dataAccess) {
430  //get catalogs
431  auto catalog = dataAccess->FirstChildElement("catalog");
432  if (catalog) {
433  //add all info for the first catlog here
435  //get next catlog
436  catalog = catalog->NextSiblingElement("catalog");
437  while (catalog) {
438  //add all info for the current catlog here
440  //get next catlog
441  catalog = catalog->NextSiblingElement("catalog");
442  }
443  }
444  }
445 
446  // Parsing of the calib-data section
447  auto calibData = site->FirstChildElement("calib-data");
448 
449  if (calibData) {
450  auto frontierConnect = calibData->FirstChildElement("frontier-connect");
451 
452  if (frontierConnect) {
453  m_frontierConnect = _toParenString(*frontierConnect);
454  }
455  auto localConnect = calibData->FirstChildElement("local-connect");
456  if (localConnect) {
457  if (frontierConnect) {
458  throw cms::Exception("Illegal site local configuration")
459  << "It is illegal to include both frontier-connect and local-connect in the same XML file";
460  }
462  auto connectString = localConnect->FirstChildElement("connectString");
463  if (connectString) {
464  m_localConnectPrefix = safe(connectString->Attribute("prefix"));
465  m_localConnectSuffix = safe(connectString->Attribute("suffix"));
466  }
467  }
468  }
469 
470  // Parsing of the source config section
471  auto sourceConfig = site->FirstChildElement("source-config");
472 
473  if (sourceConfig) {
474  auto cacheTempDir = sourceConfig->FirstChildElement("cache-temp-dir");
475 
476  if (cacheTempDir) {
477  m_cacheTempDir = safe(cacheTempDir->Attribute("name"));
479  }
480 
481  auto cacheMinFree = sourceConfig->FirstChildElement("cache-min-free");
482 
483  if (cacheMinFree) {
484  //TODO what did xerces do if it couldn't convert?
485  m_cacheMinFree = cacheMinFree->DoubleAttribute("value");
487  }
488 
489  auto cacheHint = sourceConfig->FirstChildElement("cache-hint");
490 
491  if (cacheHint) {
492  m_cacheHint = safe(cacheHint->Attribute("value"));
494  }
495 
496  auto cloneCacheHint = sourceConfig->FirstChildElement("clone-cache-hint");
497 
498  if (cloneCacheHint) {
499  m_cloneCacheHint = safe(cloneCacheHint->Attribute("value"));
501  }
502 
503  auto readHint = sourceConfig->FirstChildElement("read-hint");
504 
505  if (readHint) {
506  m_readHint = safe(readHint->Attribute("value"));
508  }
509 
510  auto ttreeCacheSize = sourceConfig->FirstChildElement("ttree-cache-size");
511 
512  if (ttreeCacheSize) {
513  m_ttreeCacheSize = ttreeCacheSize->UnsignedAttribute("value");
515  }
516 
517  auto timeout = sourceConfig->FirstChildElement("timeout-in-seconds");
518 
519  if (timeout) {
520  m_timeout = timeout->UnsignedAttribute("value");
522  }
523 
524  auto statsDest = sourceConfig->FirstChildElement("statistics-destination");
525 
526  if (statsDest) {
527  m_statisticsDestination = safe(statsDest->Attribute("endpoint"));
528  if (m_statisticsDestination.empty()) {
529  m_statisticsDestination = safe(statsDest->Attribute("name"));
530  }
531  std::string tmpStatisticsInfo = safe(statsDest->Attribute("info"));
532  boost::split(m_statisticsInfo, tmpStatisticsInfo, boost::is_any_of("\t ,"));
533  m_statisticsInfoAvail = !tmpStatisticsInfo.empty();
534  }
535 
536  auto prefetching = sourceConfig->FirstChildElement("prefetching");
537 
538  if (prefetching) {
539  m_enablePrefetching = prefetching->BoolAttribute("value");
541  }
542 
543  auto nativeProtocol = sourceConfig->FirstChildElement("native-protocols");
544 
545  if (nativeProtocol) {
546  for (auto child = nativeProtocol->FirstChildElement(); child != nullptr;
547  child = child->NextSiblingElement()) {
548  m_nativeProtocols.push_back(safe(child->Attribute("prefix")));
549  }
551  }
552  }
553  }
554  m_connected = true;
555  }
556 
558  std::vector<std::string> inputStrings;
559  boost::split(inputStrings, m_statisticsDestination, boost::is_any_of(":"));
560  const std::string &host = inputStrings[0];
561  const std::string &port = (inputStrings.size() > 1) ? inputStrings[1] : m_statisticsDefaultPort;
562  struct addrinfo *res;
563  struct addrinfo hints;
564  memset(&hints, '\0', sizeof(hints));
565  hints.ai_socktype = SOCK_DGRAM;
566  hints.ai_flags = AI_ADDRCONFIG;
567  hints.ai_family = AF_UNSPEC;
568  int e = getaddrinfo(host.c_str(), port.c_str(), &hints, &res);
569  if (e != 0) {
570  // Silent failure - there's no way to report non-fatal failures from here.
571  return;
572  }
574  }
575 
578  desc.setComment("Service to translate logical file names to physical file names.");
579 
580  desc.addOptionalUntracked<std::string>("siteLocalConfigFileUrl", std::string())
581  ->setComment(
582  "Specify the file containing the site local config. Empty string will load from default directory.");
583  desc.addOptionalUntracked<std::string>("overrideSourceCacheTempDir");
584  desc.addOptionalUntracked<double>("overrideSourceCacheMinFree");
585  desc.addOptionalUntracked<std::string>("overrideSourceCacheHintDir");
586  desc.addOptionalUntracked<std::string>("overrideSourceCloneCacheHintDir")
587  ->setComment("Provide an alternate cache hint for fast cloning.");
588  desc.addOptionalUntracked<std::string>("overrideSourceReadHint");
589  desc.addOptionalUntracked<std::vector<std::string> >("overrideSourceNativeProtocols");
590  desc.addOptionalUntracked<unsigned int>("overrideSourceTTreeCacheSize");
591  desc.addOptionalUntracked<unsigned int>("overrideSourceTimeout");
592  desc.addOptionalUntracked<unsigned int>("debugLevel");
593  desc.addOptionalUntracked<bool>("overridePrefetching")
594  ->setComment("Request ROOT to asynchronously prefetch I/O during computation.");
595  desc.addOptionalUntracked<std::string>("overrideStatisticsDestination")
596  ->setComment(
597  "Provide an alternate network destination for I/O statistics (must be in the form of host:port).");
598  desc.addOptionalUntracked<std::vector<std::string> >("overrideStatisticsInfo")
599  ->setComment(
600  "Provide an alternate listing of statistics to send (comma separated list; current options are 'dn' or "
601  "'nodn'). If left blank, all information is snet (including DNs).");
602  desc.addOptionalUntracked<bool>("overrideUseLocalConnectString");
603  desc.addOptionalUntracked<std::string>("overrideLocalConnectPrefix");
604  desc.addOptionalUntracked<std::string>("overrideLocalConnectSuffix");
605  descriptions.add("SiteLocalConfigService", desc);
606  }
607  } // namespace service
608 } // 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