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)"}
StringProperty m_par_crestServer {this,"crestServer","https://crest.cern.ch","CREST URL with the port number as a string (default https://crest.cern.ch)"}
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 269 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 248 of file IOVDbSvc.h.

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

Member Function Documentation

◆ checkConfigConsistency()

StatusCode IOVDbSvc::checkConfigConsistency ( ) const
private

Definition at line 1158 of file IOVDbSvc.cxx.

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

◆ checkEventSel()

StatusCode IOVDbSvc::checkEventSel ( )
private

Definition at line 858 of file IOVDbSvc.cxx.

858 {
859 // check if EventSelector is being used to override run numbers
860 // if so, we can set IOV time already to allow conditons retrieval
861 // in the initialise phase, needed for setting up simulation
862
863 ServiceHandle<Gaudi::Interfaces::IOptionsSvc> joSvc("JobOptionsSvc",name());
864 ATH_CHECK( joSvc.retrieve() );
865
866 if (!joSvc->has("EventSelector.OverrideRunNumber")) {
867 // do not return FAILURE if the EventSelector cannot be found, or it has
868 // no override property, can e.g. happen in online running
869 ATH_MSG_DEBUG( "No EventSelector.OverrideRunNumber property found" );
870 return StatusCode::SUCCESS;
871 }
872
873 BooleanProperty overrideRunNumber("OverrideRunNumber",false);
874 ATH_CHECK( overrideRunNumber.fromString(joSvc->get("EventSelector.OverrideRunNumber")) );
875 if (overrideRunNumber) {
876 // if flag is set, extract Run,LB and time
877 ATH_MSG_INFO( "Setting run/LB/time from EventSelector override in initialize" );
878 uint32_t run,lumib;
880 bool allGood=true;
882 ATH_MSG_WARNING( "forceRunNumber property also set" );
883 }
884 IntegerProperty iprop1("RunNumber",0);
885 if (iprop1.fromString(joSvc->get("EventSelector.RunNumber","INVALID"))) {
886 run=iprop1;
887 } else {
888 ATH_MSG_ERROR( "Unable to get RunNumber from EventSelector");
889 allGood=false;
890 }
891 IntegerProperty iprop2("FirstLB",0);
892 if (iprop2.fromString(joSvc->get("EventSelector.FirstLB","INVALID"))) {
893 lumib=iprop2;
894 } else {
895 ATH_MSG_ERROR( "Unable to get FirstLB from EventSelector");
896 allGood=false;
897 }
898 IntegerProperty iprop3("InitialTimeStamp",0);
899 if (iprop3.fromString(joSvc->get("EventSelector.InitialTimeStamp","INVALID"))) {
900 time=iprop3;
901 } else {
902 ATH_MSG_ERROR("Unable to get InitialTimeStamp from EventSelector" );
903 allGood=false;
904 }
905 if (allGood) {
906 m_iovTime.setRunEvent(run,lumib);
907 uint64_t nsTime=time*1000000000LL;
908 m_iovTime.setTimestamp(nsTime);
909 ATH_MSG_INFO( "run/LB/time set to [" << run << "," << lumib << " : " << nsTime << "]" );
910 } else {
911 ATH_MSG_ERROR( "run/LB/Time NOT changed" );
912 }
913 }
914
915 return StatusCode::SUCCESS;
916}
#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:257
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 830 of file IOVDbSvc.cxx.

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

◆ fillTagInfo()

StatusCode IOVDbSvc::fillTagInfo ( )
private

Definition at line 1081 of file IOVDbSvc.cxx.

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

◆ finalize()

StatusCode IOVDbSvc::finalize ( )
overridevirtual

Service finalize.

Definition at line 235 of file IOVDbSvc.cxx.

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

◆ getDatabase()

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

Access to COOL database for a given folder.

Definition at line 267 of file IOVDbSvc.cxx.

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

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

◆ getKeyList()

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

Definition at line 802 of file IOVDbSvc.cxx.

802 {
803 // return a list of all the StoreGate keys being managed by IOVDbSvc
804 auto keys = std::views::keys(m_foldermap);
805 return {keys.begin(), keys.end()};
806}

◆ 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 538 of file IOVDbSvc.cxx.

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

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

◆ initialize()

StatusCode IOVDbSvc::initialize ( )
overridevirtual

Service init.

Definition at line 144 of file IOVDbSvc.cxx.

