ATLAS Offline Software
Loading...
Searching...
No Matches
IOVDbSvc.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// IOVDbSvc.cxx
6// Re-implementation of Athena IOVDbSvc
7// Richard Hawkijngs, started 23/11/08
8// based on earlier code by RD Schaffer, Antoine Perus and RH
9
10#include "IOVDbParser.h"
11#include "IOVDbSvc.h"
12#include "CoralCrestManager.h"
13
14#include "Gaudi/Interfaces/IOptionsSvc.h"
15#include "GaudiKernel/GaudiException.h"
16#include "GaudiKernel/Guards.h"
17#include "GaudiKernel/IIncidentSvc.h"
18#include "GaudiKernel/IIoComponentMgr.h"
19#include "GaudiKernel/IOpaqueAddress.h"
20#include "GaudiKernel/IProperty.h"
21
24#include "DBLock/DBLock.h"
28
29#include <algorithm>
30#include <list>
31#include <ranges>
32#include <utility>
33
34#include "CrestApi/CrestLogger.h"
35
36namespace {
37
38// Wrap a cool IDatabase with a DBLock.
39class LockedDatabase
40 : public cool::IDatabase
41{
42public:
43 LockedDatabase (cool::IDatabasePtr dbptr,
44 const Athena::DBLock& dblock)
45 : m_dbptr (std::move(dbptr)), m_dblock (dblock) {}
46
47 virtual ~LockedDatabase() = default;
48
49 virtual const cool::DatabaseId& databaseId() const override
50 { return m_dbptr->databaseId(); }
51
52 virtual const cool::IRecord& databaseAttributes() const override
53 { return m_dbptr->databaseAttributes(); }
54
55 virtual cool::IFolderSetPtr createFolderSet
56 ( const std::string& fullPath,
57 const std::string& description = "",
58 bool createParents = false ) override
59 { return m_dbptr->createFolderSet (fullPath, description, createParents); }
60
61 virtual bool existsFolderSet( const std::string& folderSetName ) override
62 { return m_dbptr->existsFolderSet (folderSetName); }
63
64 virtual cool::IFolderSetPtr getFolderSet( const std::string& fullPath ) override
65 { return m_dbptr->getFolderSet (fullPath); }
66
67 virtual cool::IFolderPtr createFolder
68 ( const std::string& fullPath,
69 const cool::IFolderSpecification& folderSpec,
70 const std::string& description = "",
71 bool createParents = false ) override
72 { return m_dbptr->createFolder (fullPath, folderSpec, description, createParents); }
73
74 virtual bool existsFolder( const std::string& fullPath ) override
75 { return m_dbptr->existsFolder (fullPath); }
76
77 virtual cool::IFolderPtr getFolder( const std::string& fullPath ) override
78 { return m_dbptr->getFolder (fullPath); }
79
80 virtual const std::vector<std::string> listAllNodes( bool ascending = true ) override
81 { return m_dbptr->listAllNodes (ascending); }
82
83 virtual bool dropNode( const std::string& fullPath ) override
84 { return m_dbptr->dropNode (fullPath); }
85
86 virtual bool existsTag( const std::string& tagName ) const override
87 { return m_dbptr->existsTag (tagName); }
88
89 virtual cool::IHvsNode::Type tagNameScope( const std::string& tagName ) const override
90 { return m_dbptr->tagNameScope (tagName); }
91
92 virtual const std::vector<std::string>
93 taggedNodes( const std::string& tagName ) const override
94 { return m_dbptr->taggedNodes (tagName); }
95
96 virtual bool isOpen() const override
97 { return m_dbptr->isOpen(); }
98
99 virtual void openDatabase() override
100 { return m_dbptr->openDatabase(); }
101
102 virtual void closeDatabase() override
103 { return m_dbptr->closeDatabase(); }
104
105 virtual const std::string& databaseName() const override
106 { return m_dbptr->databaseName(); }
107
108#ifdef COOL400TX
110 virtual ITransactionPtr startTransaction() override
111 { return m_dbptr->startTransaction(); }
112#endif
113
114
115private:
116 cool::IDatabasePtr m_dbptr;
117 Athena::DBLock m_dblock;
118};
119
120} // anonymous namespace
121
122
124{
125 if( m_poolSvcContext < 0 ) {
126 // Get context for POOL conditions files, and created an initial connection
128 m_poolSvcContext=m_h_poolSvc->getInputContext("Conditions", m_par_maxNumPoolFiles);
129 } else {
130 m_poolSvcContext=m_h_poolSvc->getInputContext("Conditions");
131 }
132 if( m_h_poolSvc->connect(Io::READ, m_poolSvcContext).isSuccess() ) {
133 ATH_MSG_INFO( "Opened read transaction for POOL PersistencySvc");
134 } else {
135 // We only emit info for failure to connect (for the moment? RDS 01/2008)
136 ATH_MSG_INFO( "Cannot connect to POOL PersistencySvc" );
137 }
138 }
139 return m_poolSvcContext;
140}
141
142
144 // subscribe to events
145 ServiceHandle<IIncidentSvc> incSvc("IncidentSvc",name());
146 ATH_CHECK( incSvc.retrieve() );
147 const long int pri = 100;
148 incSvc->addListener( this, IncidentType::BeginEvent, pri );
149 incSvc->addListener( this, "StoreCleared", pri ); // for SP Athena
150 incSvc->addListener( this, IncidentType::EndProcessing, pri ); // for MT Athena
151
152 // Register this service for 'I/O' events
153 ServiceHandle<IIoComponentMgr> iomgr("IoComponentMgr", name());
154 ATH_CHECK( iomgr.retrieve() );
155 ATH_CHECK( iomgr->io_register(this) );
156
157 // print warnings/info depending on state of job options
159 ATH_MSG_INFO( "COOL connection management disabled - connections kept open throughout job" );
161 ATH_MSG_INFO( "POOL file connection management disabled - files kept open throught job" );
162 if (m_par_maxNumPoolFiles > 0)
163 ATH_MSG_INFO( "Only " << m_par_maxNumPoolFiles.value() << " POOL conditions files will be open at once" );
165 ATH_MSG_WARNING( "Global run/LB number forced to be [" <<
166 m_par_forceRunNumber.value() << "," << m_par_forceLumiblockNumber.value() << "]" );
167 if (m_par_forceTimestamp > 0)
168 ATH_MSG_WARNING( "Global timestamp forced to be " << m_par_forceTimestamp.value() );
169 if (m_par_cacheRun > 0)
170 ATH_MSG_INFO( "Run-LB data will be cached in groups of " << m_par_cacheRun.value() << " runs" );
171 if (m_par_cacheTime > 0)
172 ATH_MSG_INFO( "Timestamp data will be cached in groups of " << m_par_cacheTime.value() << " seconds" );
173 if (m_par_cacheAlign > 0)
174 ATH_MSG_INFO( "Cache alignment will be done in " << m_par_cacheAlign.value() << " slices" );
175 if (m_par_onlineMode)
176 ATH_MSG_INFO( "Online mode ignoring potential missing channels outside cache" );
177 if (m_par_checklock)
178 ATH_MSG_INFO( "Tags will be required to be locked");
179
180 if (m_par_source == "COOL_DATABASE") {
182 ATH_MSG_INFO("IOVDbSvc configured to use a COOL database");
183 } else if (m_par_source == "CREST") {
185 ATH_MSG_INFO("IOVDbSvc configured to use a CREST database");
186 }
187 else {
188 ATH_MSG_ERROR("Unexpected property value " << m_par_source << ", allowed values are \"COOL_DATABASE\" or \"CREST\"" );
189 return StatusCode::FAILURE;
190 }
191
192 // make sure iovTime is undefined
193 m_iovTime.reset();
194
195 // extract information from EventSelector for run/LB/time overrides
197
198 // initialise default connection
199 if (!m_par_defaultConnection.empty()) {
200 // default connection is readonly if no : in name (i.e. logical conn)
201 bool readonly=(m_par_defaultConnection.find(':')==std::string::npos);
202 m_connections.push_back(std::make_unique<IOVDbConn>(m_par_defaultConnection,readonly,msg()));
203 }
204
205 // set time of timestampslop in nanoseconds
206 m_iovslop=static_cast<cool::ValidityKey>(m_par_timeStampSlop*1.E9);
207
208 // check for global tag in jobopt, which will override anything in input file
209 if (!m_par_globalTag.empty()) {
211 ATH_MSG_INFO( "Global tag: " << m_par_globalTag.value() << " set from joboptions" );
212 }
213
214 // setup folders and process tag overrides
216
217 // Set state to initialize
219 ATH_MSG_INFO( "Initialised with " << m_connections.size() <<
220 " connections and " << m_foldermap.size() << " folders" );
221
222 if (m_outputToFile) ATH_MSG_INFO("Db dump to file activated");
223 if (m_crestCoolToFile) ATH_MSG_INFO("Crest or Cool dump to file activated");
224
225 ATH_MSG_INFO( "Service IOVDbSvc initialised successfully" );
226
228 return StatusCode::SUCCESS;
229}
230
231
233 ATH_MSG_DEBUG("I/O reinitialization...");
234 // PoolSvc clears all connections on IO_reinit - forget the stored contextId
235 m_poolSvcContext = -1;
236 return StatusCode::SUCCESS;
237}
238
239
241 ATH_MSG_DEBUG("I/O finalization...");
242 return StatusCode::SUCCESS;
243}
244
245
246StatusCode IOVDbSvc::finalize() {
247 // summarise and delete folders, adding total read from COOL
248 unsigned long long nread = 0;
249 float readtime = 0;
250
251 // accumulate a map of readtime by connection
252 std::map<IOVDbConn*, float> ctmap;
253 for (const auto & [name, folder] : m_foldermap) {
254 folder->summary();
255 nread += folder->bytesRead();
256 readtime += folder->readTime();
257 const auto& [citr, inserted] = ctmap.try_emplace(folder->conn(), 0);
258 citr->second += folder->readTime();
259 }
260 m_foldermap.clear();
261 ATH_MSG_INFO( "Total payload read from IOVDb: " << nread << " bytes in (( " << std::fixed << std::setw(9) << std::setprecision(2) <<
262 readtime << " ))s" );
263
264 // close and delete connections, printing time in each one
265 for (const auto & conn : m_connections) {
266 float fread = 0;
267 const auto citr = ctmap.find(conn.get());
268 if (citr != ctmap.end()) fread = citr->second;
269 conn->setInactive();
270 conn->summary(fread);
271 }
272 m_connections.clear();
273
274 return StatusCode::SUCCESS;
275}
276
277
278cool::IDatabasePtr IOVDbSvc::getDatabase(bool readOnly) {
279 // get default database connection
280 cool::IDatabasePtr dbconn;
281 if (m_par_defaultConnection.empty() || m_connections.empty()) {
282 ATH_MSG_INFO( "No default COOL database connection is available");
283 dbconn.reset();
284 } else {
285 Athena::DBLock dblock;
286 if (m_connections[0]->isReadOnly()!=readOnly) {
287 ATH_MSG_INFO("Changing state of default connection to readonly=" << readOnly );
288 m_connections[0]->setReadOnly(readOnly);
289 }
290 dbconn = std::make_shared<LockedDatabase> (m_connections[0]->getCoolDb(),
291 dblock);
292 }
293 return dbconn;
294}
295
296
298 // Read information for folders and setup TADs
299 if (storeID!=StoreID::DETECTOR_STORE) return StatusCode::SUCCESS;
300 // Preloading of addresses should be done ONLY for detector store
301 ATH_MSG_DEBUG( "preLoadAddress: storeID -> " << storeID );
302
303 Athena::DBLock dblock;
304
305 // check File Level Meta Data of input, see if any requested folders are available there
308 if (m_h_metaDataStore->retrieve(cont,contEnd).isSuccess()) {
309 unsigned int ncontainers=0;
310 unsigned int nused=0;
311 for (;cont!=contEnd; ++cont) {
312 ++ncontainers;
313 const std::string& fname=cont->folderName();
314 // check if this folder is in list requested by IOVDbSvc
315 for (const auto & [name, folder] : m_foldermap) {
316 // take data from FLMD only if tag override is NOT set
317 if (folder->folderName()==fname && !(folder->tagOverride())) {
318 ATH_MSG_INFO( "Folder " << fname << " will be taken from file metadata" );
319 folder->useFileMetaData();
320 folder->setFolderDescription( cont->folderDescription() );
321 ++nused;
322 break;
323 }
324 }
325 }
326 ATH_MSG_INFO( "Found " << ncontainers << " metadata containers in input file, " << nused << " will be used");
327 } else {
328 ATH_MSG_DEBUG( "Could not retrieve IOVMetaDataContainer objects from MetaDataStore" );
329 }
330
331 // Remove folders which should only be read from file meta data, but
332 // were not found in the MetaDataStore
333
334 // Note: we cannot iterate and perform erase within the iteration
335 // because the iterator becomes invalid. So first collect the keys
336 // to erase in a first pass and then erase them.
337 std::vector<std::string> keysToDelete;
338 for (const auto & [name, folder] : m_foldermap) {
339 if (folder->fromMetaDataOnly() && !folder->readMeta()) {
340 ATH_MSG_INFO( "preLoadAddresses: Removing folder " << folder->folderName() <<
341 ". It should only be in the file meta data and was not found." );
342 keysToDelete.push_back(name);
343 }
344 }
345
346 for (auto & thisKey : keysToDelete) {
347 const auto fitr = m_foldermap.find(thisKey);
348 if (fitr != m_foldermap.end()) {
349 fitr->second->conn()->decUsage();
350 m_foldermap.erase(fitr);
351 } else {
352 ATH_MSG_ERROR( "preLoadAddresses: Could not find folder " << thisKey << " for removal" );
353 }
354 }
355
356
357 // loop over all folders, grouped by connection
358 // do metadata folders on first connection (default connection)
359 bool doMeta=true;
360 // do not close COOL connection until next one has been opened, this enables
361 // connection sharing in CORAL, so all COOL connections will use the same
362 // CORAL one (althugh they will each be given a separate session)
363 IOVDbConn* oldconn=nullptr;
364 for (const auto & pThisConnection : m_connections) {
365 if (pThisConnection->nFolders()>0 || doMeta) {
366 // loop over all folders using this connection
367 for (const auto & [name, folder] : m_foldermap) {
368 if (folder->conn()==pThisConnection.get() || (folder->conn()==nullptr && doMeta)) {
369 std::unique_ptr<SG::TransientAddress> tad =
370 folder->preLoadFolder( &(*m_h_tagInfoMgr), m_par_cacheRun, m_par_cacheTime);
371 if (oldconn!=pThisConnection.get()) {
372 // close old connection if appropriate
373 if (m_par_manageConnections && oldconn!=nullptr) oldconn->setInactive();
374 oldconn=pThisConnection.get();
375 }
376 if (tad==nullptr) {
377 ATH_MSG_ERROR( "preLoadFolder failed for folder " << folder->folderName() );
378 return StatusCode::FAILURE;
379 }
380 // for write-metadata folder, request data preload
381 if (folder->writeMeta()) {
382 if (m_h_IOVSvc->preLoadDataTAD(tad.get(),folder->eventStore()).isFailure()) {
383 ATH_MSG_ERROR( "Could not request IOVSvc to preload metadata for " << folder->folderName() );
384 return StatusCode::FAILURE;
385 }
386 } else {
387 // for other folders, just preload TAD (not data)
388 if (m_h_IOVSvc->preLoadTAD(tad.get(), folder->eventStore()).isFailure()) {
389 ATH_MSG_ERROR( "Could not request IOVSvc to preload metadata for " << folder->folderName() );
390 return StatusCode::FAILURE;
391 }
392 }
393 // Add TAD to Storegate
394 tlist.push_back(tad.release());
395 // check for IOV override
397 }
398 }
399 }
400 doMeta=false;
401 }
402 // close last connection
403 if (oldconn!=nullptr and m_par_manageConnections) oldconn->setInactive();
404
405 // some folder keys may have changed during preloadFolder due to use of
406 // <key> specification in folder description string
407 // build a new foldermap with the updated keys
408 FolderMap newmap;
409 for (auto & [name, folder] : m_foldermap) {
410 newmap[folder->key()]=std::move(folder);
411 }
412 m_foldermap=std::move(newmap);
413
414 // fill global and explicit folder tags into TagInfo
415 if (fillTagInfo().isFailure())
416 ATH_MSG_ERROR("Could not fill TagInfo object from preLoadAddresses" );
417
418 return StatusCode::SUCCESS;
419}
420
421
422StatusCode IOVDbSvc::loadAddresses(StoreID::type /*storeID*/, tadList& /*list*/ ) {
423 // this method does nothing
424 return StatusCode::SUCCESS;
425}
426
427
429 const EventContext& /*ctx*/)
430{
431 // Provide TAD and associated range, actually reading the conditions data
432
433 // Read information for folders and setup TADs
434 if (storeID!=StoreID::DETECTOR_STORE) return StatusCode::FAILURE;
435 Gaudi::Guards::AuditorGuard auditor(std::string("UpdateAddr::")+(tad->name().empty() ? "anonymous" : tad->name()),
436 auditorSvc(), "preLoadProxy");
437
438 IOVTime iovTime{m_iovTime};
439 IOVRange range;
440 std::unique_ptr<IOpaqueAddress> address;
441
442 // first check if this key is managed by IOVDbSvc
443 // return FAILURE if not - this allows other AddressProviders to be
444 // asked for the TAD
445 const std::string& key=tad->name();
446 const auto fitr=m_foldermap.find(key);
447 if (fitr==m_foldermap.end()) {
449 "updateAddress cannot find description for TAD " << key );
450 return StatusCode::FAILURE;
451 }
452 const auto& folder=fitr->second;
453 if (folder->clid()!=tad->clID()) {
454 ATH_MSG_VERBOSE( "CLID for TAD " << key << " is " << tad->clID()
455 << " but expecting " << folder->clid() );
456
457 return StatusCode::FAILURE;
458 }
459
460 // IOVDbSvc will satisfy the request, using already found folder
461 // now determine the current IOVTime
462 if (m_state==IOVDbSvc::INITIALIZATION && !m_iovTime.isValid()) {
463 ATH_MSG_DEBUG( "updateAddress: in initialisation phase and no iovTime defined" );
464 return::StatusCode::SUCCESS;
465 }
467 // determine iovTime from eventID in the event context
468 const EventIDBase* evid = EventIDFromStore( m_h_sgSvc );
469 if( evid ) {
470 iovTime.setRunEvent( evid->run_number(), evid->lumi_block()) ;
471 // save both seconds and ns offset for timestamp
472 uint64_t nsTime = evid->time_stamp() *1000000000LL;
473 nsTime += evid->time_stamp_ns_offset();
474 iovTime.setTimestamp(nsTime);
475 m_iovTime = iovTime;
476 ATH_MSG_DEBUG( "updateAddress - using iovTime from EventInfo: " << iovTime);
477 } else {
478 // failed to get event info - just return success
479 ATH_MSG_DEBUG( "Could not get event - initialise phase");
480 return StatusCode::SUCCESS;
481 }
482 } else {
483 ATH_MSG_DEBUG("updateAddress: using iovTime from init/beginRun: " << iovTime);
484 }
485
486
487
488 // obtain the validity key for this folder (includes overrides)
489 cool::ValidityKey vkey=folder->iovTime(iovTime);
490 {
491 // The dblock is currently abused to also protect the cache in the IOVDbFolders.
492 // This global lock may give rise to deadlocks between the dblock and the internal lock
493 // of the SGImplSvc. The deadlock may arise if the order of the initial call to IOVDbSvc
494 // and SGImplSvc are different, because the two services call each other.
495 // A problem was observed when SG::DataProxy::isValidAddress first called IOVDbSvc::updateAddress
496 // which called IOVSvc::setRange then SGImplSvc::proxy, and at the same time
497 // StoreGateSvc::contains called first SGImplSvc::proxy which then called IOVDbSvc::updateAddress.
498 // This problem is mitigated by limiting the scope of the dblock here.
499 Athena::DBLock dblock;
500 ATH_MSG_DEBUG("Validity key "<<vkey);
501 if (folder->source() == IOVDbFolder::source_t::CRESTDB) {
502 if (!folder->readMeta() && !folder->cacheValid((vkey))){
503 fitr->second->loadCache(vkey, m_par_cacheAlign,m_globalTag,m_par_onlineMode);
504 }
505 } else { //COOL reading
506 if (!folder->readMeta() && !folder->cacheValid(vkey)) {
507 // mark this folder as not-dropped so cache-read will succeed
508 folder->setDropped(false);
509 // reload cache for this folder (and all others sharing this DB connection)
510 ATH_MSG_DEBUG( "Triggering cache load for folder " << folder->folderName());
511 if (loadCaches(folder->conn()).isFailure()) {
512 ATH_MSG_ERROR( "Cache load failed for at least one folder from " << folder->conn()->name()
513 << ". You may see errors from other folders sharing the same connection." );
514 return StatusCode::FAILURE;
515 }
516 }
517 }//end cool part
518 // data should now be in cache
519 // setup address and range
520 {
521 Gaudi::Guards::AuditorGuard auditor(std::string("FldrSetup:")+(tad->name().empty() ? "anonymous" : tad->name()),
522 auditorSvc(), "preLoadProxy");
523 if (!folder->getAddress(vkey,&(*m_h_persSvc),poolSvcContext(),address,
524 range,m_poolPayloadRequested)) {
525 ATH_MSG_ERROR( "getAddress failed for folder " << folder->folderName() );
526 return StatusCode::FAILURE;
527 }
528 }
529 // reduce minimum IOV of timestamp folders to avoid 'thrashing'
530 // due to events slightly out of order in HLT
531 if (folder->timeStamp()) {
532 cool::ValidityKey start=range.start().timestamp();
533 if (start>m_iovslop) start-=m_iovslop;
534 range=IOVRange(IOVTime(start),range.stop());
535 }
536 }
537
538 // Pass range onto IOVSvc
539 if (m_h_IOVSvc->setRange(tad->clID(),tad->name(),
540 range,folder->eventStore()).isFailure()) {
541 ATH_MSG_ERROR( "setRange failed for folder " << folder->folderName() );
542 return StatusCode::FAILURE;
543 }
544 tad->setAddress(address.release());
545 return StatusCode::SUCCESS;
546}
547
548
549StatusCode IOVDbSvc::getRange( const CLID& clid,
550 const std::string& dbKey,
551 const IOVTime& time,
552 IOVRange& range,
553 std::string& tag,
554 std::unique_ptr<IOpaqueAddress>& address) {
555
556 Athena::DBLock dblock;
557
558 ATH_MSG_DEBUG( "getRange clid: " << clid << " key: \""<< dbKey << "\" t: " << time );
559
560 const auto fitr = m_foldermap.find(dbKey);
561 if (fitr==m_foldermap.end()) {
562 ATH_MSG_VERBOSE("getRange cannot find description for dbKey " << dbKey );
563 return StatusCode::FAILURE;
564 }
565 const auto& folder = fitr->second;
566 if (folder->clid()!=clid) {
567 ATH_MSG_VERBOSE( "supplied CLID for " << dbKey << " is "
568 << clid
569 << " but expecting " << folder->clid() );
570
571 return StatusCode::FAILURE;
572 }
573
574 tag = folder->key();
575
576 // obtain the validity key for this folder (includes overrides)
577 cool::ValidityKey vkey = folder->iovTime(time);
578 if (folder->source() == IOVDbFolder::source_t::CRESTDB) {
579 if (!folder->readMeta() && !folder->cacheValid((vkey))){
580 fitr->second->loadCache(vkey, m_par_cacheAlign,m_globalTag,m_par_onlineMode);
581 }
582 } else {
583 if (!folder->readMeta() && !folder->cacheValid(vkey)) {
584 // mark this folder as not-dropped so cache-read will succeed
585 folder->setDropped(false);
586 // reload cache for this folder (and all others sharing this DB
587 // connection)
588 ATH_MSG_DEBUG("Triggering cache load for folder " << folder->folderName());
589 if (loadCaches(folder->conn(), &time).isFailure()) {
590 ATH_MSG_ERROR("Cache load failed for at least one folder from " << folder->conn()->name()
591 << ". You may see errors from other folders sharing the "
592 "same connection.");
593 return StatusCode::FAILURE;
594 }
595 }
596 }
597 // data should now be in cache
598 address.reset();
599 // setup address and range
600 {
601 Gaudi::Guards::AuditorGuard auditor(std::string("FldrSetup:")+(dbKey.empty() ? "anonymous" : dbKey),
602 auditorSvc(), "preLoadProxy");
603 if (!folder->getAddress(vkey,&(*m_h_persSvc),poolSvcContext(),address,
604 range,m_poolPayloadRequested)) {
605 ATH_MSG_ERROR("getAddress failed for folder " <<folder->folderName() );
606 return StatusCode::FAILURE;
607 }
608 }
609
610 // Special handling for extensible folders:
611 if (folder->extensible()) {
612 // Set the end time to just past the current event or lumiblock.
613 IOVTime extStop = range.stop();
614 if (folder->timeStamp()) {
615 extStop.setTimestamp (time.timestamp() + 1);
616 }
617 else {
618 extStop.setRETime (time.re_time() + 1);
619 }
620 range = IOVRange (range.start(), extStop);
621 }
622
623 // Special handling for IOV override: set the infinite validity range
624 if (folder->iovOverridden()) {
625 if (folder->timeStamp()) {
628 }
629 else {
632 }
633 }
634
635 return StatusCode::SUCCESS;
636}
637
638
639StatusCode IOVDbSvc::setRange( const CLID& /*clid*/,
640 const std::string& /*dbKey*/,
641 const IOVRange& /*range*/,
642 const std::string& /*storeName*/ ) {
643 // this method does nothing
644 return StatusCode::SUCCESS;
645}
646
647
648StatusCode IOVDbSvc::signalBeginRun(const IOVTime& beginRunTime,
649 const EventContext& ctx)
650{
651 Athena::DBLock dblock;
652
653 // Begin run - set state and save time for later use
655 // Is this a different run compared to the previous call?
656 bool newRun = m_iovTime.isValid() && (m_iovTime.run() != beginRunTime.run());
657 m_iovTime=beginRunTime;
658 // For a MC event, the run number we need to use to look up the conditions
659 // may be different from that of the event itself. Override the run
660 // number with the conditions run number from the event context,
661 // if it is defined.
662 EventIDBase::number_type conditionsRun =
664 if (conditionsRun != EventIDBase::UNDEFNUM) {
665 m_iovTime.setRunEvent (conditionsRun, m_iovTime.event());
666 }
667
668 ATH_MSG_DEBUG( "signalBeginRun> begin run time " << m_iovTime);
669 if (!m_par_onlineMode) {
670 return StatusCode::SUCCESS;
671 }
672
673 // ONLINE mode: allow adding of new calibration constants between runs
674 if (!newRun) {
675 ATH_MSG_DEBUG( "Same run as previous signalBeginRun call. Skipping re-loading of folders..." );
676 return StatusCode::SUCCESS;
677 }
678
679 // all other stuff is event based so happens after this.
680 // this is before first event of each run
681 ATH_MSG_DEBUG( "In online mode will recheck ... " );
682 ATH_MSG_DEBUG( "First reload PoolCataloge ... " );
683 m_h_poolSvc->startCatalog();
684 m_h_poolSvc->commitCatalog();
685 static const std::string preLoadProxyStr{"preLoadProxy"};
686 for (const auto & pThisConnection : m_connections){
687 // only access connections which are actually in use - avoids waking up
688 // the default DB connection if it is not being used
689 if (pThisConnection->nFolders()>0) {
690 //request for database activates connection
691 cool::IDatabasePtr dbconn=pThisConnection->getCoolDb();
692 if (dbconn.get()==nullptr) {
693 ATH_MSG_FATAL( "Conditions database connection " << pThisConnection->name() << " cannot be opened - STOP" );
694 return StatusCode::FAILURE;
695 }
696 for (const auto & [name, folder]: m_foldermap) {
697 if (folder->conn()!=pThisConnection.get()) continue;
698 folder->printCache();
699 cool::ValidityKey vkey=folder->iovTime(m_iovTime);
700 {
701 Gaudi::Guards::AuditorGuard auditor(std::string("FldrCache:")+folder->folderName(), auditorSvc(), preLoadProxyStr);
702 if (!folder->loadCacheIfDbChanged(vkey, m_globalTag, dbconn, m_h_IOVSvc)) {
703 ATH_MSG_ERROR( "Problem RELOADING: " << folder->folderName());
704 return StatusCode::FAILURE;
705 }
706 }
707 folder->printCache();
708 }
709 }
710 if (m_par_manageConnections) pThisConnection->setInactive();
711 }
712 return StatusCode::SUCCESS;
713}
714
715
717 // this method does nothing
718}
719
720
722 // Close any open POOL files after loding Conditions
723 ATH_MSG_DEBUG( "postConditionsLoad: m_par_managePoolConnections=" << m_par_managePoolConnections
724 << " m_poolPayloadRequested=" << m_poolPayloadRequested );
725
727 // reset POOL connection to close all open conditions POOL files
730 if( m_poolSvcContext ) {
731 if (m_h_poolSvc->disconnect(m_poolSvcContext).isSuccess()) {
732 ATH_MSG_DEBUG( "Successfully closed input POOL connections");
733 } else {
734 ATH_MSG_WARNING( "Unable to close input POOL connections" );
735 }
736 // reopen transaction
737 if (m_h_poolSvc->connect(Io::READ, m_poolSvcContext).isSuccess()) {
738 ATH_MSG_DEBUG("Reopend read transaction for POOL conditions input files" );
739 } else {
740 ATH_MSG_WARNING("Cannot reopen read transaction for POOL conditions input files");
741 }
742 }
743 }
744}
745
746
747void IOVDbSvc::handle( const Incident& inc) {
748 // Handle incidents:
749 // BeginEvent to set IOVDbSvc state to EVENT_LOOP
750 // StoreCleared/EndProcessing to close any open POOL files
751 ATH_MSG_VERBOSE( "entering handle(), incident type " << inc.type() << " from " << inc.source() );
752 if (inc.type()=="BeginEvent") {
754 } else {
755 Athena::DBLock dblock;
756
757 const StoreClearedIncident* sinc = dynamic_cast<const StoreClearedIncident*>(&inc);
758 if( (inc.type()=="StoreCleared" && sinc!=nullptr && sinc->store()==&*m_h_sgSvc
760 or inc.type()==IncidentType::EndProcessing )
761 {
764 }
765 }
766}
767
768
770 // Processing of taginfo
771 // Set GlobalTag and any folder-specific overrides if given
772
773 // dump out contents of TagInfo
774 ATH_MSG_DEBUG( "Tags from input TagInfo:");
775 if( msg().level()>=MSG::DEBUG ) m_h_tagInfoMgr->printTags(msg());
776
777 // check IOVDbSvc GlobalTag, if not already set
778 if (m_globalTag.empty()) {
779 m_globalTag = m_h_tagInfoMgr->findTag("IOVDbGlobalTag");
780 if (!m_globalTag.empty()) ATH_MSG_INFO( "Global tag: " << m_globalTag<< " set from input file" );
782 }
783
784 // now check for tag overrides for specific folders
785 const ITagInfoMgr::NameTagPairVec& nameTagPairs = m_h_tagInfoMgr->getInputTags();
786 for (const auto & [theTagName, theTag]: nameTagPairs) {
787 // assume tags relating to conditions folders start with /
788 if (not theTagName.starts_with('/')) continue;
789 // check for folder(s) with this name in (key, ptr) pair
790 for (const auto & [name, folder]: m_foldermap) {
791 const std::string& ifname=folder->folderName();
792 if (ifname!=theTagName) continue;
793 // use an override from TagInfo only if there is not an explicit jo tag,
794 // and folder meta-data is not used, and there is no <noover/> spec,
795 // and no global tag set in job options
796 if (folder->joTag().empty() && !folder->readMeta() && !folder->noOverride() && m_par_globalTag.empty()) {
797 folder->setTagOverride(theTag,false);
798 ATH_MSG_INFO( "TagInfo override for tag " << theTag << " in folder " << ifname );
799 } else if (folder->joTag()!=theTag) {
800 const std::string_view tagTypeString=(folder->joTag().empty()) ? "hierarchical" : "jobOption";
801 ATH_MSG_INFO( "Ignoring inputfile TagInfo request for tag " << theTag << " in folder " << ifname<<" in favour of "<<tagTypeString);
802 }
803 }
804 }
805 return StatusCode::SUCCESS;
806}
807
808
809std::vector<std::string>
811 // return a list of all the StoreGate keys being managed by IOVDbSvc
812 auto keys = std::views::keys(m_foldermap);
813 return {keys.begin(), keys.end()};
814}
815
816
817bool IOVDbSvc::getKeyInfo(const std::string& key, IIOVDbSvc::KeyInfo& info) {
818 // return information about given SG key
819 // first attempt to find the folder object for this key
820 const auto itr = m_foldermap.find(key);
821 if (itr!=m_foldermap.end()) {
822 const IOVDbFolder* f = itr->second.get();
823 info.folderName = f->folderName();
824 info.tag = f->resolvedTag();
825 info.range = f->currentRange();
826 info.retrieved = f->retrieved();
827 info.bytesRead = f->bytesRead();
828 info.readTime = f->readTime();
829 info.extensible = f->extensible();
830 return true;
831 } else {
832 info.retrieved = false;
833 return false;
834 }
835}
836
837
838bool IOVDbSvc::dropObject(const std::string& key, const bool resetCache) {
839 // find the folder corresponding to this object
840 const auto itr = m_foldermap.find(key);
841 if (itr!=m_foldermap.end()) {
842 IOVDbFolder* folder=itr->second.get();
843 CLID clid=folder->clid();
844 SG::DataProxy* proxy=m_h_detStore->proxy(clid,key);
845 if (proxy!=nullptr) {
846 m_h_detStore->clearProxyPayload(proxy);
847 ATH_MSG_DEBUG("Dropped payload for key " << key );
848 folder->setDropped(true);
849 if (resetCache) {
850 folder->resetCache();
851 ATH_MSG_DEBUG( "Cache reset done for folder " << folder->folderName() );
852 }
853 return true;
854 } else {
855 return false;
856 }
857 } else {
858 return false;
859 }
860}
861
862
863/************************/
864// private methods of IOVDbSvc
865
867 // check if EventSelector is being used to override run numbers
868 // if so, we can set IOV time already to allow conditons retrieval
869 // in the initialise phase, needed for setting up simulation
870
871 ServiceHandle<Gaudi::Interfaces::IOptionsSvc> joSvc("JobOptionsSvc",name());
872 ATH_CHECK( joSvc.retrieve() );
873
874 if (!joSvc->has("EventSelector.OverrideRunNumber")) {
875 // do not return FAILURE if the EventSelector cannot be found, or it has
876 // no override property, can e.g. happen in online running
877 ATH_MSG_DEBUG( "No EventSelector.OverrideRunNumber property found" );
878 return StatusCode::SUCCESS;
879 }
880
881 BooleanProperty overrideRunNumber("OverrideRunNumber",false);
882 ATH_CHECK( overrideRunNumber.fromString(joSvc->get("EventSelector.OverrideRunNumber")) );
883 if (overrideRunNumber) {
884 // if flag is set, extract Run,LB and time
885 ATH_MSG_INFO( "Setting run/LB/time from EventSelector override in initialize" );
886 uint32_t run,lumib;
887 uint64_t time;
888 bool allGood=true;
890 ATH_MSG_WARNING( "forceRunNumber property also set" );
891 }
892 IntegerProperty iprop1("RunNumber",0);
893 if (iprop1.fromString(joSvc->get("EventSelector.RunNumber","INVALID"))) {
894 run=iprop1;
895 } else {
896 ATH_MSG_ERROR( "Unable to get RunNumber from EventSelector");
897 allGood=false;
898 }
899 IntegerProperty iprop2("FirstLB",0);
900 if (iprop2.fromString(joSvc->get("EventSelector.FirstLB","INVALID"))) {
901 lumib=iprop2;
902 } else {
903 ATH_MSG_ERROR( "Unable to get FirstLB from EventSelector");
904 allGood=false;
905 }
906 IntegerProperty iprop3("InitialTimeStamp",0);
907 if (iprop3.fromString(joSvc->get("EventSelector.InitialTimeStamp","INVALID"))) {
908 time=iprop3;
909 } else {
910 ATH_MSG_ERROR("Unable to get InitialTimeStamp from EventSelector" );
911 allGood=false;
912 }
913 if (allGood) {
914 m_iovTime.setRunEvent(run,lumib);
915 uint64_t nsTime=time*1000000000LL;
916 m_iovTime.setTimestamp(nsTime);
917 ATH_MSG_INFO( "run/LB/time set to [" << run << "," << lumib << " : " << nsTime << "]" );
918 } else {
919 ATH_MSG_ERROR( "run/LB/Time NOT changed" );
920 }
921 }
922
923 return StatusCode::SUCCESS;
924}
925
926
928 // read the Folders joboptions and setup the folder list
929 // no wildcards are allowed
930
931 // getting the pairs: folder name - CREST tag name:
933 auto mLevel = static_cast<std::underlying_type_t<MSG::Level>>(msg().level());
934 Crest::LogLevel cLevel = static_cast<Crest::LogLevel>(mLevel);
935 Crest::Logger::setLogLevel(cLevel);
936 m_cresttagmap.clear();
938 if (m_cresttagmap.empty()) {
939 ATH_MSG_FATAL("Got empty tag-map. GlobalTag "<< m_par_globalTag.value() << " does not exist.");
940 return StatusCode::FAILURE;
941 }
942 }
943
944 //1. Loop through folders
945 std::list<IOVDbParser> allFolderdata;
946 for (const auto & thisFolder : m_par_folders) {
947 ATH_MSG_DEBUG( "Setup folder " << thisFolder );
948 IOVDbParser folderdata(thisFolder,msg());
949 if (!folderdata.isValid()) {
950 ATH_MSG_FATAL("setupFolders: Folder setup string is invalid: " <<thisFolder);
951 return StatusCode::FAILURE;
952 }
953
954 allFolderdata.push_back(std::move(folderdata));
955 }
956
957 //2. Loop through overwrites:
958 // syntax for entries is <prefix>folderpath</prefix> <tag>value</tag>
959 // folderpath matches from left of folderName
960 // but if partial match, next character must be / so override for /Fred/Ji
961 // matches /Fred/Ji/A and /Fred/Ji but not /Fred/Jim
962
963 for (const auto & thisOverrideTag : m_par_overrideTags) {
964 IOVDbParser keys(thisOverrideTag,msg());
965 if (not keys.isValid()){
966 ATH_MSG_ERROR("An override tag was invalid: " << thisOverrideTag);
967 return StatusCode::FAILURE;
968 }
969 std::string prefix;
970 if (!keys.getKey("prefix","",prefix)) { // || !keys.getKey("tag","",tag)) {
971 ATH_MSG_ERROR( "Problem in overrideTag specification " <<thisOverrideTag );
972 return StatusCode::FAILURE;
973 }
974
975 for (auto& folderdata : allFolderdata) {
976 const std::string& ifname=folderdata.folderName();
977 if (ifname.starts_with(prefix) &&
978 (ifname.size()==prefix.size() || ifname[prefix.size()]=='/')) {
979 //Match!
980 folderdata.applyOverrides(keys,msg());
981 }
982 }
983 }
984
985 //3. Remove any duplicates:
986 std::list<IOVDbParser>::iterator it1=allFolderdata.begin();
987 std::list<IOVDbParser>::iterator it_e=allFolderdata.end();
988 for (;it1!=it_e;++it1) {
989 const IOVDbParser& folder1=*it1;
990 std::list<IOVDbParser>::iterator it2=it1;
991 ++it2;
992 while(it2!=it_e) {
993 const IOVDbParser& folder2=*it2;
994 if (folder1==folder2) {
995 it2=allFolderdata.erase(it2); //FIXME: Smarter distinction/reporting about same folder but different keys.
996 ATH_MSG_DEBUG( "Removing duplicate folder " << folder1.folderName());
997 } else {
998 ++it2;
999 //Catch suspicous cases:
1000 if (folder1.folderName()==folder2.folderName()) {
1001 ATH_MSG_WARNING( "Folder name appears twice: " << folder1.folderName() );
1002 ATH_MSG_WARNING( folder1 << " vs " << folder2 );
1003 }
1004 }
1005 }//end inner loop
1006 }//end outer loop
1007
1008 //4.Set up folder map with cleaned folder list
1009
1010 bool crestError=false;
1011 for (const auto& folderdata : allFolderdata) {
1012 // find the connection specification first
1013 // default is to use the 'default' connection
1014 IOVDbConn* conn=nullptr;
1015 std::string connstr;
1016 if (folderdata.getKey("db","",connstr)) {
1017 // an explicit database name is specified
1018 // check if it is already present in the existing connections
1019 for (const auto & pThisConnection : m_connections) {
1020 if (pThisConnection->name()==connstr) {
1021 // found existing connection - use that
1022 conn=pThisConnection.get();
1023 break;
1024 }
1025 }
1026 if (conn==nullptr) {
1027 // create new read-onlyconnection
1028 conn = m_connections.emplace_back(std::make_unique<IOVDbConn>(connstr,true,msg())).get();
1029 }
1030 } else {
1031 // no connection specified - use default if available
1032 if (!m_par_defaultConnection.empty()) {
1033 conn=m_connections[0].get();
1034 } else {
1035 ATH_MSG_FATAL( "Folder request " << folderdata.folderName() <<
1036 " gives no DB connection information and no default set" );
1037 return StatusCode::FAILURE;
1038 }
1039 }
1040
1041 // create the new folder, but only if a folder for this SG key has not
1042 // already been requested
1043
1044 std::string crestTag;
1046 crestTag = m_cresttagmap[folderdata.folderName()];
1047 if(crestTag.empty() && folderdata.folderName() != "/TagInfo") {
1048 ATH_MSG_FATAL( "GlobalTag "<< m_par_globalTag.value() << " does not contain folder "
1049 << folderdata.folderName());
1050 crestError=true;
1051 continue;
1052 }
1053 }
1054
1055 auto folder=std::make_unique<IOVDbFolder>(conn,folderdata,msg(),&(*m_h_clidSvc), &(*m_h_metaDataTool),
1058 const std::string& key=folder->key();
1059 if (m_foldermap.find(key)==m_foldermap.end()) { //This check is too weak. For POOL-based folders, the SG key is in the folder description (not known at this point).
1060 m_foldermap[key]=std::move(folder);
1061 conn->incUsage();
1062 } else {
1063 ATH_MSG_ERROR( "Duplicate request for folder " <<
1064 folder->folderName() <<
1065 " associated to already requested Storegate key " << key );
1066 // clean up this duplicate request
1067 }
1068 }// end loop over folders
1069
1070 if(crestError)
1071 return StatusCode::FAILURE;
1072
1073 // check for folders to be written to metadata
1074 for (const auto & folderToWrite : m_par_foldersToWrite) {
1075 // match wildcard * at end of string only (i.e. /A/* matches /A/B, /A/C/D)
1076 std::string_view match=folderToWrite;
1077 std::string::size_type idx=folderToWrite.find('*');
1078 if (idx!=std::string::npos) {
1079 match=std::string_view(folderToWrite).substr(0,idx);
1080 }
1081 for (const auto & [name, folder] : m_foldermap) {
1082 if (folder->folderName().starts_with(match)) {
1083 folder->setWriteMeta();
1084 ATH_MSG_INFO( "Folder " << folder->folderName() << " will be written to file metadata" );
1085 }
1086 }//end loop over FolderMap
1087 }//end loop over m_par_foldersToWrite
1088 return StatusCode::SUCCESS;
1089}
1090
1091
1093 if (!m_par_globalTag.empty()) {
1094 ATH_MSG_DEBUG( "Adding GlobalTag " << m_par_globalTag << " into TagInfo" );
1095 ATH_CHECK( m_h_tagInfoMgr->addTag("IOVDbGlobalTag",m_par_globalTag) );
1096 }
1097 // add all explicit tags specified in folders
1098 // can be from Folders or tagOverrides properties
1099 for (const auto & [name, folder] : m_foldermap) {
1100 if (!folder->joTag().empty()) {
1101 ATH_MSG_DEBUG( "Adding folder " << folder->folderName() <<" tag " << folder->joTag() << " into TagInfo" );
1102 if (m_h_tagInfoMgr->addTag(folder->folderName(),folder->joTag()).isFailure())
1103 return StatusCode::FAILURE;
1104 }
1105 // check to see if any input TagInfo folder overrides should be removed
1106 // this anticipates the decisions which will be made in processTagInfo
1107 // Here we do not have access to the TagInfo object, but can put remove
1108 // requests in for all folders if the global tag is set, or if there is
1109 // an explict joboption tag, nooverride spec, or data comes from metadata
1110 if (!m_par_globalTag.empty() || !folder->joTag().empty() || folder->noOverride() ||
1111 folder->readMeta()) {
1112 if (m_h_tagInfoMgr->removeTagFromInput(folder->folderName()).isFailure()) {
1113 ATH_MSG_WARNING( "Could not add TagInfo remove request for "
1114 << folder->folderName() );
1115 } else {
1116 ATH_MSG_INFO( "Added taginfo remove for " << folder->folderName() );
1117 }
1118 }
1119 }
1120 return StatusCode::SUCCESS;
1121}
1122
1123
1124StatusCode IOVDbSvc::loadCaches(IOVDbConn* conn, const IOVTime* time) {
1125 // load the caches for all folders using the given connection
1126 // so connection use is optimised
1127
1128 Gaudi::Guards::AuditorGuard auditor(std::string("loadCachesOverhead:")+conn->name(), auditorSvc(), "preLoadProxy");
1129
1130 ATH_MSG_DEBUG( "loadCaches: Begin for connection " << conn->name());
1131 // if global abort already set, load nothing
1132 if (m_abort) return StatusCode::FAILURE;
1133 bool access=false;
1134 StatusCode sc=StatusCode::SUCCESS;
1135 for (const auto & [name, folder] : m_foldermap) {
1136 if (folder->conn()!=conn) continue;
1137 cool::ValidityKey vkey=folder->iovTime(time==nullptr ? m_iovTime : *time);
1138 // protect against out of range times (timestamp -1 happened in FDR2)
1139 if (vkey>cool::ValidityKeyMax) {
1140 ATH_MSG_WARNING( "Requested validity key " << vkey << " is out of range, reset to 0" );
1141 vkey=0;
1142 }
1143 if (!folder->cacheValid(vkey) && !folder->dropped()) {
1144 access=true;
1145 {
1146 Gaudi::Guards::AuditorGuard auditor(std::string("FldrCache:")+folder->folderName(), auditorSvc(), "preLoadProxy");
1147 if (!folder->loadCache(vkey,m_par_cacheAlign,m_globalTag,m_par_onlineMode)) {
1148 ATH_MSG_ERROR( "Cache load (prefetch) failed for folder " << folder->folderName() );
1149 // remember the failure, but also load other folders on this connection
1150 // while it is open
1151 sc=StatusCode::FAILURE;
1152 }
1153 }
1154 }
1155 }
1156 // disconnect from database if we connected
1157 if (access && m_par_manageConnections) conn->setInactive();
1158 // if connection aborted, set overall abort so we do not waste time trying
1159 // to read data from other schema
1160 if (conn->aborted()) {
1161 m_abort=true;
1162 throw GaudiException("Connection " + conn->name() + " was aborted",
1163 "IOVDbSvc::loadCache()", StatusCode::FAILURE);
1164 }
1165 return sc;
1166}
1167
1168
1170 // check consistency of global tag and database instance, if set
1171 // catch most common user misconfigurations
1172 // this is only done here as need global tag to be set even if read from file
1173 // @TODO should this not be done during initialize
1174
1175 if (!m_par_dbinst.empty() && !m_globalTag.empty() && m_source!=IOVDbFolder::source_t::CRESTDB) {
1176 const std::string_view tagstub = std::string_view(m_globalTag).substr(0,7);
1177 ATH_MSG_DEBUG( "Checking " << m_par_dbinst << " against " <<tagstub );
1178
1179 if ( ((m_par_dbinst=="COMP200" || m_par_dbinst=="CONDBR2") &&
1180 (tagstub!="COMCOND" && tagstub!="CONDBR2")) ||
1181 (m_par_dbinst=="OFLP200" && (tagstub!="OFLCOND" && tagstub!="CMCCOND")) ) {
1182
1183 ATH_MSG_FATAL( "Likely incorrect conditions DB configuration! " <<
1184 "Attached to database instance " << m_par_dbinst <<
1185 " but global tag begins " << tagstub );
1186 ATH_MSG_FATAL( "See Atlas/CoolTroubles wiki for details,"
1187 " or set IOVDbSvc.DBInstance=\"\" to disable check" );
1188 return StatusCode::FAILURE;
1189 }
1190 }
1191 return StatusCode::SUCCESS;
1192}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
Header for CoralCrestManager class.
Common database lock.
const EventIDBase * EventIDFromStore(IProxyDict *store)
Retrieve the EventID from EventContext saved in store STORE.
uint32_t CLID
The Class ID type.
Athena service for Interval Of Validity database.
This class is a container for conditions data.
Validity Range object.
static Double_t sc
Incident sent after a store is cleared.
static const Attributes_t empty
Define macros for attributes used to control the static checker.
Common database lock.
Definition DBLock.h:46
EventIDBase::number_type conditionsRun() const
static std::map< std::string, std::string > getGlobalTagMap(const std::string &crest_path, const std::string &globaltag)
void setInactive()
bool isValid() const
Definition IOVDbParser.h:66
virtual StatusCode finalize() override
Service finalize.
Definition IOVDbSvc.cxx:246
BooleanProperty m_par_managePoolConnections
Definition IOVDbSvc.h:188
StatusCode loadCaches(IOVDbConn *conn, const IOVTime *time=nullptr)
PublicToolHandle< IIOVDbMetaDataTool > m_h_metaDataTool
Definition IOVDbSvc.h:228
ServiceHandle< StoreGateSvc > m_h_sgSvc
Definition IOVDbSvc.h:222
Gaudi::Property< std::vector< std::string > > m_par_overrideTags
Definition IOVDbSvc.h:182
virtual void handle(const Incident &incident) override
Incident service handle for EndEvent.
Definition IOVDbSvc.cxx:747
Gaudi::Property< std::vector< std::string > > m_par_folders
Definition IOVDbSvc.h:180
virtual cool::IDatabasePtr getDatabase(bool readOnly) override
Access to COOL database for a given folder.
Definition IOVDbSvc.cxx:278
BooleanProperty m_crestCoolToFile
Definition IOVDbSvc.h:218
virtual bool dropObject(const std::string &key, const bool resetCache=false) override
Definition IOVDbSvc.cxx:838
IAddressProvider::tadList tadList
Definition IOVDbSvc.h:91
BooleanProperty m_outputToFile
Definition IOVDbSvc.h:217
BooleanProperty m_par_checklock
Definition IOVDbSvc.h:209
IntegerProperty m_par_forceLumiblockNumber
Definition IOVDbSvc.h:192
BooleanProperty m_par_manageConnections
Definition IOVDbSvc.h:186
virtual StatusCode preLoadAddresses(StoreID::type storeID, tadList &list) override
Get all addresses that the provider wants to preload in SG maps.
Definition IOVDbSvc.cxx:297
StatusCode io_finalize() override final
Definition IOVDbSvc.cxx:240
ServiceHandle< IAddressCreator > m_h_persSvc
Definition IOVDbSvc.h:225
bool m_abort
Definition IOVDbSvc.h:273
std::map< std::string, std::string > m_cresttagmap
Definition IOVDbSvc.h:213
IOVDbFolder::source_t m_source
Definition IOVDbSvc.h:254
StatusCode checkConfigConsistency() const
IOVTime m_iovTime
Definition IOVDbSvc.h:258
IntegerProperty m_par_maxNumPoolFiles
Definition IOVDbSvc.h:196
UnsignedIntegerProperty m_par_cacheAlign
Definition IOVDbSvc.h:205
StatusCode io_reinit() override final
Definition IOVDbSvc.cxx:232
IntegerProperty m_par_forceTimestamp
Definition IOVDbSvc.h:194
virtual StatusCode setRange(const CLID &clid, const std::string &dbKey, const IOVRange &range, const std::string &tag) override
Set range for a particular data object.
Definition IOVDbSvc.cxx:639
IntegerProperty m_par_cacheRun
Definition IOVDbSvc.h:200
@ FINALIZE_ALG
Definition IOVDbSvc.h:250
@ BEGIN_RUN
Definition IOVDbSvc.h:248
@ INITIALIZATION
Definition IOVDbSvc.h:247
@ EVENT_LOOP
Definition IOVDbSvc.h:249
virtual StatusCode initialize() override
Service init.
Definition IOVDbSvc.cxx:143
StatusCode checkEventSel()
Definition IOVDbSvc.cxx:866
virtual void postConditionsLoad() override
May be called once conditions are loaded to let IOVDbSvc release resources.
Definition IOVDbSvc.cxx:721
BooleanProperty m_par_onlineMode
Definition IOVDbSvc.h:207
ServiceHandle< StoreGateSvc > m_h_metaDataStore
Definition IOVDbSvc.h:224
ServiceHandle< IClassIDSvc > m_h_clidSvc
Definition IOVDbSvc.h:226
ServiceHandle< ITagInfoMgr > m_h_tagInfoMgr
Definition IOVDbSvc.h:229
Gaudi::Property< std::string > m_par_dbinst
Definition IOVDbSvc.h:178
virtual StatusCode signalBeginRun(const IOVTime &beginRunTime, const EventContext &ctx) override
Set time for begin run.
Definition IOVDbSvc.cxx:648
int m_poolSvcContext
Definition IOVDbSvc.h:238
ServiceHandle< IPoolSvc > m_h_poolSvc
Definition IOVDbSvc.h:227
StatusCode fillTagInfo()
int poolSvcContext()
Definition IOVDbSvc.cxx:123
bool m_poolPayloadRequested
Definition IOVDbSvc.h:234
StatusCode setupFolders()
Definition IOVDbSvc.cxx:927
ServiceHandle< StoreGateSvc > m_h_detStore
Definition IOVDbSvc.h:223
virtual bool getKeyInfo(const std::string &key, IIOVDbSvc::KeyInfo &info) override
Return information about SG key return false if this key is not known to IOVDbSvc.
Definition IOVDbSvc.cxx:817
Gaudi::Property< std::string > m_par_defaultConnection
Definition IOVDbSvc.h:174
virtual StatusCode loadAddresses(StoreID::type storeID, tadList &list) override
Get all new addresses from Provider for this Event.
Definition IOVDbSvc.cxx:422
virtual StatusCode updateAddress(StoreID::type storeID, SG::TransientAddress *tad, const EventContext &ctx) override
Update a transient Address.
Definition IOVDbSvc.cxx:428
IOVDbSvc_state m_state
Definition IOVDbSvc.h:252
virtual std::vector< std::string > getKeyList() override
Definition IOVDbSvc.cxx:810
virtual void signalEndProxyPreload() override
Signal that callback has been fired.
Definition IOVDbSvc.cxx:716
IntegerProperty m_par_cacheTime
Definition IOVDbSvc.h:202
Gaudi::Property< std::vector< std::string > > m_par_foldersToWrite
Definition IOVDbSvc.h:184
Gaudi::Property< std::string > m_par_globalTag
Definition IOVDbSvc.h:176
IntegerProperty m_par_forceRunNumber
Definition IOVDbSvc.h:190
virtual StatusCode processTagInfo() override
Process TagInfo.
Definition IOVDbSvc.cxx:769
StringProperty m_par_source
Definition IOVDbSvc.h:211
virtual StatusCode getRange(const CLID &clid, const std::string &dbKey, const IOVTime &time, IOVRange &range, std::string &tag, std::unique_ptr< IOpaqueAddress > &ioa) override
Get range for a particular data object identified by its clid and key and a requested IOVTime.
Definition IOVDbSvc.cxx:549
FloatProperty m_par_timeStampSlop
Definition IOVDbSvc.h:198
std::string m_globalTag
Definition IOVDbSvc.h:261
FolderMap m_foldermap
Definition IOVDbSvc.h:271
cool::ValidityKey m_iovslop
Definition IOVDbSvc.h:264
std::vector< std::unique_ptr< IOVDbConn > > m_connections
Definition IOVDbSvc.h:267
std::map< std::string, std::unique_ptr< IOVDbFolder > > FolderMap
Definition IOVDbSvc.h:270
ServiceHandle< IIOVSvc > m_h_IOVSvc
Definition IOVDbSvc.h:221
Validity Range object.
Definition IOVRange.h:30
Basic time unit for IOVSvc.
Definition IOVTime.h:33
static constexpr uint64_t MAXTIMESTAMP
Definition IOVTime.h:58
static constexpr uint32_t MAXRUN
Definition IOVTime.h:48
void setRETime(uint64_t time) noexcept
Definition IOVTime.cxx:84
void setRunEvent(uint32_t run, uint32_t event) noexcept
Definition IOVTime.cxx:96
static constexpr uint32_t MINEVENT
Definition IOVTime.h:50
static constexpr uint64_t MINTIMESTAMP
Definition IOVTime.h:56
void setTimestamp(uint64_t timestamp) noexcept
Definition IOVTime.cxx:72
uint32_t run() const noexcept
Definition IOVTime.h:105
static constexpr uint32_t MAXEVENT
Definition IOVTime.h:51
static constexpr uint32_t MINRUN
Definition IOVTime.h:44
std::vector< NameTagPair > NameTagPairVec
Definition ITagInfoMgr.h:66
a const_iterator facade to DataHandle.
Definition SGIterator.h:164
CLID clID() const
Retrieve string key:
const std::string & name() const
Get the primary (hashed) SG key.
void setAddress(CxxUtils::RefCountedPtr< IOpaqueAddress > pAddress)
Retrieve primary clid.
Incident sent after a store is cleared.
const StoreGateSvc * store() const
Return the store that was cleared.
@ DETECTOR_STORE
Definition StoreID.h:27
std::string description
glabal timer - how long have I taken so far?
Definition hcg.cxx:93
bool match(std::string s1, std::string s2)
match the individual directories of two strings
Definition hcg.cxx:359
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
openDatabase(dbstring)
Filled by IIOVDbSvc::getKeyInfo.
Definition IIOVDbSvc.h:44
MsgStream & msg
Definition testRead.cxx:32
int run(int argc, char *argv[])