Skip to content

Commit ebc3343

Browse files
committed
Add new access types, no implementation yet
1 parent a421496 commit ebc3343

10 files changed

Lines changed: 153 additions & 55 deletions

File tree

include/openPMD/IO/Access.hpp

Lines changed: 72 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,11 @@ enum class Access
7878
* Read mode corresponds with Access::READ_RANDOM_ACCESS.
7979
*/
8080
READ_WRITE,
81-
CREATE, //!< create new series and truncate existing (files)
82-
APPEND //!< write new iterations to an existing series without reading
81+
CREATE_RANDOM_ACCESS, //!< create new series and truncate existing (files)
82+
CREATE_LINEAR,
83+
APPEND_RANDOM_ACCESS, //!< write new iterations to an existing series
84+
//!< without reading
85+
APPEND_LINEAR
8386
}; // Access
8487

8588
std::ostream &operator<<(std::ostream &o, Access const &a);
@@ -94,8 +97,10 @@ namespace access
9497
case Access::READ_ONLY:
9598
return true;
9699
case Access::READ_WRITE:
97-
case Access::CREATE:
98-
case Access::APPEND:
100+
case Access::CREATE_RANDOM_ACCESS:
101+
case Access::CREATE_LINEAR:
102+
case Access::APPEND_RANDOM_ACCESS:
103+
case Access::APPEND_LINEAR:
99104
return false;
100105
}
101106
throw std::runtime_error("Unreachable!");
@@ -114,8 +119,10 @@ namespace access
114119
case Access::READ_ONLY:
115120
case Access::READ_WRITE:
116121
return false;
117-
case Access::CREATE:
118-
case Access::APPEND:
122+
case Access::CREATE_RANDOM_ACCESS:
123+
case Access::CREATE_LINEAR:
124+
case Access::APPEND_RANDOM_ACCESS:
125+
case Access::APPEND_LINEAR:
119126
return true;
120127
}
121128
throw std::runtime_error("Unreachable!");
@@ -125,6 +132,65 @@ namespace access
125132
{
126133
return !writeOnly(access);
127134
}
135+
136+
inline bool random_access(Access access)
137+
{
138+
switch (access)
139+
{
140+
141+
case Access::READ_ONLY:
142+
case Access::READ_WRITE:
143+
case Access::CREATE_RANDOM_ACCESS:
144+
case Access::APPEND_RANDOM_ACCESS:
145+
return true;
146+
case Access::READ_LINEAR:
147+
case Access::CREATE_LINEAR:
148+
case Access::APPEND_LINEAR:
149+
return false;
150+
}
151+
throw std::runtime_error("Unreachable");
152+
}
153+
154+
inline bool linear(Access access)
155+
{
156+
return !random_access(access);
157+
}
158+
159+
inline bool append(Access access)
160+
{
161+
switch (access)
162+
{
163+
164+
case Access::READ_ONLY:
165+
case Access::READ_LINEAR:
166+
case Access::READ_WRITE:
167+
case Access::CREATE_RANDOM_ACCESS:
168+
case Access::CREATE_LINEAR:
169+
return false;
170+
case Access::APPEND_RANDOM_ACCESS:
171+
case Access::APPEND_LINEAR:
172+
return true;
173+
}
174+
throw std::runtime_error("Unreachable");
175+
}
176+
177+
inline bool create(Access access)
178+
{
179+
switch (access)
180+
{
181+
182+
case Access::READ_ONLY:
183+
case Access::READ_LINEAR:
184+
case Access::READ_WRITE:
185+
case Access::APPEND_RANDOM_ACCESS:
186+
case Access::APPEND_LINEAR:
187+
return false;
188+
case Access::CREATE_RANDOM_ACCESS:
189+
case Access::CREATE_LINEAR:
190+
return true;
191+
}
192+
throw std::runtime_error("Unreachable");
193+
}
128194
} // namespace access
129195

130196
// deprecated name (used prior to 0.12.0)

