Skip to content

Commit 0978dfd

Browse files
committed
[ntuple] add unit test for multi stream reading
1 parent b3ecc08 commit 0978dfd

File tree

2 files changed

+165
-0
lines changed

2 files changed

+165
-0
lines changed

tree/ntuple/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ ROOT_ADD_GTEST(ntuple_merger ntuple_merger.cxx LIBRARIES ROOTNTuple CustomStruct
4848
ROOT_ADD_GTEST(ntuple_metrics ntuple_metrics.cxx LIBRARIES ROOTNTuple)
4949
ROOT_ADD_GTEST(ntuple_model ntuple_model.cxx LIBRARIES ROOTNTuple CustomStruct)
5050
ROOT_ADD_GTEST(ntuple_multi_column ntuple_multi_column.cxx LIBRARIES ROOTNTuple)
51+
ROOT_ADD_GTEST(ntuple_multi_stream ntuple_multi_stream.cxx LIBRARIES ROOTNTuple)
5152
ROOT_ADD_GTEST(ntuple_packing ntuple_packing.cxx LIBRARIES ROOTNTuple)
5253
ROOT_ADD_GTEST(ntuple_pages ntuple_pages.cxx LIBRARIES ROOTNTuple)
5354
ROOT_ADD_GTEST(ntuple_print ntuple_print.cxx LIBRARIES ROOTNTuple CustomStruct)
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
#include "ntuple_test.hxx"
2+
3+
#include <algorithm>
4+
5+
TEST(RNTuple, MultiStreamBasics)
6+
{
7+
FileRaii fileGuard("test_ntuple_multi_stream_basics.root");
8+
9+
{
10+
auto model = ROOT::RNTupleModel::Create();
11+
model->MakeField<float>("pt");
12+
auto writer = ROOT::RNTupleWriter::Recreate(std::move(model), "ntpl", fileGuard.GetPath());
13+
writer->Fill();
14+
writer->CommitCluster();
15+
writer->Fill();
16+
}
17+
18+
{
19+
auto reader = ROOT::RNTupleReader::Open("ntpl", fileGuard.GetPath());
20+
reader->EnableMetrics();
21+
reader->LoadEntry(0);
22+
reader->LoadEntry(1);
23+
EXPECT_EQ(
24+
1, reader->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.RClusterPool.nCluster")->GetValueAsInt());
25+
auto ctrClusterLoaded = reader->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.nClusterLoaded");
26+
auto nClusterLoaded = ctrClusterLoaded->GetValueAsInt();
27+
reader->LoadEntry(0);
28+
EXPECT_GT(ctrClusterLoaded->GetValueAsInt(), nClusterLoaded);
29+
}
30+
31+
{
32+
auto reader = ROOT::RNTupleReader::Open("ntpl", fileGuard.GetPath());
33+
reader->EnableMetrics();
34+
auto token = reader->CreateActiveEntryToken();
35+
EXPECT_EQ(ROOT::kInvalidDescriptorId, token.GetEntryNumber());
36+
37+
try {
38+
token.SetEntryNumber(2);
39+
FAIL() << "out of bounds entry number should fail";
40+
} catch (const ROOT::RException &e) {
41+
EXPECT_THAT(e.what(), testing::HasSubstr("out of range"));
42+
}
43+
44+
token.SetEntryNumber(0);
45+
reader->LoadEntry(0);
46+
reader->LoadEntry(1);
47+
EXPECT_EQ(
48+
2, reader->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.RClusterPool.nCluster")->GetValueAsInt());
49+
auto ctrClusterLoaded = reader->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.nClusterLoaded");
50+
auto nClusterLoaded = ctrClusterLoaded->GetValueAsInt();
51+
reader->LoadEntry(0);
52+
EXPECT_EQ(ctrClusterLoaded->GetValueAsInt(), nClusterLoaded);
53+
}
54+
}
55+
56+
TEST(RNTuple, MultiStreamRefcount)
57+
{
58+
FileRaii fileGuard("test_ntuple_multi_stream_refcount.root");
59+
60+
{
61+
auto model = ROOT::RNTupleModel::Create();
62+
model->MakeField<float>("pt");
63+
auto writer = ROOT::RNTupleWriter::Recreate(std::move(model), "ntpl", fileGuard.GetPath());
64+
writer->Fill();
65+
writer->CommitCluster();
66+
writer->Fill();
67+
}
68+
69+
{
70+
auto reader = ROOT::RNTupleReader::Open("ntpl", fileGuard.GetPath());
71+
reader->EnableMetrics();
72+
73+
auto t1 = reader->CreateActiveEntryToken();
74+
t1.SetEntryNumber(0);
75+
auto t2 = reader->CreateActiveEntryToken(); // t1;
76+
t2.SetEntryNumber(0);
77+
EXPECT_EQ(0, t2.GetEntryNumber());
78+
79+
auto ctrPageUnsealed = reader->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.nPageUnsealed");
80+
auto ctrNPage = reader->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.RPagePool.nPage");
81+
reader->LoadEntry(0);
82+
reader->LoadEntry(1);
83+
EXPECT_EQ(2, ctrPageUnsealed->GetValueAsInt());
84+
EXPECT_EQ(2, ctrNPage->GetValueAsInt());
85+
t1.Reset();
86+
reader->LoadEntry(0);
87+
EXPECT_EQ(2, ctrPageUnsealed->GetValueAsInt());
88+
EXPECT_EQ(1, ctrNPage->GetValueAsInt());
89+
reader->LoadEntry(1);
90+
EXPECT_EQ(3, ctrPageUnsealed->GetValueAsInt());
91+
EXPECT_EQ(2, ctrNPage->GetValueAsInt());
92+
t2.Reset(); // cluster 0 unpinned
93+
reader->LoadEntry(0);
94+
EXPECT_EQ(3, ctrPageUnsealed->GetValueAsInt());
95+
EXPECT_EQ(1, ctrNPage->GetValueAsInt());
96+
reader->LoadEntry(1);
97+
EXPECT_EQ(4, ctrPageUnsealed->GetValueAsInt());
98+
EXPECT_EQ(1, ctrNPage->GetValueAsInt());
99+
}
100+
}
101+
102+
TEST(RNTuple, MultiStreamDestruct)
103+
{
104+
FileRaii fileGuard("test_ntuple_multi_stream_destruct.root");
105+
106+
{
107+
auto model = ROOT::RNTupleModel::Create();
108+
model->MakeField<float>("pt");
109+
auto writer = ROOT::RNTupleWriter::Recreate(std::move(model), "ntpl", fileGuard.GetPath());
110+
writer->Fill();
111+
}
112+
113+
auto reader = ROOT::RNTupleReader::Open("ntpl", fileGuard.GetPath());
114+
auto token = reader->CreateActiveEntryToken();
115+
reader.reset();
116+
EXPECT_NO_THROW(token.SetEntryNumber(0));
117+
EXPECT_NO_THROW(token.Reset());
118+
}
119+
120+
TEST(RNTuple, MultiStreamSwap)
121+
{
122+
FileRaii fileGuard("test_ntuple_multi_stream_swap.root");
123+
124+
{
125+
auto model = ROOT::RNTupleModel::Create();
126+
model->MakeField<float>("pt");
127+
auto writer = ROOT::RNTupleWriter::Recreate(std::move(model), "ntpl", fileGuard.GetPath());
128+
writer->Fill();
129+
writer->CommitCluster();
130+
writer->Fill();
131+
}
132+
133+
auto r1 = ROOT::RNTupleReader::Open("ntpl", fileGuard.GetPath());
134+
auto r2 = ROOT::RNTupleReader::Open("ntpl", fileGuard.GetPath());
135+
r1->EnableMetrics();
136+
r2->EnableMetrics();
137+
138+
auto t1 = r1->CreateActiveEntryToken();
139+
t1.SetEntryNumber(0);
140+
auto t2 = r2->CreateActiveEntryToken();
141+
t2.SetEntryNumber(1);
142+
143+
std::swap(t1, t2);
144+
EXPECT_EQ(1u, t1.GetEntryNumber()); // Now belongs to r2
145+
EXPECT_EQ(0u, t2.GetEntryNumber()); // Now belongs to r1
146+
147+
{
148+
auto ctrPageUnsealed = r1->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.nPageUnsealed");
149+
auto ctrNPage = r1->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.RPagePool.nPage");
150+
r1->LoadEntry(0);
151+
r1->LoadEntry(1);
152+
EXPECT_EQ(2, ctrPageUnsealed->GetValueAsInt());
153+
EXPECT_EQ(2, ctrNPage->GetValueAsInt());
154+
}
155+
156+
{
157+
auto ctrPageUnsealed = r2->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.nPageUnsealed");
158+
auto ctrNPage = r2->GetMetrics().GetCounter("RNTupleReader.RPageSourceFile.RPagePool.nPage");
159+
r2->LoadEntry(1);
160+
r2->LoadEntry(0);
161+
EXPECT_EQ(2, ctrPageUnsealed->GetValueAsInt());
162+
EXPECT_EQ(2, ctrNPage->GetValueAsInt());
163+
}
164+
}

0 commit comments

Comments
 (0)