From 80a37402099807535e51b4931b9deef9a373a864 Mon Sep 17 00:00:00 2001 From: scott snyder <snyder@bnl.gov> Date: Fri, 28 Jun 2024 21:49:21 +0200 Subject: [PATCH 1/3] PersistentDataModel: Add dhFormToken to DataHeader. Track the DhForm token in the transient DataHeader. This is to allow skipping the key registration step if the format has not changed. --- .../PersistentDataModel/DataHeader.h | 8 +++++++- Database/PersistentDataModel/src/DataHeader.cxx | 10 ++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Database/PersistentDataModel/PersistentDataModel/DataHeader.h b/Database/PersistentDataModel/PersistentDataModel/DataHeader.h index a36aef566bd8..f89e6ceb23c6 100755 --- a/Database/PersistentDataModel/PersistentDataModel/DataHeader.h +++ b/Database/PersistentDataModel/PersistentDataModel/DataHeader.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration */ #ifndef PERSISTENTDATAMODEL_DATAHEADER_H @@ -182,6 +182,10 @@ public: // Non-static members /// Add new entry to hash map void addHash(IStringPool* pool); + /// Form token, to be able to tell when the form changes. + const std::string& dhFormToken() const; + void setDhFormToken(const std::string& formToken); + void setAttributeList(const coral::AttributeList* attrList); const coral::AttributeList* getAttributeList(); void setEvtRefTokenStr(const std::string& tokenStr); @@ -208,6 +212,8 @@ private: const coral::AttributeList* m_attrList; /// Optional Token String for Event Reference to enable writing of TAG to Payload files. std::string m_evtRefTokenStr; + /// Token to the DH format object. + std::string m_dhFormToken; }; #include "AthenaKernel/CLASS_DEF.h" diff --git a/Database/PersistentDataModel/src/DataHeader.cxx b/Database/PersistentDataModel/src/DataHeader.cxx index 6364c3cda3be..e1f263cbf544 100755 --- a/Database/PersistentDataModel/src/DataHeader.cxx +++ b/Database/PersistentDataModel/src/DataHeader.cxx @@ -286,6 +286,16 @@ void DataHeader::addHash(IStringPool* pool) { } } //______________________________________________________________________________ +const std::string& DataHeader::dhFormToken() const +{ + return m_dhFormToken; +} +//______________________________________________________________________________ +void DataHeader::setDhFormToken(const std::string& formToken) +{ + m_dhFormToken = formToken; +} +//______________________________________________________________________________ void DataHeader::setAttributeList(const coral::AttributeList* attrList) { m_attrList = attrList; } -- GitLab From bfc0613a32cf8e4ea4360780668a41d9c287f724 Mon Sep 17 00:00:00 2001 From: scott snyder <snyder@bnl.gov> Date: Fri, 28 Jun 2024 21:50:33 +0200 Subject: [PATCH 2/3] PersistentDataModelTPCnv: Add dhFormToken to DataHeader. Track the DhForm token in the transient DataHeader. This is to allow skipping the key registration step if the format has not changed. --- Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx | 3 ++- Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx index c6977d5f3698..4bf905c27ebe 100755 --- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx +++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration */ /** @file DataHeaderCnv_p5.cxx @@ -218,6 +218,7 @@ void DataHeaderCnv_p5::persToTrans(const DataHeader_p5& pers, { unsigned int entry = 1; const unsigned int provSize = dhForm.params(entry)[0]; + trans.setDhFormToken (pers.dhFormToken()); trans.m_inputDataHeader.resize(provSize); std::vector<DataHeaderElement>::iterator it = trans.m_inputDataHeader.begin(); std::vector<DataHeaderElement_p5>::const_iterator pit = pers.m_dataHeader.begin(); diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx index ddc1f18e32af..1f49396de8cb 100755 --- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx +++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx @@ -60,6 +60,7 @@ DataHeader* DataHeaderCnv_p6::createTransient( const DataHeader_p6* pers, const Token* dhToken ) const { DataHeader* trans = new DataHeader(); + trans->setDhFormToken (pers->dhFormToken()); const unsigned int provSize = pers->m_provenanceSize; trans->m_inputDataHeader.resize(provSize); // DataHeaders with a self Reference at the end have the list longer by 1 element -- GitLab From 211ca57da0bc7145d8801b60a6250caf043daae4 Mon Sep 17 00:00:00 2001 From: scott snyder <snyder@bnl.gov> Date: Fri, 28 Jun 2024 21:53:18 +0200 Subject: [PATCH 3/3] EventSelectorAthenaPool: Skip calling registerKeys repeatedly with the same form. We can skip calling registerKeys() if we've seen the same DH form before. Speeds up analysis use cases. --- .../src/AthenaPoolAddressProviderSvc.cxx | 7 ++++++- .../src/AthenaPoolAddressProviderSvc.h | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx index c15460704973..f432433c5035 100755 --- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx +++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx @@ -129,8 +129,14 @@ StatusCode AthenaPoolAddressProviderSvc::loadAddresses(StoreID::type storeID, } ATH_MSG_DEBUG("Created dataHeader SecondaryEventSelector"); } + /// Only call registerKeys() if we haven't seen this form before. + bool doRegister = dataHeader->dhFormToken().empty() || + m_dhFormKeys.emplace (dataHeader->dhFormToken()).second; ATH_MSG_DEBUG("The current Event contains: " << dataHeader->size() << " objects"); for (const auto& element : *dataHeader) { + if (doRegister) { + EventSelectorAthenaPoolUtil::registerKeys(element, eventStore()); + } SG::TransientAddress* tadd = element.getAddress(); if (tadd->clID() == ClassID_traits<DataHeader>::ID()) { // self reference delete tadd; tadd = nullptr; @@ -139,7 +145,6 @@ StatusCode AthenaPoolAddressProviderSvc::loadAddresses(StoreID::type storeID, tadd->setProvider(this, storeID); tads.push_back(tadd); } - EventSelectorAthenaPoolUtil::registerKeys(element, eventStore()); } m_guid = thisFile; return(StatusCode::SUCCESS); diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h index 4d0afd648ab6..b0140cba874b 100755 --- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h +++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h @@ -18,6 +18,7 @@ #include "PersistentDataModel/Guid.h" #include <string> +#include <unordered_set> class IClassIDSvc; @@ -56,6 +57,8 @@ private: // data ServiceHandle<StoreGateSvc> m_metaDataStore; ServiceHandle<IClassIDSvc> m_clidSvc; Guid m_guid; + /// Set of DataHeader form keys for which we've already done registerKeys. + std::unordered_set<std::string> m_dhFormKeys; private: // properties Gaudi::Property<std::string> m_dataHeaderKey{this, "DataHeaderKey", "EventSelector", -- GitLab