ATLAS Offline Software
Loading...
Searching...
No Matches
IOVDbSvc Class Reference

Athena service for Interval Of Validity database. More...

#include <IOVDbSvc.h>

Inheritance diagram for IOVDbSvc:

Public Types

typedef IAddressProvider::tadList tadList
typedef IAddressProvider::tadListIterator tadListIterator

Public Member Functions

virtual StatusCode initialize () override
 Service init.
StatusCode io_reinit () override final
virtual StatusCode finalize () override
 Service finalize.
StatusCode io_finalize () override final
virtual cool::IDatabasePtr getDatabase (bool readOnly) override
 Access to COOL database for a given folder.
Address use
virtual StatusCode preLoadAddresses (StoreID::type storeID, tadList &list) override
 Get all addresses that the provider wants to preload in SG maps.
virtual StatusCode loadAddresses (StoreID::type storeID, tadList &list) override
 Get all new addresses from Provider for this Event.
virtual StatusCode updateAddress (StoreID::type storeID, SG::TransientAddress *tad, const EventContext &ctx) override
 Update a transient Address.

IOV range access

enum  IOVDbSvc_state { INITIALIZATION = 0 , BEGIN_RUN , EVENT_LOOP , FINALIZE_ALG }
typedef std::map< std::string, std::unique_ptr< IOVDbFolder > > FolderMap
Gaudi::Property< std::string > m_par_defaultConnection {this,"dbConnection","sqlite://;schema=cooldummy.db;dbname=OFLP200","default DB connection string"}
Gaudi::Property< std::string > m_par_globalTag {this,"GlobalTag","","Global database tag"}
Gaudi::Property< std::string > m_par_dbinst {this,"DBInstance","","Database instance (like OFLP200)"}
Gaudi::Property< std::vector< std::string > > m_par_folders {this,"Folders",{},"List of database folders to preload","OrderedSet<std::string>"}
Gaudi::Property< std::vector< std::string > > m_par_overrideTags {this,"overrideTags",{},"List of xml-modifiers for folders like <prefix>/My/Folder</prefix><tag>MyFolderTag</tag>","OrderedSet<std::string>"}
Gaudi::Property< std::vector< std::string > > m_par_foldersToWrite {this,"FoldersToMetaData",{},"list of folders to write to file meta data","OrderedSet<std::string>"}
BooleanProperty m_par_manageConnections {this,"ManageConnections",true,"flag to trigger the connections management"}
BooleanProperty m_par_managePoolConnections {this,"ManagePoolConnections",true,"flag to manage pool connections"}
IntegerProperty m_par_forceRunNumber {this,"forceRunNumber",0,"globally force run-number (default: no force)"}
IntegerProperty m_par_forceLumiblockNumber {this,"forceLumiblockNumber",0,"globally force LB-number (default: no force)"}
IntegerProperty m_par_forceTimestamp {this,"forceTimeStamp",0,"globally force time-stamp (default: no force)"}
IntegerProperty m_par_maxNumPoolFiles {this,"MaxPoolFilesOpen",5,"max number of pool files open allowed (0 means no limit)"}
FloatProperty m_par_timeStampSlop {this,"TimeStampSlop",0.0,"backdata timestamp IOVs by this many seconds"}
IntegerProperty m_par_cacheRun {this,"CacheRun",0,"force larger numbers of runs to be cached"}
IntegerProperty m_par_cacheTime {this,"CacheTime",0,"force larger timeranges to be cached (seconds)"}
UnsignedIntegerProperty m_par_cacheAlign {this,"CacheAlign",0,"cache alignment - divide cache into N slices and align queries on slice"}
BooleanProperty m_par_onlineMode {this,"OnlineMode",false,"online mode flag to ignore missing channels outside cache range"}
BooleanProperty m_par_checklock {this,"CheckLock",false,"check to ensure global/HVS tags are locked (for production)"}
StringProperty m_par_source {this,"Source","COOL_DATABASE","source of data as a string (default COOL_DATABASE)"}
std::map< std::string, std::string > m_cresttagmap
StringProperty m_par_format {this,"Format",{},"Format of data; default is empty string (default for a given source)"}
BooleanProperty m_outputToFile {this,"OutputToFile",false,"output to file for debugging purposes"}
BooleanProperty m_crestCoolToFile {this,"CrestCoolToFile",false,"output to file crest or cool data in the same format for debugging purposes"}
ServiceHandle< IIOVSvcm_h_IOVSvc {this,"IOVSvc","IOVSvc"}
ServiceHandle< StoreGateSvcm_h_sgSvc {this,"StoreGateSvc","StoreGateSvc"}
ServiceHandle< StoreGateSvcm_h_detStore {this,"DetectorStore","DetectorStore"}
ServiceHandle< StoreGateSvcm_h_metaDataStore {this,"MetaDataStore","StoreGateSvc/MetaDataStore"}
ServiceHandle< IAddressCreator > m_h_persSvc {this,"EventPersistencySvc","EventPersistencySvc"}
ServiceHandle< IClassIDSvc > m_h_clidSvc {this,"ClassIDSvc","ClassIDSvc"}
ServiceHandle< IPoolSvcm_h_poolSvc {this,"PoolSvc","PoolSvc"}
PublicToolHandle< IIOVDbMetaDataToolm_h_metaDataTool {this,"IOVDbMetaDataTool","IOVDbMetaDataTool"}
ServiceHandle< ITagInfoMgrm_h_tagInfoMgr {this,"TagInfoMgr","TagInfoMgr"}
bool m_poolPayloadRequested {false}
int m_poolSvcContext {-1}
IOVDbSvc_state m_state {INITIALIZATION}
IOVTime m_iovTime {}
std::string m_globalTag {}
cool::ValidityKey m_iovslop {}
std::vector< std::unique_ptr< IOVDbConn > > m_connections
FolderMap m_foldermap
bool m_abort {false}
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.
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.
virtual StatusCode signalBeginRun (const IOVTime &beginRunTime, const EventContext &ctx) override
 Set time for begin run.
virtual void signalEndProxyPreload () override
 Signal that callback has been fired.
virtual void postConditionsLoad () override
 May be called once conditions are loaded to let IOVDbSvc release resources.
virtual void handle (const Incident &incident) override
 Incident service handle for EndEvent.
virtual StatusCode processTagInfo () override
 Process TagInfo.
virtual std::vector< std::string > getKeyList () override
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.
virtual bool dropObject (const std::string &key, const bool resetCache=false) override
StatusCode checkConfigConsistency () const
StatusCode checkEventSel ()
StatusCode setupFolders ()
StatusCode fillTagInfo ()
StatusCode loadCaches (IOVDbConn *conn, const IOVTime *time=nullptr)
int poolSvcContext ()

Detailed Description

Athena service for Interval Of Validity database.

The IOVDbSvc may be in one of three time states which determines from where the IOV time is coming: initialization - IOV time must be set from the EventSelector begin run - IOV time should have been set with signalBeginRun event loop - IOV time is from EventInfo

Definition at line 66 of file IOVDbSvc.h.

Member Typedef Documentation

◆ FolderMap

typedef std::map<std::string, std::unique_ptr<IOVDbFolder> > IOVDbSvc::FolderMap
private

Definition at line 267 of file IOVDbSvc.h.

◆ tadList

Definition at line 91 of file IOVDbSvc.h.

◆ tadListIterator

Member Enumeration Documentation

◆ IOVDbSvc_state

Enumerator
INITIALIZATION 
BEGIN_RUN 
EVENT_LOOP 
FINALIZE_ALG 

Definition at line 246 of file IOVDbSvc.h.

246 {
247 INITIALIZATION = 0,
248 BEGIN_RUN,
251 };
@ FINALIZE_ALG
Definition IOVDbSvc.h:250
@ BEGIN_RUN
Definition IOVDbSvc.h:248
@ INITIALIZATION
Definition IOVDbSvc.h:247
@ EVENT_LOOP
Definition IOVDbSvc.h:249

Member Function Documentation

◆ checkConfigConsistency()

StatusCode IOVDbSvc::checkConfigConsistency ( ) const
private

Definition at line 1157 of file IOVDbSvc.cxx.

