diff --git a/source/adios2/toolkit/transport/file/FileFStream.cpp b/source/adios2/toolkit/transport/file/FileFStream.cpp index c71e5fdfe7..814a9cc904 100644 --- a/source/adios2/toolkit/transport/file/FileFStream.cpp +++ b/source/adios2/toolkit/transport/file/FileFStream.cpp @@ -111,7 +111,6 @@ void FileFStream::OpenChain(const std::string &name, Mode openMode, ProfilerStop("open"); }; - bool createOnAppend = true; int token = 1; m_Name = name; CheckName(); @@ -120,11 +119,6 @@ void FileFStream::OpenChain(const std::string &name, Mode openMode, { chainComm.Recv(&token, 1, chainComm.Rank() - 1, 0, "Chain token in FileFStream::OpenChain"); - if (openMode == Mode::Write) - { - openMode = Mode::Append; - createOnAppend = false; - } } m_OpenMode = openMode; @@ -140,28 +134,26 @@ void FileFStream::OpenChain(const std::string &name, Mode openMode, else { ProfilerStart("open"); - m_FileStream.open(name, std::fstream::out | std::fstream::binary | - std::fstream::trunc); + if (chainComm.Rank() == 0) + { + m_FileStream.open(name, std::fstream::out | + std::fstream::binary | + std::fstream::trunc); + } + else + { + m_FileStream.open(name, + std::fstream::out | std::fstream::binary); + } ProfilerStop("open"); } break; case (Mode::Append): ProfilerStart("open"); - - if (createOnAppend) - { - m_FileStream.open(name, std::fstream::in | std::fstream::out | - std::fstream::binary); - m_FileStream.seekp(0, std::ios_base::end); - } - else - { - m_FileStream.open(name, std::fstream::in | std::fstream::out | - std::fstream::binary); - m_FileStream.seekp(0, std::ios_base::beg); - } - + m_FileStream.open(name, std::fstream::in | std::fstream::out | + std::fstream::binary); + m_FileStream.seekp(0, std::ios_base::end); ProfilerStop("open"); break; diff --git a/source/adios2/toolkit/transport/file/FilePOSIX.cpp b/source/adios2/toolkit/transport/file/FilePOSIX.cpp index 7ec300be4a..ee9163814e 100644 --- a/source/adios2/toolkit/transport/file/FilePOSIX.cpp +++ b/source/adios2/toolkit/transport/file/FilePOSIX.cpp @@ -134,7 +134,6 @@ void FilePOSIX::OpenChain(const std::string &name, Mode openMode, return FD; }; - bool createOnAppend = true; int token = 1; m_Name = name; CheckName(); @@ -143,11 +142,6 @@ void FilePOSIX::OpenChain(const std::string &name, Mode openMode, { chainComm.Recv(&token, 1, chainComm.Rank() - 1, 0, "Chain token in FilePOSIX::OpenChain"); - if (openMode == Mode::Write) - { - openMode = Mode::Append; - createOnAppend = false; - } } m_OpenMode = openMode; @@ -157,7 +151,8 @@ void FilePOSIX::OpenChain(const std::string &name, Mode openMode, case (Mode::Write): if (async && chainComm.Size() == 1) { - // only single process open can do it asynchronously + // only when process is a single writer, can create the file + // asynchronously, otherwise other processes are waiting on it m_IsOpening = true; m_OpenFuture = std::async(std::launch::async, lf_AsyncOpenWrite, name); @@ -166,8 +161,16 @@ void FilePOSIX::OpenChain(const std::string &name, Mode openMode, { ProfilerStart("open"); errno = 0; - m_FileDescriptor = - open(m_Name.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (chainComm.Rank() == 0) + { + m_FileDescriptor = + open(m_Name.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666); + } + else + { + m_FileDescriptor = open(m_Name.c_str(), O_WRONLY, 0666); + lseek(m_FileDescriptor, 0, SEEK_SET); + } m_Errno = errno; ProfilerStop("open"); } @@ -176,19 +179,15 @@ void FilePOSIX::OpenChain(const std::string &name, Mode openMode, case (Mode::Append): ProfilerStart("open"); errno = 0; - - if (createOnAppend) + if (chainComm.Rank() == 0) { - m_FileDescriptor = open(m_Name.c_str(), O_RDWR | O_CREAT, 0777); - lseek(m_FileDescriptor, 0, SEEK_END); + m_FileDescriptor = open(m_Name.c_str(), O_RDWR | O_CREAT, 0666); } else { - /* This case runs on rank > 0 when called with Write mode */ m_FileDescriptor = open(m_Name.c_str(), O_RDWR); - lseek(m_FileDescriptor, 0, SEEK_SET); } - + lseek(m_FileDescriptor, 0, SEEK_END); m_Errno = errno; ProfilerStop("open"); break;