129 std::string outputConnection = outputConnectionSpec.substr(0, outputConnectionSpec.find(
'['));
133 if (!this->
cleanUp(outputConnection).isSuccess()) {
135 return(StatusCode::FAILURE);
137 return(StatusCode::SUCCESS);
140 ATH_MSG_DEBUG(
"commitOutput SKIPPED for uninitialized server.");
141 return(StatusCode::SUCCESS);
143 std::map<void*, RootType> commitCache;
144 std::string fileName;
147 const char* placementStr =
nullptr;
150 if (
sc.isSuccess() && placementStr !=
nullptr && strlen(placementStr) > 6 && num > 0) {
151 const char * matchedChars = strstr(placementStr,
"[FILE=");
153 ATH_MSG_ERROR(std::format(
"No matching filename in {}", placementStr));
156 fileName = matchedChars;
157 fileName = fileName.substr(6, fileName.find(
']') - 6);
159 ATH_MSG_ERROR(std::format(
"Failed to connectOutput for {}", fileName));
163 bool dataHeaderSeen =
false;
164 std::string dataHeaderID;
166 std::string objName =
"ALL";
167 if (useDetailChronoStat()) {
168 objName = placementStr;
173 std::string_view pStr = placementStr;
174 std::string::size_type cpos = pStr.find (
"[CONT=");
175 if (cpos == std::string::npos) {
176 ATH_MSG_ERROR(std::format(
"No CONT field in placement string: {}", pStr));
177 return StatusCode::FAILURE;
179 std::string tokenStr (pStr.substr(0, cpos));
180 std::string contName (pStr.substr(cpos, std::string::npos));
181 std::string::size_type cl1 = contName.find(
']');
182 if (cl1 == std::string::npos) {
183 ATH_MSG_ERROR(std::format(
"Missing close bracket after CONT field in placement string: {}", pStr));
184 return StatusCode::FAILURE;
186 tokenStr.append(contName, cl1 + 1);
187 contName = contName.substr(6, cl1 - 6);
189 std::string::size_type ppos = pStr.find (
"[PNAME=");
190 if (ppos == std::string::npos) {
191 ATH_MSG_ERROR(std::format(
"No PNAME field in placement string: {}", pStr));
192 return StatusCode::FAILURE;
194 std::string className (pStr.substr(ppos, std::string::npos));
195 std::string::size_type cl2 = className.find(
']');
196 if (cl2 == std::string::npos) {
197 ATH_MSG_ERROR(std::format(
"Missing close bracket after PNAME field in placement string: {}", pStr));
198 return StatusCode::FAILURE;
200 className = className.substr(7, cl2 - 7);
203 const std::string numStr = std::to_string(num);
205 bool foundContainer =
false;
206 std::size_t opPos = contName.find(
'(');
208 foundContainer =
true;
211 if (contName.compare(0, opPos, item) == 0){
212 foundContainer =
true;
218 if (len > 0 && foundContainer && contName[len] ==
'(' ) {
224 FileIncident beginInputIncident(name(),
"BeginInputMemFile", memName);
225 incSvc->fireIncident(beginInputIncident);
226 FileIncident endInputIncident(name(),
"EndInputMemFile", std::move(memName));
227 incSvc->fireIncident(endInputIncident);
234 sc = metadataSvc->shmProxy(std::format(
"{}[NUM={}]", pStr, numStr));
235 if (
sc.isRecoverable()) {
237 }
else if (
sc.isFailure()) {
248 if( m_oneDataHeaderForm.value() ) {
249 auto placementWithSwn = [&] {
return std::format(
"{}[SWN={}]", placementStr, num); };
250 if( className ==
"DataHeaderForm_p6" ) {
253 "", placementWithSwn());
254 DHcnv->updateRepRefs(&address,
static_cast<DataObject*
>(obj)).ignore();
260 if (token ==
nullptr) {
264 tokenStr = token->toString();
266 if( className ==
"DataHeader_p6" ) {
269 tokenStr, placementWithSwn());
270 if (!DHcnv->updateRep(&address,
static_cast<DataObject*
>(obj)).isSuccess()) {
275 if (className !=
"Token" && className !=
"DataHeaderForm_p6" && !classDesc.
IsFundamental()) {
276 commitCache.insert(std::pair<void*, RootType>(obj, classDesc));
278 placementStr =
nullptr;
282 placement.
fromString(placementStr); placementStr =
nullptr;
284 if (token ==
nullptr) {
288 tokenStr = token->toString();
289 if (className ==
"DataHeader_p6") {
294 if (!DHcnv->updateRep(&address,
static_cast<DataObject*
>(obj)).isSuccess()) {
298 dataHeaderSeen =
true;
305 dataHeaderID = std::format(
"{}/{}/{}", token->contID(), numStr, token->dbID().toString());
306 }
else if (dataHeaderSeen) {
307 dataHeaderSeen =
false;
310 if (className ==
"DataHeaderForm_p6") {
313 tokenStr, dataHeaderID);
314 if (!DHcnv->updateRepRefs(&address,
static_cast<DataObject*
>(obj)).isSuccess()) {
315 ATH_MSG_ERROR(
"Failed updateRepRefs for obj = " << tokenStr);
320 GenericAddress address(0, 0,
"", dataHeaderID);
321 if (!DHcnv->updateRepRefs(&address,
nullptr).isSuccess()) {
327 if (className !=
"Token" && className !=
"DataHeaderForm_p6" && !classDesc.
IsFundamental()) {
328 commitCache.insert(std::pair<void*, RootType>(obj, classDesc));
335 while (
sc.isRecoverable()) {
338 if (!
sc.isSuccess()) {
344 while (
sc.isRecoverable()) {
347 if (
sc.isFailure()) {
352 if (dataHeaderSeen) {
354 GenericAddress address(0, 0,
"", std::move(dataHeaderID));
355 if (!DHcnv->updateRepRefs(&address,
nullptr).isSuccess()) {
360 placementStr =
nullptr;
361 }
else if (
sc.isSuccess() && placementStr !=
nullptr && strncmp(placementStr,
"stop", 4) == 0) {
362 return(StatusCode::RECOVERABLE);
363 }
else if (
sc.isRecoverable() || num == -1) {
364 return(StatusCode::RECOVERABLE);
366 if (
sc.isFailure() || fileName.empty()) {
369 FileIncident beginInputIncident(name(),
"BeginInputMemFile", memName);
370 incSvc->fireIncident(beginInputIncident);
371 FileIncident endInputIncident(name(),
"EndInputMemFile", std::move(memName));
372 incSvc->fireIncident(endInputIncident);
373 if (
sc.isFailure()) {
374 ATH_MSG_INFO(
"All SharedWriter clients stopped - exiting");
378 return(StatusCode::FAILURE);
382 ATH_MSG_DEBUG(std::format(
"commitOutput SKIPPED for metadata-only server: {}", outputConnectionSpec));
383 return(StatusCode::SUCCESS);
385 if (outputConnection.empty()) {
386 outputConnection = std::move(fileName);
388 outputConnection = outputConnectionSpec;
393 std::size_t
merge = outputConnection.find(
"?pmerge=");
394 const std::string baseOutputConnection = outputConnection.substr(0,
merge);
403 StatusCode status = AthenaPoolCnvSvc::commitOutput(outputConnection, doCommit);
404 for (
auto& [ptr, rootType] : commitCache) {
405 rootType.Destruct(ptr);