1157 {
1158 // check consistency of global tag and database instance, if set
1159 // catch most common user misconfigurations
1160 // this is only done here as need global tag to be set even if read from file
1161 // @TODO should this not be done during initialize
1162
1163 if (!m_par_dbinst.empty() && !m_globalTag.empty() && m_par_source!="CREST") {
1164 const std::string_view tagstub = std::string_view(m_globalTag).substr(0,7);
1165 ATH_MSG_DEBUG( "Checking " << m_par_dbinst << " against " <<tagstub );
1166
1167 if ( ((m_par_dbinst=="COMP200" || m_par_dbinst=="CONDBR2") &&
1168 (tagstub!="COMCOND" && tagstub!="CONDBR2")) ||
1169 (m_par_dbinst=="OFLP200" && (tagstub!="OFLCOND" && tagstub!="CMCCOND")) ) {
1170
1171 ATH_MSG_FATAL( "Likely incorrect conditions DB configuration! " <<
1172 "Attached to database instance " << m_par_dbinst <<
1173 " but global tag begins " << tagstub );
1174 ATH_MSG_FATAL( "See Atlas/CoolTroubles wiki for details,"
1175 " or set IOVDbSvc.DBInstance=\"\" to disable check" );
1176 return StatusCode::FAILURE;
1177 }
1178 }
1179 return StatusCode::SUCCESS;
1180}
#define ATH_MSG_FATAL(x)
#define ATH_MSG_DEBUG(x)
Gaudi::Property< std::string > m_par_dbinst
Definition IOVDbSvc.h:178
StringProperty m_par_source
Definition IOVDbSvc.h:211
std::string m_globalTag
Definition IOVDbSvc.h:258

◆ checkEventSel()

StatusCode IOVDbSvc::checkEventSel ( )
private

Definition at line 854 of file IOVDbSvc.cxx.

854 {
855 // check if EventSelector is being used to override run numbers
856 // if so, we can set IOV time already to allow conditons retrieval
857 // in the initialise phase, needed for setting up simulation
858
859 ServiceHandle<Gaudi::Interfaces::IOptionsSvc> joSvc("JobOptionsSvc",name());
860 ATH_CHECK( joSvc.retrieve() );
861
862 if (!joSvc->has("EventSelector.OverrideRunNumber")) {
863 // do not return FAILURE if the EventSelector cannot be found, or it has
864 // no override property, can e.g. happen in online running
865 ATH_MSG_DEBUG( "No EventSelector.OverrideRunNumber property found" );
866 return StatusCode::SUCCESS;
867 }
868
869 BooleanProperty overrideRunNumber("OverrideRunNumber",false);
870 ATH_CHECK( overrideRunNumber.fromString(joSvc->get("EventSelector.OverrideRunNumber")) );
871 if (overrideRunNumber) {
872 // if flag is set, extract Run,LB and time
873 ATH_MSG_INFO( "Setting run/LB/time from EventSelector override in initialize" );
874 uint32_t run,lumib;
876 bool allGood=true;
878 ATH_MSG_WARNING( "forceRunNumber property also set" );
879 }
880 IntegerProperty iprop1("RunNumber",0);
881 if (iprop1.fromString(joSvc->get("EventSelector.RunNumber","INVALID"))) {
882 run=iprop1;
883 } else {
884 ATH_MSG_ERROR( "Unable to get RunNumber from EventSelector");
885 allGood=false;
886 }
887 IntegerProperty iprop2("FirstLB",0);
888 if (iprop2.fromString(joSvc->get("EventSelector.FirstLB","INVALID"))) {
889 lumib=iprop2;
890 } else {
891 ATH_MSG_ERROR( "Unable to get FirstLB from EventSelector");
892 allGood=false;
893 }
894 IntegerProperty iprop3("InitialTimeStamp",0);
895 if (iprop3.fromString(joSvc->get("EventSelector.InitialTimeStamp","INVALID"))) {
896 time=iprop3;
897 } else {
898 ATH_MSG_ERROR("Unable to get InitialTimeStamp from EventSelector" );
899 allGood=false;
900 }
901 if (allGood) {
902 m_iovTime.setRunEvent(run,lumib);
903 uint64_t nsTime=time*1000000000LL;
904 m_iovTime.setTimestamp(nsTime);
905 ATH_MSG_INFO( "run/LB/time set to [" << run << "," << lumib << " : " << nsTime << "]" );
906 } else {
907 ATH_MSG_ERROR( "run/LB/Time NOT changed" );
908 }
909 }
910
911 return StatusCode::SUCCESS;
912}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
IntegerProperty m_par_forceLumiblockNumber
Definition IOVDbSvc.h:192
IOVTime m_iovTime
Definition IOVDbSvc.h:255
IntegerProperty m_par_forceRunNumber
Definition IOVDbSvc.h:190
time(flags, cells_name, *args, **kw)
bool allGood
Loop over the SDOs & Digits.
setEventNumber uint32_t
int run(int argc, char *argv[])

◆ dropObject()

bool IOVDbSvc::dropObject ( const std::string & key,
const bool resetCache = false )
overridevirtual

Definition at line 826 of file IOVDbSvc.cxx.

826 {
827 // find the folder corresponding to this object
828 const auto itr = m_foldermap.find(key);
829 if (itr!=m_foldermap.end()) {
830 IOVDbFolder* folder=itr->second.get();
831 CLID clid=folder->clid();
832 SG::DataProxy* proxy=m_h_detStore->proxy(clid,key);
833 if (proxy!=nullptr) {
834 m_h_detStore->clearProxyPayload(proxy);
835 ATH_MSG_DEBUG("Dropped payload for key " << key );
836 folder->setDropped(true);
837 if (resetCache) {
838 folder->resetCache();
839 ATH_MSG_DEBUG( "Cache reset done for folder " << folder->folderName() );
840 }
841 return true;
842 } else {
843 return false;
844 }
845 } else {
846 return false;
847 }
848}
uint32_t CLID
The Class ID type.
ServiceHandle< StoreGateSvc > m_h_detStore
Definition IOVDbSvc.h:223
FolderMap m_foldermap
Definition IOVDbSvc.h:268

◆ fillTagInfo()

StatusCode IOVDbSvc::fillTagInfo ( )
private

Definition at line 1080 of file IOVDbSvc.cxx.

1080 {
1081 if (!m_par_globalTag.empty()) {
1082 ATH_MSG_DEBUG( "Adding GlobalTag " << m_par_globalTag << " into TagInfo" );
1083 ATH_CHECK( m_h_tagInfoMgr->addTag("IOVDbGlobalTag",m_par_globalTag) );
1084 }
1085 // add all explicit tags specified in folders
1086 // can be from Folders or tagOverrides properties
1087 for (const auto & [name, folder] : m_foldermap) {
1088 if (!folder->joTag().empty()) {
1089 ATH_MSG_DEBUG( "Adding folder " << folder->folderName() <<" tag " << folder->joTag() << " into TagInfo" );
1090 if (m_h_tagInfoMgr->addTag(folder->folderName(),folder->joTag()).isFailure())
1091 return StatusCode::FAILURE;
1092 }
1093 // check to see if any input TagInfo folder overrides should be removed
1094 // this anticipates the decisions which will be made in processTagInfo
1095 // Here we do not have access to the TagInfo object, but can put remove
1096 // requests in for all folders if the global tag is set, or if there is
1097 // an explict joboption tag, nooverride spec, or data comes from metadata
1098 if (!m_par_globalTag.empty() || !folder->joTag().empty() || folder->noOverride() ||
1099 folder->readMeta()) {
1100 if (m_h_tagInfoMgr->removeTagFromInput(folder->folderName()).isFailure()) {
1101 ATH_MSG_WARNING( "Could not add TagInfo remove request for "
1102 << folder->folderName() );
1103 } else {
1104 ATH_MSG_INFO( "Added taginfo remove for " << folder->folderName() );
1105 }
1106 }
1107 }
1108 return StatusCode::SUCCESS;
1109}
ServiceHandle< ITagInfoMgr > m_h_tagInfoMgr
Definition IOVDbSvc.h:229
Gaudi::Property< std::string > m_par_globalTag
Definition IOVDbSvc.h:176

◆ finalize()

StatusCode IOVDbSvc::finalize ( )
overridevirtual

Service finalize.

Definition at line 234 of file IOVDbSvc.cxx.

234 {
235 // summarise and delete folders, adding total read from COOL
236 unsigned long long nread = 0;
237 float readtime = 0;
238
239 // accumulate a map of readtime by connection
240 std::map<IOVDbConn*, float> ctmap;
241 for (const auto & [name, folder] : m_foldermap) {
242 folder->summary();
243 nread += folder->bytesRead();
244 readtime += folder->readTime();
245 const auto& [citr, inserted] = ctmap.try_emplace(folder->conn(), 0);
246 citr->second += folder->readTime();
247 }
248 m_foldermap.clear();
249 ATH_MSG_INFO( "Total payload read from IOVDb: " << nread << " bytes in (( " << std::fixed << std::setw(9) << std::setprecision(2) <<
250 readtime << " ))s" );
251
252 // close and delete connections, printing time in each one
253 for (const auto & conn : m_connections) {
254 float fread = 0;
255 const auto citr = ctmap.find(conn.get());
256 if (citr != ctmap.end()) fread = citr->second;
257 conn->setInactive();
258 conn->summary(fread);
259 }
260 m_connections.clear();
261
262 return StatusCode::SUCCESS;
263}
std::vector< std::unique_ptr< IOVDbConn > > m_connections
Definition IOVDbSvc.h:264

◆ getDatabase()

cool::IDatabasePtr IOVDbSvc::getDatabase ( bool readOnly)
overridevirtual

Access to COOL database for a given folder.