144 {
145 // subscribe to events
146 ServiceHandle<IIncidentSvc> incSvc("IncidentSvc",name());
147 ATH_CHECK( incSvc.retrieve() );
148 const long int pri = 100;
149 incSvc->addListener( this, IncidentType::BeginEvent, pri );
150 incSvc->addListener( this, "StoreCleared", pri ); // for SP Athena
151 incSvc->addListener( this, IncidentType::EndProcessing, pri ); // for MT Athena
152
153 // Register this service for 'I/O' events
154 ServiceHandle<IIoComponentMgr> iomgr("IoComponentMgr", name());
155 ATH_CHECK( iomgr.retrieve() );
156 ATH_CHECK( iomgr->io_register(this) );
157
158 // print warnings/info depending on state of job options
160 ATH_MSG_INFO( "COOL connection management disabled - connections kept open throughout job" );
162 ATH_MSG_INFO( "POOL file connection management disabled - files kept open throught job" );
163 if (m_par_maxNumPoolFiles > 0)
164 ATH_MSG_INFO( "Only " << m_par_maxNumPoolFiles.value() << " POOL conditions files will be open at once" );
166 ATH_MSG_WARNING( "Global run/LB number forced to be [" <<
167 m_par_forceRunNumber.value() << "," << m_par_forceLumiblockNumber.value() << "]" );
168 if (m_par_forceTimestamp > 0)
169 ATH_MSG_WARNING( "Global timestamp forced to be " << m_par_forceTimestamp.value() );
170 if (m_par_cacheRun > 0)
171 ATH_MSG_INFO( "Run-LB data will be cached in groups of " << m_par_cacheRun.value() << " runs" );
172 if (m_par_cacheTime > 0)
173 ATH_MSG_INFO( "Timestamp data will be cached in groups of " << m_par_cacheTime.value() << " seconds" );
174 if (m_par_cacheAlign > 0)
175 ATH_MSG_INFO( "Cache alignment will be done in " << m_par_cacheAlign.value() << " slices" );
176 if (m_par_onlineMode)
177 ATH_MSG_INFO( "Online mode ignoring potential missing channels outside cache" );
178 if (m_par_checklock)
179 ATH_MSG_INFO( "Tags will be required to be locked");
180
181 // make sure iovTime is undefined
182 m_iovTime.reset();
183
184 // extract information from EventSelector for run/LB/time overrides
186
187 // initialise default connection
188 if (!m_par_defaultConnection.empty()) {
189 // default connection is readonly if no : in name (i.e. logical conn)
190 bool readonly=(m_par_defaultConnection.find(':')==std::string::npos);
191 m_connections.push_back(std::make_unique<IOVDbConn>(m_par_defaultConnection,readonly,msg()));
192 }
193
194 // set time of timestampslop in nanoseconds
195 m_iovslop=static_cast<cool::ValidityKey>(m_par_timeStampSlop*1.E9);
196
197 // check for global tag in jobopt, which will override anything in input file
198 if (!m_par_globalTag.empty()) {
200 ATH_MSG_INFO( "Global tag: " << m_par_globalTag.value() << " set from joboptions" );
201 }
202
203 // setup folders and process tag overrides
205
206 // Set state to initialize
208 ATH_MSG_INFO( "Initialised with " << m_connections.size() <<
209 " connections and " << m_foldermap.size() << " folders" );
210
211 if (m_outputToFile) ATH_MSG_INFO("Db dump to file activated");
212 if (m_crestCoolToFile) ATH_MSG_INFO("Crest or Cool dump to file activated");
213
214 ATH_MSG_INFO( "Service IOVDbSvc initialised successfully" );
215
217 return StatusCode::SUCCESS;
218}
BooleanProperty m_par_managePoolConnections
Definition IOVDbSvc.h:188
BooleanProperty m_crestCoolToFile
Definition IOVDbSvc.h:220
BooleanProperty m_outputToFile
Definition IOVDbSvc.h:219
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:858
StatusCode setupFolders()
Definition IOVDbSvc.cxx:919
IntegerProperty m_par_cacheTime
Definition IOVDbSvc.h:202
FloatProperty m_par_timeStampSlop
Definition IOVDbSvc.h:198
cool::ValidityKey m_iovslop
Definition IOVDbSvc.h:263
MsgStream & msg
Definition testRead.cxx:32

◆ io_finalize()

StatusCode IOVDbSvc::io_finalize ( )
finaloverride

Definition at line 229 of file IOVDbSvc.cxx.

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

◆ io_reinit()

StatusCode IOVDbSvc::io_reinit ( )
finaloverride

Definition at line 221 of file IOVDbSvc.cxx.

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

◆ loadAddresses()

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

