From 0e0c7c9ac409824b1890b406dc525f90f182601f Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Tue, 8 Feb 2022 15:27:59 -0500 Subject: [PATCH] added OpenChain to FileStdio transport, and relevant test with BP5 engine --- .../toolkit/transport/file/FileStdio.cpp | 65 +++++++++++++++++++ .../adios2/toolkit/transport/file/FileStdio.h | 4 ++ testing/adios2/engine/bp/CMakeLists.txt | 2 +- .../engine/bp/TestBPWriteReadADIOS2stdio.cpp | 18 +++-- 4 files changed, 82 insertions(+), 7 deletions(-) diff --git a/source/adios2/toolkit/transport/file/FileStdio.cpp b/source/adios2/toolkit/transport/file/FileStdio.cpp index 81dfe5d220..2621d9db7e 100644 --- a/source/adios2/toolkit/transport/file/FileStdio.cpp +++ b/source/adios2/toolkit/transport/file/FileStdio.cpp @@ -111,6 +111,71 @@ void FileStdio::Open(const std::string &name, const Mode openMode, } } +void FileStdio::OpenChain(const std::string &name, Mode openMode, + const helper::Comm &chainComm, const bool async) +{ + auto lf_AsyncOpenWrite = [&](const std::string &name) -> FILE * { + errno = 0; + return std::fopen(name.c_str(), "wb"); + }; + + int token = 1; + m_Name = name; + CheckName(); + + if (chainComm.Rank() > 0) + { + chainComm.Recv(&token, 1, chainComm.Rank() - 1, 0, + "Chain token in FileStdio::OpenChain"); + } + + m_OpenMode = openMode; + switch (m_OpenMode) + { + case (Mode::Write): + if (async) + { + m_IsOpening = true; + m_OpenFuture = + std::async(std::launch::async, lf_AsyncOpenWrite, name); + } + else + { + errno = 0; + m_File = std::fopen(name.c_str(), "wb"); + } + break; + case (Mode::Append): + errno = 0; + m_File = std::fopen(name.c_str(), "rwb"); + // m_File = std::fopen(name.c_str(), "a+b"); + std::fseek(m_File, 0, SEEK_END); + break; + case (Mode::Read): + errno = 0; + m_File = std::fopen(name.c_str(), "rb"); + break; + default: + helper::Throw( + "Toolkit", "transport::file::FileStdio", "Open", + "unknown open mode for file " + m_Name); + } + + if (!m_IsOpening) + { + CheckFile( + "couldn't open file " + m_Name + + ", check permissions or path existence, in call to stdio open"); + m_IsOpen = true; + } + + if (chainComm.Rank() < chainComm.Size() - 1) + { + chainComm.Isend(&token, 1, chainComm.Rank() + 1, 0, + "Sending Chain token in FileStdio::OpenChain"); + } +} + void FileStdio::SetBuffer(char *buffer, size_t size) { if (!m_File) diff --git a/source/adios2/toolkit/transport/file/FileStdio.h b/source/adios2/toolkit/transport/file/FileStdio.h index 37d7ded3d4..f0ccfaf043 100644 --- a/source/adios2/toolkit/transport/file/FileStdio.h +++ b/source/adios2/toolkit/transport/file/FileStdio.h @@ -37,6 +37,10 @@ class FileStdio : public Transport void Open(const std::string &name, const Mode openMode, const bool async = false) final; + void OpenChain(const std::string &name, Mode openMode, + const helper::Comm &chainComm, + const bool async = false) final; + void SetBuffer(char *buffer, size_t size) final; void Write(const char *buffer, size_t size, size_t start = MaxSizeT) final; diff --git a/testing/adios2/engine/bp/CMakeLists.txt b/testing/adios2/engine/bp/CMakeLists.txt index 857337872f..34e0dccaee 100644 --- a/testing/adios2/engine/bp/CMakeLists.txt +++ b/testing/adios2/engine/bp/CMakeLists.txt @@ -78,7 +78,7 @@ bp_gtest_add_tests_helper(WriteReadADIOS2 MPI_ALLOW) async_gtest_add_tests_helper(WriteReadADIOS2 MPI_ALLOW) bp_gtest_add_tests_helper(WriteReadADIOS2fstream MPI_ALLOW) -bp3_bp4_gtest_add_tests_helper(WriteReadADIOS2stdio MPI_ALLOW) +bp_gtest_add_tests_helper(WriteReadADIOS2stdio MPI_ALLOW) bp_gtest_add_tests_helper(WriteReadAsStreamADIOS2 MPI_ALLOW) bp_gtest_add_tests_helper(WriteReadAsStreamADIOS2_Threads MPI_ALLOW) bp_gtest_add_tests_helper(WriteReadAttributes MPI_ALLOW) diff --git a/testing/adios2/engine/bp/TestBPWriteReadADIOS2stdio.cpp b/testing/adios2/engine/bp/TestBPWriteReadADIOS2stdio.cpp index 977d54a70e..5b4b507bb9 100644 --- a/testing/adios2/engine/bp/TestBPWriteReadADIOS2stdio.cpp +++ b/testing/adios2/engine/bp/TestBPWriteReadADIOS2stdio.cpp @@ -183,7 +183,8 @@ TEST_F(BPWriteReadTestADIOS2stdio, ADIOS2BPWriteRead1D8) } io.AddTransport("file", {{"Library", "stdio"}}); - adios2::Engine bpReader = io.Open(fname, adios2::Mode::Read); + adios2::Engine bpReader = + io.Open(fname, adios2::Mode::ReadRandomAccess); auto var_iString = io.InquireVariable("iString"); EXPECT_TRUE(var_iString); @@ -530,7 +531,8 @@ TEST_F(BPWriteReadTestADIOS2stdio, ADIOS2BPWriteRead2D2x4) } io.AddTransport("file", {{"Library", "stdio"}}); - adios2::Engine bpReader = io.Open(fname, adios2::Mode::Read); + adios2::Engine bpReader = + io.Open(fname, adios2::Mode::ReadRandomAccess); auto var_iString = io.InquireVariable("iString"); EXPECT_TRUE(var_iString); @@ -877,7 +879,8 @@ TEST_F(BPWriteReadTestADIOS2stdio, ADIOS2BPWriteRead2D4x2) } io.AddTransport("file", {{"Library", "stdio"}}); - adios2::Engine bpReader = io.Open(fname, adios2::Mode::Read); + adios2::Engine bpReader = + io.Open(fname, adios2::Mode::ReadRandomAccess); auto var_i8 = io.InquireVariable("i8"); EXPECT_TRUE(var_i8); @@ -1213,7 +1216,8 @@ TEST_F(BPWriteReadTestADIOS2stdio, ADIOS2BPWriteRead2D4x2_ReadMultiSteps) } io.AddTransport("file", {{"Library", "stdio"}}); - adios2::Engine bpReader = io.Open(fname, adios2::Mode::Read); + adios2::Engine bpReader = + io.Open(fname, adios2::Mode::ReadRandomAccess); auto var_i8 = io.InquireVariable("i8"); EXPECT_TRUE(var_i8); @@ -1538,7 +1542,8 @@ TEST_F(BPWriteReadTestADIOS2stdio, ADIOS2BPWriteRead2D4x2_MultiStepsOverflow) } io.AddTransport("file", {{"Library", "stdio"}}); - adios2::Engine bpReader = io.Open(fname, adios2::Mode::Read); + adios2::Engine bpReader = + io.Open(fname, adios2::Mode::ReadRandomAccess); auto var_i8 = io.InquireVariable("i8"); auto var_i16 = io.InquireVariable("i16"); @@ -1639,7 +1644,8 @@ TEST_F(BPWriteReadTestADIOS2stdio, OpenEngineTwice) bpWriter.Close(); EXPECT_NO_THROW(io.Open(fname, adios2::Mode::Write)); - EXPECT_THROW(io.Open(fname, adios2::Mode::Read), std::invalid_argument); + EXPECT_THROW(io.Open(fname, adios2::Mode::ReadRandomAccess), + std::invalid_argument); } }