CMS 3D CMS Logo

EventSetupProvider.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Framework
4 // Module: EventSetupProvider
5 //
6 // Description: <one line class summary>
7 //
8 // Implementation:
9 // <Notes on implementation>
10 //
11 // Author: Chris Jones
12 // Created: Thu Mar 24 16:27:14 EST 2005
13 //
14 
15 // system include files
16 #include <algorithm>
17 #include <cassert>
18 
19 // user include files
37 
38 namespace edm {
39  namespace eventsetup {
40 
42  unsigned subProcessIndex,
43  const PreferredProviderInfo* iInfo)
44  : activityRegistry_(activityRegistry),
45  mustFinishConfiguration_(true),
46  subProcessIndex_(subProcessIndex),
47  preferredProviderInfo_((nullptr != iInfo) ? (new PreferredProviderInfo(*iInfo)) : nullptr),
48  finders_(new std::vector<std::shared_ptr<EventSetupRecordIntervalFinder>>()),
49  dataProviders_(new std::vector<std::shared_ptr<ESProductResolverProvider>>()),
50  referencedDataKeys_(new std::map<EventSetupRecordKey, std::map<DataKey, ComponentDescription const*>>),
51  recordToFinders_(
53  psetIDToRecordKey_(new std::map<ParameterSetIDHolder, std::set<EventSetupRecordKey>>),
54  recordToPreferred_(new std::map<EventSetupRecordKey, std::map<DataKey, ComponentDescription>>),
55  recordsWithALooperResolver_(new std::set<EventSetupRecordKey>) {}
56 
58 
59  std::shared_ptr<EventSetupRecordProvider>& EventSetupProvider::recordProvider(const EventSetupRecordKey& iKey) {
60  auto lb = std::lower_bound(recordKeys_.begin(), recordKeys_.end(), iKey);
61  if (lb == recordKeys_.end() || iKey != *lb) {
62  throw cms::Exception("LogicError") << "EventSetupProvider::recordProvider Could not find key\n"
63  << "Should be impossible. Please contact Framework developer.\n";
64  }
65  auto index = std::distance(recordKeys_.begin(), lb);
66  return recordProviders_[index];
67  }
68 
70  auto lb = std::lower_bound(recordKeys_.begin(), recordKeys_.end(), iKey);
71  if (lb == recordKeys_.end() || iKey != *lb) {
72  return nullptr;
73  }
74  auto index = std::distance(recordKeys_.begin(), lb);
75  return recordProviders_[index].get();
76  }
77 
79  std::unique_ptr<EventSetupRecordProvider> iProvider) {
80  auto lb = std::lower_bound(recordKeys_.begin(), recordKeys_.end(), iKey);
81  auto index = std::distance(recordKeys_.begin(), lb);
82  if (lb == recordKeys_.end() || iKey != *lb) {
83  recordKeys_.insert(lb, iKey);
84  recordProviders_.insert(recordProviders_.begin() + index, std::move(iProvider));
85  } else {
86  recordProviders_[index] = std::move(iProvider);
87  }
88  }
89 
90  void EventSetupProvider::add(std::shared_ptr<ESProductResolverProvider> iProvider) {
91  assert(iProvider.get() != nullptr);
92  dataProviders_->push_back(iProvider);
93  if (activityRegistry_) {
94  activityRegistry_->postESModuleRegistrationSignal_(iProvider->description());
95  }
96  }
97 
98  void EventSetupProvider::replaceExisting(std::shared_ptr<ESProductResolverProvider> productResolverProvider) {
99  ParameterSetIDHolder psetID(productResolverProvider->description().pid_);
100  std::set<EventSetupRecordKey> const& keysForPSetID = (*psetIDToRecordKey_)[psetID];
101  for (auto const& key : keysForPSetID) {
102  recordProvider(key)->resetProductResolverProvider(psetID, productResolverProvider);
103  }
104  }
105 
106  void EventSetupProvider::add(std::shared_ptr<EventSetupRecordIntervalFinder> iFinder) {
107  assert(iFinder.get() != nullptr);
108  finders_->push_back(iFinder);
109  }
110 
111  using RecordProviders = std::vector<std::shared_ptr<EventSetupRecordProvider>>;
112  using RecordToPreferred = std::map<EventSetupRecordKey, EventSetupRecordProvider::DataToPreferredProviderMap>;
114  static void preferEverything(const ComponentDescription& iComponent,
115  const RecordProviders& iRecordProviders,
116  RecordToPreferred& iReturnValue) {
117  //need to get our hands on the actual ESProductResolverProvider
118  bool foundResolverProvider = false;
119  for (auto const& recordProvider : iRecordProviders) {
120  std::set<ComponentDescription> components = recordProvider->resolverProviderDescriptions();
121  if (components.find(iComponent) != components.end()) {
122  std::shared_ptr<ESProductResolverProvider> resolverProv =
123  recordProvider->resolverProvider(*(components.find(iComponent)));
124  assert(resolverProv.get());
125 
126  std::set<EventSetupRecordKey> records = resolverProv->usingRecords();
127  for (auto const& recordKey : records) {
128  unsigned int iovIndex = 0; // Doesn't matter which index is picked, at least 1 should always exist
130  resolverProv->keyedResolvers(recordKey, iovIndex);
131  if (!keyedResolvers.unInitialized()) {
132  //add them to our output
133  EventSetupRecordProvider::DataToPreferredProviderMap& dataToProviderMap = iReturnValue[recordKey];
134 
135  for (auto keyedResolver : keyedResolvers) {
136  EventSetupRecordProvider::DataToPreferredProviderMap::iterator itFind =
137  dataToProviderMap.find(keyedResolver.dataKey_);
138  if (itFind != dataToProviderMap.end()) {
139  throw cms::Exception("ESPreferConflict")
140  << "Two providers have been set to be preferred for\n"
141  << keyedResolver.dataKey_.type().name() << " \"" << keyedResolver.dataKey_.name().value() << "\""
142  << "\n the providers are "
143  << "\n 1) type=" << itFind->second.type_ << " label=\"" << itFind->second.label_ << "\""
144  << "\n 2) type=" << iComponent.type_ << " label=\"" << iComponent.label_ << "\""
145  << "\nPlease modify configuration so only one is preferred";
146  }
147  dataToProviderMap.insert(std::make_pair(keyedResolver.dataKey_, iComponent));
148  }
149  }
150  }
151  foundResolverProvider = true;
152  break;
153  }
154  }
155  if (!foundResolverProvider) {
156  throw cms::Exception("ESPreferNoProvider")
157  << "Could not make type=\"" << iComponent.type_ << "\" label=\"" << iComponent.label_
158  << "\" a preferred Provider."
159  << "\n Please check spelling of name, or that it was loaded into the job.";
160  }
161  }
162 
164  using namespace edm::eventsetup;
166  for (auto const& itInfo : *preferredProviderInfo_) {
167  if (itInfo.second.empty()) {
168  //want everything
170  } else {
171  for (auto const& itRecData : itInfo.second) {
172  std::string recordName = itRecData.first;
174  if (recordKey.type() == eventsetup::EventSetupRecordKey::TypeTag()) {
175  throw cms::Exception("ESPreferUnknownRecord")
176  << "Unknown record \"" << recordName
177  << "\" used in es_prefer statement for type=" << itInfo.first.type_ << " label=\""
178  << itInfo.first.label_ << "\"\n Please check spelling.";
179  //record not found
180  }
181  //See if the ResolverProvider provides something for this Record
182  EventSetupRecordProvider& recordProviderForKey = *recordProvider(recordKey);
183 
184  std::set<ComponentDescription> components = recordProviderForKey.resolverProviderDescriptions();
185  std::set<ComponentDescription>::iterator itResolverProv = components.find(itInfo.first);
186  if (itResolverProv == components.end()) {
187  throw cms::Exception("ESPreferWrongRecord")
188  << "The type=" << itInfo.first.type_ << " label=\"" << itInfo.first.label_
189  << "\" does not provide data for the Record " << recordName;
190  }
191  //Does it data type exist?
192  eventsetup::TypeTag datumType = eventsetup::TypeTag::findType(itRecData.second.first);
193  if (datumType == eventsetup::TypeTag()) {
194  //not found
195  throw cms::Exception("ESPreferWrongDataType")
196  << "The es_prefer statement for type=" << itInfo.first.type_ << " label=\"" << itInfo.first.label_
197  << "\" has the unknown data type \"" << itRecData.second.first << "\""
198  << "\n Please check spelling";
199  }
200  eventsetup::DataKey datumKey(datumType, itRecData.second.second.c_str());
201 
202  //Does the resolverprovider make this?
203  std::shared_ptr<ESProductResolverProvider> resolverProv =
204  recordProviderForKey.resolverProvider(*itResolverProv);
205  unsigned int iovIndex = 0; // Doesn't matter which index is picked, at least 1 should always exist
206  const ESProductResolverProvider::KeyedResolvers& keyedResolvers =
207  resolverProv->keyedResolvers(recordKey, iovIndex);
208  if (!keyedResolvers.contains(datumKey)) {
209  throw cms::Exception("ESPreferWrongData")
210  << "The es_prefer statement for type=" << itInfo.first.type_ << " label=\"" << itInfo.first.label_
211  << "\" specifies the data item \n"
212  << " type=\"" << itRecData.second.first << "\" label=\"" << itRecData.second.second << "\""
213  << " which is not provided. Please check spelling.";
214  }
215 
217  (*recordToPreferred_)[recordKey];
218  //has another provider already been specified?
219  if (dataToProviderMap.end() != dataToProviderMap.find(datumKey)) {
220  EventSetupRecordProvider::DataToPreferredProviderMap::iterator itFind =
221  dataToProviderMap.find(datumKey);
222  throw cms::Exception("ESPreferConflict")
223  << "Two providers have been set to be preferred for\n"
224  << datumKey.type().name() << " \"" << datumKey.name().value() << "\""
225  << "\n the providers are "
226  << "\n 1) type=" << itFind->second.type_ << " label=\"" << itFind->second.label_ << "\""
227  << "\n 2) type=" << itResolverProv->type_ << " label=\"" << itResolverProv->label_ << "\""
228  << "\nPlease modify configuration so only one is preferred";
229  }
230  dataToProviderMap.insert(std::make_pair(datumKey, *itResolverProv));
231  }
232  }
233  }
234  }
235  }
236 
238  bool& hasNonconcurrentFinder) {
239  //we delayed adding finders to the system till here so that everything would be loaded first
240  recordToFinders_->clear();
241  for (auto& finder : *finders_) {
242  if (!finder->concurrentFinder()) {
243  hasNonconcurrentFinder = true;
244  }
245 
246  const std::set<EventSetupRecordKey> recordsUsing = finder->findingForRecords();
247 
248  for (auto const& key : recordsUsing) {
249  (*recordToFinders_)[key].push_back(finder);
250 
252  if (recProvider == nullptr) {
253  bool printInfoMsg = true;
254  unsigned int nConcurrentIOVs = numberOfConcurrentIOVs.numberOfConcurrentIOVs(key, printInfoMsg);
255 
256  //create a provider for this record
257  insert(key, std::make_unique<EventSetupRecordProvider>(key, activityRegistry_, nConcurrentIOVs));
258  recProvider = tryToGetRecordProvider(key);
259  }
260  recProvider->addFinder(finder);
261  }
262  }
263  //we've transfered our ownership so this is no longer needed
264  finders_.reset();
265 
266  //Now handle providers since sources can also be finders and the sources can delay registering
267  // their Records and therefore could delay setting up their Proxies
268  psetIDToRecordKey_->clear();
269  for (auto& productResolverProvider : *dataProviders_) {
270  ParameterSetIDHolder psetID(productResolverProvider->description().pid_);
271 
272  const std::set<EventSetupRecordKey> recordsUsing = productResolverProvider->usingRecords();
273  for (auto const& key : recordsUsing) {
274  unsigned int nConcurrentIOVs = numberOfConcurrentIOVs.numberOfConcurrentIOVs(key);
275  productResolverProvider->createKeyedResolvers(key, nConcurrentIOVs);
276 
277  if (productResolverProvider->description().isLooper_) {
279  }
280 
281  (*psetIDToRecordKey_)[psetID].insert(key);
282 
284  if (recProvider == nullptr) {
285  bool printInfoMsg = true;
286  nConcurrentIOVs = numberOfConcurrentIOVs.numberOfConcurrentIOVs(key, printInfoMsg);
287  //create a provider for this record
288  insert(key, std::make_unique<EventSetupRecordProvider>(key, activityRegistry_, nConcurrentIOVs));
289  recProvider = tryToGetRecordProvider(key);
290  }
291  recProvider->add(productResolverProvider);
292  }
293  }
294 
295  //used for the case where no preferred Providers have been specified for the Record
297 
299 
300  //For each Provider, find all the Providers it depends on. If a dependent Provider
301  // can not be found pass in an empty list
302  //CHANGE: now allow for missing Providers
303  for (auto& itRecordProvider : recordProviders_) {
304  const EventSetupRecordProvider::DataToPreferredProviderMap* preferredInfo = &kEmptyMap;
305  RecordToPreferred::const_iterator itRecordFound = recordToPreferred_->find(itRecordProvider->key());
306  if (itRecordFound != recordToPreferred_->end()) {
307  preferredInfo = &(itRecordFound->second);
308  }
309  //Give it our list of preferred
310  itRecordProvider->usePreferred(*preferredInfo);
311 
312  std::set<EventSetupRecordKey> records = itRecordProvider->dependentRecords();
313  if (!records.empty()) {
314  std::string missingRecords;
315  std::vector<std::shared_ptr<EventSetupRecordProvider>> depProviders;
316  depProviders.reserve(records.size());
317  bool foundAllProviders = true;
318  for (auto const& key : records) {
319  auto lb = std::lower_bound(recordKeys_.begin(), recordKeys_.end(), key);
320  if (lb == recordKeys_.end() || key != *lb) {
321  foundAllProviders = false;
322  if (missingRecords.empty()) {
323  missingRecords = key.name();
324  } else {
325  missingRecords += ", ";
326  missingRecords += key.name();
327  }
328  } else {
329  auto index = std::distance(recordKeys_.begin(), lb);
330  depProviders.push_back(recordProviders_[index]);
331  }
332  }
333 
334  if (!foundAllProviders) {
335  edm::LogInfo("EventSetupDependency")
336  << "The EventSetup record " << itRecordProvider->key().name() << " depends on at least one Record \n ("
337  << missingRecords
338  << ") which is not present in the job."
339  "\n This may lead to an exception begin thrown during event processing.\n If no exception occurs "
340  "during the job than it is usually safe to ignore this message.";
341 
342  //depProviders.clear();
343  //NOTE: should provide a warning
344  }
345 
346  itRecordProvider->setDependentProviders(depProviders);
347  }
348  }
349 
351  for (auto& provider : *dataProviders_) {
352  provider->updateLookup(indices);
353  }
354  dataProviders_.reset();
355 
356  mustFinishConfiguration_ = false;
357  }
358 
359  using Itr = RecordProviders::iterator;
360  static void findDependents(const EventSetupRecordKey& iKey,
361  Itr itBegin,
362  Itr itEnd,
363  std::vector<std::shared_ptr<EventSetupRecordProvider>>& oDependents) {
364  for (Itr it = itBegin; it != itEnd; ++it) {
365  //does it depend on the record in question?
366  const std::set<EventSetupRecordKey>& deps = (*it)->dependentRecords();
367  if (deps.end() != deps.find(iKey)) {
368  oDependents.push_back(*it);
369  //now see who is dependent on this record since they will be indirectly dependent on iKey
370  findDependents((*it)->key(), itBegin, itEnd, oDependents);
371  }
372  }
373  }
374 
377  if (recProvider == nullptr) {
378  return;
379  }
380 
381  std::vector<std::shared_ptr<EventSetupRecordProvider>> dependents;
382  findDependents(iKey, recordProviders_.begin(), recordProviders_.end(), dependents);
383 
384  dependents.erase(std::unique(dependents.begin(), dependents.end()), dependents.end());
385 
386  recProvider->resetProxies();
387  for (auto& d : dependents) {
388  d->resetProxies();
389  }
390  }
391 
393  for (auto& recProvider : recordProviders_) {
394  if (recProvider) {
395  recProvider->resetProxies();
396  }
397  }
398  }
399 
401  ModuleTypeResolverMaker const* resolverMaker,
402  EventSetupProvider& precedingESProvider,
403  std::set<ParameterSetIDHolder>& sharingCheckDone,
404  std::map<EventSetupRecordKey, std::vector<ComponentDescription const*>>& referencedESProducers,
405  EventSetupsController& esController) {
406  edm::LogVerbatim("EventSetupSharing")
407  << "EventSetupProvider::checkESProducerSharing: Checking processes with SubProcess Indexes "
408  << subProcessIndex() << " and " << precedingESProvider.subProcessIndex();
409 
410  if (referencedESProducers.empty()) {
411  for (auto& recProvider : recordProviders_) {
412  recProvider->getReferencedESProducers(referencedESProducers);
413  }
414  }
415 
416  // This records whether the configurations of all the ESProductResolverProviders
417  // and finders matches for a particular pair of processes and
418  // a particular record and also the records it depends on.
419  std::map<EventSetupRecordKey, bool> allComponentsMatch;
420 
421  std::map<ParameterSetID, bool> candidateNotRejectedYet;
422 
423  // Loop over all the ESProducers which have a ESProductResolver
424  // referenced by any EventSetupRecord in this EventSetupProvider
425  for (auto const& iRecord : referencedESProducers) {
426  for (auto const& iComponent : iRecord.second) {
427  ParameterSetID const& psetID = iComponent->pid_;
428  ParameterSetIDHolder psetIDHolder(psetID);
429  if (sharingCheckDone.find(psetIDHolder) != sharingCheckDone.end())
430  continue;
431 
432  bool firstProcessWithThisPSet = false;
433  bool precedingHasMatchingPSet = false;
434 
435  esController.lookForMatches(psetID,
437  precedingESProvider.subProcessIndex_,
438  firstProcessWithThisPSet,
439  precedingHasMatchingPSet);
440 
441  if (firstProcessWithThisPSet) {
442  sharingCheckDone.insert(psetIDHolder);
443  allComponentsMatch[iRecord.first] = false;
444  continue;
445  }
446 
447  if (!precedingHasMatchingPSet) {
448  allComponentsMatch[iRecord.first] = false;
449  continue;
450  }
451 
452  // An ESProducer that survives to this point is a candidate.
453  // It was shared with some other process in the first pass where
454  // ESProducers were constructed and one of three possibilities exists:
455  // 1) It should not have been shared and a new ESProducer needs
456  // to be created and the proper pointers set.
457  // 2) It should have been shared with a different preceding process
458  // in which case some pointers need to be modified.
459  // 3) It was originally shared which the correct prior process
460  // in which case nothing needs to be done, but we do need to
461  // do some work to verify that.
462  // Make an entry in a map for each of these ESProducers. We
463  // will set the value to false if and when we determine
464  // the ESProducer cannot be shared between this pair of processes.
465  auto iCandidateNotRejectedYet = candidateNotRejectedYet.find(psetID);
466  if (iCandidateNotRejectedYet == candidateNotRejectedYet.end()) {
467  candidateNotRejectedYet[psetID] = true;
468  iCandidateNotRejectedYet = candidateNotRejectedYet.find(psetID);
469  }
470 
471  // At this point we know that the two processes both
472  // have an ESProducer matching the type and label in
473  // iComponent and also with exactly the same configuration.
474  // And there was not an earlier preceding process
475  // where the same instance of the ESProducer could
476  // have been shared. And this ESProducer was referenced
477  // by the later process's EventSetupRecord (preferred or
478  // or just the only thing that could have made the data).
479  // To determine if sharing is allowed, now we need to
480  // check if all the ESProductResolverProviders and all the
481  // finders are the same for this record and also for
482  // all records this record depends on. And even
483  // if this is true, we have to wait until the loop
484  // ends because some other ESProductResolver associated with
485  // the ESProducer could write to a different record where
486  // the same determination will need to be repeated. Only if
487  // all of the the ESProductResolver's can be shared, can the ESProducer
488  // instance be shared across processes.
489 
490  if (iCandidateNotRejectedYet->second == true) {
491  auto iAllComponentsMatch = allComponentsMatch.find(iRecord.first);
492  if (iAllComponentsMatch == allComponentsMatch.end()) {
493  // We do not know the value in AllComponents yet and
494  // we need it now so we have to do the difficult calculation
495  // now.
496  bool match = doRecordsMatch(precedingESProvider, iRecord.first, allComponentsMatch, esController);
497  allComponentsMatch[iRecord.first] = match;
498  iAllComponentsMatch = allComponentsMatch.find(iRecord.first);
499  }
500  if (!iAllComponentsMatch->second) {
501  iCandidateNotRejectedYet->second = false;
502  }
503  }
504  } // end loop over components used by record
505  } // end loop over records
506 
507  // Loop over candidates
508  for (auto const& candidate : candidateNotRejectedYet) {
509  ParameterSetID const& psetID = candidate.first;
510  bool canBeShared = candidate.second;
511  if (canBeShared) {
512  ParameterSet const& pset = esController.getESProducerPSet(psetID, subProcessIndex_);
514  ParameterSetIDHolder psetIDHolder(psetID);
515  sharingCheckDone.insert(psetIDHolder);
516  if (esController.isFirstMatch(psetID, subProcessIndex_, precedingESProvider.subProcessIndex_)) {
517  continue; // Proper sharing was already done. Nothing more to do.
518  }
519 
520  // Need to reset the pointer from the EventSetupRecordProvider to the
521  // the ESProductResolverProvider so these two processes share an ESProducer.
522 
523  std::shared_ptr<ESProductResolverProvider> productResolverProvider;
524  std::set<EventSetupRecordKey> const& keysForPSetID1 = (*precedingESProvider.psetIDToRecordKey_)[psetIDHolder];
525  for (auto const& key : keysForPSetID1) {
526  productResolverProvider = precedingESProvider.recordProvider(key)->resolverProvider(psetIDHolder);
527  assert(productResolverProvider);
528  break;
529  }
530 
531  std::set<EventSetupRecordKey> const& keysForPSetID2 = (*psetIDToRecordKey_)[psetIDHolder];
532  for (auto const& key : keysForPSetID2) {
533  recordProvider(key)->resetProductResolverProvider(psetIDHolder, productResolverProvider);
534  }
535  } else {
536  if (esController.isLastMatch(psetID, subProcessIndex_, precedingESProvider.subProcessIndex_)) {
537  ParameterSet& pset = esController.getESProducerPSet(psetID, subProcessIndex_);
538  ModuleFactory::get()->addTo(esController, *this, pset, resolverMaker, true);
539  }
540  }
541  }
542  }
543 
545  EventSetupRecordKey const& eventSetupRecordKey,
546  std::map<EventSetupRecordKey, bool>& allComponentsMatch,
547  EventSetupsController const& esController) {
548  // first check if this record matches. If not just return false
549 
550  // then find the directly dependent records and iterate over them
551  // recursively call this function on them. If they return false
552  // set allComponentsMatch to false for them and return false.
553  // if they all return true then set allComponents to true
554  // and return true.
555 
556  if (precedingESProvider.recordsWithALooperResolver_->find(eventSetupRecordKey) !=
557  precedingESProvider.recordsWithALooperResolver_->end()) {
558  return false;
559  }
560 
561  if ((*recordToFinders_)[eventSetupRecordKey].size() !=
562  (*precedingESProvider.recordToFinders_)[eventSetupRecordKey].size()) {
563  return false;
564  }
565 
566  for (auto const& finder : (*recordToFinders_)[eventSetupRecordKey]) {
567  ParameterSetID const& psetID = finder->descriptionForFinder().pid_;
568  bool itMatches =
569  esController.isMatchingESSource(psetID, subProcessIndex_, precedingESProvider.subProcessIndex_);
570  if (!itMatches) {
571  return false;
572  }
573  }
574 
575  fillReferencedDataKeys(eventSetupRecordKey);
576  precedingESProvider.fillReferencedDataKeys(eventSetupRecordKey);
577 
578  std::map<DataKey, ComponentDescription const*> const& dataItems = (*referencedDataKeys_)[eventSetupRecordKey];
579 
580  std::map<DataKey, ComponentDescription const*> const& precedingDataItems =
581  (*precedingESProvider.referencedDataKeys_)[eventSetupRecordKey];
582 
583  if (dataItems.size() != precedingDataItems.size()) {
584  return false;
585  }
586 
587  for (auto const& dataItem : dataItems) {
588  auto precedingDataItem = precedingDataItems.find(dataItem.first);
589  if (precedingDataItem == precedingDataItems.end()) {
590  return false;
591  }
592  if (dataItem.second->pid_ != precedingDataItem->second->pid_) {
593  return false;
594  }
595  // Check that the configurations match exactly for the ESProducers
596  // (We already checked the ESSources above and there should not be
597  // any loopers)
598  if (!dataItem.second->isSource_ && !dataItem.second->isLooper_) {
599  bool itMatches = esController.isMatchingESProducer(
600  dataItem.second->pid_, subProcessIndex_, precedingESProvider.subProcessIndex_);
601  if (!itMatches) {
602  return false;
603  }
604  }
605  }
606  EventSetupRecordProvider* recProvider = tryToGetRecordProvider(eventSetupRecordKey);
607  if (recProvider != nullptr) {
608  std::set<EventSetupRecordKey> dependentRecords = recProvider->dependentRecords();
609  for (auto const& dependentRecord : dependentRecords) {
610  auto iter = allComponentsMatch.find(dependentRecord);
611  if (iter != allComponentsMatch.end()) {
612  if (iter->second) {
613  continue;
614  } else {
615  return false;
616  }
617  }
618  bool match = doRecordsMatch(precedingESProvider, dependentRecord, allComponentsMatch, esController);
619  allComponentsMatch[dependentRecord] = match;
620  if (!match)
621  return false;
622  }
623  }
624  return true;
625  }
626 
628  if (referencedDataKeys_->find(eventSetupRecordKey) != referencedDataKeys_->end())
629  return;
630 
631  EventSetupRecordProvider* recProvider = tryToGetRecordProvider(eventSetupRecordKey);
632  if (recProvider == nullptr) {
633  (*referencedDataKeys_)[eventSetupRecordKey];
634  return;
635  }
636  recProvider->fillReferencedDataKeys((*referencedDataKeys_)[eventSetupRecordKey]);
637  }
638 
640  for (auto const& recProvider : recordProviders_) {
642  const EventSetupRecordProvider::DataToPreferredProviderMap* preferredInfo = &kEmptyMap;
643  RecordToPreferred::const_iterator itRecordFound = recordToPreferred_->find(recProvider->key());
644  if (itRecordFound != recordToPreferred_->end()) {
645  preferredInfo = &(itRecordFound->second);
646  }
647  recProvider->resetRecordToResolverPointers(*preferredInfo);
648  }
649  }
650 
652  preferredProviderInfo_.reset();
653  referencedDataKeys_.reset();
654  recordToFinders_.reset();
655  psetIDToRecordKey_.reset();
656  recordToPreferred_.reset();
658  }
659 
661  std::set<EventSetupRecordKey>& recordsNotAllowingConcurrentIOVs) const {
662  for (auto const& productResolverProvider : *dataProviders_) {
663  productResolverProvider->fillRecordsNotAllowingConcurrentIOVs(recordsNotAllowingConcurrentIOVs);
664  }
665  }
666 
668  // First loop sets a flag that helps us to not duplicate calls to the
669  // same EventSetupRecordProvider setting the IOVs. Dependent records
670  // can cause duplicate calls without this protection.
671  for (auto& recProvider : recordProviders_) {
672  recProvider->initializeForNewSyncValue();
673  }
674 
675  for (auto& recProvider : recordProviders_) {
676  recProvider->setValidityIntervalFor(iValue);
677  }
678  }
679 
680  std::shared_ptr<const EventSetupImpl> EventSetupProvider::eventSetupForInstance(const IOVSyncValue& iValue,
681  bool& newEventSetupImpl) {
682  using IntervalStatus = EventSetupRecordProvider::IntervalStatus;
683 
684  // It is important to understand that eventSetupForInstance is a function
685  // where only one call is executing at a time (not multiple calls running
686  // concurrently). These calls are made in the order determined by the
687  // InputSource. One invocation completes and returns before another starts.
688 
689  bool needNewEventSetupImpl = false;
690  if (eventSetupImpl_.get() == nullptr) {
691  needNewEventSetupImpl = true;
692  } else {
693  for (auto& recProvider : recordProviders_) {
694  if (recProvider->intervalStatus() == IntervalStatus::Invalid) {
695  if (eventSetupImpl_->validRecord(recProvider->key())) {
696  needNewEventSetupImpl = true;
697  }
698  } else {
699  if (recProvider->newIntervalForAnySubProcess()) {
700  needNewEventSetupImpl = true;
701  }
702  }
703  }
704  }
705 
706  if (needNewEventSetupImpl) {
707  //cannot use make_shared because constructor is private
708  eventSetupImpl_ = std::shared_ptr<EventSetupImpl>(new EventSetupImpl());
709  newEventSetupImpl = true;
710  eventSetupImpl_->setKeyIters(recordKeys_.begin(), recordKeys_.end());
711 
712  for (auto& recProvider : recordProviders_) {
713  recProvider->setEventSetupImpl(eventSetupImpl_.get());
714  }
715  }
717  }
718 
720  for (auto& recProvider : recordProviders_) {
721  if (recProvider->doWeNeedToWaitForIOVsToFinish(iValue)) {
722  return true;
723  }
724  }
725  return false;
726  }
727 
728  std::set<ComponentDescription> EventSetupProvider::resolverProviderDescriptions() const {
729  typedef std::set<ComponentDescription> Set;
730  Set descriptions;
731 
732  for (auto const& recProvider : recordProviders_) {
733  auto const& d = recProvider->resolverProviderDescriptions();
734  descriptions.insert(d.begin(), d.end());
735  }
736  if (dataProviders_.get()) {
737  for (auto const& p : *dataProviders_) {
738  descriptions.insert(p->description());
739  }
740  }
741 
742  return descriptions;
743  }
744 
746  insert(iKey, std::unique_ptr<EventSetupRecordProvider>());
747  eventSetupImpl_->setKeyIters(recordKeys_.begin(), recordKeys_.end());
748  }
749 
751  preferredProviderInfo_ = std::make_unique<PreferredProviderInfo>(iInfo);
752  }
753 
754  void EventSetupProvider::fillKeys(std::set<EventSetupRecordKey>& keys) const {
755  for (auto const& recProvider : recordProviders_) {
756  keys.insert(recProvider->key());
757  }
758  }
759 
762 
763  unsigned int index = 0;
764  for (const auto& provider : recordProviders_) {
765  index = ret.dataKeysInRecord(
766  index, provider->key(), provider->registeredDataKeys(), provider->componentsForRegisteredDataKeys());
767  }
768 
769  return ret;
770  }
771 
772  //
773  // static member functions
774  //
776  std::string edmtype = iConfiguration.getParameter<std::string>("@module_edm_type");
777  std::string modtype = iConfiguration.getParameter<std::string>("@module_type");
778  std::string label = iConfiguration.getParameter<std::string>("@module_label");
779  edm::LogVerbatim("EventSetupSharing")
780  << "Sharing " << edmtype << ": class=" << modtype << " label='" << label << "'";
781  }
782 
783  } // namespace eventsetup
784 } // namespace edm
static void findDependents(const EventSetupRecordKey &iKey, Itr itBegin, Itr itEnd, std::vector< std::shared_ptr< EventSetupRecordProvider >> &oDependents)
Log< level::Info, true > LogVerbatim
std::set< EventSetupRecordKey > dependentRecords() const
Returns the list of Records the provided Record depends on (usually none)
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
propagate_const< std::shared_ptr< EventSetupImpl > > eventSetupImpl_
void add(std::shared_ptr< ESProductResolverProvider >)
void resetProxies()
This will clear the cache&#39;s of all the Proxies so that next time they are called they will run...
ret
prodAgent to be discontinued
std::unique_ptr< std::map< ParameterSetIDHolder, std::set< EventSetupRecordKey > > > psetIDToRecordKey_
bool isMatchingESSource(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
void addRecord(const EventSetupRecordKey &iKey)
Intended for use only in tests.
ESRecordsToProductResolverIndices recordsToResolverIndices() const
std::unique_ptr< std::map< EventSetupRecordKey, std::map< DataKey, ComponentDescription const * > > > referencedDataKeys_
void fillKeys(std::set< EventSetupRecordKey > &keys) const
constexpr std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
void addFinder(std::shared_ptr< EventSetupRecordIntervalFinder >)
For now, only use one finder.
void lookForMatches(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex, bool &firstProcessWithThisPSet, bool &precedingHasMatchingPSet) const
assert(be >=bs)
void finishConfiguration(NumberOfConcurrentIOVs const &, bool &hasNonconcurrentFinder)
std::map< ComponentDescription, RecordToDataMap > PreferredProviderInfo
void forceCacheClear()
Used when testing that all code properly updates on IOV changes of all Records.
RecordProviders::iterator Itr
ParameterSet & getESProducerPSet(ParameterSetID const &psetID, unsigned subProcessIndex)
char const * label
bool isLastMatch(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
std::shared_ptr< EventSetupRecordProvider > & recordProvider(const EventSetupRecordKey &iKey)
EventSetupRecordProvider * tryToGetRecordProvider(const EventSetupRecordKey &iKey)
bool doWeNeedToWaitForIOVsToFinish(IOVSyncValue const &) const
static void logInfoWhenSharing(ParameterSet const &iConfiguration)
void fillReferencedDataKeys(EventSetupRecordKey const &eventSetupRecordKey)
void fillRecordsNotAllowingConcurrentIOVs(std::set< EventSetupRecordKey > &recordsNotAllowingConcurrentIOVs) const
static void preferEverything(const ComponentDescription &iComponent, const RecordProviders &iRecordProviders, RecordToPreferred &iReturnValue)
find everything made by a ESProductResolverProvider and add it to the &#39;preferred&#39; list ...
std::unique_ptr< std::vector< std::shared_ptr< EventSetupRecordIntervalFinder > > > finders_
def unique(seq, keepstr=True)
Definition: tier0.py:24
bool isMatchingESProducer(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
ActivityRegistry const * activityRegistry_
std::unique_ptr< std::vector< std::shared_ptr< ESProductResolverProvider > > > dataProviders_
void fillReferencedDataKeys(std::map< DataKey, ComponentDescription const *> &referencedDataKeys) const
std::unique_ptr< PreferredProviderInfo > preferredProviderInfo_
std::shared_ptr< const EventSetupImpl > eventSetupForInstance(IOVSyncValue const &, bool &newEventSetupImpl)
void resetRecordPlusDependentRecords(EventSetupRecordKey const &)
Used when we need to force a Record to reset all its proxies.
d
Definition: ztail.py:151
Log< level::Info, false > LogInfo
std::unique_ptr< std::map< EventSetupRecordKey, std::vector< std::shared_ptr< EventSetupRecordIntervalFinder > > > > recordToFinders_
bool doRecordsMatch(EventSetupProvider &precedingESProvider, EventSetupRecordKey const &eventSetupRecordKey, std::map< EventSetupRecordKey, bool > &allComponentsMatch, EventSetupsController const &esController)
EventSetupProvider(ActivityRegistry const *, unsigned subProcessIndex=0U, PreferredProviderInfo const *iInfo=nullptr)
std::map< DataKey, ComponentDescription > DataToPreferredProviderMap
void setPreferredProviderInfo(PreferredProviderInfo const &iInfo)
void checkESProducerSharing(ModuleTypeResolverMaker const *resolverMaker, EventSetupProvider &precedingESProvider, std::set< ParameterSetIDHolder > &sharingCheckDone, std::map< EventSetupRecordKey, std::vector< ComponentDescription const *>> &referencedESProducers, EventSetupsController &esController)
void setAllValidityIntervals(const IOVSyncValue &iValue)
Set the validity intervals in all EventSetupRecordProviders.
bool isFirstMatch(ParameterSetID const &psetID, unsigned subProcessIndex, unsigned precedingProcessIndex) const
heterocontainer::HCTypeTag TypeTag
std::map< EventSetupRecordKey, EventSetupRecordProvider::DataToPreferredProviderMap > RecordToPreferred
HLT enums.
static ComponentFactory< T > const * get()
void add(std::shared_ptr< ESProductResolverProvider >)
numberOfConcurrentIOVs
Definition: options_cfi.py:14
std::unique_ptr< std::map< EventSetupRecordKey, std::map< DataKey, ComponentDescription > > > recordToPreferred_
void insert(EventSetupRecordKey const &, std::unique_ptr< EventSetupRecordProvider >)
std::unique_ptr< std::set< EventSetupRecordKey > > recordsWithALooperResolver_
std::set< ComponentDescription > resolverProviderDescriptions() const
std::set< ComponentDescription > resolverProviderDescriptions() const
return information on which ESProductResolverProviders are supplying information
void replaceExisting(std::shared_ptr< ESProductResolverProvider >)
PostESModuleRegistration postESModuleRegistrationSignal_
def move(src, dest)
Definition: eostools.py:511
std::shared_ptr< ESProductResolverProvider > resolverProvider(ComponentDescription const &)
returns the first matching ESProductResolverProvider or a &#39;null&#39; if not found
std::vector< std::shared_ptr< EventSetupRecordProvider > > RecordProviders
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