Definition at line 266 of file IOVDbSvc.cxx.

266 {
267 // get default database connection
268 cool::IDatabasePtr dbconn;
269 if (m_par_defaultConnection.empty() || m_connections.empty()) {
270 ATH_MSG_INFO( "No default COOL database connection is available");
271 dbconn.reset();
272 } else {
273 Athena::DBLock dblock;
274 if (m_connections[0]->isReadOnly()!=readOnly) {
275 ATH_MSG_INFO("Changing state of default connection to readonly=" << readOnly );
276 m_connections[0]->setReadOnly(readOnly);
277 }
278 dbconn = std::make_shared<LockedDatabase> (m_connections[0]->getCoolDb(),
279 dblock);
280 }
281 return dbconn;
282}
Gaudi::Property< std::string > m_par_defaultConnection
Definition IOVDbSvc.h:174

◆ getKeyInfo()

bool IOVDbSvc::getKeyInfo ( const std::string & key,
IIOVDbSvc::KeyInfo & info )
overridevirtual

Return information about SG key return false if this key is not known to IOVDbSvc.

Definition at line 805 of file IOVDbSvc.cxx.

805 {
806 // return information about given SG key
807 // first attempt to find the folder object for this key
808 const auto itr = m_foldermap.find(key);
809 if (itr!=m_foldermap.end()) {
810 const IOVDbFolder* f = itr->second.get();
811 info.folderName = f->folderName();
812 info.tag = f->resolvedTag();
813 info.range = f->currentRange();
814 info.retrieved = f->retrieved();
815 info.bytesRead = f->bytesRead();
816 info.readTime = f->readTime();
817 info.extensible = f->extensible();
818 return true;
819 } else {
820 info.retrieved = false;
821 return false;
822 }
823}

◆ getKeyList()

std::vector< std::string > IOVDbSvc::getKeyList ( )
overridevirtual

Definition at line 798 of file IOVDbSvc.cxx.

798 {
799 // return a list of all the StoreGate keys being managed by IOVDbSvc
800 auto keys = std::views::keys(m_foldermap);
801 return {keys.begin(), keys.end()};
802}

◆ getRange()

StatusCode IOVDbSvc::getRange ( const CLID & clid,
const std::string & dbKey,
const IOVTime & time,
IOVRange & range,
std::string & tag,
std::unique_ptr< IOpaqueAddress > & ioa )
overridevirtual

Get range for a particular data object identified by its clid and key and a requested IOVTime.

Definition at line 537 of file IOVDbSvc.cxx.

