19 #include "CoralBase/AttributeList.h"
20 #include "CoralBase/Attribute.h"
22 #include "GaudiKernel/IIncidentSvc.h"
23 #include "GaudiKernel/FileIncident.h"
30 static const pool::Guid DHForm_p6_Guid(
"7BE56CEF-C866-4BEE-9348-A5F34B5F1DAD");
44 if( incSvc.retrieve().isSuccess() ) {
45 incSvc->removeListener(
this, IncidentType::EndInputFile);
53 bool doFilterDHAliases =
true;
54 SmartIF<IProperty> cnvSvc{service(
"AthenaPoolCnvSvc")};
57 if( cnvSvc->getProperty(&sizeProp).isSuccess() ) {
60 BooleanProperty aliasFilterProp(
"doFilterDHAliases", doFilterDHAliases);
61 if( cnvSvc->getProperty(&aliasFilterProp).isSuccess() ) {
62 doFilterDHAliases = aliasFilterProp.value();
64 BooleanProperty oneDHForm(
"OneDataHeaderForm",
m_oneDHForm);
65 if( cnvSvc->getProperty(&oneDHForm).isSuccess() ) {
70 if( doFilterDHAliases ) {
81 incSvc->addListener(
this, IncidentType::EndInputFile, 0);
82 incSvc->addListener(
this,
"PreFork", 0);
84 incSvc->addListener(
this,
"WriteDataHeaderForms", 0);
91 if( incident.type() ==
"PreFork" ) {
94 if( incident.type() == IncidentType::EndInputFile ) {
96 const std::string&
guid =
static_cast<const FileIncident&
>(incident).fileGuid();
99 if( incident.type() ==
"WriteDataHeaderForms" ) {
101 const std::string&
fileName =
static_cast<const FileIncident*
>(&incident)->
fileName();
103 std::vector<std::string> toWrite;
104 auto pos =
fileName.find(
"[OutputCollection=MetaDataHdr]");
105 bool metaDataCommit = (
pos != std::string::npos);
106 std::string justFileName =
fileName.substr(0,
pos);
110 const std::string& placementStr = elem.first;
116 if( (placementStr.find(
"[CONT=MetaData") != std::string::npos) == metaDataCommit ) {
117 toWrite.push_back( placementStr );
122 for( std::size_t
n = 0;
const std::string& placementStr : toWrite ) {
126 if( form_ptr->isModified() ) {
127 static const RootType dhFormType(
typeid( *form_ptr ) );
131 std::string errmsg =
std::format(
"Failed to write {} {}", dhFormType.
Name(), placementStr);
133 throw GaudiException(errmsg,
"DataHeaderCnv::WriteDataHeaderForms", StatusCode::FAILURE);
135 ATH_MSG_DEBUG(
"Wrote DatHeaderForm, placeemnt was " << placementStr <<
" token=" << form_token->
toString());
136 form_token->
release(); form_token =
nullptr;
137 bool doCommit = (++
n == toWrite.size());
140 throw GaudiException(
"WriteDataHeaderForms failed",
"DataHeaderCnv::WriteDataHeaderForms", StatusCode::FAILURE);
153 size_t dbpos =
iter->first.find(
"[DB=");
154 if( dbpos != std::string::npos &&
iter->first.compare(dbpos+4, dbpos+36, dbGuid) == 0 ) {
167 if(
start == std::string::npos )
192 if( lval != rval )
return lval < rval;
196 if( lval.empty() or rval.empty() )
return false;
197 return std::stoul( lval ) < std::stoul( rval );
211 auto dataHeader =
reinterpret_cast<DataHeader_p6*
>( pObject );
212 const std::string dhRef = pAddress->par()[0];
213 const std::string dhPlacementStr = pAddress->par()[1];
216 dhFormPlacement.
fromString( dataHeader->dhFormToken() );
219 if( !clientN.empty() ) {
223 dataHeader->setDhFormToken( dhFormNewRef );
231 ATH_MSG_ERROR(
"updateRep called but the previous DataHeader was not yet processed."
234 return StatusCode::FAILURE;
239 std::size_t tagBeg = dhPlacementStr.find(
"[KEY=") + 5;
240 std::size_t tagSize = dhPlacementStr.find(
']', tagBeg) - tagBeg;
243 return StatusCode::SUCCESS;
257 std::string dhid = pAddress->par()[1];
259 this->
setToken( pAddress->par()[0] );
261 ATH_MSG_ERROR(
"updateRepRefs called without DataHeaderForm" );
262 return StatusCode::FAILURE;
270 ATH_MSG_ERROR(
"updateRepRefs: missing DataHeaderForm for DH ID=" << dhid );
271 return StatusCode::FAILURE;
284 return(StatusCode::SUCCESS);
292 ATH_MSG_ERROR(
"Failed to cast DataHeader to transient type" );
293 return(StatusCode::FAILURE);
297 std::string form_placement_str = dhf_placement.
toString();
299 std::unique_ptr<DataHeaderForm_p6>& dhForm =
m_persFormMap[form_placement_str];
300 if (dhForm ==
nullptr) {
302 dhForm = std::make_unique<DataHeaderForm_p6>();
309 const std::string connection = dh_placement.
fileName();
315 ATH_MSG_FATAL(
"Failed to convert DataHeader to persistent type: " <<
e.what());
316 return(StatusCode::FAILURE);
320 if (dh_token ==
nullptr) {
322 return(StatusCode::FAILURE);
332 static const RootType dhFormType(
typeid(*dhForm));
334 if (dhf_token ==
nullptr) {
336 return(StatusCode::FAILURE);
345 dhf_token->
release(); dhf_token =
nullptr;
356 dhForm->
setToken( form_placement_str );
358 form_placement_str = dhForm->
getToken();
361 auto b = form_placement_str.find(
"[FILE=");
362 auto e = form_placement_str.find(
"]",
b);
363 form_placement_str.erase(
b,
e-
b+1);
369 if (
list !=
nullptr) {
373 obj->getEvtRefTokenStr().c_str(),
375 delete ref_token; ref_token =
nullptr;
376 for (coral::AttributeList::const_iterator
iter =
list->begin(), last =
list->end();
iter != last; ++
iter) {
377 attr_placement = this->
setPlacementWithType(
"AttributeList", (*iter).specification().name(), *pAddr->par());
379 (*iter).addressOfData(),
380 RootType((*iter).specification().type()) );
381 delete attr_token; attr_token =
nullptr;
385 if (tokAddr !=
nullptr) {
386 tokAddr->
setToken(std::move(dh_token));
388 return(StatusCode::FAILURE);
390 return(StatusCode::SUCCESS);
396 void* voidPtr1 =
nullptr;
398 if (voidPtr1 ==
nullptr) {
403 void* voidPtr2 =
nullptr;
410 if (voidPtr2 ==
nullptr) {
411 throw std::runtime_error(
"Could not get object for token = " + mapToken.
toString());
425 void* voidPtr1 =
nullptr;
426 std::string error_message;
431 error_message =
err.what();
433 if (voidPtr1 ==
nullptr) {
434 throw std::runtime_error(
"Could not get object for token = " +
m_i_poolToken->
toString() +
", " + error_message);
438 std::string dhFormToken =
header->dhFormToken();
440 if( !dhFormToken.empty() and dhFormToken.find(
"[OID=") == std::string::npos) {
451 oid2 >>= 32; oid2 <<= 32;
454 if( !swn.empty() ) oid2 += std::stoul( swn ) - 1;
455 formToken.
setOid( {0,oid2} );
458 header->setDhFormToken( dhFormToken );
463 size_t dbpos = dhFormToken.find(
"[DB=");
464 if( dbpos != std::string::npos ) {
465 const std::string dbGuid = dhFormToken.substr(dbpos+4, dbpos+36);
473 void* voidPtr2 =
nullptr;
474 if( dhFormToken.empty() ) {
487 error_message =
err.what();
489 if (voidPtr2 ==
nullptr) {
495 void* firstPtr1 =
nullptr;
500 error_message =
err.what();
502 if (firstPtr1 ==
nullptr)
throw std::runtime_error(
"Could not get first DataHeader for token = " + firstToken.
toString() +
", " + error_message);
505 std::unique_ptr<DataHeader_p6> firstHeader(
reinterpret_cast<DataHeader_p6*
>(firstPtr1) );
515 error_message =
err.what();
517 if (voidPtr2 ==
nullptr)
throw std::runtime_error(
"Could not get DataHeaderForm for token = " + formToken.
toString() +
", " + error_message);
520 ATH_MSG_WARNING(
"DataHeaderForm read exception: " << error_message <<
" - reusing the last good DHForm");
523 ATH_MSG_WARNING(
"DataHeaderForm read exception: " << error_message <<
" - reusing the last good DHForm");
528 if (voidPtr2 ==
nullptr) {
529 throw std::runtime_error(
"Could not get object for token = " + formToken.
toString());
547 auto iter =
dh->m_inputDataHeader.begin();
548 while(
iter !=
dh->m_inputDataHeader.end() ) {
565 std::string bestPfn, fileType;
571 static const pool::Guid p6_guid(
"4DDBD295-EFCE-472A-9EC8-15CD35A9EB8D");
572 static const pool::Guid p5_guid(
"D82968A1-CF91-4320-B2DD-E0F739CBC7E6");
573 static const pool::Guid p4_guid(
"9630EB7B-CCD7-47D9-A39B-CBBF4133CDF2");
574 static const pool::Guid p3_guid(
"EC1318F0-8E28-45F8-9A2D-2597C1CC87A6");
588 std::unique_ptr<DataHeader_p4> obj_p4(this->poolReadObject<DataHeader_p4>());
592 std::unique_ptr<DataHeader_p3> obj_p3(this->poolReadObject<DataHeader_p3>());
598 std::string
error =
e.what();
599 throw std::runtime_error(
error);