Get all new addresses from Provider for this Event.

Definition at line 411 of file IOVDbSvc.cxx.

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

◆ loadCaches()

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

Definition at line 1113 of file IOVDbSvc.cxx.

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

◆ poolSvcContext()

int IOVDbSvc::poolSvcContext ( )
private

Definition at line 124 of file IOVDbSvc.cxx.

125{
126 if( m_poolSvcContext < 0 ) {
127 // Get context for POOL conditions files, and created an initial connection
129 m_poolSvcContext=m_h_poolSvc->getInputContext("Conditions", m_par_maxNumPoolFiles);
130 } else {
131 m_poolSvcContext=m_h_poolSvc->getInputContext("Conditions");
132 }
133 if( m_h_poolSvc->connect(Io::READ, m_poolSvcContext).isSuccess() ) {
134 ATH_MSG_INFO( "Opened read transaction for POOL PersistencySvc");
135 } else {
136 // We only emit info for failure to connect (for the moment? RDS 01/2008)
137 ATH_MSG_INFO( "Cannot connect to POOL PersistencySvc" );
138 }
139 }
140 return m_poolSvcContext;
141}
ServiceHandle< IPoolSvc > m_h_poolSvc
Definition IOVDbSvc.h:229

◆ postConditionsLoad()

void IOVDbSvc::postConditionsLoad ( )
overridevirtual

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

Definition at line 713 of file IOVDbSvc.cxx.

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

◆ 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 286 of file IOVDbSvc.cxx.

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

◆ processTagInfo()

StatusCode IOVDbSvc::processTagInfo ( )
overridevirtual

Process TagInfo.

Definition at line 761 of file IOVDbSvc.cxx.

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

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

◆ setupFolders()

StatusCode IOVDbSvc::setupFolders ( )
private

Definition at line 919 of file IOVDbSvc.cxx.

919 {
920 // read the Folders joboptions and setup the folder list
921 // no wildcards are allowed
922
923 // getting the pairs: folder name - CREST tag name:
924 if (m_par_source == "CREST"){
925 auto mLevel = static_cast<std::underlying_type_t<MSG::Level>>(msg().level());
926 Crest::LogLevel cLevel = static_cast<Crest::LogLevel>(mLevel);
927 Crest::Logger::setLogLevel(cLevel);
928 m_cresttagmap.clear();
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 - db or dbConnection
1001 // default is to use the 'default' connection
1002 IOVDbConn* conn=nullptr;
1003 std::string connstr;
1004 if (folderdata.getKey("db","",connstr) ||
1005 folderdata.getKey("dbConnection","",connstr)) {
1006 // an explicit database name is specified
1007 // check if it is already present in the existing connections
1008 for (const auto & pThisConnection : m_connections) {
1009 if (pThisConnection->name()==connstr) {
1010 // found existing connection - use that
1011 conn=pThisConnection.get();
1012 break;
1013 }
1014 }
1015 if (conn==nullptr) {
1016 // create new read-onlyconnection
1017 conn = m_connections.emplace_back(std::make_unique<IOVDbConn>(connstr,true,msg())).get();
1018 }
1019 } else {
1020 // no connection specified - use default if available
1021 if (!m_par_defaultConnection.empty()) {
1022 conn=m_connections[0].get();
1023 } else {
1024 ATH_MSG_FATAL( "Folder request " << folderdata.folderName() <<
1025 " gives no DB connection information and no default set" );
1026 return StatusCode::FAILURE;
1027 }
1028 }
1029
1030 // create the new folder, but only if a folder for this SG key has not
1031 // already been requested
1032
1033 std::string crestTag;
1034 if (m_par_source == "CREST"){
1035 crestTag = m_cresttagmap[folderdata.folderName()];
1036 if(crestTag.empty() && folderdata.folderName() != "/TagInfo") {
1037 ATH_MSG_FATAL( "GlobalTag "<< m_par_globalTag << " does not contain folder "
1038 << folderdata.folderName());
1039 crestError=true;
1040 continue;
1041 }
1042 }
1043
1044 auto folder=std::make_unique<IOVDbFolder>(conn,folderdata,msg(),&(*m_h_clidSvc), &(*m_h_metaDataTool),
1047 const std::string& key=folder->key();
1048 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).
1049 m_foldermap[key]=std::move(folder);
1050 conn->incUsage();
1051 } else {
1052 ATH_MSG_ERROR( "Duplicate request for folder " <<
1053 folder->folderName() <<
1054 " associated to already requested Storegate key " << key );
1055 // clean up this duplicate request
1056 }
1057 }// end loop over folders
1058
1059 if(crestError)
1060 return StatusCode::FAILURE;
1061
1062 // check for folders to be written to metadata
1063 for (const auto & folderToWrite : m_par_foldersToWrite) {
1064 // match wildcard * at end of string only (i.e. /A/* matches /A/B, /A/C/D)
1065 std::string_view match=folderToWrite;
1066 std::string::size_type idx=folderToWrite.find('*');
1067 if (idx!=std::string::npos) {
1068 match=std::string_view(folderToWrite).substr(0,idx);
1069 }
1070 for (const auto & [name, folder] : m_foldermap) {
1071 if (folder->folderName().starts_with(match)) {
1072 folder->setWriteMeta();
1073 ATH_MSG_INFO( "Folder " << folder->folderName() << " will be written to file metadata" );
1074 }
1075 }//end loop over FolderMap
1076 }//end loop over m_par_foldersToWrite
1077 return StatusCode::SUCCESS;
1078}
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:230
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:215
ServiceHandle< IClassIDSvc > m_h_clidSvc
Definition IOVDbSvc.h:228
Gaudi::Property< std::vector< std::string > > m_par_foldersToWrite
Definition IOVDbSvc.h:184
StringProperty m_par_crestServer
Definition IOVDbSvc.h:213
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 637 of file IOVDbSvc.cxx.

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