src/IO/ADIOS/ADIOS2File.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -633,8 +633,10 @@ void ADIOS2File::configure_IO()
633633
configure_IO_Write();
634634
}
635635
break;
636-
case Access::APPEND:
637-
case Access::CREATE:
636+
case Access::APPEND_RANDOM_ACCESS:
637+
case Access::APPEND_LINEAR:
638+
case Access::CREATE_RANDOM_ACCESS:
639+
case Access::CREATE_LINEAR:
638640
configure_IO_Write();
639641
break;
640642
}

src/IO/ADIOS/ADIOS2IOHandler.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1985,7 +1985,8 @@ adios2::Mode ADIOS2IOHandlerImpl::adios2AccessMode(
19851985
}
19861986
switch (m_handler->m_backendAccess)
19871987
{
1988-
case Access::CREATE:
1988+
case Access::CREATE_RANDOM_ACCESS:
1989+
case Access::CREATE_LINEAR:
19891990
switch (openFileAs)
19901991
{
19911992

@@ -2044,7 +2045,8 @@ adios2::Mode ADIOS2IOHandlerImpl::adios2AccessMode(
20442045
{
20452046
return adios2::Mode::Write;
20462047
}
2047-
case Access::APPEND:
2048+
case Access::APPEND_RANDOM_ACCESS:
2049+
case Access::APPEND_LINEAR:
20482050
return adios2::Mode::Append;
20492051
}
20502052
throw std::runtime_error("Unreachable!");

src/IO/AbstractIOHandler.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,15 @@ void AbstractIOHandler::setIterationEncoding(IterationEncoding encoding)
8383
*const_cast<Access *>(&m_backendAccess) =
8484
Access::READ_RANDOM_ACCESS;
8585
break;
86-
case Access::APPEND:
87-
*const_cast<Access *>(&m_backendAccess) = Access::CREATE;
86+
case Access::APPEND_LINEAR:
87+
case Access::APPEND_RANDOM_ACCESS:
88+
*const_cast<Access *>(&m_backendAccess) =
89+
Access::CREATE_RANDOM_ACCESS;
8890
break;
8991
case Access::READ_RANDOM_ACCESS:
9092
case Access::READ_WRITE:
91-
case Access::CREATE:
93+
case Access::CREATE_RANDOM_ACCESS:
94+
case Access::CREATE_LINEAR:
9295
break;
9396
}
9497
}

src/IO/Access.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,17 @@ std::ostream &operator<<(std::ostream &o, Access const &a)
1818
case Access::READ_WRITE:
1919
o << std::string("READ_WRITE");
2020
break;
21-
case Access::CREATE:
22-
o << std::string("CREATE");
21+
case Access::CREATE_LINEAR:
22+
o << std::string("CREATE_LINEAR");
2323
break;
24-
case Access::APPEND:
25-
o << std::string("APPEND");
24+
case Access::APPEND_LINEAR:
25+
o << std::string("APPEND_LINEAR");
26+
break;
27+
case Access::CREATE_RANDOM_ACCESS:
28+
o << std::string("CREATE_RANDOM_ACCESS");
29+
break;
30+
case Access::APPEND_RANDOM_ACCESS:
31+
o << std::string("APPEND_RANDOM_ACCESS");
2632
break;
2733
}
2834
return o;

