12#include "GaudiKernel/MsgStream.h"
13#include "GaudiKernel/GenericAddress.h"
14#include "GaudiKernel/Algorithm.h"
15#include "GaudiKernel/IAlgManager.h"
16#include "GaudiKernel/IClassIDSvc.h"
36 base_class(name, pSvcLocator),
47StatusCode AddressRemappingSvc::initialize() {
57 for (
const std::string& overwrite : m_overwriteMaps) {
58 const std::string::size_type p_sep = overwrite.find(
"->");
59 if (p_sep == std::string::npos) {
60 ATH_MSG_ERROR(
"Unexpected format in TypeKeyOverwriteMaps: " << overwrite);
61 return(StatusCode::FAILURE);
64 const std::pair<std::string, std::string>
entry(overwrite.substr(p_sep + 2), overwrite.substr(0, p_sep));
66 <<
" -> " <<
entry.first);
67 const std::string::size_type p_oldSep =
entry.first.find(
'#');
68 if (p_oldSep == std::string::npos) {
69 ATH_MSG_ERROR(
"Unexpected format in TypeKeyOverwriteMaps: " << overwrite);
70 return(StatusCode::FAILURE);
73 std::string clidStr =
entry.first.substr(0, p_oldSep);
74 std::set<CLID> symClids;
75 for (std::string::size_type p_clidSep = clidStr.rfind(
','); p_clidSep != std::string::npos; clidStr.resize(p_clidSep), p_clidSep = clidStr.rfind(
',')) {
76 symClids.insert(
getClid(clidStr.substr(p_clidSep + 1)));
78 std::string keyStr =
entry.first.substr(p_oldSep + 1);
79 SG::TransientAddress oldTad(
getClid(clidStr), keyStr);
80 for (std::string::size_type p_keySep = keyStr.rfind(
','); p_keySep != std::string::npos; keyStr.resize(p_keySep), p_keySep = keyStr.rfind(
',')) {
81 oldTad.setAlias(keyStr.substr(p_keySep + 1));
83 for (
CLID clid : symClids) {
84 oldTad.setTransientID(clid);
87 const std::string::size_type p_newSep =
entry.second.find(
'#');
88 if (p_newSep == std::string::npos) {
89 ATH_MSG_ERROR(
"Unexpected format in TypeKeyOverwriteMaps: " << overwrite);
90 return(StatusCode::FAILURE);
92 SG::TransientAddress newTad(
getClid(
entry.second.substr(0, p_newSep)),
entry.second.substr(p_newSep + 1));
93 ATH_MSG_INFO(
"TypeKeyOverwriteMaps for: " << newTad.clID()
94 <<
"#" << newTad.name()
95 <<
" -> " << oldTad.clID()
96 <<
"#" << oldTad.name());
103 return(StatusCode::SUCCESS);
115 if (toadd.empty())
return;
119 auto newmap = std::make_unique<InputRenameMap_t> (*u);
120 for (
const auto& p : toadd)
122 u.update (std::move (newmap));
128StatusCode AddressRemappingSvc::initInputRenames()
131 InputRenameMap_t newmap;
134 for (
const std::string&
remap : m_typeKeyRenameMaps)
136 std::string::size_type pos1 =
remap.find(
'#');
137 std::string::size_type pos2 =
remap.find(
"->");
138 if (pos1 == std::string::npos || pos2 == std::string::npos || pos2 < pos1)
145 std::string from =
remap.substr (pos1+1, pos2-pos1-1);
146 std::string
to =
remap.substr (pos2+2, std::string::npos);
148 if (clid == CLID_NULL) {
157 newmap[from_key] = Athena::InputRenameEntry { to_key, std::move(to) };
163 if (!m_typeKeyRenameMaps.empty()) {
165 Athena::RCURead<InputRenameMap_t>
r (*m_inputRenames);
170 return StatusCode::SUCCESS;
180 return(StatusCode::SUCCESS);
195 const std::vector<SG::TransientAddress>* oldTads =
nullptr;
196 const std::vector<SG::TransientAddress>* newTads =
nullptr;
202 return StatusCode::SUCCESS;
214 if (!status.isSuccess()) {
218 for (std::vector<SG::TransientAddress>::const_iterator oldIter = oldTads->begin(),
219 newIter = newTads->begin(), oldIterEnd = oldTads->end();
220 oldIter != oldIterEnd; ++oldIter, ++newIter) {
222 tads.push_back(tadd);
223 m_proxyDict->stringToKey(oldIter->name(), oldIter->clID());
224 m_proxyDict->stringToKey(newIter->name(), newIter->clID());
226 return(StatusCode::SUCCESS);
243 return StatusCode::SUCCESS;
246 std::vector<SG::TransientAddress> oldTadsCleaned =
m_oldTads;
247 std::vector<SG::TransientAddress> newTadsCleaned =
m_newTads;
251 if (!status.isSuccess()) {
255 for (std::vector<SG::TransientAddress>::iterator oldIter = oldTadsCleaned.begin(),
256 newIter = newTadsCleaned.begin(), oldIterEnd = oldTadsCleaned.end();
257 oldIter != oldIterEnd; ++oldIter, ++newIter)
259 CLID goodCLID = newIter->clID();
261 std::set<CLID> clidToKeep (clidvec.begin(), clidvec.end());
266 clidToKeep.erase(goodCLID);
271 dataProxy =
m_proxyDict->proxy(goodCLID, newIter->name());
273 clidToKeep.erase(goodCLID);
277 ATH_MSG_DEBUG(
"Remapping " << oldIter->clID() <<
"#" << oldIter->name() <<
" to base-class CLID: " << goodCLID <<
"#" << newIter->name());
283 ATH_MSG_INFO(
"Skipping remapping of " << oldIter->clID() <<
"#" << oldIter->name() <<
" because no suitable remapping found");
289 for(
auto tIter = clidToKeep.begin(); tIter != clidToKeep.end(); ++tIter) {
290 if(goodCLID == *tIter)
continue;
294 if(oldIter->clID()!=tadd->
clID()) {
297 tads.push_back(tadd);
298 m_proxyDict->stringToKey(oldIter->name(), oldIter->clID());
299 m_proxyDict->stringToKey(newIter->name(), newIter->clID());
307 return StatusCode::SUCCESS;
313 const EventContext& ctx)
319 const EventContext& )
const
321 const std::vector<SG::TransientAddress>* oldTads =
nullptr;
322 const std::vector<SG::TransientAddress>* newTads =
nullptr;
334 for (std::vector<SG::TransientAddress>::const_iterator oldIter = oldTads->begin(),
335 newIter = newTads->begin(), oldIterEnd = oldTads->end();
336 oldIter != oldIterEnd; ++oldIter, ++newIter) {
337 if (oldIter->transientID(tad->
clID()) &&
338 (oldIter->name() == tad->
name() || oldIter->hasAlias (tad->
name())))
340 ATH_MSG_DEBUG(
"Overwrite for: " << tad->
clID() <<
"#" << tad->
name() <<
" -> " << newIter->clID() <<
"#" << newIter->name());
342 if (dataProxy == 0) {
343 ATH_MSG_WARNING(
"Cannot get proxy for: " << newIter->clID() <<
"#" << newIter->name());
344 return(StatusCode::FAILURE);
346 GenericAddress* newGadd = 0;
349 ATH_MSG_WARNING(
"Cannot get GenericAddress for: " << newIter->clID() <<
"#" << newIter->name());
350 return(StatusCode::FAILURE);
352 GenericAddress* oldGadd =
new GenericAddress(newGadd->svcType(), tad->
clID(), *newGadd->par(), tad->
name(), *newGadd->ipar());
354 return(StatusCode::SUCCESS);
357 return(StatusCode::FAILURE);
375 if (
r->empty() &&
m_deletes.empty())
return StatusCode::SUCCESS;
383 IAddressProvider::tadList::iterator pos = tads.begin();
384 IAddressProvider::tadList::iterator end = tads.end();
392 auto it =
r->find (sgkey);
393 if (it !=
r->end()) {
394 const std::string& name_renamed = it->second.m_key;
397 auto tad_new = std::make_unique<SG::TransientAddress>
398 (tad_clid, name_renamed,
401 if (clid == tad_clid)
continue;
402 tad_new->setTransientID (clid);
404 if (
r->find(from_key) ==
r->end()) {
410 size_t namelen = tad->
name().size();
411 for (
const std::string&
a : tad->
alias()) {
412 std::string a_renamed =
a;
415 auto it_a =
r->find (from_key);
416 if (it_a !=
r->end()) {
417 a_renamed = it_a->second.m_key;
420 if (strncmp (a_renamed.c_str(), tad->
name().c_str(), namelen) == 0 &&
421 a_renamed[namelen] ==
'.')
423 a_renamed = name_renamed + a_renamed.substr (namelen, std::string::npos);
426 tad_new->setAlias (a_renamed);
432 tad = tad_new.release();
440 auto tad_new = std::make_unique<SG::TransientAddress>
441 (tad->
clID(), tad->
name() +
"_DELETED",
445 for (
const std::string&
a : tad->
alias()) {
446 tad_new->setAlias (
a +
"_DELETED");
450 tad = tad_new.release();
458 for (
const std::string&
a : aset) {
460 auto it_a =
r->find (from_key);
461 if (it_a !=
r->end()) {
462 const std::string& s = it_a->second.m_key;
475 return StatusCode::SUCCESS;
490const AddressRemappingSvc::InputRenameRCU_t*
508 for (IAlgorithm* ialg : algs) {
509 if (Gaudi::Algorithm* alg =
dynamic_cast<Gaudi::Algorithm*
> (ialg)) {
512 if (alg->name() ==
"SGInputLoader")
continue;
515 if (alg->type() ==
"AthViews::ViewDataVerifier" )
continue;
517 for (
const DataObjID& dobj : alg->outputDataObjs()) {
518 static const std::string
pref =
"StoreGateSvc+";
519 if (dobj.key().rfind(
pref, 0) != std::string::npos) {
520 std::string key = dobj.key().substr (
pref.size());
527 if (dobj.fullKey().find (
"xAOD") != std::string::npos ||
528 dobj.fullKey().find (
"cinfo") != std::string::npos)
544 std::string key = tad.
name();
547 for (
const auto& p : std::ranges::subrange(
xrange.first,
xrange.second)) {
548 CLID clid = p.second;
This file contains the class definition for the AddressRemappingSvc class.
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Handle mappings between names and auxid_t.
a traits class that associates a CLID to a type T It also detects whether T inherits from Gaudi DataO...
uint32_t CLID
The Class ID type.
Interface for non-const operations on an auxiliary store.
Interface for const operations on an auxiliary store.
read-copy-update (RCU) style synchronization for Athena.
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
ServiceHandle< IAlgResourcePool > m_algResourcePool
void addInputRenames(const InputRenameMap_t &toadd) const
Merge in additional input rename mappings.
Athena::IInputRename::InputRenameRCU_t InputRenameRCU_t
virtual const IInputRename::InputRenameRCU_t * inputRenameMap() const override
Retrieve a pointer to the input rename map.
std::unique_ptr< InputRenameRCU_t > m_inputRenames
Gaudi::Property< std::vector< std::string > > m_typeKeyRenameMaps
Property: list of requested input renames.
StatusCode updateAddressConst(StoreID::type, SG::TransientAddress *pTad, const EventContext &ctx) const
bool isDeleted(const SG::TransientAddress &tad) const
ServiceHandle< Athena::IRCUSvc > m_RCUSvc
virtual StatusCode finalize() override
Required of all Gaudi services:
ServiceHandle< IClassIDSvc > m_clidSvc
StatusCode loadAddressesConst(IAddressProvider::tadList &tads) const
virtual StatusCode loadAddresses(StoreID::type storeID, IAddressProvider::tadList &tads) override
Implementation of the loadAddresses function without any functionality.
virtual StatusCode updateAddress(StoreID::type, SG::TransientAddress *pTad, const EventContext &ctx) override
Update a transient address.
ServiceHandle< IProxyDict > m_proxyDict
AddressRemappingSvc(const std::string &name, ISvcLocator *pSvcLocator)
Standard Service Constructor.
Athena::InputRenameMap_t InputRenameMap_t
Map of sgkey->sgkey for input renames.
std::vector< SG::TransientAddress > m_oldTads
StatusCode renameTads(IAddressProvider::tadList &tads) const
Scan TAD list and carry out any requested renamings.
std::atomic< bool > m_haveDeletes
std::vector< SG::TransientAddress > m_newTads
std::unordered_multimap< std::string, CLID > m_deletes
CLID getClid(const std::string &type) const
StatusCode preLoadAddressesConst(StoreID::type storeID, IAddressProvider::tadList &tads) const
std::mutex m_deletesMutex
CxxUtils::CachedValue< std::vector< SG::TransientAddress > > m_newTadsCleaned
CxxUtils::CachedValue< std::vector< SG::TransientAddress > > m_oldTadsCleaned
virtual ~AddressRemappingSvc()
Destructor.
Gaudi::Property< bool > m_skipBadRemappings
virtual StatusCode preLoadAddresses(StoreID::type storeID, IAddressProvider::tadList &tads) override
Get all addresses from provider.
Helper to read data from a RCUObject.
Helper to update data in a RCUObject.
std::list< SG::TransientAddress * > tadList
void setInputRenameMap(const Athena::InputRenameMap_t *map, const IStringPool &pool)
Declare input renaming requests.
static AuxTypeRegistry & instance()
Return the singleton registry instance.
The non-template portion of the BaseInfo implementation.
static const BaseInfoBase * find(CLID clid)
Find the BaseInfoBase instance for clid.
const std::vector< CLID > & get_bases() const
Return the class IDs of all known bases of T (that have class IDs).
virtual IOpaqueAddress * address() const override final
Retrieve IOpaqueAddress.
bool isValidAddress() const
is the address valid?
CLID clID() const
Retrieve string key:
StoreID::type storeID() const
void clearAddress(const bool &flag)
Return the clearAddress flag.
const std::string & name() const
Get the primary (hashed) SG key.
void setTransientID(CLID id)
get transient CLID's
bool transientID(CLID id) const
set transient CLID's
void setAlias(const std::string &key)
set alias'
bool removeAlias(const std::string &key)
remove alias from proxy
std::vector< CLID > TransientClidSet
Strictly a set, but there shouldn't be more than a handful of entries, so store it as a sorted vector...
void setAddress(CxxUtils::RefCountedPtr< IOpaqueAddress > pAddress)
Retrieve primary clid.
IAddressProvider * provider()
std::vector< std::string > TransientAliasSet
const TransientAliasSet & alias() const
set the clearAddress flag: IOA will not be deleted in proxy
void xrange(TH1 *h, bool symmetric)
std::map< std::string, std::string > remap
list of directories to be explicitly remapped
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
Type of the input rename map: sgkey_t -> sgkey_t.