130 std::string outputConnection = outputConnectionSpec.substr(0, outputConnectionSpec.find(
'['));
134 if (!this->cleanUp(outputConnection).isSuccess()) {
136 return(StatusCode::FAILURE);
138 return(StatusCode::SUCCESS);
141 ATH_MSG_DEBUG(
"commitOutput SKIPPED for uninitialized server.");
142 return(StatusCode::SUCCESS);
144 std::map<void*, RootType> commitCache;
145 std::string fileName;
148 const char* placementStr =
nullptr;
151 if (
sc.isSuccess() && placementStr !=
nullptr && strlen(placementStr) > 6 && num > 0) {
152 const char * matchedChars = strstr(placementStr,
"[FILE=");
154 ATH_MSG_ERROR(std::format(
"No matching filename in {}", placementStr));
157 fileName = matchedChars;
158 fileName = fileName.substr(6, fileName.find(
']') - 6);
160 ATH_MSG_ERROR(std::format(
"Failed to connectOutput for {}", fileName));
164 bool dataHeaderSeen =
false;
165 std::string dataHeaderID;
167 std::string objName =
"ALL";
168 if (useDetailChronoStat()) {
169 objName = placementStr;
174 std::string_view pStr = placementStr;
175 std::string::size_type cpos = pStr.find (
"[CONT=");
176 if (cpos == std::string::npos) {
177 ATH_MSG_ERROR(std::format(
"No CONT field in placement string: {}", pStr));
178 return StatusCode::FAILURE;
180 std::string tokenStr (pStr.substr(0, cpos));
181 std::string contName (pStr.substr(cpos, std::string::npos));
182 std::string::size_type cl1 = contName.find(
']');
183 if (cl1 == std::string::npos) {
184 ATH_MSG_ERROR(std::format(
"Missing close bracket after CONT field in placement string: {}", pStr));
185 return StatusCode::FAILURE;
187 tokenStr.append(contName, cl1 + 1);
188 contName = contName.substr(6, cl1 - 6);
190 std::string::size_type ppos = pStr.find (
"[PNAME=");
191 if (ppos == std::string::npos) {
192 ATH_MSG_ERROR(std::format(
"No PNAME field in placement string: {}", pStr));
193 return StatusCode::FAILURE;
195 std::string className (pStr.substr(ppos, std::string::npos));
196 std::string::size_type cl2 = className.find(
']');
197 if (cl2 == std::string::npos) {
198 ATH_MSG_ERROR(std::format(
"Missing close bracket after PNAME field in placement string: {}", pStr));
199 return StatusCode::FAILURE;
201 className = className.substr(7, cl2 - 7);
204 const std::string numStr = std::to_string(num);
206 bool foundContainer =
false;
207 std::size_t opPos = contName.find(
'(');
209 foundContainer =
true;
212 if (contName.compare(0, opPos, item) == 0){
213 foundContainer =
true;
219 if (len > 0 && foundContainer && contName[len] ==
'(' ) {
225 FileIncident beginInputIncident(name(),
"BeginInputMemFile", memName);
226 incSvc->fireIncident(beginInputIncident);
227 FileIncident endInputIncident(name(),
"EndInputMemFile", std::move(memName));
228 incSvc->fireIncident(endInputIncident);
235 sc = metadataSvc->shmProxy(std::format(
"{}[NUM={}]", pStr, numStr));
236 if (
sc.isRecoverable()) {
238 }
else if (
sc.isFailure()) {
249 if( m_oneDataHeaderForm.value() ) {
250 auto placementWithSwn = [&] {
return std::format(
"{}[SWN={}]", placementStr, num); };
251 if( className ==
"DataHeaderForm_p6" ) {
254 "", placementWithSwn());
255 DHcnv->updateRepRefs(&address,
static_cast<DataObject*
>(obj)).ignore();
261 if (token ==
nullptr) {
265 tokenStr = token->toString();
267 if( className ==
"DataHeader_p6" ) {
270 tokenStr, placementWithSwn());
271 if (!DHcnv->updateRep(&address,
static_cast<DataObject*
>(obj)).isSuccess()) {
276 if (className !=
"Token" && className !=
"DataHeaderForm_p6" && !classDesc.
IsFundamental()) {
277 commitCache.insert(std::pair<void*, RootType>(obj, classDesc));
279 placementStr =
nullptr;
283 placement.
fromString(placementStr); placementStr =
nullptr;
285 if (token ==
nullptr) {
289 tokenStr = token->toString();
290 if (className ==
"DataHeader_p6") {
295 if (!DHcnv->updateRep(&address,
static_cast<DataObject*
>(obj)).isSuccess()) {
299 dataHeaderSeen =
true;
306 dataHeaderID = std::format(
"{}/{}/{}", token->contID(), numStr, token->dbID().toString());
307 }
else if (dataHeaderSeen) {
308 dataHeaderSeen =
false;
311 if (className ==
"DataHeaderForm_p6") {
314 tokenStr, dataHeaderID);
315 if (!DHcnv->updateRepRefs(&address,
static_cast<DataObject*
>(obj)).isSuccess()) {
316 ATH_MSG_ERROR(
"Failed updateRepRefs for obj = " << tokenStr);
321 GenericAddress address(0, 0,
"", dataHeaderID);
322 if (!DHcnv->updateRepRefs(&address,
nullptr).isSuccess()) {
328 if (className !=
"Token" && className !=
"DataHeaderForm_p6" && !classDesc.
IsFundamental()) {
329 commitCache.insert(std::pair<void*, RootType>(obj, classDesc));
336 while (
sc.isRecoverable()) {
339 if (!
sc.isSuccess()) {
345 while (
sc.isRecoverable()) {
348 if (
sc.isFailure()) {
353 if (dataHeaderSeen) {
355 GenericAddress address(0, 0,
"", std::move(dataHeaderID));
356 if (!DHcnv->updateRepRefs(&address,
nullptr).isSuccess()) {
361 placementStr =
nullptr;
362 }
else if (
sc.isSuccess() && placementStr !=
nullptr && strncmp(placementStr,
"stop", 4) == 0) {
363 return(StatusCode::RECOVERABLE);
364 }
else if (
sc.isRecoverable() || num == -1) {
365 return(StatusCode::RECOVERABLE);
367 if (
sc.isFailure() || fileName.empty()) {
370 FileIncident beginInputIncident(name(),
"BeginInputMemFile", memName);
371 incSvc->fireIncident(beginInputIncident);
372 FileIncident endInputIncident(name(),
"EndInputMemFile", std::move(memName));
373 incSvc->fireIncident(endInputIncident);
374 if (
sc.isFailure()) {
375 ATH_MSG_INFO(
"All SharedWriter clients stopped - exiting");
379 return(StatusCode::FAILURE);
383 ATH_MSG_DEBUG(std::format(
"commitOutput SKIPPED for metadata-only server: {}", outputConnectionSpec));
384 return(StatusCode::SUCCESS);
386 if (outputConnection.empty()) {
387 outputConnection = std::move(fileName);
389 outputConnection = outputConnectionSpec;
394 StatusCode status = AthenaPoolCnvSvc::commitOutput(outputConnection, doCommit);
395 for (
auto& [ptr, rootType] : commitCache) {
396 rootType.Destruct(ptr);