src/IO/HDF5/HDF5IOHandler.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "openPMD/IO/HDF5/HDF5IOHandler.hpp"
2222
#include "openPMD/IO/AbstractIOHandler.hpp"
2323
#include "openPMD/IO/AbstractIOHandlerImpl.hpp"
24+
#include "openPMD/IO/Access.hpp"
2425
#include "openPMD/IO/FlushParametersInternal.hpp"
2526
#include "openPMD/IO/HDF5/HDF5IOHandlerImpl.hpp"
2627
#include "openPMD/auxiliary/Environment.hpp"
@@ -292,10 +293,12 @@ void HDF5IOHandlerImpl::createFile(
292293
unsigned flags{};
293294
switch (m_handler->m_backendAccess)
294295
{
295-
case Access::CREATE:
296+
case Access::CREATE_RANDOM_ACCESS:
297+
case Access::CREATE_LINEAR:
296298
flags = H5F_ACC_TRUNC;
297299
break;
298-
case Access::APPEND:
300+
case Access::APPEND_RANDOM_ACCESS:
301+
case Access::APPEND_LINEAR:
299302
if (auxiliary::file_exists(name))
300303
{
301304
flags = H5F_ACC_RDWR;
@@ -647,7 +650,7 @@ void HDF5IOHandlerImpl::createDataset(
647650
"[HDF5] Internal error: Failed to open HDF5 group during dataset "
648651
"creation");
649652

650-
if (m_handler->m_backendAccess == Access::APPEND)
653+
if (access::append(m_handler->m_backendAccess))
651654
{
652655
// The dataset might already exist in the file from a previous run
653656
// We delete it, otherwise we could not create it again with

src/IO/JSON/JSONIOHandlerImpl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ void JSONIOHandlerImpl::createFile(
517517
associateWithFile(writable, shared_name);
518518
this->m_dirty.emplace(shared_name);
519519

520-
if (m_handler->m_backendAccess != Access::APPEND ||
520+
if (!access::append(m_handler->m_backendAccess) ||
521521
!auxiliary::file_exists(fullPathToFile))
522522
{
523523
// if in create mode: make sure to overwrite
@@ -2194,7 +2194,7 @@ auto JSONIOHandlerImpl::putJsonContents(
21942194

21952195
auto writeSingleFile = [this, &it](std::string const &writeThisFile) {
21962196
auto [fh, _, fh_with_precision] =
2197-
getFilehandle(File(writeThisFile), Access::CREATE);
2197+
getFilehandle(File(writeThisFile), Access::CREATE_RANDOM_ACCESS);
21982198
(void)_;
21992199

22002200
switch (m_fileFormat)

src/Series.cpp

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,7 @@ void Series::init(
905905

906906
switch (at)
907907
{
908-
case Access::CREATE:
908+
case Access::CREATE_RANDOM_ACCESS:
909909
case Access::READ_WRITE:
910910
case Access::READ_ONLY: {
911911
auto [parsed_input, tracing_json] = initIOHandler<json::TracingJSON>(
@@ -917,8 +917,10 @@ void Series::init(
917917
init_directly(std::move(parsed_input), std::move(tracing_json));
918918
}
919919
break;
920+
case Access::CREATE_LINEAR:
920921
case Access::READ_LINEAR:
921-
case Access::APPEND: {
922+
case Access::APPEND_RANDOM_ACCESS:
923+
case Access::APPEND_LINEAR: {
922924
auto [first_parsed_input, first_tracing_json] =
923925
initIOHandler<json::TracingJSON>(
924926
filepath,
@@ -963,7 +965,7 @@ auto Series::initIOHandler(
963965
/* considerFiles = */ true);
964966
auto input = parseInput(filepath);
965967
if (resolve_generic_extension && input->format == Format::GENERIC &&
966-
at != Access::CREATE)
968+
!access::create(at))
967969
{
968970
auto isPartOfSeries =
969971
input->iterationEncoding == IterationEncoding::fileBased
@@ -1155,13 +1157,15 @@ Given file pattern: ')END"
11551157
IOHandler()->m_seriesStatus = internal::SeriesStatus::Default;
11561158
break;
11571159
}
1158-
case Access::CREATE: {
1160+
case Access::CREATE_RANDOM_ACCESS:
1161+
case Access::CREATE_LINEAR: {
11591162
initDefaults(input->iterationEncoding);
11601163
setIterationEncoding_internal(
11611164
input->iterationEncoding, series.m_iterationEncodingSetExplicitly);
11621165
break;
11631166
}
1164-
case Access::APPEND: {
1167+
case Access::APPEND_RANDOM_ACCESS:
1168+
case Access::APPEND_LINEAR: {
11651169
initDefaults(input->iterationEncoding);
11661170
setIterationEncoding_internal(
11671171
input->iterationEncoding, series.m_iterationEncodingSetExplicitly);
@@ -1225,7 +1229,7 @@ void Series::initDefaults(IterationEncoding ie, bool initAll)
12251229
* In file-based iteration encoding, files are always truncated in Append
12261230
* mode (Append mode works on a per-iteration basis).
12271231
*/
1228-
if (!initAll && IOHandler()->m_frontendAccess == Access::APPEND &&
1232+
if (!initAll && access::append(IOHandler()->m_frontendAccess) &&
12291233
ie != IterationEncoding::fileBased)
12301234
{
12311235
return;
@@ -1349,8 +1353,10 @@ void Series::flushFileBased(
13491353
}
13501354
break;
13511355
case Access::READ_WRITE:
1352-
case Access::CREATE:
1353-
case Access::APPEND: {
1356+
case Access::CREATE_RANDOM_ACCESS:
1357+
case Access::CREATE_LINEAR:
1358+
case Access::APPEND_RANDOM_ACCESS:
1359+
case Access::APPEND_LINEAR: {
13541360
bool allDirty = dirty();
13551361
for (auto it = begin; it != end; ++it)
13561362
{
@@ -1471,7 +1477,7 @@ void Series::flushGorVBased(
14711477
{
14721478
if (!written())
14731479
{
1474-
if (IOHandler()->m_frontendAccess == Access::APPEND)
1480+
if (access::append(IOHandler()->m_frontendAccess))
14751481
{
14761482
Parameter<Operation::CHECK_FILE> param;
14771483
param.name = series.m_name;
@@ -2855,7 +2861,7 @@ void Series::openIteration(IterationIndex_t index, Iteration &iteration)
28552861
* before it is possible to open it.
28562862
*/
28572863
if (!iteration.written() &&
2858-
(IOHandler()->m_frontendAccess == Access::CREATE ||
2864+
(access::create(IOHandler()->m_frontendAccess) ||
28592865
oldStatus != internal::CloseStatus::ParseAccessDeferred))
28602866
{
28612867
// nothing to do, file will be opened by writing routines
@@ -3267,13 +3273,21 @@ Series::snapshots(std::optional<SnapshotWorkflow> const snapshot_workflow)
32673273
SnapshotWorkflow::RandomAccess);
32683274
break;
32693275

3270-
case Access::CREATE:
3271-
case Access::APPEND:
3276+
// TODO: Remove parameter
3277+
case Access::CREATE_RANDOM_ACCESS:
3278+
case Access::APPEND_RANDOM_ACCESS:
32723279
// Users can select.
32733280
usedSnapshotWorkflow = snapshot_workflow.value_or(
32743281
/* random-access logic by default */
32753282
SnapshotWorkflow::RandomAccess);
32763283
break;
3284+
case Access::CREATE_LINEAR:
3285+
case Access::APPEND_LINEAR:
3286+
// Users can select.
3287+
usedSnapshotWorkflow = snapshot_workflow.value_or(
3288+
/* random-access logic by default */
3289+
SnapshotWorkflow::Synchronous);
3290+
break;
32773291
}
32783292
}
32793293

@@ -3342,10 +3356,12 @@ void Series::parseBase()
33423356
readIterations();
33433357
}
33443358

3359+
// TODO: ensure backwards compatibility
33453360
WriteIterations Series::writeIterations()
33463361
{
33473362
auto const access = IOHandler()->m_frontendAccess;
3348-
if (access != Access::CREATE && access != Access::APPEND)
3363+
if (access != Access::CREATE_RANDOM_ACCESS &&
3364+
access != Access::APPEND_RANDOM_ACCESS)
33493365
{
33503366
throw error::WrongAPIUsage(
33513367
"[Series::writeIterations()] May only be applied for access modes "
@@ -3514,24 +3530,11 @@ auto Series::preparseSnapshots()
35143530

35153531
bool Series::randomAccessSteps() const
35163532
{
3517-
auto randomAccess = [](Access access) {
3518-
switch (access)
3519-
{
3520-
case Access::READ_RANDOM_ACCESS:
3521-
case Access::READ_WRITE:
3522-
return true;
3523-
case Access::READ_LINEAR:
3524-
case Access::CREATE:
3525-
case Access::APPEND:
3526-
return false;
3527-
}
3528-
return false;
3529-
};
35303533
return get().m_parsePreference.value_or(
35313534
internal::ParsePreference::UpFront) ==
35323535
internal::ParsePreference::UpFront &&
35333536
iterationEncoding() == IterationEncoding::variableBased &&
3534-
randomAccess(IOHandler()->m_backendAccess);
3537+
access::random_access(IOHandler()->m_backendAccess);
35353538
}
35363539

35373540
namespace

0 commit comments

Comments
 (0)