542 {
543
544 Athena::DBLock dblock;
545
546 ATH_MSG_DEBUG( "getRange clid: " << clid << " key: \""<< dbKey << "\" t: " << time );
547
548 const auto fitr = m_foldermap.find(dbKey);
549 if (fitr==m_foldermap.end()) {
550 ATH_MSG_VERBOSE("getRange cannot find description for dbKey " << dbKey );
551 return StatusCode::FAILURE;
552 }
553 const auto& folder = fitr->second;
554 if (folder->clid()!=clid) {
555 ATH_MSG_VERBOSE( "supplied CLID for " << dbKey << " is "
556 << clid
557 << " but expecting " << folder->clid() );
558
559 return StatusCode::FAILURE;
560 }
561
562 tag = folder->key();
563
564 // obtain the validity key for this folder (includes overrides)
565 cool::ValidityKey vkey = folder->iovTime(time);
566 if (folder->source() == "CREST") {
567 if (!folder->readMeta() && !folder->cacheValid((vkey))){
568 fitr->second->loadCache(vkey, m_par_cacheAlign,m_globalTag,m_par_onlineMode);
569 }
570 } else {
571 if (!folder->readMeta() && !folder->cacheValid(vkey)) {
572 // mark this folder as not-dropped so cache-read will succeed
573 folder->setDropped(false);
574 // reload cache for this folder (and all others sharing this DB
575 // connection)
576 ATH_MSG_DEBUG("Triggering cache load for folder " << folder->folderName());
577 if (loadCaches(folder->conn(), &time).isFailure()) {
578 ATH_MSG_ERROR("Cache load failed for at least one folder from " << folder->conn()->name()
579 << ". You may see errors from other folders sharing the "
580 "same connection.");
581 return StatusCode::FAILURE;
582 }
583 }
584 }
585 // data should now be in cache
586 address.reset();
587 // setup address and range
588 {
589 Gaudi::Guards::AuditorGuard auditor(std::string("FldrSetup:")+(dbKey.empty() ? "anonymous" : dbKey),
590 auditorSvc(), "preLoadProxy");
591 if (!folder->getAddress(vkey,&(*m_h_persSvc),poolSvcContext(),address,
592 range,m_poolPayloadRequested)) {
593 ATH_MSG_ERROR("getAddress failed for folder " <<folder->folderName() );
594 return StatusCode::FAILURE;
595 }
596 }
597
598 // Special handling for extensible folders:
599 if (folder->extensible()) {
600 // Set the end time to just past the current event or lumiblock.
601 IOVTime extStop = range.stop();
602 if (folder->timeStamp()) {
603 extStop.setTimestamp (time.timestamp() + 1);
604 }
605 else {
606 extStop.setRETime (time.re_time() + 1);
607 }
608 range = IOVRange (range.start(), extStop);
609 }
610
611 // Special handling for IOV override: set the infinite validity range
612 if (folder->iovOverridden()) {
613 if (folder->timeStamp()) {
614 range = IOVRange ( IOVTime(IOVTime::MINTIMESTAMP),
615 IOVTime(IOVTime::MAXTIMESTAMP) );
616 }
617 else {
618 range = IOVRange ( IOVTime(IOVTime::MINRUN,IOVTime::MINEVENT),
620 }
621 }
622
623 return StatusCode::SUCCESS;
624}
#define ATH_MSG_VERBOSE(x)
StatusCode loadCaches(IOVDbConn *conn, const IOVTime *time=nullptr)
ServiceHandle< IAddressCreator > m_h_persSvc
Definition IOVDbSvc.h:225
UnsignedIntegerProperty m_par_cacheAlign
Definition IOVDbSvc.h:205
BooleanProperty m_par_onlineMode
Definition IOVDbSvc.h:207
int poolSvcContext()
Definition IOVDbSvc.cxx:123
bool m_poolPayloadRequested
Definition IOVDbSvc.h:234
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
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
static constexpr uint32_t MAXEVENT
Definition IOVTime.h:51
static constexpr uint32_t MINRUN
Definition IOVTime.h:44

◆ handle()

void IOVDbSvc::handle ( const Incident & incident)
overridevirtual

Incident service handle for EndEvent.

Definition at line 735 of file IOVDbSvc.cxx.

735 {
736 // Handle incidents:
737 // BeginEvent to set IOVDbSvc state to EVENT_LOOP
738 // StoreCleared/EndProcessing to close any open POOL files
739 ATH_MSG_VERBOSE( "entering handle(), incident type " << inc.type() << " from " << inc.source() );
740 if (inc.type()=="BeginEvent") {
742 } else {
743 Athena::DBLock dblock;
744
745 const StoreClearedIncident* sinc = dynamic_cast<const StoreClearedIncident*>(&inc);
746 if( (inc.type()=="StoreCleared" && sinc!=nullptr && sinc->store()==&*m_h_sgSvc
748 or inc.type()==IncidentType::EndProcessing )
749 {
752 }
753 }
754}
ServiceHandle< StoreGateSvc > m_h_sgSvc
Definition IOVDbSvc.h:222
virtual void postConditionsLoad() override
May be called once conditions are loaded to let IOVDbSvc release resources.
Definition IOVDbSvc.cxx:709
IOVDbSvc_state m_state
Definition IOVDbSvc.h:252
const StoreGateSvc * store() const
Return the store that was cleared.

◆ initialize()

StatusCode IOVDbSvc::initialize ( )
overridevirtual

Service init.

Definition at line 143 of file IOVDbSvc.cxx.

143 {
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 // make sure iovTime is undefined
181 m_iovTime.reset();
182
183 // extract information from EventSelector for run/LB/time overrides
185
186 // initialise default connection
187 if (!m_par_defaultConnection.empty()) {
188 // default connection is readonly if no : in name (i.e. logical conn)
189 bool readonly=(m_par_defaultConnection.find(':')==std::string::npos);
190 m_connections.push_back(std::make_unique<IOVDbConn>(m_par_defaultConnection,readonly,msg()));
191 }
192
193 // set time of timestampslop in nanoseconds
194 m_iovslop=static_cast<cool::ValidityKey>(m_par_timeStampSlop*1.E9);
195
196 // check for global tag in jobopt, which will override anything in input file
197 if (!m_par_globalTag.empty()) {
199 ATH_MSG_INFO( "Global tag: " << m_par_globalTag.value() << " set from joboptions" );
200 }
201
202 // setup folders and process tag overrides
204
205 // Set state to initialize
207 ATH_MSG_INFO( "Initialised with " << m_connections.size() <<
208 " connections and " << m_foldermap.size() << " folders" );
209
210 if (m_outputToFile) ATH_MSG_INFO("Db dump to file activated");
211 if (m_crestCoolToFile) ATH_MSG_INFO("Crest or Cool dump to file activated");
212
213 ATH_MSG_INFO( "Service IOVDbSvc initialised successfully" );
214
216 return StatusCode::SUCCESS;
217}
BooleanProperty m_par_managePoolConnections
Definition IOVDbSvc.h:188
BooleanProperty m_crestCoolToFile
Definition IOVDbSvc.h:218
BooleanProperty m_outputToFile
Definition IOVDbSvc.h:217
BooleanProperty m_par_checklock
Definition IOVDbSvc.h:209
BooleanProperty m_par_manageConnections
Definition IOVDbSvc.h:186
StatusCode checkConfigConsistency() const
IntegerProperty m_par_maxNumPoolFiles
Definition IOVDbSvc.h:196
IntegerProperty m_par_forceTimestamp
Definition IOVDbSvc.h:194
IntegerProperty m_par_cacheRun
Definition IOVDbSvc.h:200
StatusCode checkEventSel()
Definition IOVDbSvc.cxx:854
StatusCode setupFolders()
Definition IOVDbSvc.cxx:915
IntegerProperty m_par_cacheTime
Definition IOVDbSvc.h:202
FloatProperty m_par_timeStampSlop
Definition IOVDbSvc.h:198
cool::ValidityKey m_iovslop
Definition IOVDbSvc.h:261
MsgStream & msg
Definition testRead.cxx:32

◆ io_finalize()

StatusCode IOVDbSvc::io_finalize ( )
finaloverride

Definition at line 228 of file IOVDbSvc.cxx.

228 {
229 ATH_MSG_DEBUG("I/O finalization...");
230 return StatusCode::SUCCESS;
231}

◆ io_reinit()

StatusCode IOVDbSvc::io_reinit ( )
finaloverride

Definition at line 220 of file IOVDbSvc.cxx.

220 {
221 ATH_MSG_DEBUG("I/O reinitialization...");
222 // PoolSvc clears all connections on IO_reinit - forget the stored contextId
223 m_poolSvcContext = -1;
224 return StatusCode::SUCCESS;
225}
int m_poolSvcContext
Definition IOVDbSvc.h:238

◆ loadAddresses()

StatusCode IOVDbSvc::loadAddresses ( StoreID::type storeID,
tadList & list )
overridevirtual

Get all new addresses from Provider for this Event.

Definition at line 410 of file IOVDbSvc.cxx.

410 {
411 // this method does nothing
412 return StatusCode::SUCCESS;
413}

◆ loadCaches()

StatusCode IOVDbSvc::loadCaches ( IOVDbConn * conn,
const IOVTime * time = nullptr )
private

Definition at line 1112 of file IOVDbSvc.cxx.

1112 {
1113 // load the caches for all folders using the given connection
1114 // so connection use is optimised
1115
1116 Gaudi::Guards::AuditorGuard auditor(std::string("loadCachesOverhead:")+conn->name(), auditorSvc(), "preLoadProxy");
1117
1118 ATH_MSG_DEBUG( "loadCaches: Begin for connection " << conn->name());
1119 // if global abort already set, load nothing
1120 if (m_abort) return StatusCode::FAILURE;
1121 bool access=false;
1122 StatusCode sc=StatusCode::SUCCESS;
1123 for (const auto & [name, folder] : m_foldermap) {
1124 if (folder->conn()!=conn) continue;
1125 cool::ValidityKey vkey=folder->iovTime(time==nullptr ? m_iovTime : *time);
1126 // protect against out of range times (timestamp -1 happened in FDR2)
1127 if (vkey>cool::ValidityKeyMax) {
1128 ATH_MSG_WARNING( "Requested validity key " << vkey << " is out of range, reset to 0" );
1129 vkey=0;
1130 }
1131 if (!folder->cacheValid(vkey) && !folder->dropped()) {
1132 access=true;
1133 {
1134 Gaudi::Guards::AuditorGuard auditor(std::string("FldrCache:")+folder->folderName(), auditorSvc(), "preLoadProxy");
1135 if (!folder->loadCache(vkey,m_par_cacheAlign,m_globalTag,m_par_onlineMode)) {
1136 ATH_MSG_ERROR( "Cache load (prefetch) failed for folder " << folder->folderName() );
1137 // remember the failure, but also load other folders on this connection
1138 // while it is open
1139 sc=StatusCode::FAILURE;
1140 }
1141 }
1142 }
1143 }
1144 // disconnect from database if we connected
1145 if (access && m_par_manageConnections) conn->setInactive();
1146 // if connection aborted, set overall abort so we do not waste time trying
1147 // to read data from other schema
1148 if (conn->aborted()) {
1149 m_abort=true;
1150 throw GaudiException("Connection " + conn->name() + " was aborted",
1151 "IOVDbSvc::loadCache()", StatusCode::FAILURE);
1152 }
1153 return sc;
1154}
static Double_t sc
bool m_abort
Definition IOVDbSvc.h:270
::StatusCode StatusCode
StatusCode definition for legacy code.
access(filename, mode)

◆ poolSvcContext()

int IOVDbSvc::poolSvcContext ( )
private

Definition at line 123 of file IOVDbSvc.cxx.

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}
ServiceHandle< IPoolSvc > m_h_poolSvc
Definition IOVDbSvc.h:227

◆ postConditionsLoad()

void IOVDbSvc::postConditionsLoad ( )
overridevirtual

May be called once conditions are loaded to let IOVDbSvc release resources.

Definition at line 709 of file IOVDbSvc.cxx.

709 {
710 // Close any open POOL files after loding Conditions
711 ATH_MSG_DEBUG( "postConditionsLoad: m_par_managePoolConnections=" << m_par_managePoolConnections
712 << " m_poolPayloadRequested=" << m_poolPayloadRequested );
713
715 // reset POOL connection to close all open conditions POOL files
718 if( m_poolSvcContext ) {
719 if (m_h_poolSvc->disconnect(m_poolSvcContext).isSuccess()) {
720 ATH_MSG_DEBUG( "Successfully closed input POOL connections");
721 } else {
722 ATH_MSG_WARNING( "Unable to close input POOL connections" );
723 }
724 // reopen transaction
725 if (m_h_poolSvc->connect(Io::READ, m_poolSvcContext).isSuccess()) {
726 ATH_MSG_DEBUG("Reopend read transaction for POOL conditions input files" );
727 } else {
728 ATH_MSG_WARNING("Cannot reopen read transaction for POOL conditions input files");
729 }
730 }
731 }
732}

◆ preLoadAddresses()

StatusCode IOVDbSvc::preLoadAddresses ( StoreID::type storeID,
tadList & list )
overridevirtual

Get all addresses that the provider wants to preload in SG maps.

Definition at line 285 of file IOVDbSvc.cxx.