708 {
709 // this method does nothing
710}

◆ updateAddress()

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

Update a transient Address.

Definition at line 417 of file IOVDbSvc.cxx.

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

272{false};

◆ m_connections

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

Definition at line 266 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 220 of file IOVDbSvc.h.

220{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 215 of file IOVDbSvc.h.

◆ m_foldermap

FolderMap IOVDbSvc::m_foldermap
private

Definition at line 270 of file IOVDbSvc.h.

◆ m_globalTag

std::string IOVDbSvc::m_globalTag {}
private

Definition at line 260 of file IOVDbSvc.h.

260{};

◆ m_h_clidSvc

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

Definition at line 228 of file IOVDbSvc.h.

228{this,"ClassIDSvc","ClassIDSvc"};

◆ m_h_detStore

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

Definition at line 225 of file IOVDbSvc.h.

225{this,"DetectorStore","DetectorStore"};

◆ m_h_IOVSvc

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

Definition at line 223 of file IOVDbSvc.h.

223{this,"IOVSvc","IOVSvc"};

◆ m_h_metaDataStore

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

Definition at line 226 of file IOVDbSvc.h.

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

◆ m_h_metaDataTool

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

Definition at line 230 of file IOVDbSvc.h.

230{this,"IOVDbMetaDataTool","IOVDbMetaDataTool"};

◆ m_h_persSvc

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

Definition at line 227 of file IOVDbSvc.h.

227{this,"EventPersistencySvc","EventPersistencySvc"};

◆ m_h_poolSvc

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

Definition at line 229 of file IOVDbSvc.h.

229{this,"PoolSvc","PoolSvc"};

◆ m_h_sgSvc

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

Definition at line 224 of file IOVDbSvc.h.

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

◆ m_h_tagInfoMgr

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

Definition at line 231 of file IOVDbSvc.h.

231{this,"TagInfoMgr","TagInfoMgr"};

◆ m_iovslop

cool::ValidityKey IOVDbSvc::m_iovslop {}
private

Definition at line 263 of file IOVDbSvc.h.

263{};

◆ m_iovTime

IOVTime IOVDbSvc::m_iovTime {}
private

Definition at line 257 of file IOVDbSvc.h.

257{};

◆ m_outputToFile

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

Definition at line 219 of file IOVDbSvc.h.

219{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_crestServer

StringProperty IOVDbSvc::m_par_crestServer {this,"crestServer","https://crest.cern.ch","CREST URL with the port number as a string (default https://crest.cern.ch)"}
private

Definition at line 213 of file IOVDbSvc.h.

213{this,"crestServer","https://crest.cern.ch","CREST URL with the port number as a string (default https://crest.cern.ch)"};

◆ 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 217 of file IOVDbSvc.h.

217{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 236 of file IOVDbSvc.h.

236{false};

◆ m_poolSvcContext

int IOVDbSvc::m_poolSvcContext {-1}
private

Definition at line 240 of file IOVDbSvc.h.

240{-1};

◆ m_state

IOVDbSvc_state IOVDbSvc::m_state {INITIALIZATION}
private

Definition at line 254 of file IOVDbSvc.h.


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