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() ) {
46 incSvc->removeListener(
this, IncidentType::EndInputFile);
47 }
catch ( GaudiException &
e){
48 ATH_MSG_FATAL(
"Gaudi exception caught in DataHeaderCnv::~DataHeaderCnv");
57 bool doFilterDHAliases =
true;
58 const std::string
svcName = (serviceLocator()->existsService(
"AthenaPoolSharedIOCnvSvc") ?
"AthenaPoolSharedIOCnvSvc" :
"AthenaPoolCnvSvc");
59 SmartIF<IProperty> cnvSvc{service(
svcName,
false)};
62 if( cnvSvc->getProperty(&sizeProp).isSuccess() ) {
65 BooleanProperty aliasFilterProp(
"doFilterDHAliases", doFilterDHAliases);
66 if( cnvSvc->getProperty(&aliasFilterProp).isSuccess() ) {
67 doFilterDHAliases = aliasFilterProp.value();
69 BooleanProperty oneDHForm(
"OneDataHeaderForm",
m_oneDHForm);
70 if( cnvSvc->getProperty(&oneDHForm).isSuccess() ) {
75 if( doFilterDHAliases ) {
86 incSvc->addListener(
this, IncidentType::EndInputFile, 0);
87 incSvc->addListener(
this,
"PreFork", 0);
89 incSvc->addListener(
this,
"WriteDataHeaderForms", 0);
96 if( incident.type() ==
"PreFork" ) {
99 if( incident.type() == IncidentType::EndInputFile ) {
101 const std::string&
guid =
static_cast<const FileIncident&
>(incident).fileGuid();
104 if( incident.type() ==
"WriteDataHeaderForms" ) {
106 const std::string&
fileName =
static_cast<const FileIncident*
>(&incident)->
fileName();
108 std::vector<std::string> toWrite;
109 auto pos =
fileName.find(
"[OutputCollection=MetaDataHdr]");
110 bool metaDataCommit = (
pos != std::string::npos);
111 std::string justFileName =
fileName.substr(0,
pos);
115 const std::string& placementStr = elem.first;
121 if( (placementStr.find(
"[CONT=MetaData") != std::string::npos) == metaDataCommit ) {
122 toWrite.push_back( placementStr );
127 for( std::size_t
n = 0;
const std::string& placementStr : toWrite ) {
131 if( form_ptr->isModified() ) {
132 static const RootType dhFormType(
typeid( *form_ptr ) );
136 std::string errmsg =
std::format(
"Failed to write {} {}", dhFormType.
Name(), placementStr);
138 throw GaudiException(std::move(errmsg),
"DataHeaderCnv::WriteDataHeaderForms", StatusCode::FAILURE);
140 ATH_MSG_DEBUG(
"Wrote DatHeaderForm, placeemnt was " << placementStr <<
" token=" << form_token->
toString());
141 form_token->
release(); form_token =
nullptr;
142 bool doCommit = (++
n == toWrite.size());
145 throw GaudiException(
"WriteDataHeaderForms failed",
"DataHeaderCnv::WriteDataHeaderForms", StatusCode::FAILURE);
158 size_t dbpos =
iter->first.find(
"[DB=");
159 if( dbpos != std::string::npos &&
iter->first.compare(dbpos+4, dbpos+36, dbGuid) == 0 ) {
172 if(
start == std::string::npos )
197 if( lval != rval )
return lval < rval;
201 if( lval.empty() or rval.empty() )
return false;
202 return std::stoul( lval ) < std::stoul( rval );
216 auto dataHeader =
reinterpret_cast<DataHeader_p6*
>( pObject );
217 const std::string dhRef = pAddress->par()[0];
218 const std::string dhPlacementStr = pAddress->par()[1];
221 dhFormPlacement.
fromString( dataHeader->dhFormToken() );
224 if( !clientN.empty() ) {
228 dataHeader->setDhFormToken( dhFormNewRef );
236 ATH_MSG_ERROR(
"updateRep called but the previous DataHeader was not yet processed."
239 return StatusCode::FAILURE;
244 std::size_t tagBeg = dhPlacementStr.find(
"[KEY=") + 5;
245 std::size_t tagSize = dhPlacementStr.find(
']', tagBeg) - tagBeg;
248 return StatusCode::SUCCESS;
262 std::string dhid = pAddress->par()[1];
264 this->
setToken( pAddress->par()[0] );
266 ATH_MSG_ERROR(
"updateRepRefs called without DataHeaderForm" );
267 return StatusCode::FAILURE;
275 ATH_MSG_ERROR(
"updateRepRefs: missing DataHeaderForm for DH ID=" << dhid );
276 return StatusCode::FAILURE;
289 return(StatusCode::SUCCESS);
297 ATH_MSG_ERROR(
"Failed to cast DataHeader to transient type" );
298 return(StatusCode::FAILURE);
302 std::string form_placement_str = dhf_placement.
toString();
304 std::unique_ptr<DataHeaderForm_p6>& dhForm =
m_persFormMap[form_placement_str];
305 if (dhForm ==
nullptr) {
307 dhForm = std::make_unique<DataHeaderForm_p6>();
314 const std::string connection = dh_placement.
fileName();
320 ATH_MSG_FATAL(
"Failed to convert DataHeader to persistent type: " <<
e.what());
321 return(StatusCode::FAILURE);
325 if (dh_token ==
nullptr) {
327 return(StatusCode::FAILURE);
337 static const RootType dhFormType(
typeid(*dhForm));
339 if (dhf_token ==
nullptr) {
341 return(StatusCode::FAILURE);
350 dhf_token->
release(); dhf_token =
nullptr;
361 dhForm->
setToken( form_placement_str );
363 form_placement_str = dhForm->
getToken();
366 auto b = form_placement_str.find(
"[FILE=");
367 auto e = form_placement_str.find(
"]",
b);
368 form_placement_str.erase(
b,
e-
b+1);
374 if (
list !=
nullptr) {
378 obj->getEvtRefTokenStr().c_str(),
380 delete ref_token; ref_token =
nullptr;
381 for (coral::AttributeList::const_iterator
iter =
list->begin(), last =
list->end();
iter != last; ++
iter) {
382 attr_placement = this->
setPlacementWithType(
"AttributeList", (*iter).specification().name(), *pAddr->par());
384 (*iter).addressOfData(),
385 RootType((*iter).specification().type()) );
386 delete attr_token; attr_token =
nullptr;
390 if (tokAddr !=
nullptr) {
391 tokAddr->
setToken(std::move(dh_token));
393 return(StatusCode::FAILURE);
395 return(StatusCode::SUCCESS);
401 void* voidPtr1 =
nullptr;
403 if (voidPtr1 ==
nullptr) {
408 void* voidPtr2 =
nullptr;
415 if (voidPtr2 ==
nullptr) {
416 throw std::runtime_error(
"Could not get object for token = " + mapToken.
toString());
430 void* voidPtr1 =
nullptr;
431 std::string error_message;
436 error_message =
err.what();
438 if (voidPtr1 ==
nullptr) {
439 throw std::runtime_error(
"Could not get object for token = " +
m_i_poolToken->
toString() +
", " + error_message);
443 std::string dhFormToken =
header->dhFormToken();
445 if( !dhFormToken.empty() and dhFormToken.find(
"[OID=") == std::string::npos) {
456 oid2 >>= 32; oid2 <<= 32;
459 if( !swn.empty() ) oid2 += std::stoul( swn ) - 1;
460 formToken.
setOid( {0,oid2} );
463 header->setDhFormToken( dhFormToken );
468 size_t dbpos = dhFormToken.find(
"[DB=");
469 if( dbpos != std::string::npos ) {
470 const std::string dbGuid = dhFormToken.substr(dbpos+4, dbpos+36);
478 void* voidPtr2 =
nullptr;
479 if( dhFormToken.empty() ) {
492 error_message =
err.what();
494 if (voidPtr2 ==
nullptr) {
500 void* firstPtr1 =
nullptr;
505 error_message =
err.what();
507 if (firstPtr1 ==
nullptr)
throw std::runtime_error(
"Could not get first DataHeader for token = " + firstToken.
toString() +
", " + error_message);
510 std::unique_ptr<DataHeader_p6> firstHeader(
reinterpret_cast<DataHeader_p6*
>(firstPtr1) );
520 error_message =
err.what();
522 if (voidPtr2 ==
nullptr)
throw std::runtime_error(
"Could not get DataHeaderForm for token = " + formToken.
toString() +
", " + error_message);
525 ATH_MSG_WARNING(
"DataHeaderForm read exception: " << error_message <<
" - reusing the last good DHForm");
528 ATH_MSG_WARNING(
"DataHeaderForm read exception: " << error_message <<
" - reusing the last good DHForm");
533 if (voidPtr2 ==
nullptr) {
534 throw std::runtime_error(
"Could not get object for token = " + formToken.
toString());
552 auto iter =
dh->m_inputDataHeader.begin();
553 while(
iter !=
dh->m_inputDataHeader.end() ) {
570 std::string bestPfn, fileType;
576 static const pool::Guid p6_guid(
"4DDBD295-EFCE-472A-9EC8-15CD35A9EB8D");
577 static const pool::Guid p5_guid(
"D82968A1-CF91-4320-B2DD-E0F739CBC7E6");
578 static const pool::Guid p4_guid(
"9630EB7B-CCD7-47D9-A39B-CBBF4133CDF2");
579 static const pool::Guid p3_guid(
"EC1318F0-8E28-45F8-9A2D-2597C1CC87A6");
593 std::unique_ptr<DataHeader_p4> obj_p4(this->poolReadObject<DataHeader_p4>());
597 std::unique_ptr<DataHeader_p3> obj_p3(this->poolReadObject<DataHeader_p3>());
603 std::string
error =
e.what();
604 throw std::runtime_error(
error);