285 {
286 // Read information for folders and setup TADs
287 if (storeID!=StoreID::DETECTOR_STORE) return StatusCode::SUCCESS;
288 // Preloading of addresses should be done ONLY for detector store
289 ATH_MSG_DEBUG( "preLoadAddress: storeID -> " << storeID );
290
291 Athena::DBLock dblock;
292
293 // check File Level Meta Data of input, see if any requested folders are available there
294 SG::ConstIterator<IOVMetaDataContainer> cont;
295 SG::ConstIterator<IOVMetaDataContainer> contEnd;
296 if (m_h_metaDataStore->retrieve(cont,contEnd).isSuccess()) {
297 unsigned int ncontainers=0;
298 unsigned int nused=0;
299 for (;cont!=contEnd; ++cont) {
300 ++ncontainers;
301 const std::string& fname=cont->folderName();
302 // check if this folder is in list requested by IOVDbSvc
303 for (const auto & [name, folder] : m_foldermap) {
304 // take data from FLMD only if tag override is NOT set
305 if (folder->folderName()==fname && !(folder->tagOverride())) {
306 ATH_MSG_INFO( "Folder " << fname << " will be taken from file metadata" );
307 folder->useFileMetaData();
308 folder->setFolderDescription( cont->folderDescription() );
309 ++nused;
310 break;
311 }
312 }
313 }
314 ATH_MSG_INFO( "Found " << ncontainers << " metadata containers in input file, " << nused << " will be used");
315 } else {
316 ATH_MSG_DEBUG( "Could not retrieve IOVMetaDataContainer objects from MetaDataStore" );
317 }
318
319 // Remove folders which should only be read from file meta data, but
320 // were not found in the MetaDataStore
321
322 // Note: we cannot iterate and perform erase within the iteration
323 // because the iterator becomes invalid. So first collect the keys
324 // to erase in a first pass and then erase them.
325 std::vector<std::string> keysToDelete;
326 for (const auto & [name, folder] : m_foldermap) {
327 if (folder->fromMetaDataOnly() && !folder->readMeta()) {
328 ATH_MSG_INFO( "preLoadAddresses: Removing folder " << folder->folderName() <<
329 ". It should only be in the file meta data and was not found." );
330 keysToDelete.push_back(name);
331 }
332 }
333
334 for (auto & thisKey : keysToDelete) {
335 const auto fitr = m_foldermap.find(thisKey);
336 if (fitr != m_foldermap.end()) {
337 fitr->second->conn()->decUsage();
338 m_foldermap.erase(fitr);
339 } else {
340 ATH_MSG_ERROR( "preLoadAddresses: Could not find folder " << thisKey << " for removal" );
341 }
342 }
343
344
345 // loop over all folders, grouped by connection
346 // do metadata folders on first connection (default connection)
347 bool doMeta=true;
348 // do not close COOL connection until next one has been opened, this enables
349 // connection sharing in CORAL, so all COOL connections will use the same
350 // CORAL one (althugh they will each be given a separate session)
351 IOVDbConn* oldconn=nullptr;
352 for (const auto & pThisConnection : m_connections) {
353 if (pThisConnection->nFolders()>0 || doMeta) {
354 // loop over all folders using this connection
355 for (const auto & [name, folder] : m_foldermap) {
356 if (folder->conn()==pThisConnection.get() || (folder->conn()==nullptr && doMeta)) {
357 std::unique_ptr<SG::TransientAddress> tad =
359 if (oldconn!=pThisConnection.get()) {
360 // close old connection if appropriate
361 if (m_par_manageConnections && oldconn!=nullptr) oldconn->setInactive();
362 oldconn=pThisConnection.get();
363 }
364 if (tad==nullptr) {
365 ATH_MSG_ERROR( "preLoadFolder failed for folder " << folder->folderName() );
366 return StatusCode::FAILURE;
367 }
368 // for write-metadata folder, request data preload
369 if (folder->writeMeta()) {
370 if (m_h_IOVSvc->preLoadDataTAD(tad.get(),folder->eventStore()).isFailure()) {
371 ATH_MSG_ERROR( "Could not request IOVSvc to preload metadata for " << folder->folderName() );
372 return StatusCode::FAILURE;
373 }
374 } else {
375 // for other folders, just preload TAD (not data)
376 if (m_h_IOVSvc->preLoadTAD(tad.get(), folder->eventStore()).isFailure()) {
377 ATH_MSG_ERROR( "Could not request IOVSvc to preload metadata for " << folder->folderName() );
378 return StatusCode::FAILURE;
379 }
380 }
381 // Add TAD to Storegate
382 tlist.push_back(tad.release());
383 // check for IOV override
385 }
386 }
387 }
388 doMeta=false;
389 }
390 // close last connection
391 if (oldconn!=nullptr and m_par_manageConnections) oldconn->setInactive();
392
393 // some folder keys may have changed during preloadFolder due to use of
394 // <key> specification in folder description string
395 // build a new foldermap with the updated keys
396 FolderMap newmap;
397 for (auto & [name, folder] : m_foldermap) {
398 newmap[folder->key()]=std::move(folder);
399 }
400 m_foldermap=std::move(newmap);
401
402 // fill global and explicit folder tags into TagInfo
403 if (fillTagInfo().isFailure())
404 ATH_MSG_ERROR("Could not fill TagInfo object from preLoadAddresses" );
405
406 return StatusCode::SUCCESS;
407}
void setInactive()
ServiceHandle< StoreGateSvc > m_h_metaDataStore
Definition IOVDbSvc.h:224
StatusCode fillTagInfo()
std::map< std::string, std::unique_ptr< IOVDbFolder > > FolderMap
Definition IOVDbSvc.h:267
ServiceHandle< IIOVSvc > m_h_IOVSvc
Definition IOVDbSvc.h:221
@ DETECTOR_STORE
Definition StoreID.h:27

◆ processTagInfo()

StatusCode IOVDbSvc::processTagInfo ( )
overridevirtual

Process TagInfo.

Definition at line 757 of file IOVDbSvc.cxx.

757 {
758 // Processing of taginfo
759 // Set GlobalTag and any folder-specific overrides if given
760
761 // dump out contents of TagInfo
762 ATH_MSG_DEBUG( "Tags from input TagInfo:");
763 if( msg().level()>=MSG::DEBUG ) m_h_tagInfoMgr->printTags(msg());
764
765 // check IOVDbSvc GlobalTag, if not already set
766 if (m_globalTag.empty()) {
767 m_globalTag = m_h_tagInfoMgr->findTag("IOVDbGlobalTag");
768 if (!m_globalTag.empty()) ATH_MSG_INFO( "Global tag: " << m_globalTag<< " set from input file" );
770 }
771
772 // now check for tag overrides for specific folders
773 const ITagInfoMgr::NameTagPairVec& nameTagPairs = m_h_tagInfoMgr->getInputTags();
774 for (const auto & [theTagName, theTag]: nameTagPairs) {
775 // assume tags relating to conditions folders start with /
776 if (not theTagName.starts_with('/')) continue;
777 // check for folder(s) with this name in (key, ptr) pair
778 for (const auto & [name, folder]: m_foldermap) {
779 const std::string& ifname=folder->folderName();
780 if (ifname!=theTagName) continue;
781 // use an override from TagInfo only if there is not an explicit jo tag,
782 // and folder meta-data is not used, and there is no <noover/> spec,
783 // and no global tag set in job options
784 if (folder->joTag().empty() && !folder->readMeta() && !folder->noOverride() && m_par_globalTag.empty()) {
785 folder->setTagOverride(theTag,false);
786 ATH_MSG_INFO( "TagInfo override for tag " << theTag << " in folder " << ifname );
787 } else if (folder->joTag()!=theTag) {
788 const std::string_view tagTypeString=(folder->joTag().empty()) ? "hierarchical" : "jobOption";
789 ATH_MSG_INFO( "Ignoring inputfile TagInfo request for tag " << theTag << " in folder " << ifname<<" in favour of "<<tagTypeString);
790 }
791 }
792 }
793 return StatusCode::SUCCESS;
794}
static const Attributes_t empty
std::vector< NameTagPair > NameTagPairVec
Definition ITagInfoMgr.h:66

◆ setRange()

StatusCode IOVDbSvc::setRange ( const CLID & clid,
const std::string & dbKey,
const IOVRange & range,
const std::string & tag )
overridevirtual

Set range for a particular data object.

Definition at line 627 of file IOVDbSvc.cxx.

630 {
631 // this method does nothing
632 return StatusCode::SUCCESS;
633}

◆ setupFolders()

StatusCode IOVDbSvc::setupFolders ( )
private

Definition at line 915 of file IOVDbSvc.cxx.

