From 9194c07a8844a54d45b4020d6e47ef13ad737de7 Mon Sep 17 00:00:00 2001 From: silverweed Date: Tue, 28 Oct 2025 11:17:03 +0100 Subject: [PATCH] [net] TParallelMergingFile: don't rely on nbytes for UploadAndReset() The `nbytes` value returned by TDirectoryFile::Write() is only > 0 if we write at least one TObject to the file, which is not the case for non-TObject-based objects that handle their own writing (e.g. RNTuple through RMiniFile). This means that if we write only non-TObjects in a TParallelMergingFile we will never call UploadAndReset() by only checking nbytes. With this PR, we instead use GetBytesWritten() to check if anything gets written by TDirectoryFile::Write(), which works even in case of non- TObjects. --- net/net/src/TParallelMergingFile.cxx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/net/net/src/TParallelMergingFile.cxx b/net/net/src/TParallelMergingFile.cxx index 894a093578611..bbe71c7d9aefd 100644 --- a/net/net/src/TParallelMergingFile.cxx +++ b/net/net/src/TParallelMergingFile.cxx @@ -133,9 +133,7 @@ Bool_t TParallelMergingFile::UploadAndReset() fMessage.WriteLong64(GetEND()); CopyTo(fMessage); - // FIXME: CXX17: Use init-statement in if to declare `error` variable - int error; - if ((error = fSocket->Send(fMessage)) <= 0) { + if (int error = fSocket->Send(fMessage); error <= 0) { Error("UploadAndReset","Upload to the merging server failed with %d\n",error); delete fSocket; fSocket = 0; @@ -177,8 +175,12 @@ Bool_t TParallelMergingFile::UploadAndReset() Int_t TParallelMergingFile::Write(const char *, Int_t opt, Int_t bufsize) { - Int_t nbytes = TMemFile::Write(0,opt,bufsize); - if (nbytes) { + std::size_t prevSize = GetBytesWritten(); + auto nbytes = TMemFile::Write(0,opt,bufsize); + std::size_t newSize = GetBytesWritten(); + // NOTE: we don't rely on nbytes > 0 to do UploadAndReset() because nbytes may be 0 if the file + // only contains non-TObject objects (as they are not written by TMemFile::Write). + if (newSize > prevSize) { UploadAndReset(); } return nbytes;