CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
CondDBESSource.cc
Go to the documentation of this file.
1 //
2 // Package: CondCore/ESSources
3 // Module: CondDBESSource
4 //
5 // Description: <one line class summary>
6 //
7 // Implementation:
8 // <Notes on implementation>
9 //
10 // Author: Zhen Xie
11 // Fixes and other changes: Giacomo Govi
12 //
13 #include "CondDBESSource.h"
14 
15 #include <boost/algorithm/string.hpp>
20 
23 
29 #include <exception>
30 
31 #include <iomanip>
32 
33 namespace {
34  /* utility ot build the name of the plugin corresponding to a given record
35  se ESSources
36  */
37  std::string buildName(std::string const& iRecordName) { return iRecordName + std::string("@NewProxy"); }
38 
39  std::string joinRecordAndLabel(std::string const& iRecordName, std::string const& iLabelName) {
40  return iRecordName + std::string("@") + iLabelName;
41  }
42 
43  /* utility class to return a IOVs associated to a given "name"
44  This implementation return the IOV associated to a record...
45  It is essentialy a workaround to get the full IOV out of the tag colector
46  that is not accessible as hidden in the ESSource
47  FIXME: need to support label??
48  */
49  class CondGetterFromESSource : public cond::persistency::CondGetter {
50  public:
51  CondGetterFromESSource(CondDBESSource::ProxyMap const& ip) : m_proxies(ip) {}
52  ~CondGetterFromESSource() override {}
53 
54  cond::persistency::IOVProxy get(std::string name) const override {
55  CondDBESSource::ProxyMap::const_iterator p = m_proxies.find(name);
56  if (p != m_proxies.end())
57  return (*p).second->iovProxy();
59  }
60 
61  CondDBESSource::ProxyMap const& m_proxies;
62  };
63 
64  // This needs to be re-design and implemented...
65  // dump the state of a DataProxy
66  void dumpInfo(std::ostream& out, std::string const& recName, cond::DataProxyWrapperBase const& proxy) {
67  //cond::SequenceState state(proxy.proxy()->iov().state());
68  out << recName << " / " << proxy.label() << ": " << proxy.connString() << ", " << proxy.tag()
69  << "\n "
70  // << state.size() << ", " << state.revision() << ", "
71  // << cond::time::to_boost(state.timestamp()) << "\n "
72  // << state.comment()
73  << "\n "
74  // << "refresh " << proxy.proxy()->stats.nRefresh
75  // << "/" << proxy.proxy()->stats.nArefresh
76  // << ", reconnect " << proxy.proxy()->stats.nReconnect
77  // << "/" << proxy.proxy()->stats.nAreconnect
78  // << ", make " << proxy.proxy()->stats.nMake
79  // << ", load " << proxy.proxy()->stats.nLoad
80  ;
81  //if ( proxy.proxy()->stats.nLoad>0) {
82  out << "Time look up, payloadIds:" << std::endl;
83  const auto& pids = *proxy.requests();
84  for (const auto& id : pids)
85  out << " " << id.since << " - " << id.till << " : " << id.payloadId << std::endl;
86  }
87 
88 } // namespace
89 
90 /*
91  * config Param
92  * RefreshEachRun: if true will refresh the IOV at each new run (or lumiSection)
93  * DumpStat: if true dump the statistics of all DataProxy (currently on cout)
94  * DBParameters: configuration set of the connection
95  * globaltag: The GlobalTag
96  * toGet: list of record label tag connection-string to add/overwrite the content of the global-tag
97  */
99  : m_connection(),
100  m_connectionString(""),
101  m_frontierKey(""),
102  m_lastRun(0), // for the stat
103  m_lastLumi(0), // for the stat
104  m_policy(NOREFRESH),
105  m_doDump(iConfig.getUntrackedParameter<bool>("DumpStat", false)) {
106  if (iConfig.getUntrackedParameter<bool>("RefreshAlways", false)) {
108  }
109  if (iConfig.getUntrackedParameter<bool>("RefreshOpenIOVs", false)) {
111  }
112  if (iConfig.getUntrackedParameter<bool>("RefreshEachRun", false)) {
114  }
115  if (iConfig.getUntrackedParameter<bool>("ReconnectEachRun", false)) {
117  }
118 
119  Stats s = {0, 0, 0, 0, 0, 0, 0, 0};
120  m_stats = s;
121 
122  /*parameter set parsing
123  */
125  if (iConfig.exists("globaltag")) {
126  globaltag = iConfig.getParameter<std::string>("globaltag");
127  // the global tag _requires_ a connection string
128  m_connectionString = iConfig.getParameter<std::string>("connect");
129 
130  if (!globaltag.empty()) {
132  if (siteLocalConfig.isAvailable()) {
133  if (siteLocalConfig->useLocalConnectString()) {
134  std::string const& localConnectPrefix = siteLocalConfig->localConnectPrefix();
135  std::string const& localConnectSuffix = siteLocalConfig->localConnectSuffix();
136  m_connectionString = localConnectPrefix + globaltag + localConnectSuffix;
137  }
138  }
139  }
140  } else if (iConfig.exists("connect")) // default connection string
141  m_connectionString = iConfig.getParameter<std::string>("connect");
142 
143  // frontier key
144  m_frontierKey = iConfig.getUntrackedParameter<std::string>("frontierKey", "");
145 
146  // snapshot
147  boost::posix_time::ptime snapshotTime;
148  if (iConfig.exists("snapshotTime")) {
149  std::string snapshotTimeString = iConfig.getParameter<std::string>("snapshotTime");
150  if (!snapshotTimeString.empty())
151  snapshotTime = boost::posix_time::time_from_string(snapshotTimeString);
152  }
153 
154  // connection configuration
155  if (iConfig.exists("DBParameters")) {
156  edm::ParameterSet connectionPset = iConfig.getParameter<edm::ParameterSet>("DBParameters");
157  m_connection.setParameters(connectionPset);
158  }
160 
161  // load specific record/tag info - it will overwrite the global tag ( if any )
162  std::map<std::string, cond::GTEntry_t> replacements;
163  std::map<std::string, boost::posix_time::ptime> specialSnapshots;
164  if (iConfig.exists("toGet")) {
165  typedef std::vector<edm::ParameterSet> Parameters;
166  Parameters toGet = iConfig.getParameter<Parameters>("toGet");
167  for (Parameters::iterator itToGet = toGet.begin(); itToGet != toGet.end(); ++itToGet) {
168  std::string recordname = itToGet->getParameter<std::string>("record");
169  if (recordname.empty())
170  throw cond::Exception("ESSource: The record name has not been provided in a \"toGet\" entry.");
171  std::string labelname = itToGet->getUntrackedParameter<std::string>("label", "");
172  std::string pfn("");
173  if (m_connectionString.empty() || itToGet->exists("connect"))
174  pfn = itToGet->getParameter<std::string>("connect");
175  std::string tag("");
176  std::string fqTag("");
177  if (itToGet->exists("tag")) {
178  tag = itToGet->getParameter<std::string>("tag");
179  fqTag = cond::persistency::fullyQualifiedTag(tag, pfn);
180  }
181  boost::posix_time::ptime tagSnapshotTime =
182  boost::posix_time::time_from_string(std::string(cond::time::MAX_TIMESTAMP));
183  if (itToGet->exists("snapshotTime"))
184  tagSnapshotTime = boost::posix_time::time_from_string(itToGet->getParameter<std::string>("snapshotTime"));
185  if (itToGet->exists("refreshTime")) {
186  cond::Time_t refreshTime = itToGet->getParameter<unsigned long long>("refreshTime");
187  m_refreshTimeForRecord.insert(std::make_pair(recordname, refreshTime));
188  }
189 
190  std::string recordLabelKey = joinRecordAndLabel(recordname, labelname);
191  replacements.insert(
192  std::make_pair(recordLabelKey, cond::GTEntry_t(std::make_tuple(recordname, labelname, fqTag))));
193  specialSnapshots.insert(std::make_pair(recordLabelKey, tagSnapshotTime));
194  }
195  }
196 
197  // get the global tag, merge with "replacement" store in "tagCollection"
198  std::vector<std::string> globaltagList;
199  std::vector<std::string> connectList;
200  std::vector<std::string> pfnPrefixList;
201  std::vector<std::string> pfnPostfixList;
202  if (!globaltag.empty()) {
203  std::string pfnPrefix(iConfig.getUntrackedParameter<std::string>("pfnPrefix", ""));
204  std::string pfnPostfix(iConfig.getUntrackedParameter<std::string>("pfnPostfix", ""));
205  boost::split(globaltagList, globaltag, boost::is_any_of("|"), boost::token_compress_off);
206  fillList(m_connectionString, connectList, globaltagList.size(), "connection");
207  fillList(pfnPrefix, pfnPrefixList, globaltagList.size(), "pfnPrefix");
208  fillList(pfnPostfix, pfnPostfixList, globaltagList.size(), "pfnPostfix");
209  }
210 
211  cond::GTMetadata_t gtMetadata;
212  fillTagCollectionFromDB(connectList, pfnPrefixList, pfnPostfixList, globaltagList, replacements, gtMetadata);
213  // if no job specific setting has been found, use the GT timestamp
214  if (snapshotTime.is_not_a_date_time())
215  snapshotTime = gtMetadata.snapshotTime;
216 
217  TagCollection::iterator it;
218  TagCollection::iterator itBeg = m_tagCollection.begin();
219  TagCollection::iterator itEnd = m_tagCollection.end();
220 
221  std::map<std::string, cond::persistency::Session> sessions;
222 
223  /* load DataProxy Plugin (it is strongly typed due to EventSetup ideosyncrasis)
224  * construct proxy
225  * contrary to EventSetup the "object-name" is not used as identifier: multiple entries in a record are
226  * dinstinguished only by their label...
227  * done in two step: first create ProxyWrapper loading ALL required dictionaries
228  * this will allow to initialize POOL in one go for each "database"
229  * The real initialization of the Data-Proxies is done in the second loop
230  */
231  std::vector<std::unique_ptr<cond::DataProxyWrapperBase>> proxyWrappers(m_tagCollection.size());
232  size_t ipb = 0;
233  for (it = itBeg; it != itEnd; ++it) {
234  size_t ind = ipb++;
235  proxyWrappers[ind] = std::unique_ptr<cond::DataProxyWrapperBase>{
236  cond::ProxyFactory::get()->tryToCreate(buildName(it->second.recordName()))};
237  if (!proxyWrappers[ind].get()) {
238  edm::LogWarning("CondDBESSource") << "Plugin for Record " << it->second.recordName() << " has not been found.";
239  }
240  }
241 
242  // now all required libraries have been loaded
243  // init sessions and DataProxies
244  ipb = 0;
245  for (it = itBeg; it != itEnd; ++it) {
247  std::string tag = it->second.tagName();
248  std::pair<std::string, std::string> tagParams = cond::persistency::parseTag(it->second.tagName());
249  if (!tagParams.second.empty()) {
250  connStr = tagParams.second;
251  tag = tagParams.first;
252  }
253  std::map<std::string, cond::persistency::Session>::iterator p = sessions.find(connStr);
255  if (p == sessions.end()) {
257  std::tuple<std::string, std::string, std::string> connPars =
259  std::string dbService = std::get<1>(connPars);
260  std::string dbAccount = std::get<2>(connPars);
261  if ((dbService == "cms_orcon_prod" || dbService == "cms_orcon_adg") && dbAccount != "CMS_CONDITIONS")
262  edm::LogWarning("CondDBESSource")
263  << "[WARNING] You are reading tag \"" << tag << "\" from V1 account \"" << connStr
264  << "\". The concerned Conditions might be out of date." << std::endl;
265  //open db get tag info (i.e. the IOV token...)
266  nsess = m_connection.createReadOnlySession(connStr, "");
267  sessions.insert(std::make_pair(connStr, nsess));
268  } else
269  nsess = (*p).second;
270 
271  // ownership...
272  ProxyP proxy(std::move(proxyWrappers[ipb++]));
273  // instert in the map
274  if (proxy.get()) {
275  m_proxies.insert(std::make_pair(it->second.recordName(), proxy));
276  // initialize
277  boost::posix_time::ptime tagSnapshotTime = snapshotTime;
278  auto tagSnapshotIter = specialSnapshots.find(it->first);
279  if (tagSnapshotIter != specialSnapshots.end())
280  tagSnapshotTime = tagSnapshotIter->second;
281  // finally, if the snapshot is set to infinity, reset the snapshot to null, to take the full iov set...
282  if (tagSnapshotTime == boost::posix_time::time_from_string(std::string(cond::time::MAX_TIMESTAMP)))
283  tagSnapshotTime = boost::posix_time::ptime();
284 
285  proxy->lateInit(nsess, tag, tagSnapshotTime, it->second.recordLabel(), connStr, &m_queue, &m_mutex);
286  }
287  }
288 
289  // one loaded expose all other tags to the Proxy!
290  CondGetterFromESSource visitor(m_proxies);
291  ProxyMap::iterator b = m_proxies.begin();
292  ProxyMap::iterator e = m_proxies.end();
293  for (; b != e; b++) {
294  (*b).second->proxy(0)->loadMore(visitor);
295 
298  if (recordKey.type() != EventSetupRecordKey::TypeTag()) {
299  findingRecordWithKey(recordKey);
300  usingRecordWithKey(recordKey);
301  }
302  }
303 
304  m_stats.nData = m_proxies.size();
305 }
306 
307 void CondDBESSource::fillList(const std::string& stringList,
308  std::vector<std::string>& listToFill,
309  const unsigned int listSize,
310  const std::string& type) {
311  boost::split(listToFill, stringList, boost::is_any_of("|"), boost::token_compress_off);
312  // If it is one clone it for each GT
313  if (listToFill.size() == 1) {
314  for (unsigned int i = 1; i < listSize; ++i) {
315  listToFill.push_back(stringList);
316  }
317  }
318  // else if they don't match the number of GTs throw an exception
319  else if (listSize != listToFill.size()) {
320  throw cond::Exception(
321  std::string("ESSource: number of global tag components does not match number of " + type + " strings"));
322  }
323 }
324 
326  //dump info FIXME: find a more suitable place...
327  if (m_doDump) {
328  std::cout << "CondDBESSource Statistics" << std::endl
329  << "DataProxy " << m_stats.nData << " setInterval " << m_stats.nSet << " Runs " << m_stats.nRun
330  << " Lumis " << m_stats.nLumi << " Refresh " << m_stats.nRefresh << " Actual Refresh "
331  << m_stats.nActualRefresh << " Reconnect " << m_stats.nReconnect << " Actual Reconnect "
333  std::cout << std::endl;
334 
335  ProxyMap::iterator b = m_proxies.begin();
336  ProxyMap::iterator e = m_proxies.end();
337  for (; b != e; b++) {
338  dumpInfo(std::cout, (*b).first, *(*b).second);
339  std::cout << "\n" << std::endl;
340  }
341 
342  // FIXME
343  // We shall eventually close transaction and session...
344  }
345 }
346 
347 //
348 // invoked by EventSetUp: for a given record return the smallest IOV for which iTime is valid
349 // limit to next run/lumisection of Refresh is required
350 //
352  const edm::IOVSyncValue& iTime,
353  edm::ValidityInterval& oInterval) {
354  std::string recordname = iKey.name();
355 
356  edm::LogInfo("CondDBESSource") << "Getting data for record \"" << recordname << "\" to be consumed by "
357  << iTime.eventID() << ", timestamp: " << iTime.time().value()
358  << "; from CondDBESSource::setIntervalFor";
359 
360  std::lock_guard<std::mutex> guard(m_mutex);
361  m_stats.nSet++;
362  //{
363  // not really required, keep here for the time being
364  if (iTime.eventID().run() != m_lastRun) {
365  m_lastRun = iTime.eventID().run();
366  m_stats.nRun++;
367  }
368  if (iTime.luminosityBlockNumber() != m_lastLumi) {
370  m_stats.nLumi++;
371  }
372  //}
373  cond::Time_t lastTime = m_lastRun;
374  cond::Time_t defaultIovSize = cond::time::MAX_VAL;
375  cond::Time_t minDiffTime = 1;
376  bool refreshThisRecord = false;
377  if (m_policy != REFRESH_ALWAYS) {
378  auto iR = m_refreshTimeForRecord.find(recordname);
379  refreshThisRecord = (iR != m_refreshTimeForRecord.end());
380  if (refreshThisRecord) {
382  defaultIovSize = iR->second;
383  minDiffTime = defaultIovSize;
384  }
385  }
386  bool doRefresh = false;
387  if (m_policy == REFRESH_EACH_RUN || m_policy == RECONNECT_EACH_RUN || refreshThisRecord) {
388  // find out the last run number for the proxy of the specified record
389  std::map<std::string, cond::Time_t>::iterator iRec = m_lastRecordRuns.find(recordname);
390  if (iRec != m_lastRecordRuns.end()) {
391  cond::Time_t lastRecordRun = iRec->second;
392  cond::Time_t diffTime = lastTime - lastRecordRun;
393  if (lastRecordRun > lastTime)
394  diffTime = lastRecordRun - lastTime;
395  if (diffTime >= minDiffTime) {
396  // a refresh is required!
397  doRefresh = true;
398  iRec->second = lastTime;
399  edm::LogInfo("CondDBESSource") << "Preparing refresh for record \"" << recordname
400  << "\" since there has been a transition from run/lumi " << lastRecordRun
401  << " to run/lumi " << lastTime << "; from CondDBESSource::setIntervalFor";
402  }
403  } else {
404  doRefresh = true;
405  m_lastRecordRuns.insert(std::make_pair(recordname, lastTime));
406  edm::LogInfo("CondDBESSource") << "Preparing refresh for record \"" << recordname << "\" for " << iTime.eventID()
407  << ", timestamp: " << iTime.time().value()
408  << "; from CondDBESSource::setIntervalFor";
409  }
410  if (!doRefresh)
411  edm::LogInfo("CondDBESSource") << "Though enabled, refresh not needed for record \"" << recordname << "\" for "
412  << iTime.eventID() << ", timestamp: " << iTime.time().value()
413  << "; from CondDBESSource::setIntervalFor";
414  } else if (m_policy == REFRESH_ALWAYS || m_policy == REFRESH_OPEN_IOVS) {
415  doRefresh = true;
416  edm::LogInfo("CondDBESSource") << "Forcing refresh for record \"" << recordname << "\" for " << iTime.eventID()
417  << ", timestamp: " << iTime.time().value()
418  << "; from CondDBESSource::setIntervalFor";
419  }
420 
422 
423  // compute the smallest interval (assume all objects have the same timetype....)
424  cond::ValidityInterval recordValidity(1, cond::TIMELIMIT);
425  cond::TimeType timetype = cond::TimeType::invalid;
426  bool userTime = true;
427 
428  //FIXME use equal_range
429  ProxyMap::const_iterator pmBegin = m_proxies.lower_bound(recordname);
430  ProxyMap::const_iterator pmEnd = m_proxies.upper_bound(recordname);
431  if (pmBegin == pmEnd) {
432  edm::LogInfo("CondDBESSource") << "No DataProxy (Pluging) found for record \"" << recordname
433  << "\"; from CondDBESSource::setIntervalFor";
434  return;
435  }
436 
437  for (ProxyMap::const_iterator pmIter = pmBegin; pmIter != pmEnd; ++pmIter) {
438  edm::LogInfo("CondDBESSource") << "Processing record \"" << recordname << "\" and label \""
439  << pmIter->second->label() << "\" for " << iTime.eventID()
440  << ", timestamp: " << iTime.time().value()
441  << "; from CondDBESSource::setIntervalFor";
442 
443  timetype = (*pmIter).second->timeType();
444 
445  cond::Time_t abtime = cond::time::fromIOVSyncValue(iTime, timetype);
446  userTime = (0 == abtime);
447 
448  if (userTime)
449  return; // oInterval invalid to avoid that make is called...
450 
451  if (doRefresh) {
452  std::string recKey = joinRecordAndLabel(recordname, pmIter->second->label());
453  TagCollection::const_iterator tcIter = m_tagCollection.find(recKey);
454  if (tcIter == m_tagCollection.end()) {
455  edm::LogInfo("CondDBESSource") << "No Tag found for record \"" << recordname << "\" and label \""
456  << pmIter->second->label() << "\"; from CondDBESSource::setIntervalFor";
457  return;
458  }
459 
460  // first reconnect if required
461  if (m_policy == RECONNECT_EACH_RUN || refreshThisRecord) {
462  edm::LogInfo("CondDBESSource")
463  << "Checking if the session must be closed and re-opened for getting correct conditions"
464  << "; from CondDBESSource::setIntervalFor";
465  std::stringstream transId;
466  transId << lastTime;
467  if (!m_frontierKey.empty()) {
468  transId << "_" << m_frontierKey;
469  }
471  std::pair<std::string, std::string> tagParams = cond::persistency::parseTag(tcIter->second.tagName());
472  if (!tagParams.second.empty())
473  connStr = tagParams.second;
474  std::map<std::string, std::pair<cond::persistency::Session, std::string>>* sessionPool = &m_sessionPool;
475  if (refreshThisRecord) {
476  sessionPool = &m_sessionPoolForLumiConditions;
477  }
478  auto iSess = sessionPool->find(connStr);
479  bool reopen = false;
480  if (iSess != sessionPool->end()) {
481  if (iSess->second.second != transId.str()) {
482  // the available session is open for a different run: reopen
483  reopen = true;
484  iSess->second.second = transId.str();
485  }
486  } else {
487  // no available session: probably first run analysed...
488  iSess =
489  sessionPool->insert(std::make_pair(connStr, std::make_pair(cond::persistency::Session(), transId.str())))
490  .first;
491  reopen = true;
492  }
493  if (reopen) {
494  iSess->second.first = m_connection.createReadOnlySession(connStr, transId.str());
495  edm::LogInfo("CondDBESSource") << "Re-opening the session with connection string " << connStr
496  << " and new transaction Id " << transId.str()
497  << "; from CondDBESSource::setIntervalFor";
498  }
499 
500  edm::LogInfo("CondDBESSource") << "Reconnecting to \"" << connStr << "\" for getting new payload for record \""
501  << recordname << "\" and label \"" << pmIter->second->label()
502  << "\" from IOV tag \"" << tcIter->second.tagName() << "\" to be consumed by "
503  << iTime.eventID() << ", timestamp: " << iTime.time().value()
504  << "; from CondDBESSource::setIntervalFor";
505  pmIter->second->session() = iSess->second.first;
506  pmIter->second->reload();
507  //if( isSizeIncreased )
508  //edm::LogInfo( "CondDBESSource" ) << "After reconnecting, an increased size of the IOV sequence labeled by tag \"" << tcIter->second.tag
509  // << "\" was found; from CondDBESSource::setIntervalFor";
510  //m_stats.nActualReconnect += isSizeIncreased;
512  } else {
513  edm::LogInfo("CondDBESSource") << "Refreshing IOV sequence labeled by tag \"" << tcIter->second.tagName()
514  << "\" for getting new payload for record \"" << recordname << "\" and label \""
515  << pmIter->second->label() << "\" to be consumed by " << iTime.eventID()
516  << ", timestamp: " << iTime.time().value()
517  << "; from CondDBESSource::setIntervalFor";
518  pmIter->second->reload();
519  //if( isSizeIncreased )
520  // edm::LogInfo( "CondDBESSource" ) << "After refreshing, an increased size of the IOV sequence labeled by tag \"" << tcIter->second.tag
521  // << "\" was found; from CondDBESSource::setIntervalFor";
522  //m_stats.nActualRefresh += isSizeIncreased;
523  m_stats.nRefresh++;
524  }
525  }
526 
527  /*
528  // make oInterval valid For Ever
529  {
530  oInterval = edm::ValidityInterval(cond::toIOVSyncValue(recordValidity.first, cond::runnumber, true),
531  cond::toIOVSyncValue(recordValidity.second, cond::runnumber, false));
532  return;
533  }
534  */
535 
536  //query the IOVSequence
537  cond::ValidityInterval validity = (*pmIter).second->setIntervalFor(abtime, defaultIovSize);
538 
539  edm::LogInfo("CondDBESSource") << "Validity coming from IOV sequence for record \"" << recordname
540  << "\" and label \"" << pmIter->second->label() << "\": (" << validity.first << ", "
541  << validity.second << ") for time (type: " << cond::timeTypeNames(timetype) << ") "
542  << abtime << "; from CondDBESSource::setIntervalFor";
543 
544  recordValidity.first = std::max(recordValidity.first, validity.first);
545  recordValidity.second = std::min(recordValidity.second, validity.second);
546  }
547 
548  if (m_policy == REFRESH_OPEN_IOVS) {
549  doRefresh = (recordValidity.second == cond::timeTypeSpecs[timetype].endValue);
550  edm::LogInfo("CondDBESSource") << "Validity for record \"" << recordname
551  << "\" and the corresponding label(s) coming from Condition DB: ("
552  << recordValidity.first << ", " << recordValidity.first
553  << ") as the last IOV element in the IOV sequence is infinity"
554  << "; from CondDBESSource::setIntervalFor";
555  }
556 
557  // to force refresh we set end-value to the minimum such an IOV can extend to: current run or lumiblock
558 
559  if ((!userTime) && recordValidity.second != 0) {
560  edm::IOVSyncValue start = cond::time::toIOVSyncValue(recordValidity.first, timetype, true);
561  edm::IOVSyncValue stop = doRefresh ? cond::time::limitedIOVSyncValue(iTime, timetype)
562  : cond::time::toIOVSyncValue(recordValidity.second, timetype, false);
563 
566  }
567  oInterval = edm::ValidityInterval(start, stop);
568  }
569 
570  edm::LogInfo("CondDBESSource") << "Setting validity for record \"" << recordname
571  << "\" and corresponding label(s): starting at " << oInterval.first().eventID()
572  << ", timestamp: " << oInterval.first().time().value() << ", ending at "
573  << oInterval.last().eventID() << ", timestamp: " << oInterval.last().time().value()
574  << ", for " << iTime.eventID() << ", timestamp: " << iTime.time().value()
575  << "; from CondDBESSource::setIntervalFor";
576 }
577 
578 //required by EventSetup System
580  const EventSetupRecordKey& iRecordKey, unsigned int iovIndex) {
581  KeyedProxiesVector keyedProxiesVector;
582 
583  std::string recordname = iRecordKey.name();
584 
585  ProxyMap::const_iterator b = m_proxies.lower_bound(recordname);
586  ProxyMap::const_iterator e = m_proxies.upper_bound(recordname);
587  if (b == e) {
588  edm::LogInfo("CondDBESSource") << "No DataProxy (Pluging) found for record \"" << recordname
589  << "\"; from CondDBESSource::registerProxies";
590  return keyedProxiesVector;
591  }
592 
593  for (ProxyMap::const_iterator p = b; p != e; ++p) {
594  if (nullptr != (*p).second.get()) {
595  edm::eventsetup::TypeTag type = (*p).second->type();
596  DataKey key(type, edm::eventsetup::IdTags((*p).second->label().c_str()));
597  keyedProxiesVector.emplace_back(key, (*p).second->edmProxy(iovIndex));
598  }
599  }
600  return keyedProxiesVector;
601 }
602 
603 void CondDBESSource::initConcurrentIOVs(const EventSetupRecordKey& key, unsigned int nConcurrentIOVs) {
604  std::string recordname = key.name();
605  ProxyMap::const_iterator b = m_proxies.lower_bound(recordname);
606  ProxyMap::const_iterator e = m_proxies.upper_bound(recordname);
607  for (ProxyMap::const_iterator p = b; p != e; ++p) {
608  if (p->second) {
609  p->second->initConcurrentIOVs(nConcurrentIOVs);
610  }
611  }
612 }
613 
614 // Fills tag collection from the given globaltag
616  const std::string& prefix,
617  const std::string& postfix,
618  const std::string& roottag,
619  std::set<cond::GTEntry_t>& tagcoll,
620  cond::GTMetadata_t& gtMetadata) {
621  if (!roottag.empty()) {
622  if (connectionString.empty())
623  throw cond::Exception(std::string("ESSource: requested global tag ") + roottag +
624  std::string(" but not connection string given"));
625  std::tuple<std::string, std::string, std::string> connPars =
627  if (std::get<2>(connPars) == "CMS_COND_31X_GLOBALTAG") {
628  edm::LogWarning("CondDBESSource")
629  << "[WARNING] You are reading Global Tag \"" << roottag
630  << "\" from V1 account \"CMS_COND_31X_GLOBALTAG\". The concerned Conditions might be out of date."
631  << std::endl;
632  } else if (roottag.rfind("::All") != std::string::npos && std::get<2>(connPars) == "CMS_CONDITIONS") {
633  edm::LogWarning("CondDBESSource") << "[WARNING] You are trying to read Global Tag \"" << roottag
634  << "\" - postfix \"::All\" should not be used for V2." << std::endl;
635  }
637  session.transaction().start(true);
638  cond::persistency::GTProxy gtp = session.readGlobalTag(roottag, prefix, postfix);
639  gtMetadata.snapshotTime = gtp.snapshotTime();
640  for (const auto& gte : gtp) {
641  tagcoll.insert(gte);
642  }
643  session.transaction().commit();
644  }
645 }
646 
647 // fills tagcollection merging with replacement
648 // Note: it assumem the coraldbList and roottagList have the same length. This checked in the constructor that prepares the two lists before calling this method.
649 void CondDBESSource::fillTagCollectionFromDB(const std::vector<std::string>& connectionStringList,
650  const std::vector<std::string>& prefixList,
651  const std::vector<std::string>& postfixList,
652  const std::vector<std::string>& roottagList,
653  std::map<std::string, cond::GTEntry_t>& replacement,
654  cond::GTMetadata_t& gtMetadata) {
655  std::set<cond::GTEntry_t> tagcoll;
656 
657  auto connectionString = connectionStringList.begin();
658  auto prefix = prefixList.begin();
659  auto postfix = postfixList.begin();
660  for (auto roottag = roottagList.begin(); roottag != roottagList.end();
661  ++roottag, ++connectionString, ++prefix, ++postfix) {
662  fillTagCollectionFromGT(*connectionString, *prefix, *postfix, *roottag, tagcoll, gtMetadata);
663  }
664 
665  std::set<cond::GTEntry_t>::iterator tagCollIter;
666  std::set<cond::GTEntry_t>::iterator tagCollBegin = tagcoll.begin();
667  std::set<cond::GTEntry_t>::iterator tagCollEnd = tagcoll.end();
668 
669  // FIXME the logic is a bit perverse: can be surely linearized (at least simplified!) ....
670  for (tagCollIter = tagCollBegin; tagCollIter != tagCollEnd; ++tagCollIter) {
671  std::string recordLabelKey = joinRecordAndLabel(tagCollIter->recordName(), tagCollIter->recordLabel());
672  std::map<std::string, cond::GTEntry_t>::iterator fid = replacement.find(recordLabelKey);
673  if (fid != replacement.end()) {
674  if (!fid->second.tagName().empty()) {
675  cond::GTEntry_t tagMetadata(
676  std::make_tuple(tagCollIter->recordName(), tagCollIter->recordLabel(), fid->second.tagName()));
677  m_tagCollection.insert(std::make_pair(recordLabelKey, tagMetadata));
678  edm::LogInfo("CondDBESSource") << "Replacing tag \"" << tagCollIter->tagName() << "\" for record \""
679  << tagMetadata.recordName() << "\" and label \"" << tagMetadata.recordLabel()
680  << "\" with tag " << tagMetadata.tagName()
681  << "\"; from CondDBESSource::fillTagCollectionFromDB";
682  } else {
683  m_tagCollection.insert(std::make_pair(recordLabelKey, *tagCollIter));
684  }
685  replacement.erase(fid);
686  } else {
687  m_tagCollection.insert(std::make_pair(recordLabelKey, *tagCollIter));
688  }
689  }
690  std::map<std::string, cond::GTEntry_t>::iterator replacementIter;
691  std::map<std::string, cond::GTEntry_t>::iterator replacementBegin = replacement.begin();
692  std::map<std::string, cond::GTEntry_t>::iterator replacementEnd = replacement.end();
693  for (replacementIter = replacementBegin; replacementIter != replacementEnd; ++replacementIter) {
694  if (replacementIter->second.tagName().empty()) {
695  std::stringstream msg;
696  msg << "ESSource: no tag provided for record " << replacementIter->second.recordName();
697  if (!replacementIter->second.recordLabel().empty())
698  msg << " and label " << replacementIter->second.recordLabel();
699  throw cond::Exception(msg.str());
700  }
701  m_tagCollection.insert(*replacementIter);
702  }
703 }
704 
705 // backward compatibility for configuration files
707 public:
708  explicit PoolDBESSource(const edm::ParameterSet& ps) : CondDBESSource(ps) {}
709 };
710 
712 //define this as a plug-in
RunNumber_t run() const
Definition: EventID.h:38
persistency::Exception Exception
Definition: Exception.h:25
const TimeTypeSpecs timeTypeSpecs[]
Definition: Time.cc:16
T getUntrackedParameter(std::string const &, T const &) const
std::tuple< std::string, std::string, std::string > parseConnectionString(const std::string &connectionString)
Definition: Utils.h:95
virtual std::string const & localConnectPrefix() const =0
std::mutex m_mutex
Base exception class for the object to relational access.
Definition: Exception.h:11
list globaltag
Definition: align_cfg.py:7
void usingRecordWithKey(const EventSetupRecordKey &key)
const EventID & eventID() const
Definition: IOVSyncValue.h:40
virtual std::string const & localConnectSuffix() const =0
void start(bool readOnly=true)
Definition: Session.cc:18
void setIntervalFor(const EventSetupRecordKey &, const edm::IOVSyncValue &, edm::ValidityInterval &) override
bool exists(std::string const &parameterName) const
checks if a parameter exists
boost::posix_time::ptime snapshotTime
Definition: Types.h:106
static constexpr const char *const MAX_TIMESTAMP
Definition: Time.h:26
std::pair< Time_t, Time_t > ValidityInterval
Definition: Time.h:17
std::map< std::string, std::pair< cond::persistency::Session, std::string > > m_sessionPool
RefreshPolicy m_policy
Transaction & transaction()
Definition: Session.cc:52
virtual bool useLocalConnectString() const =0
TimeType
Definition: Time.h:19
void setParameters(const edm::ParameterSet &connectionPset)
const IOVSyncValue & last() const
void fillTagCollectionFromGT(const std::string &connectionString, const std::string &prefix, const std::string &postfix, const std::string &roottag, std::set< cond::GTEntry_t > &tagcoll, cond::GTMetadata_t &gtMetadata)
Time_t fromIOVSyncValue(edm::IOVSyncValue const &time, TimeType timetype)
Definition: Time.cc:85
edm::SerialTaskQueue m_queue
std::string const & timeTypeNames(int)
Definition: Time.cc:11
std::string const & label() const
Definition: DataProxy.h:92
unsigned long long Time_t
Definition: Time.h:14
Time_t lumiTime(unsigned int run, unsigned int lumiId)
Definition: Time.cc:54
vector< ParameterSet > Parameters
std::string convertoToOracleConnection(const std::string &input)
Definition: Utils.h:120
std::pair< std::string, std::string > parseTag(const std::string &tag)
Definition: GTProxy.cc:14
static const IOVSyncValue & beginOfTime()
Definition: IOVSyncValue.cc:88
def dumpInfo
Definition: getInfo.py:88
if(conf_.getParameter< bool >("UseStripCablingDB"))
cond::persistency::ConnectionPool m_connection
def move
Definition: eostools.py:511
bool isAvailable() const
Definition: Service.h:40
tuple key
prepare the HTCondor submission files and eventually submit them
edm::IOVSyncValue toIOVSyncValue(cond::Time_t time, TimeType timetype, bool startOrStop)
Definition: Time.cc:67
LuminosityBlockNumber_t luminosityBlockNumber() const
Definition: IOVSyncValue.h:41
boost::posix_time::ptime snapshotTime() const
Definition: GTProxy.cc:135
Session createSession(const std::string &connectionString, bool writeCapable=false)
void initConcurrentIOVs(const EventSetupRecordKey &key, unsigned int nConcurrentIOVs) override
std::string fullyQualifiedTag(const std::string &tag, const std::string &connectionString)
Definition: GTProxy.cc:8
void fillList(const std::string &pfn, std::vector< std::string > &pfnList, const unsigned int listSize, const std::string &type)
std::multimap< std::string, ProxyP > ProxyMap
T min(T a, T b)
Definition: MathUtil.h:58
const std::string & recordLabel() const
Definition: Types.h:121
std::shared_ptr< cond::DataProxyWrapperBase > ProxyP
std::map< std::string, std::pair< cond::persistency::Session, std::string > > m_sessionPoolForLumiConditions
Log< level::Info, false > LogInfo
std::string const & connString() const
Definition: DataProxy.h:93
#define DEFINE_FWK_EVENTSETUP_SOURCE(type)
Definition: SourceFactory.h:91
std::vector< std::pair< DataKey, std::shared_ptr< DataProxy >>> KeyedProxiesVector
PoolDBESSource(const edm::ParameterSet &ps)
TagCollection m_tagCollection
std::shared_ptr< std::vector< Iov_t > > const & requests() const
Definition: DataProxy.h:100
KeyedProxiesVector registerProxies(const EventSetupRecordKey &, unsigned int iovIndex) override
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
const Time_t TIMELIMIT(std::numeric_limits< Time_t >::max())
std::map< std::string, cond::Time_t > m_refreshTimeForRecord
double b
Definition: hdecay.h:118
~CondDBESSource() override
tuple msg
Definition: mps_check.py:285
std::string const & tag() const
Definition: DataProxy.h:94
void fillTagCollectionFromDB(const std::vector< std::string > &connectionStringList, const std::vector< std::string > &prefixList, const std::vector< std::string > &postfixList, const std::vector< std::string > &roottagList, std::map< std::string, cond::GTEntry_t > &replacement, cond::GTMetadata_t &gtMetadata)
heterocontainer::HCTypeTag TypeTag
std::string m_connectionString
ProxyMap m_proxies
unsigned int m_lastRun
const std::string & recordName() const
Definition: Types.h:120
static const ValidityInterval & invalidInterval()
Session createReadOnlySession(const std::string &connectionString, const std::string &transactionId)
std::map< std::string, cond::Time_t > m_lastRecordRuns
const std::string & tagName() const
Definition: Types.h:122
std::string m_frontierKey
const Timestamp & time() const
Definition: IOVSyncValue.h:42
edm::IOVSyncValue limitedIOVSyncValue(Time_t time, TimeType timetype)
Definition: Time.cc:101
tuple cout
Definition: gather_cfg.py:144
const IOVSyncValue & first() const
#define get
Log< level::Warning, false > LogWarning
Time_t endValue
Definition: Time.h:42
CondDBESSource(const edm::ParameterSet &)
GTProxy readGlobalTag(const std::string &name)
Definition: Session.cc:163
unsigned int m_lastLumi
const Time_t MAX_VAL(std::numeric_limits< Time_t >::max())
TimeValue_t value() const
Definition: Timestamp.h:45
void findingRecordWithKey(const eventsetup::EventSetupRecordKey &)
static const IOVSyncValue & invalidIOVSyncValue()
Definition: IOVSyncValue.cc:78
static HCTypeTag findType(char const *iTypeName)
find a type based on the types name, if not found will return default HCTypeTag
Definition: HCTypeTag.cc:121