915 {
916 // read the Folders joboptions and setup the folder list
917 // no wildcards are allowed
918
919 // getting the pairs: folder name - CREST tag name:
920 if (m_par_source == "CREST"){
921 auto mLevel = static_cast<std::underlying_type_t<MSG::Level>>(msg().level());
922 Crest::LogLevel cLevel = static_cast<Crest::LogLevel>(mLevel);
923 Crest::Logger::setLogLevel(cLevel);
924 m_cresttagmap.clear();
926 if (m_cresttagmap.empty()) {
927 ATH_MSG_FATAL("Got empty tag-map. GlobalTag "<< m_par_globalTag.value() << " does not exist.");
928 return StatusCode::FAILURE;
929 }
930 }
931
932 //1. Loop through folders
933 std::list<IOVDbParser> allFolderdata;
934 for (const auto & thisFolder : m_par_folders) {
935 ATH_MSG_DEBUG( "Setup folder " << thisFolder );
936 IOVDbParser folderdata(thisFolder,msg());
937 if (!folderdata.isValid()) {
938 ATH_MSG_FATAL("setupFolders: Folder setup string is invalid: " <<thisFolder);
939 return StatusCode::FAILURE;
940 }
941
942 allFolderdata.push_back(std::move(folderdata));
943 }
944
945 //2. Loop through overwrites:
946 // syntax for entries is <prefix>folderpath</prefix> <tag>value</tag>
947 // folderpath matches from left of folderName
948 // but if partial match, next character must be / so override for /Fred/Ji
949 // matches /Fred/Ji/A and /Fred/Ji but not /Fred/Jim
950
951 for (const auto & thisOverrideTag : m_par_overrideTags) {
952 IOVDbParser keys(thisOverrideTag,msg());
953 if (not keys.isValid()){
954 ATH_MSG_ERROR("An override tag was invalid: " << thisOverrideTag);
955 return StatusCode::FAILURE;
956 }
957 std::string prefix;
958 if (!keys.getKey("prefix","",prefix)) { // || !keys.getKey("tag","",tag)) {
959 ATH_MSG_ERROR( "Problem in overrideTag specification " <<thisOverrideTag );
960 return StatusCode::FAILURE;
961 }
962
963 for (auto& folderdata : allFolderdata) {
964 const std::string& ifname=folderdata.folderName();
965 if (ifname.starts_with(prefix) &&
966 (ifname.size()==prefix.size() || ifname[prefix.size()]=='/')) {
967 //Match!
968 folderdata.applyOverrides(keys,msg());
969 }
970 }
971 }
972
973 //3. Remove any duplicates:
974 std::list<IOVDbParser>::iterator it1=allFolderdata.begin();
975 std::list<IOVDbParser>::iterator it_e=allFolderdata.end();
976 for (;it1!=it_e;++it1) {
977 const IOVDbParser& folder1=*it1;
978 std::list<IOVDbParser>::iterator it2=it1;
979 ++it2;
980 while(it2!=it_e) {
981 const IOVDbParser& folder2=*it2;
982 if (folder1==folder2) {
983 it2=allFolderdata.erase(it2); //FIXME: Smarter distinction/reporting about same folder but different keys.
984 ATH_MSG_DEBUG( "Removing duplicate folder " << folder1.folderName());
985 } else {
986 ++it2;
987 //Catch suspicous cases:
988 if (folder1.folderName()==folder2.folderName()) {
989 ATH_MSG_WARNING( "Folder name appears twice: " << folder1.folderName() );
990 ATH_MSG_WARNING( folder1 << " vs " << folder2 );
991 }
992 }
993 }//end inner loop
994 }//end outer loop
995
996 //4.Set up folder map with cleaned folder list
997
998 bool crestError=false;
999 for (const auto& folderdata : allFolderdata) {
1000 // find the connection specification first
1001 // default is to use the 'default' connection
1002 IOVDbConn* conn=nullptr;
1003 std::string connstr;
1004 if (folderdata.getKey("db","",connstr)) {
1005 // an explicit database name is specified
1006 // check if it is already present in the existing connections
1007 for (const auto & pThisConnection : m_connections) {
1008 if (pThisConnection->name()==connstr) {
1009 // found existing connection - use that
1010 conn=pThisConnection.get();
1011 break;
1012 }
1013 }
1014 if (conn==nullptr) {
1015 // create new read-onlyconnection
1016 conn = m_connections.emplace_back(std::make_unique<IOVDbConn>(connstr,true,msg())).get();
1017 }
1018 } else {
1019 // no connection specified - use default if available
1020 if (!m_par_defaultConnection.empty()) {
1021 conn=m_connections[0].get();
1022 } else {
1023 ATH_MSG_FATAL( "Folder request " << folderdata.folderName() <<
1024 " gives no DB connection information and no default set" );
1025 return StatusCode::FAILURE;
1026 }
1027 }
1028
1029 // create the new folder, but only if a folder for this SG key has not
1030 // already been requested
1031
1032 std::string crestTag;
1033 if (m_par_source == "CREST"){
1034 crestTag = m_cresttagmap[folderdata.folderName()];
1035 if(crestTag.empty() && folderdata.folderName() != "/TagInfo") {
1036 ATH_MSG_FATAL( "GlobalTag "<< m_par_globalTag << " does not contain folder "
1037 << folderdata.folderName());
1038 crestError=true;
1039 continue;
1040 }
1041 }
1042
1043 auto folder=std::make_unique<IOVDbFolder>(conn,folderdata,msg(),&(*m_h_clidSvc), &(*m_h_metaDataTool),
1046 const std::string& key=folder->key();
1047 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).
1048 m_foldermap[key]=std::move(folder);
1049 conn->incUsage();
1050 } else {
1051 ATH_MSG_ERROR( "Duplicate request for folder " <<
1052 folder->folderName() <<
1053 " associated to already requested Storegate key " << key );
1054 // clean up this duplicate request
1055 }
1056 }// end loop over folders
1057
1058 if(crestError)
1059 return StatusCode::FAILURE;
1060
1061 // check for folders to be written to metadata
1062 for (const auto & folderToWrite : m_par_foldersToWrite) {
1063 // match wildcard * at end of string only (i.e. /A/* matches /A/B, /A/C/D)
1064 std::string_view match=folderToWrite;
1065 std::string::size_type idx=folderToWrite.find('*');
1066 if (idx!=std::string::npos) {
1067 match=std::string_view(folderToWrite).substr(0,idx);
1068 }
1069 for (const auto & [name, folder] : m_foldermap) {
1070 if (folder->folderName().starts_with(match)) {
1071 folder->setWriteMeta();
1072 ATH_MSG_INFO( "Folder " << folder->folderName() << " will be written to file metadata" );
1073 }
1074 }//end loop over FolderMap
1075 }//end loop over m_par_foldersToWrite
1076 return StatusCode::SUCCESS;
1077}
static std::map< std::string, std::string > getGlobalTagMap(const std::string &crest_path, const std::string &globaltag)
PublicToolHandle< IIOVDbMetaDataTool > m_h_metaDataTool
Definition IOVDbSvc.h:228
Gaudi::Property< std::vector< std::string > > m_par_overrideTags
Definition IOVDbSvc.h:182
Gaudi::Property< std::vector< std::string > > m_par_folders
Definition IOVDbSvc.h:180
std::map< std::string, std::string > m_cresttagmap
Definition IOVDbSvc.h:213
ServiceHandle< IClassIDSvc > m_h_clidSvc
Definition IOVDbSvc.h:226
Gaudi::Property< std::vector< std::string > > m_par_foldersToWrite
Definition IOVDbSvc.h:184
bool match(std::string s1, std::string s2)
match the individual directories of two strings
Definition hcg.cxx:359

◆ signalBeginRun()

StatusCode IOVDbSvc::signalBeginRun ( const IOVTime & beginRunTime,
const EventContext & ctx )
overridevirtual

Set time for begin run.

Definition at line 636 of file IOVDbSvc.cxx.

638{
639 Athena::DBLock dblock;
640
641 // Begin run - set state and save time for later use
643 // Is this a different run compared to the previous call?
644 bool newRun = m_iovTime.isValid() && (m_iovTime.run() != beginRunTime.run());
645 m_iovTime=beginRunTime;
646 // For a MC event, the run number we need to use to look up the conditions
647 // may be different from that of the event itself. Override the run
648 // number with the conditions run number from the event context,
649 // if it is defined.
650 EventIDBase::number_type conditionsRun =
652 if (conditionsRun != EventIDBase::UNDEFNUM) {
653 m_iovTime.setRunEvent (conditionsRun, m_iovTime.event());
654 }
655
656 ATH_MSG_DEBUG( "signalBeginRun> begin run time " << m_iovTime);
657 if (!m_par_onlineMode) {
658 return StatusCode::SUCCESS;
659 }
660
661 // ONLINE mode: allow adding of new calibration constants between runs
662 if (!newRun) {
663 ATH_MSG_DEBUG( "Same run as previous signalBeginRun call. Skipping re-loading of folders..." );
664 return StatusCode::SUCCESS;
665 }
666
667 // all other stuff is event based so happens after this.
668 // this is before first event of each run
669 ATH_MSG_DEBUG( "In online mode will recheck ... " );
670 ATH_MSG_DEBUG( "First reload PoolCataloge ... " );
671 m_h_poolSvc->startCatalog();
672 m_h_poolSvc->commitCatalog();
673 static const std::string preLoadProxyStr{"preLoadProxy"};
674 for (const auto & pThisConnection : m_connections){
675 // only access connections which are actually in use - avoids waking up
676 // the default DB connection if it is not being used
677 if (pThisConnection->nFolders()>0) {
678 //request for database activates connection
679 cool::IDatabasePtr dbconn=pThisConnection->getCoolDb();
680 if (dbconn.get()==nullptr) {
681 ATH_MSG_FATAL( "Conditions database connection " << pThisConnection->name() << " cannot be opened - STOP" );
682 return StatusCode::FAILURE;
683 }
684 for (const auto & [name, folder]: m_foldermap) {
685 if (folder->conn()!=pThisConnection.get()) continue;
686 folder->printCache();
687 cool::ValidityKey vkey=folder->iovTime(m_iovTime);
688 {
689 Gaudi::Guards::AuditorGuard auditor(std::string("FldrCache:")+folder->folderName(), auditorSvc(), preLoadProxyStr);
690 if (!folder->loadCacheIfDbChanged(vkey, m_globalTag, dbconn, m_h_IOVSvc)) {
691 ATH_MSG_ERROR( "Problem RELOADING: " << folder->folderName());
692 return StatusCode::FAILURE;
693 }
694 }
695 folder->printCache();
696 }
697 }
698 if (m_par_manageConnections) pThisConnection->setInactive();
699 }
700 return StatusCode::SUCCESS;
701}
EventIDBase::number_type conditionsRun() const
uint32_t run() const noexcept
Definition IOVTime.h:105
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.

◆ signalEndProxyPreload()

void IOVDbSvc::signalEndProxyPreload ( )
overridevirtual

Signal that callback has been fired.

Definition at line 704 of file IOVDbSvc.cxx.

704 {
705 // this method does nothing
706}

◆ updateAddress()

