Skip to content

Commit 18b83d2

Browse files
committed
.at(), operator[](): reopen Iterations implicitly
1 parent 9d831ef commit 18b83d2

2 files changed

Lines changed: 40 additions & 8 deletions

File tree

src/snapshots/ContainerImpls.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,14 @@ auto StatefulSnapshotsContainer::operator[](key_type const &key)
256256
{
257257
try
258258
{
259-
res.beginStep(/* reread = */ false);
259+
if (res.closed())
260+
{
261+
res.open();
262+
}
263+
else
264+
{
265+
res.beginStep(/* reread = */ false);
266+
}
260267
}
261268
catch (error::OperationUnsupportedInBackend const &)
262269
{

test/Files_SerialIO/close_and_reopen_test.cpp

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ template <typename WriteIterations>
2020
auto run_test_filebased(
2121
Access writeAccess,
2222
WriteIterations &&writeIterations,
23-
std::string const &ext)
23+
std::string const &ext,
24+
bool synchronous)
2425
{
2526
std::string filename =
2627
"../samples/close_iteration_reopen/filebased_%T." + ext;
@@ -39,6 +40,11 @@ auto run_test_filebased(
3940
B_y.resetDataset({Datatype::INT, {5}});
4041
B_y.storeChunk(data, {0}, {5});
4142
it.close();
43+
// This also verifies that operator[] and at() can be used to access the
44+
// Iteration after closing
45+
REQUIRE(series.iterations.at(0).closed());
46+
REQUIRE(writeIterations(series)[0].closed() == !synchronous);
47+
REQUIRE(writeIterations(series).at(0).closed() == !synchronous);
4248
}
4349

4450
{
@@ -54,6 +60,9 @@ auto run_test_filebased(
5460
e_position_x.resetDataset({Datatype::INT, {5}});
5561
e_position_x.storeChunk(data, {0}, {5});
5662
it.close();
63+
REQUIRE(series.iterations.at(1).closed());
64+
REQUIRE(writeIterations(series).at(1).closed() == !synchronous);
65+
REQUIRE(writeIterations(series)[1].closed() == !synchronous);
5766
}
5867
{
5968
auto it = writeIterations(series)[2];
@@ -281,19 +290,35 @@ auto close_and_reopen_test() -> void
281290
for (auto writeAccess :
282291
{Access::CREATE_RANDOM_ACCESS, Access::CREATE_LINEAR})
283292
{
293+
bool synchronous = writeAccess == Access::CREATE_LINEAR;
284294
run_test_filebased(
285-
writeAccess, [](Series &s) { return s.iterations; }, "bp");
295+
writeAccess, [](Series &s) { return s.iterations; }, "bp", false);
286296
run_test_filebased(
287-
writeAccess, [](Series &s) { return s.writeIterations(); }, "bp");
297+
writeAccess,
298+
[](Series &s) { return s.writeIterations(); },
299+
"bp",
300+
true);
288301
run_test_filebased(
289-
writeAccess, [](Series &s) { return s.snapshots(); }, "bp");
302+
writeAccess,
303+
[](Series &s) { return s.snapshots(); },
304+
"bp",
305+
synchronous);
290306
run_test_filebased(
291-
writeAccess, [](Series &s) { return s.snapshots(); }, "bp");
307+
writeAccess,
308+
[](Series &s) { return s.snapshots(); },
309+
"bp",
310+
synchronous);
292311
run_test_filebased(
293-
writeAccess, [](Series &s) { return s.snapshots(); }, "json");
312+
writeAccess,
313+
[](Series &s) { return s.snapshots(); },
314+
"json",
315+
synchronous);
294316
#if openPMD_HAVE_HDF5
295317
run_test_filebased(
296-
writeAccess, [](Series &s) { return s.snapshots(); }, "h5");
318+
writeAccess,
319+
[](Series &s) { return s.snapshots(); },
320+
"h5",
321+
synchronous);
297322
#endif
298323

299324
/*

0 commit comments

Comments
 (0)