ATLAS Offline Software
Loading...
Searching...
No Matches
MetaDataSvc.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
9
10#include "MetaDataSvc.h"
11
12#include "Gaudi/Interfaces/IOptionsSvc.h"
13#include "GaudiKernel/IAlgTool.h"
14#include "GaudiKernel/IEvtSelector.h"
15#include "GaudiKernel/IIncidentSvc.h"
16#include "GaudiKernel/IIoComponentMgr.h"
17#include "GaudiKernel/IOpaqueAddress.h"
18#include "GaudiKernel/FileIncident.h"
19#include "GaudiKernel/System.h"
20
25
27
28#include <vector>
29#include <sstream>
30#include <functional>
31
32namespace {
40 bool leftString(std::string& s, char sc) {
41 if (const auto pos = s.find(sc); pos != std::string::npos) {
42 s.resize(pos);
43 return true;
44 }
45 return false;
46 }
47}
48
49
50//________________________________________________________________________________
51MetaDataSvc::MetaDataSvc( const std::string& name, ISvcLocator* pSvcLocator )
52 : base_class( name, pSvcLocator )
53 , m_inputDataStore( "StoreGateSvc/InputMetaDataStore", name )
54 , m_outputDataStore( "StoreGateSvc/MetaDataStore", name )
55 , m_fileMgr( "FileMgr", name )
56 , m_incSvc( "IncidentSvc", name )
57 , m_outSeqSvc( "OutputStreamSequencerSvc", name )
58 , m_persToClid{ { "DataHeader_p5", 222376821 },
59 { "EventStreamInfo_p3", 167728019 },
60 { "ByteStreamMetadataContainer_p1", 1076128893 },
61 { "IOVMetaDataContainer_p1", 1316383046 },
62 { "xAOD::EventFormat_v1", 243004407 },
63 { "xAOD::CutBookkeeperContainer_v1", 1234982351 },
64 { "xAOD::CutBookkeeperAuxContainer_v1", 1147935274 },
65 { "xAOD::TriggerMenuContainer_v1", 1107011239 },
66 { "DataVector<xAOD::TriggerMenu_v1>", 1107011239 },
67 { "xAOD::TriggerMenuAuxContainer_v1", 1212409402 },
68 { "xAOD::TriggerMenuJsonContainer_v1", 1221262614 },
69 { "DataVector<xAOD::TriggerMenuJson_v1>", 1221262614 },
70 { "xAOD::TriggerMenuJsonAuxContainer_v1", 373045213 },
71 { "xAOD::LumiBlockRangeContainer_v1", 1115934851 },
72 { "DataVector<xAOD::LumiBlockRange_v1>", 1115934851 },
73 { "xAOD::LumiBlockRangeAuxContainer_v1", 1251061086 },
74 { "xAOD::FileMetaData_v1", 178309087 },
75 { "xAOD::FileMetaDataAuxInfo_v1", 73252552 },
76 { "xAOD::RingSetConfContainer_v1", 1157997427 },
77 { "DataVector<xAOD::RingSetConf_v1>", 1157997427 },
78 { "xAOD::RingSetConfAuxContainer_v1", 1307745126 },
79 { "xAOD::TruthMetaDataContainer_v1", 1188015687 },
80 { "DataVector<xAOD::TruthMetaData_v1>", 1188015687 },
81 { "xAOD::TruthMetaDataAuxContainer_v1", 1094306618 } } {}
82
83//________________________________________________________________________________
85
86//__________________________________________________________________________
88 ATH_MSG_INFO("Initializing {}", name());
89
90 // Retrieve InputMetaDataStore
91 ATH_CHECK( m_inputDataStore.retrieve() );
92 // Retrieve OutputMetaDataStore
93 ATH_CHECK( m_outputDataStore.retrieve() );
94 // Retrieve AddressCreator
95 ATH_CHECK( m_addrCrtr.retrieve() );
96
97 AthCnvSvc* cnvSvc = dynamic_cast<AthCnvSvc*>(m_addrCrtr.operator->());
98 if (cnvSvc) {
99 m_storageType = cnvSvc->repSvcType();
100 } else {
101 ATH_MSG_WARNING("Cannot get ConversionSvc Interface.");
102 }
103 // Get FileMgr
104 ATH_CHECK( m_fileMgr.retrieve() );
105
106 // Set to be listener for end of event
107 ATH_CHECK( m_incSvc.retrieve() );
108
109 ATH_CHECK( m_metaDataTools.retrieve() );
110 ATH_MSG_INFO("Found " << m_metaDataTools);
111
112 m_incSvc->addListener(this, "FirstInputFile", 80, true);
113 m_incSvc->addListener(this, "BeginInputFile", 80, true);
114 m_incSvc->addListener(this, "EndInputFile", 10, true);
115 m_incSvc->addListener(this, "BeginInputMemFile", 80, true);
116 m_incSvc->addListener(this, "EndInputMemFile", 10, true);
117
118 // Register this service for 'I/O' events
119 ServiceHandle<IIoComponentMgr> iomgr("IoComponentMgr", this->name());
120 ATH_CHECK( iomgr.retrieve() );
121 ATH_CHECK( iomgr->io_register(this) );
122
123 ServiceHandle<Gaudi::Interfaces::IOptionsSvc> joSvc("JobOptionsSvc", name());
124 if (!joSvc.retrieve().isSuccess()) {
125 ATH_MSG_WARNING("Cannot get JobOptionsSvc.");
126 } else {
127 if (joSvc->has("EventSelector.InputCollections")) {
128 // Get EventSelector to force in-time initialization and FirstInputFile incident
129 ServiceHandle<IEvtSelector> evtsel("EventSelector", this->name());
130 if (!evtsel.retrieve().isSuccess()) {
131 ATH_MSG_WARNING("Cannot get EventSelector.");
132 }
133 }
134 }
135 // retrieve the output sequences service (EventService) if available
136 m_outSeqSvc.retrieve().ignore();
137
138 return(StatusCode::SUCCESS);
139}
140//__________________________________________________________________________
142 // Release IncidentService
143 if (!m_incSvc.release().isSuccess()) {
144 ATH_MSG_WARNING("Cannot release IncidentService.");
145 }
146 // Release FileMgr
147 if (!m_fileMgr.release().isSuccess()) {
148 ATH_MSG_WARNING("Cannot release FileMgr.");
149 }
150 // Release AddressCreator
151 if (!m_addrCrtr.release().isSuccess()) {
152 ATH_MSG_WARNING("Cannot release AddressCreator.");
153 }
154 // Release OutputMetaDataStore
155 if (!m_outputDataStore.release().isSuccess()) {
156 ATH_MSG_WARNING("Cannot release OutputMetaDataStore.");
157 }
158 // Release InputMetaDataStore
159 if (!m_inputDataStore.release().isSuccess()) {
160 ATH_MSG_WARNING("Cannot release InputMetaDataStore.");
161 }
163 ATH_MSG_WARNING("EndInputFile was not received before finalize");
164 }
165 return(StatusCode::SUCCESS);
166}
167
168//__________________________________________________________________________
169StatusCode MetaDataSvc::stop() {
170 ATH_MSG_DEBUG("MetaDataSvc::stop()");
171 // Fire metaDataStopIncident
172 Incident metaDataStopIncident(name(), "MetaDataStop");
173 m_incSvc->fireIncident(metaDataStopIncident);
174 return(StatusCode::SUCCESS);
175}
176
177//________________________________________________________________________________
179 if (storeID != StoreID::METADATA_STORE) { // should this (also) run in the INPUT_METADATA_STORE?
180 return(StatusCode::SUCCESS);
181 }
182 if (!m_inputDataStore->contains<DataHeader>( name()) ) {
183 return(StatusCode::SUCCESS);
184 }
185 const DataHeader* dataHeader = nullptr;
186 ATH_CHECK( m_inputDataStore->retrieve( dataHeader, name()) );
187 for (const DataHeaderElement& dhe : *dataHeader) {
188 const CLID clid = dhe.getPrimaryClassID();
189 if (clid != ClassID_traits<DataHeader>::ID()) {
190 tads.push_back(dhe.getAddress(m_storageType, dhe.getKey()));
191 }
192 }
193 return(StatusCode::SUCCESS);
194}
195//________________________________________________________________________________
196StatusCode MetaDataSvc::newMetadataSource(const Incident& inc)
197{
198 const FileIncident* fileInc = dynamic_cast<const FileIncident*>(&inc);
199 if (fileInc == nullptr) {
200 ATH_MSG_ERROR("Unable to get FileName from EndInputFile incident");
201 return StatusCode::FAILURE;
202 }
203 const std::string guid = fileInc->fileGuid();
204 const std::string fileName = fileInc->fileName();
205 m_allowMetaDataStop = false;
207 if (!fileName.starts_with( "BSF:")) {
208 // the input file is _not_ bytestream
210 if (!m_inputDataStore->clearStore().isSuccess()) {
211 ATH_MSG_WARNING("Unable to clear input MetaData Proxies");
212 }
214 }
216 }
217 StatusCode rc{StatusCode::SUCCESS};
218 for (auto& tool : m_metaDataTools) {
219 ATH_MSG_DEBUG(" calling beginInputFile on {} for GUID \"{}\"",
220 tool->name(), guid);
221 if (tool->beginInputFile(guid).isFailure()) {
222 ATH_MSG_ERROR("Unable to call beginInputFile for {}", tool->name());
223 rc = StatusCode::FAILURE;
224 }
225 }
226 return rc;
227}
228
229StatusCode MetaDataSvc::retireMetadataSource(const Incident& inc)
230{
231 const FileIncident* fileInc = dynamic_cast<const FileIncident*>(&inc);
232 if (fileInc == nullptr) {
233 ATH_MSG_ERROR("Unable to get FileName from EndInputFile incident");
234 return StatusCode::FAILURE;
235 }
236 const std::string guid = fileInc->fileGuid();
237 ATH_MSG_DEBUG("retireMetadataSource: {}", fileInc->fileName());
238 for (auto& tool : m_metaDataTools) {
239 ATH_MSG_DEBUG(" calling endInputFile on {} for GUID \"{}\"",
240 tool->name(), guid);
241 ATH_CHECK(tool->endInputFile(guid));
242 }
243 m_allowMetaDataStop = true;
244 return StatusCode::SUCCESS;
245}
246
248{
249 if (m_outputPrepared) {
250 return StatusCode::SUCCESS;
251 }
252
253 StatusCode rc{StatusCode::SUCCESS};
254 for (auto& tool : m_metaDataTools) {
255 ATH_MSG_DEBUG(" calling metaDataStop for {}", tool->name());
256 if (tool->metaDataStop().isFailure()) {
257 ATH_MSG_ERROR("Unable to call metaDataStop for {}", tool->name());
258 rc = StatusCode::FAILURE;
259 }
260 }
261 if (!m_metaDataTools.release().isSuccess()) {
262 ATH_MSG_WARNING("Cannot release " << m_metaDataTools);
263 }
264
265 m_outputPrepared = true;
266 return rc;
267}
268
269// like prepareOutput() but for parallel streams
270StatusCode MetaDataSvc::prepareOutput(const std::string& outputName)
271{
272 // default to the serial implementation if no output name given
273 if( outputName.empty() ) {
274 return prepareOutput();
275 }
276 ATH_MSG_DEBUG( "prepareOutput('{}')", outputName );
277
278 StatusCode rc{StatusCode::SUCCESS};
279 for (auto& tool : m_metaDataTools) {
280 ATH_MSG_DEBUG(" calling metaDataStop for {}", tool->name());
281 // planning to replace the call below with (*it)->prepareOutput(outputName)
282 if (tool->metaDataStop().isFailure()) {
283 ATH_MSG_ERROR("Unable to call metaDataStop for {}", tool->name());
284 rc = StatusCode::FAILURE;
285 }
286 }
287 // MN: not releasing tools here - revisit when clear what happens on new file open
288 return rc;
289}
290
291
292StatusCode MetaDataSvc::shmProxy(const std::string& tokenStr)
293{
294 if (m_addrCrtr.name() != "AthenaPoolSharedIOCnvSvc") {
295 ATH_MSG_ERROR("shmProxy failed: unsupported AddressCreator " << m_addrCrtr.name());
296 return StatusCode::FAILURE;
297 }
298
300 ATH_CHECK(m_inputDataStore->clearStore(true));
302 }
304 ATH_CHECK(m_outputDataStore->clearStore(true));
306 }
307
309 return StatusCode::SUCCESS;
310}
311
312//__________________________________________________________________________
313void MetaDataSvc::handle(const Incident& inc) {
314 const FileIncident* fileInc = dynamic_cast<const FileIncident*>(&inc);
315 if (fileInc == nullptr) {
316 ATH_MSG_ERROR("Unable to get FileName from EndInputFile incident");
317 return;
318 }
319 const std::string fileName = fileInc->fileName();
320 ATH_MSG_DEBUG("handle() {} for {}", inc.type(), fileName);
321
322 if (inc.type() == "FirstInputFile") {
323 // Register open/close callback actions
324 using namespace std::placeholders;
325 Io::bfcn_action_t boa = std::bind(&MetaDataSvc::rootOpenAction, this, _1, _2);
326 if (m_fileMgr->regAction(std::move(boa), Io::OPEN).isFailure()) {
327 ATH_MSG_FATAL("Cannot register ROOT file open action with FileMgr.");
328 }
329 if (!initInputMetaDataStore(fileName).isSuccess()) {
330 ATH_MSG_WARNING("Unable to initialize InputMetaDataStore");
331 }
332 } else if (inc.type() == "BeginInputFile" || inc.type() == "BeginInputMemFile") {
333 if(newMetadataSource(inc).isFailure()) {
334 ATH_MSG_ERROR("Could not process new metadata source {}", fileName);
335 }
336 } else if (inc.type() == "EndInputFile" || inc.type() == "EndInputMemFile") {
337 if(retireMetadataSource(inc).isFailure()) {
338 ATH_MSG_ERROR("Could not retire metadata source {}", fileName);
339 }
340 }
341}
342
343//__________________________________________________________________________
344// This method is currently called only from OutputStreamSequencerSvc
345StatusCode MetaDataSvc::transitionMetaDataFile(const std::string& outputConn, bool disconnect)
346{
347 ATH_MSG_DEBUG("transitionMetaDataFile: {}", outputConn );
348
349 // this is normally called through EndInputFile inc, simulate it for EvSvc
350 FileIncident inc("transitionMetaDataFile", "EndInputFile", "dummyMetaInputFileName", "");
352
353 // Reset flag to allow calling prepareOutput again at next transition
354 m_outputPrepared = false;
355
356 Incident metaDataStopIncident(name(), "MetaDataStop");
357 m_incSvc->fireIncident(metaDataStopIncident);
358
359 if( disconnect ) {
360 AthCnvSvc* cnvSvc = dynamic_cast<AthCnvSvc*>(m_addrCrtr.operator->());
361 if (cnvSvc) {
362 if (!cnvSvc->disconnectOutput(outputConn).isSuccess()) {
363 ATH_MSG_WARNING("Cannot get disconnect Output Files");
364 }
365 }
366 }
367
368 return(StatusCode::SUCCESS);
369}
370
371//__________________________________________________________________________
373 ATH_MSG_INFO("I/O reinitialization...");
374 ATH_MSG_DEBUG("Dumping InputMetaDataStore: {}", m_inputDataStore->dump());
375 ATH_MSG_DEBUG("Dumping OutputMetaDataStore: {}", m_outputDataStore->dump());
376 for (const auto& tool : m_metaDataTools) {
377 ATH_MSG_INFO("Attached MetaDataTool: {}", tool->name());
378 }
379 m_outputPrepared = false;
380 return(StatusCode::SUCCESS);
381}
382//__________________________________________________________________________
383StatusCode MetaDataSvc::rootOpenAction(FILEMGR_CALLBACK_ARGS) {
384 return(StatusCode::SUCCESS);
385}
386//__________________________________________________________________________
387// check if the metadata object key contains Stream name (added by SharedWriter in MetaDataSvc)
388// remove stream part from the key (i.e. modify the parameter) and return it
389std::string MetaDataSvc::removeStreamFromKey(std::string& key) {
390 size_t pos = key.find(m_streamInKeyMark);
391 if( pos==std::string::npos ) return "";
392 size_t epos = key.find(']', pos);
393 size_t spos = pos + m_streamInKeyMark.size();
394 std::string stream = key.substr( spos, epos - spos );
395 //cppcheck-suppress uselessCallsSubstr
396 key = key.substr(0, pos) + key.substr(epos+1);
397 return stream;
398}
399
400//__________________________________________________________________________
401[[nodiscard]] std::set<std::string> MetaDataSvc::getPerStreamKeysFor(const std::string& key) const {
402 if (!m_streamKeys.contains(key)) {
403 return {key};
404 }
405 return m_streamKeys.at(key);
406}
407
408//__________________________________________________________________________
409StatusCode MetaDataSvc::addProxyToInputMetaDataStore(const std::string& tokenStr) {
410 std::string fileName = tokenStr.substr(tokenStr.find("[FILE=") + 6);
411 leftString(fileName, ']');
412 std::string className = tokenStr.substr(tokenStr.find("[PNAME=") + 7);
413 leftString(className, ']');
414 std::string contName = tokenStr.substr(tokenStr.find("[CONT=") + 6);
415 leftString(contName,']');
416 std::size_t pos1 = contName.find('(');
417 std::string keyName = contName.substr(pos1 + 1, contName.size() - pos1 - 2);
418 std::size_t pos2 = keyName.find('/');
419 if (pos2 != std::string::npos) keyName = keyName.substr(pos2 + 1);
420 std::string numName = tokenStr.substr(tokenStr.find("[NUM=") + 5);
421 leftString(numName,']');
422 unsigned long num = 0;
423 std::istringstream iss(numName);
424 iss >> num;
425 CLID clid = m_persToClid[className];
426
427 // make stream-unique keys for infile metadata objects
428 // AthenaOutputStream will use this to distribute objects to the right stream (and restore the original key)
429 if( clid == 178309087 ) { // FileMetaData
430 std::string newName = std::format("{}{}{}{}", keyName, m_streamInKeyMark, fileName, "]");
431 ATH_MSG_DEBUG("Recording {} as {}", keyName, newName);
432 m_streamKeys[keyName].insert(newName);
433 keyName = std::move(newName);
434 }
435 if( clid == 73252552 ) { // FileMetaDataAuxInfo
436 std::string newName = std::format("{}{}{}]{}",
437 keyName.substr(0, keyName.find(RootAuxDynIO::AUX_POSTFIX)),
439 fileName,
441 ATH_MSG_DEBUG("Recording {} as {}", keyName, newName);
442 m_streamKeys[keyName].insert(newName);
443 keyName = std::move(newName);
444 }
445 const std::string par[3] = { "SHM" , keyName , std::move(className) };
446 const unsigned long ipar[2] = { num , 0 };
447 IOpaqueAddress* opqAddr = nullptr;
448 SG::DataProxy* dp = m_inputDataStore->proxy(clid, keyName);
449 if (dp != nullptr) {
450 ATH_MSG_DEBUG("Resetting duplicate proxy for: {}#{} from file: {}",
451 clid, keyName, fileName);
452 dp->reset();
453 }
454 if (!m_addrCrtr->createAddress(m_storageType, clid, par, ipar, opqAddr).isSuccess()) {
455 ATH_MSG_FATAL("addProxyToInputMetaDataStore: Cannot create address for {}", tokenStr);
456 return(StatusCode::FAILURE);
457 }
458 if (m_inputDataStore->recordAddress(keyName, opqAddr).isFailure()) {
459 ATH_MSG_FATAL("addProxyToInputMetaDataStore: Cannot create proxy for {}", tokenStr);
460 return(StatusCode::FAILURE);
461 }
462 if (m_inputDataStore->accessData(clid, keyName) == nullptr) {
463 ATH_MSG_FATAL("addProxyToInputMetaDataStore: Cannot access data for {}", tokenStr);
464 return(StatusCode::FAILURE);
465 }
466 if (keyName.find(RootAuxDynIO::AUX_POSTFIX) != std::string::npos
467 && m_inputDataStore->symLink(clid, keyName, 187169987).isFailure()) {
468 ATH_MSG_WARNING("addProxyToInputMetaDataStore: Cannot symlink to AuxStore for {}", tokenStr);
469 }
470 return(StatusCode::SUCCESS);
471}
472//__________________________________________________________________________
473StatusCode MetaDataSvc::initInputMetaDataStore(const std::string& fileName) {
474 ATH_MSG_DEBUG("initInputMetaDataStore: file name {}", fileName);
476 // Load proxies for InputMetaDataStore
477 if (m_metaDataCont.value().empty()) {
478 ATH_MSG_DEBUG("MetaDataSvc called without MetaDataContainer set.");
479 return(StatusCode::SUCCESS);
480 }
481 if (fileName.starts_with( "BSF:")) {
482 ATH_MSG_DEBUG("MetaDataSvc called for non ROOT file.");
483 } else if (fileName.compare(0, 3, "SHM")==0) {
484 ATH_MSG_DEBUG("MetaDataSvc called for shared memory.");
485 } else {
486 const std::string par[2] = {
487 fileName,
488 std::format("{}(DataHeader)", m_metaDataCont.value())
489 };
490 const std::string parOld[2] = {
491 fileName,
492 std::format("{}{}", m_metaDataCont.value(), "DataHeader")
493 };
494 if (m_inputDataStore->contains<DataHeader>(name())) {
495 ATH_MSG_DEBUG("initInputMetaDataStore: MetaData Store already contains DataHeader, key = {}", name());
496 } else {
497 const unsigned long ipar[2] = { 0 , 0 };
498 IOpaqueAddress* opqAddr = nullptr;
499 if (m_addrCrtr->createAddress(m_storageType, ClassID_traits<DataHeader>::ID(), par, ipar, opqAddr).isSuccess()
500 || m_addrCrtr->createAddress(m_storageType, ClassID_traits<DataHeader>::ID(), parOld, ipar, opqAddr).isSuccess()) {
501 if (m_inputDataStore->recordAddress(name(), opqAddr).isFailure()) {
502 ATH_MSG_WARNING("initInputMetaDataStore: Cannot create proxy for DataHeader, key = {}", name());
503 }
504 }
505 }
506 std::list<SG::TransientAddress*> tList;
508 for (SG::TransientAddress* tad : tList) {
509 CLID clid = tad->clID();
510 ATH_MSG_VERBOSE("initInputMetaDataStore: add proxy for clid = {}, key = {}",
511 clid, tad->name());
512 if (m_inputDataStore->contains(tad->clID(), tad->name())) {
513 ATH_MSG_DEBUG("initInputMetaDataStore: MetaData Store already contains clid = {}, key = {}",
514 clid, tad->name());
515 } else {
516 if (!m_inputDataStore->recordAddress(tad->name(), tad->address())) {
517 ATH_MSG_ERROR("initInputMetaDataStore: Cannot create proxy for clid = {}, key = {}",
518 clid, tad->name());
519 return StatusCode::FAILURE;
520 }
521 }
522
523 for (CLID tclid : tad->transientID()) {
524 if (tclid != clid) {
525 if (m_inputDataStore->symLink (clid, tad->name(), tclid).isFailure()) {
526 ATH_MSG_WARNING("Cannot make autosymlink from {}/{} to {}",
527 clid, tad->name(), tclid);
528 }
529 }
530 }
531 delete tad;
532 }
533 tList.clear();
534 }
535 ATH_MSG_DEBUG("Loaded input meta data store proxies");
536 return(StatusCode::SUCCESS);
537}
538
539
540const std::string MetaDataSvc::currentRangeID() const
541{
542 const EventContext& ctx = Gaudi::Hive::currentContext();
543 return m_outSeqSvc.isValid()? m_outSeqSvc->currentRangeID(ctx) : "";
544}
545
546
548{
549 if (!m_handledClasses.contains(itemID)) {
550 ATH_MSG_DEBUG("Not translating metadata item ID #{}", itemID);
551 return itemID;
552 }
553
554 std::string itemName;
555 CLID contID = 0;
556 if (m_classIDSvc->getTypeNameOfID(itemID, itemName).isSuccess()) {
557 const std::string contName = std::format("MetaCont<{}>", itemName);
558 ATH_MSG_DEBUG("Transforming {} to {} for output",
559 contName, itemName);
560 if (m_classIDSvc->getIDOfTypeName(contName, contID).isSuccess())
561 return contID;
562 }
563
564 return itemID;
565}
566
567void MetaDataSvc::recordHook(const std::type_info& typeInfo) {
568 const std::string& typeName = System::typeinfoName(typeInfo);
569 ATH_MSG_VERBOSE("Handling record event of type {}", typeName);
570
571 CLID itemID = 0;
572 if (m_classIDSvc->getIDOfTypeInfoName(typeName, itemID).isSuccess()) {
573 auto result = m_handledClasses.insert(itemID);
574 if (result.second)
575 ATH_MSG_DEBUG("MetaDataSvc will handle {} ClassID: {}", typeName, itemID);
576 }
577}
578
579void MetaDataSvc::removeHook(const std::type_info& typeInfo) {
580 const std::string& typeName = System::typeinfoName(typeInfo);
581 ATH_MSG_VERBOSE("Handling removal event of type {}", typeName);
582
583 CLID itemID = 0;
584 if (m_classIDSvc->getIDOfTypeInfoName(typeName, itemID).isSuccess()) {
585 if (0 < m_handledClasses.erase(itemID))
586 ATH_MSG_DEBUG("MetaDataSvc will no longer handle {} ClassID: {}",
587 typeName, itemID);
588 }
589}
590
592 ATH_MSG_DEBUG("Locking metadata tools");
593 for(auto& tool : m_metaDataTools ) {
594 const ILockableTool *lockable = dynamic_cast<const ILockableTool*>( tool.get() );
595 if( lockable ) lockable->lock_shared();
596 }
597}
598
600 ATH_MSG_DEBUG("Unlocking metadata tools");
601 for(auto& tool : m_metaDataTools ) {
602 const ILockableTool *lockable = dynamic_cast<const ILockableTool*>( tool.get() );
603 if( lockable ) lockable->unlock_shared();
604 }
605}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
This file contains the class definition for the DataHeader and DataHeaderElement classes.
uint32_t CLID
The Class ID type.
static Double_t sc
static Double_t rc
This file contains the class definition for the MetaDataSvc class.
This file contains the class definition for the OutputStreamSequencerSvc class.
Base class for all conversion services.
Definition AthCnvSvc.h:66
virtual long repSvcType() const override
Retrieve the class type of the data store the converter uses.
virtual StatusCode disconnectOutput(const std::string &output)
Disconnect output files from the service.
This class provides a persistent form for the TransientAddress.
Definition DataHeader.h:37
This class provides the layout for summary information stored for data written to POOL.
Definition DataHeader.h:123
std::list< SG::TransientAddress * > tadList
Provide an interface for locking and unlocking a tool externally.
virtual void lock_shared() const =0
Lock the tool.
virtual void unlock_shared() const =0
Unlock the tool.
ServiceHandle< OutputStreamSequencerSvc > m_outSeqSvc
virtual StatusCode prepareOutput()
Makes the metadata store ready for output.
long m_storageType
std::map< std::string, std::set< std::string > > m_streamKeys
static constexpr std::string_view m_streamInKeyMark
marker string for embedding stream name in MetaData object keys for SharedWriter server
virtual StatusCode newMetadataSource(const Incident &)
Fills the input metadata store with the content of the new input file.
virtual StatusCode initialize() override
initialize the metadata service at the beginning of the job
void recordHook(const std::type_info &) override
MetaDataSvc(const std::string &name, ISvcLocator *pSvcLocator)
Standard Service Constructor.
void lockTools() const
bool m_beginInputFileSeen
PublicToolHandleArray< IMetaDataTool > m_metaDataTools
MetaDataTools, vector with the MetaData tools.
virtual void handle(const Incident &incident) override
react to file incidents.
ServiceHandle< StoreGateSvc > m_outputDataStore
virtual StatusCode io_reinit() override
Implements IIoComponent interface sets m_outputPrepared to false and prints some information.
StatusCode transitionMetaDataFile(const std::string &outputConn, bool disconnect)
Transition output metadata file - fire MeteDataStop incident to transition OutputStream and disconnec...
CLID remapMetaContCLID(const CLID &item_id) const
StatusCode rootOpenAction(FILEMGR_CALLBACK_ARGS)
ServiceHandle< StoreGateSvc > m_inputDataStore
virtual ~MetaDataSvc()
Destructor.
virtual StatusCode retireMetadataSource(const Incident &)
Allows metadata tools to act before an input file is closed.
std::set< CLID > m_handledClasses
bool m_allowMetaDataStop
ServiceHandle< IAddressCreator > m_addrCrtr
virtual StatusCode finalize() override
finalize the metadata service at the end of the job
StatusCode initInputMetaDataStore(const std::string &fileName)
Initialize input metadata store - can be called directly or via BeginInputFile incident.
std::map< std::string_view, CLID > m_persToClid
virtual StatusCode stop() override
stop the metadata service
ServiceHandle< IIncidentSvc > m_incSvc
std::string removeStreamFromKey(std::string &key)
check if the metadata object key contains Stream name (added by SharedWriter in MetaDataSvc) remove s...
virtual const std::string currentRangeID() const override final
StatusCode addProxyToInputMetaDataStore(const std::string &tokenStr)
ServiceHandle< IFileMgr > m_fileMgr
void removeHook(const std::type_info &) override
bool m_clearedOutputDataStore
StatusCode loadAddresses(StoreID::type storeID, IAddressProvider::tadList &tads) override
loads addresses of metadata object.
bool m_outputPrepared
void unlockTools() const
Gaudi::Property< std::string > m_metaDataCont
MetaDataContainer, POOL container name for MetaData.
bool m_clearedInputDataStore
ServiceHandle< IClassIDSvc > m_classIDSvc
virtual std::set< std::string > getPerStreamKeysFor(const std::string &key) const override final
Get all per-stream Key variants created for in-file metadata object with original key If no stream-sp...
@ METADATA_STORE
Definition StoreID.h:29
virtual StatusCode shmProxy(const std::string &tokenStr) override
Loads file metadata from memory shared between streams in SharedWriter This function clears the input...
constexpr char AUX_POSTFIX[]
Common post-fix for the names of auxiliary containers in StoreGate.