StatusCode IOVDbSvc::updateAddress ( StoreID::type storeID,
SG::TransientAddress * tad,
const EventContext & ctx )
overridevirtual

Update a transient Address.

Definition at line 416 of file IOVDbSvc.cxx.

418{
419 // Provide TAD and associated range, actually reading the conditions data
420
421 // Read information for folders and setup TADs
422 if (storeID!=StoreID::DETECTOR_STORE) return StatusCode::FAILURE;
423 Gaudi::Guards::AuditorGuard auditor(std::string("UpdateAddr::")+(tad->name().empty() ? "anonymous" : tad->name()),
424 auditorSvc(), "preLoadProxy");
425
426 IOVTime iovTime{m_iovTime};
427 IOVRange range;
428 std::unique_ptr<IOpaqueAddress> address;
429
430 // first check if this key is managed by IOVDbSvc
431 // return FAILURE if not - this allows other AddressProviders to be
432 // asked for the TAD
433 const std::string& key=tad->name();
434 const auto fitr=m_foldermap.find(key);
435 if (fitr==m_foldermap.end()) {
437 "updateAddress cannot find description for TAD " << key );
438 return StatusCode::FAILURE;
439 }
440 const auto& folder=fitr->second;
441 if (folder->clid()!=tad->clID()) {
442 ATH_MSG_VERBOSE( "CLID for TAD " << key << " is " << tad->clID()
443 << " but expecting " << folder->clid() );
444
445 return StatusCode::FAILURE;
446 }
447
448 // IOVDbSvc will satisfy the request, using already found folder
449 // now determine the current IOVTime
450 if (m_state==IOVDbSvc::INITIALIZATION && !m_iovTime.isValid()) {
451 ATH_MSG_DEBUG( "updateAddress: in initialisation phase and no iovTime defined" );
452 return::StatusCode::SUCCESS;
453 }
455 // determine iovTime from eventID in the event context
456 const EventIDBase* evid = EventIDFromStore( m_h_sgSvc );
457 if( evid ) {
458 iovTime.setRunEvent( evid->run_number(), evid->lumi_block()) ;
459 // save both seconds and ns offset for timestamp
460 uint64_t nsTime = evid->time_stamp() *1000000000LL;
461 nsTime += evid->time_stamp_ns_offset();
462 iovTime.setTimestamp(nsTime);
463 m_iovTime = iovTime;
464 ATH_MSG_DEBUG( "updateAddress - using iovTime from EventInfo: " << iovTime);
465 } else {
466 // failed to get event info - just return success
467 ATH_MSG_DEBUG( "Could not get event - initialise phase");
468 return StatusCode::SUCCESS;
469 }
470 } else {
471 ATH_MSG_DEBUG("updateAddress: using iovTime from init/beginRun: " << iovTime);
472 }
473
474
475
476 // obtain the validity key for this folder (includes overrides)
477 cool::ValidityKey vkey=folder->iovTime(iovTime);
478 {
479 // The dblock is currently abused to also protect the cache in the IOVDbFolders.
480 // This global lock may give rise to deadlocks between the dblock and the internal lock
481 // of the SGImplSvc. The deadlock may arise if the order of the initial call to IOVDbSvc
482 // and SGImplSvc are different, because the two services call each other.
483 // A problem was observed when SG::DataProxy::isValidAddress first called IOVDbSvc::updateAddress
484 // which called IOVSvc::setRange then SGImplSvc::proxy, and at the same time
485 // StoreGateSvc::contains called first SGImplSvc::proxy which then called IOVDbSvc::updateAddress.
486 // This problem is mitigated by limiting the scope of the dblock here.
487 Athena::DBLock dblock;
488 ATH_MSG_DEBUG("Validity key "<<vkey);
489 if (folder->source() == "CREST") {
490 if (!folder->readMeta() && !folder->cacheValid((vkey))){
491 fitr->second->loadCache(vkey, m_par_cacheAlign,m_globalTag,m_par_onlineMode);
492 }
493 } else { //COOL reading
494 if (!folder->readMeta() && !folder->cacheValid(vkey)) {
495 // mark this folder as not-dropped so cache-read will succeed
496 folder->setDropped(false);
497 // reload cache for this folder (and all others sharing this DB connection)
498 ATH_MSG_DEBUG( "Triggering cache load for folder " << folder->folderName());
499 if (loadCaches(folder->conn()).isFailure()) {
500 ATH_MSG_ERROR( "Cache load failed for at least one folder from " << folder->conn()->name()
501 << ". You may see errors from other folders sharing the same connection." );
502 return StatusCode::FAILURE;
503 }
504 }
505 }//end cool part
506 // data should now be in cache
507 // setup address and range
508 {
509 Gaudi::Guards::AuditorGuard auditor(std::string("FldrSetup:")+(tad->name().empty() ? "anonymous" : tad->name()),
510 auditorSvc(), "preLoadProxy");
511 if (!folder->getAddress(vkey,&(*m_h_persSvc),poolSvcContext(),address,
512 range,m_poolPayloadRequested)) {
513 ATH_MSG_ERROR( "getAddress failed for folder " << folder->folderName() );
514 return StatusCode::FAILURE;
515 }
516 }
517 // reduce minimum IOV of timestamp folders to avoid 'thrashing'
518 // due to events slightly out of order in HLT
519 if (folder->timeStamp()) {
520 cool::ValidityKey start=range.start().timestamp();
521 if (start>m_iovslop) start-=m_iovslop;
522 range=IOVRange(IOVTime(start),range.stop());
523 }
524 }
525
526 // Pass range onto IOVSvc
527 if (m_h_IOVSvc->setRange(tad->clID(),tad->name(),
528 range,folder->eventStore()).isFailure()) {
529 ATH_MSG_ERROR( "setRange failed for folder " << folder->folderName() );
530 return StatusCode::FAILURE;
531 }
532 tad->setAddress(address.release());
533 return StatusCode::SUCCESS;
534}
const EventIDBase * EventIDFromStore(IProxyDict *store)
Retrieve the EventID from EventContext saved in store STORE.
void setRunEvent(uint32_t run, uint32_t event) noexcept
Definition IOVTime.cxx:96
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.

Member Data Documentation

◆ m_abort

bool IOVDbSvc::m_abort {false}
private

Definition at line 270 of file IOVDbSvc.h.

270{false};

◆ m_connections

std::vector<std::unique_ptr<IOVDbConn> > IOVDbSvc::m_connections
private

Definition at line 264 of file IOVDbSvc.h.

◆ m_crestCoolToFile

BooleanProperty IOVDbSvc::m_crestCoolToFile {this,"CrestCoolToFile",false,"output to file crest or cool data in the same format for debugging purposes"}
private

Definition at line 218 of file IOVDbSvc.h.

218{this,"CrestCoolToFile",false,"output to file crest or cool data in the same format for debugging purposes"};

◆ m_cresttagmap

std::map<std::string, std::string> IOVDbSvc::m_cresttagmap
private

Definition at line 213 of file IOVDbSvc.h.

◆ m_foldermap

FolderMap IOVDbSvc::m_foldermap
private

Definition at line 268 of file IOVDbSvc.h.

◆ m_globalTag

std::string IOVDbSvc::m_globalTag {}
private

Definition at line 258 of file IOVDbSvc.h.

258{};

◆ m_h_clidSvc

ServiceHandle<IClassIDSvc> IOVDbSvc::m_h_clidSvc {this,"ClassIDSvc","ClassIDSvc"}
private

Definition at line 226 of file IOVDbSvc.h.

226{this,"ClassIDSvc","ClassIDSvc"};

◆ m_h_detStore

ServiceHandle<StoreGateSvc> IOVDbSvc::m_h_detStore {this,"DetectorStore","DetectorStore"}
private

Definition at line 223 of file IOVDbSvc.h.

223{this,"DetectorStore","DetectorStore"};

◆ m_h_IOVSvc

ServiceHandle<IIOVSvc> IOVDbSvc::m_h_IOVSvc {this,"IOVSvc","IOVSvc"}
private

Definition at line 221 of file IOVDbSvc.h.

221{this,"IOVSvc","IOVSvc"};

◆ m_h_metaDataStore

ServiceHandle<StoreGateSvc> IOVDbSvc::m_h_metaDataStore {this,"MetaDataStore","StoreGateSvc/MetaDataStore"}
private

Definition at line 224 of file IOVDbSvc.h.

224{this,"MetaDataStore","StoreGateSvc/MetaDataStore"};

◆ m_h_metaDataTool

PublicToolHandle<IIOVDbMetaDataTool> IOVDbSvc::m_h_metaDataTool {this,"IOVDbMetaDataTool","IOVDbMetaDataTool"}
private

Definition at line 228 of file IOVDbSvc.h.

228{this,"IOVDbMetaDataTool","IOVDbMetaDataTool"};

◆ m_h_persSvc

ServiceHandle<IAddressCreator> IOVDbSvc::m_h_persSvc {this,"EventPersistencySvc","EventPersistencySvc"}
private

Definition at line 225 of file IOVDbSvc.h.

225{this,"EventPersistencySvc","EventPersistencySvc"};

◆ m_h_poolSvc

ServiceHandle<IPoolSvc> IOVDbSvc::m_h_poolSvc {this,"PoolSvc","PoolSvc"}
private

Definition at line 227 of file IOVDbSvc.h.

227{this,"PoolSvc","PoolSvc"};

◆ m_h_sgSvc

ServiceHandle<StoreGateSvc> IOVDbSvc::m_h_sgSvc {this,"StoreGateSvc","StoreGateSvc"}
private

Definition at line 222 of file IOVDbSvc.h.

222{this,"StoreGateSvc","StoreGateSvc"};

◆ m_h_tagInfoMgr

ServiceHandle<ITagInfoMgr> IOVDbSvc::m_h_tagInfoMgr {this,"TagInfoMgr","TagInfoMgr"}
private

Definition at line 229 of file IOVDbSvc.h.

229{this,"TagInfoMgr","TagInfoMgr"};

◆ m_iovslop

cool::ValidityKey IOVDbSvc::m_iovslop {}
private

Definition at line 261 of file IOVDbSvc.h.

261{};

◆ m_iovTime

IOVTime IOVDbSvc::m_iovTime {}
private

Definition at line 255 of file IOVDbSvc.h.

255{};

◆ m_outputToFile

BooleanProperty IOVDbSvc::m_outputToFile {this,"OutputToFile",false,"output to file for debugging purposes"}
private

Definition at line 217 of file IOVDbSvc.h.

217{this,"OutputToFile",false,"output to file for debugging purposes"};

◆ m_par_cacheAlign

UnsignedIntegerProperty IOVDbSvc::m_par_cacheAlign {this,"CacheAlign",0,"cache alignment - divide cache into N slices and align queries on slice"}
private

Definition at line 205 of file IOVDbSvc.h.

205{this,"CacheAlign",0,"cache alignment - divide cache into N slices and align queries on slice"};

◆ m_par_cacheRun

IntegerProperty IOVDbSvc::m_par_cacheRun {this,"CacheRun",0,"force larger numbers of runs to be cached"}
private

Definition at line 200 of file IOVDbSvc.h.

200{this,"CacheRun",0,"force larger numbers of runs to be cached"};

◆ m_par_cacheTime

IntegerProperty IOVDbSvc::m_par_cacheTime {this,"CacheTime",0,"force larger timeranges to be cached (seconds)"}
private

Definition at line 202 of file IOVDbSvc.h.

202{this,"CacheTime",0,"force larger timeranges to be cached (seconds)"};

◆ m_par_checklock

BooleanProperty IOVDbSvc::m_par_checklock {this,"CheckLock",false,"check to ensure global/HVS tags are locked (for production)"}
private

Definition at line 209 of file IOVDbSvc.h.

209{this,"CheckLock",false,"check to ensure global/HVS tags are locked (for production)"};

◆ m_par_dbinst

Gaudi::Property<std::string> IOVDbSvc::m_par_dbinst {this,"DBInstance","","Database instance (like OFLP200)"}
private

Definition at line 178 of file IOVDbSvc.h.

178{this,"DBInstance","","Database instance (like OFLP200)"};

◆ m_par_defaultConnection

Gaudi::Property<std::string> IOVDbSvc::m_par_defaultConnection {this,"dbConnection","sqlite://;schema=cooldummy.db;dbname=OFLP200","default DB connection string"}
private

Definition at line 174 of file IOVDbSvc.h.

174{this,"dbConnection","sqlite://;schema=cooldummy.db;dbname=OFLP200","default DB connection string"};

◆ m_par_folders

Gaudi::Property<std::vector<std::string> > IOVDbSvc::m_par_folders {this,"Folders",{},"List of database folders to preload","OrderedSet<std::string>"}
private

Definition at line 180 of file IOVDbSvc.h.

180{this,"Folders",{},"List of database folders to preload","OrderedSet<std::string>"};

◆ m_par_foldersToWrite

Gaudi::Property<std::vector<std::string> > IOVDbSvc::m_par_foldersToWrite {this,"FoldersToMetaData",{},"list of folders to write to file meta data","OrderedSet<std::string>"}
private

Definition at line 184 of file IOVDbSvc.h.

184{this,"FoldersToMetaData",{},"list of folders to write to file meta data","OrderedSet<std::string>"};

◆ m_par_forceLumiblockNumber

IntegerProperty IOVDbSvc::m_par_forceLumiblockNumber {this,"forceLumiblockNumber",0,"globally force LB-number (default: no force)"}
private

Definition at line 192 of file IOVDbSvc.h.

192{this,"forceLumiblockNumber",0,"globally force LB-number (default: no force)"};

◆ m_par_forceRunNumber

IntegerProperty IOVDbSvc::m_par_forceRunNumber {this,"forceRunNumber",0,"globally force run-number (default: no force)"}
private

Definition at line 190 of file IOVDbSvc.h.

190{this,"forceRunNumber",0,"globally force run-number (default: no force)"};

◆ m_par_forceTimestamp

IntegerProperty IOVDbSvc::m_par_forceTimestamp {this,"forceTimeStamp",0,"globally force time-stamp (default: no force)"}
private

Definition at line 194 of file IOVDbSvc.h.

194{this,"forceTimeStamp",0,"globally force time-stamp (default: no force)"};

◆ m_par_format

StringProperty IOVDbSvc::m_par_format {this,"Format",{},"Format of data; default is empty string (default for a given source)"}
private

Definition at line 215 of file IOVDbSvc.h.

215{this,"Format",{},"Format of data; default is empty string (default for a given source)"};

◆ m_par_globalTag

Gaudi::Property<std::string> IOVDbSvc::m_par_globalTag {this,"GlobalTag","","Global database tag"}
private

Definition at line 176 of file IOVDbSvc.h.

176{this,"GlobalTag","","Global database tag"};

◆ m_par_manageConnections

BooleanProperty IOVDbSvc::m_par_manageConnections {this,"ManageConnections",true,"flag to trigger the connections management"}
private

Definition at line 186 of file IOVDbSvc.h.

186{this,"ManageConnections",true,"flag to trigger the connections management"};

◆ m_par_managePoolConnections

BooleanProperty IOVDbSvc::m_par_managePoolConnections {this,"ManagePoolConnections",true,"flag to manage pool connections"}
private

Definition at line 188 of file IOVDbSvc.h.

188{this,"ManagePoolConnections",true,"flag to manage pool connections"};

◆ m_par_maxNumPoolFiles

IntegerProperty IOVDbSvc::m_par_maxNumPoolFiles {this,"MaxPoolFilesOpen",5,"max number of pool files open allowed (0 means no limit)"}
private

Definition at line 196 of file IOVDbSvc.h.

196{this,"MaxPoolFilesOpen",5,"max number of pool files open allowed (0 means no limit)"};

◆ m_par_onlineMode

BooleanProperty IOVDbSvc::m_par_onlineMode {this,"OnlineMode",false,"online mode flag to ignore missing channels outside cache range"}
private

Definition at line 207 of file IOVDbSvc.h.

207{this,"OnlineMode",false,"online mode flag to ignore missing channels outside cache range"};

◆ m_par_overrideTags

Gaudi::Property<std::vector<std::string> > IOVDbSvc::m_par_overrideTags {this,"overrideTags",{},"List of xml-modifiers for folders like <prefix>/My/Folder</prefix><tag>MyFolderTag</tag>","OrderedSet<std::string>"}
private

Definition at line 182 of file IOVDbSvc.h.

182{this,"overrideTags",{},"List of xml-modifiers for folders like <prefix>/My/Folder</prefix><tag>MyFolderTag</tag>","OrderedSet<std::string>"};

◆ m_par_source

StringProperty IOVDbSvc::m_par_source {this,"Source","COOL_DATABASE","source of data as a string (default COOL_DATABASE)"}
private

Definition at line 211 of file IOVDbSvc.h.

211{this,"Source","COOL_DATABASE","source of data as a string (default COOL_DATABASE)"};

◆ m_par_timeStampSlop

FloatProperty IOVDbSvc::m_par_timeStampSlop {this,"TimeStampSlop",0.0,"backdata timestamp IOVs by this many seconds"}
private

Definition at line 198 of file IOVDbSvc.h.

198{this,"TimeStampSlop",0.0,"backdata timestamp IOVs by this many seconds"};

◆ m_poolPayloadRequested

bool IOVDbSvc::m_poolPayloadRequested {false}
private

Definition at line 234 of file IOVDbSvc.h.

234{false};

◆ m_poolSvcContext

int IOVDbSvc::m_poolSvcContext {-1}
private

Definition at line 238 of file IOVDbSvc.h.

238{-1};

◆ m_state

IOVDbSvc_state IOVDbSvc::m_state {INITIALIZATION}
private

Definition at line 252 of file IOVDbSvc.h.


The documentation for this class was generated from the following files: