Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ntuple] Move RPageInfo(Extended) up one level of nesting #18024

Merged
merged 1 commit into from
Mar 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 62 additions & 57 deletions tree/ntuple/v7/inc/ROOT/RNTupleDescriptor.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,68 @@ public:
}
};

// clang-format off
/**
\class ROOT::Experimental::RClusterDescriptor::RPageInfo
\ingroup NTuple
\brief Information about a single page in the context of a cluster's page range.
*/
// clang-format on
// NOTE: We do not need to store the element size / uncompressed page size because we know to which column
// the page belongs
struct RPageInfo {
protected:
/// The sum of the elements of all the pages must match the corresponding fNElements field in fColumnRanges
std::uint32_t fNElements = std::uint32_t(-1);
/// The meaning of fLocator depends on the storage backend.
RNTupleLocator fLocator;
/// If true, the 8 bytes following the serialized page are an xxhash of the on-disk page data
bool fHasChecksum = false;

public:
RPageInfo() = default;
RPageInfo(std::uint32_t nElements, const RNTupleLocator &locator, bool hasChecksum)
: fNElements(nElements), fLocator(locator), fHasChecksum(hasChecksum)
{
}

bool operator==(const RPageInfo &other) const
{
return fNElements == other.fNElements && fLocator == other.fLocator;
}

std::uint32_t GetNElements() const { return fNElements; }
void SetNElements(std::uint32_t n) { fNElements = n; }

const RNTupleLocator &GetLocator() const { return fLocator; }
RNTupleLocator &GetLocator() { return fLocator; }
void SetLocator(const RNTupleLocator &locator) { fLocator = locator; }

bool HasChecksum() const { return fHasChecksum; }
void SetHasChecksum(bool hasChecksum) { fHasChecksum = hasChecksum; }
};

struct RPageInfoExtended : RPageInfo {
private:
/// Index (in cluster) of the first element in page.
ROOT::NTupleSize_t fFirstElementIndex = 0;
/// Page number in the corresponding RPageRange.
ROOT::NTupleSize_t fPageNumber = 0;

public:
RPageInfoExtended() = default;
RPageInfoExtended(const RPageInfo &pageInfo, ROOT::NTupleSize_t firstElementIndex, ROOT::NTupleSize_t pageNumber)
: RPageInfo(pageInfo), fFirstElementIndex(firstElementIndex), fPageNumber(pageNumber)
{
}

ROOT::NTupleSize_t GetFirstElementIndex() const { return fFirstElementIndex; }
void SetFirstElementIndex(ROOT::NTupleSize_t firstInPage) { fFirstElementIndex = firstInPage; }

ROOT::NTupleSize_t GetPageNumber() const { return fPageNumber; }
void SetPageNumber(ROOT::NTupleSize_t pageNumber) { fPageNumber = pageNumber; }
};

// clang-format off
/**
\class ROOT::Experimental::RClusterDescriptor::RPageRange
Expand All @@ -312,63 +374,6 @@ public:
class RPageRange {
friend class Internal::RClusterDescriptorBuilder;

public:
/// We do not need to store the element size / uncompressed page size because we know to which column
/// the page belongs
struct RPageInfo {
protected:
/// The sum of the elements of all the pages must match the corresponding fNElements field in fColumnRanges
std::uint32_t fNElements = std::uint32_t(-1);
/// The meaning of fLocator depends on the storage backend.
RNTupleLocator fLocator;
/// If true, the 8 bytes following the serialized page are an xxhash of the on-disk page data
bool fHasChecksum = false;

public:
RPageInfo() = default;
RPageInfo(std::uint32_t nElements, const RNTupleLocator &locator, bool hasChecksum)
: fNElements(nElements), fLocator(locator), fHasChecksum(hasChecksum)
{
}

bool operator==(const RPageInfo &other) const
{
return fNElements == other.fNElements && fLocator == other.fLocator;
}

std::uint32_t GetNElements() const { return fNElements; }
void SetNElements(std::uint32_t n) { fNElements = n; }

const RNTupleLocator &GetLocator() const { return fLocator; }
RNTupleLocator &GetLocator() { return fLocator; }
void SetLocator(const RNTupleLocator &locator) { fLocator = locator; }

bool HasChecksum() const { return fHasChecksum; }
void SetHasChecksum(bool hasChecksum) { fHasChecksum = hasChecksum; }
};

struct RPageInfoExtended : RPageInfo {
private:
/// Index (in cluster) of the first element in page.
ROOT::NTupleSize_t fFirstElementIndex = 0;
/// Page number in the corresponding RPageRange.
ROOT::NTupleSize_t fPageNumber = 0;

public:
RPageInfoExtended() = default;
RPageInfoExtended(const RPageInfo &pageInfo, ROOT::NTupleSize_t firstElementIndex,
ROOT::NTupleSize_t pageNumber)
: RPageInfo(pageInfo), fFirstElementIndex(firstElementIndex), fPageNumber(pageNumber)
{
}

ROOT::NTupleSize_t GetFirstElementIndex() const { return fFirstElementIndex; }
void SetFirstElementIndex(ROOT::NTupleSize_t firstInPage) { fFirstElementIndex = firstInPage; }

ROOT::NTupleSize_t GetPageNumber() const { return fPageNumber; }
void SetPageNumber(ROOT::NTupleSize_t pageNumber) { fPageNumber = pageNumber; }
};

private:
/// Extend this RPageRange to fit the given RColumnRange, i.e. prepend as many synthetic RPageInfos as needed to
/// cover the range in `columnRange`. `RPageInfo`s are constructed to contain as many elements of type `element`
Expand Down
5 changes: 2 additions & 3 deletions tree/ntuple/v7/inc/ROOT/RPageStorage.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -687,7 +687,7 @@ protected:
struct RClusterInfo {
ROOT::DescriptorId_t fClusterId = 0;
/// Location of the page on disk
RClusterDescriptor::RPageRange::RPageInfoExtended fPageInfo;
RClusterDescriptor::RPageInfoExtended fPageInfo;
/// The first element number of the page's column in the given cluster
std::uint64_t fColumnOffset = 0;
};
Expand Down Expand Up @@ -717,8 +717,7 @@ protected:
/// commonly used as part of `LoadClusters()` in derived classes.
void PrepareLoadCluster(
const RCluster::RKey &clusterKey, ROnDiskPageMap &pageZeroMap,
std::function<void(ROOT::DescriptorId_t, ROOT::NTupleSize_t, const RClusterDescriptor::RPageRange::RPageInfo &)>
perPageFunc);
std::function<void(ROOT::DescriptorId_t, ROOT::NTupleSize_t, const RClusterDescriptor::RPageInfo &)> perPageFunc);

/// Enables the default set of metrics provided by RPageSource. `prefix` will be used as the prefix for
/// the counters registered in the internal RNTupleMetrics object.
Expand Down
2 changes: 1 addition & 1 deletion tree/ntuple/v7/src/RNTupleDescriptor.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ ROOT::Experimental::RColumnDescriptor ROOT::Experimental::RColumnDescriptor::Clo

////////////////////////////////////////////////////////////////////////////////

ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfoExtended
ROOT::Experimental::RClusterDescriptor::RPageInfoExtended
ROOT::Experimental::RClusterDescriptor::RPageRange::Find(ROOT::NTupleSize_t idxInCluster) const
{
const auto N = fCumulativeNElements.size();
Expand Down
9 changes: 4 additions & 5 deletions tree/ntuple/v7/src/RPageStorage.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -312,8 +312,7 @@ void ROOT::Experimental::Internal::RPageSource::UnzipClusterImpl(RCluster *clust

void ROOT::Experimental::Internal::RPageSource::PrepareLoadCluster(
const RCluster::RKey &clusterKey, ROnDiskPageMap &pageZeroMap,
std::function<void(ROOT::DescriptorId_t, ROOT::NTupleSize_t, const RClusterDescriptor::RPageRange::RPageInfo &)>
perPageFunc)
std::function<void(ROOT::DescriptorId_t, ROOT::NTupleSize_t, const RClusterDescriptor::RPageInfo &)> perPageFunc)
{
auto descriptorGuard = GetSharedDescriptorGuard();
const auto &clusterDesc = descriptorGuard->GetClusterDescriptor(clusterKey.fClusterId);
Expand Down Expand Up @@ -1010,7 +1009,7 @@ void ROOT::Experimental::Internal::RPagePersistentSink::CommitPage(ColumnHandle_
{
fOpenColumnRanges.at(columnHandle.fPhysicalId).IncrementNElements(page.GetNElements());

RClusterDescriptor::RPageRange::RPageInfo pageInfo;
RClusterDescriptor::RPageInfo pageInfo;
pageInfo.SetNElements(page.GetNElements());
pageInfo.SetLocator(CommitPageImpl(columnHandle, page));
pageInfo.SetHasChecksum(GetWriteOptions().GetEnablePageChecksums());
Expand All @@ -1022,7 +1021,7 @@ void ROOT::Experimental::Internal::RPagePersistentSink::CommitSealedPage(ROOT::D
{
fOpenColumnRanges.at(physicalColumnId).IncrementNElements(sealedPage.GetNElements());

RClusterDescriptor::RPageRange::RPageInfo pageInfo;
RClusterDescriptor::RPageInfo pageInfo;
pageInfo.SetNElements(sealedPage.GetNElements());
pageInfo.SetLocator(CommitSealedPageImpl(physicalColumnId, sealedPage));
pageInfo.SetHasChecksum(sealedPage.GetHasChecksum());
Expand Down Expand Up @@ -1106,7 +1105,7 @@ void ROOT::Experimental::Internal::RPagePersistentSink::CommitSealedPageV(
for (auto sealedPageIt = range.fFirst; sealedPageIt != range.fLast; ++sealedPageIt) {
fOpenColumnRanges.at(range.fPhysicalColumnId).IncrementNElements(sealedPageIt->GetNElements());

RClusterDescriptor::RPageRange::RPageInfo pageInfo;
RClusterDescriptor::RPageInfo pageInfo;
pageInfo.SetNElements(sealedPageIt->GetNElements());
pageInfo.SetLocator(locators[locatorIndexes[i++]]);
pageInfo.SetHasChecksum(sealedPageIt->GetHasChecksum());
Expand Down
4 changes: 2 additions & 2 deletions tree/ntuple/v7/src/RPageStorageDaos.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -550,7 +550,7 @@ void ROOT::Experimental::Internal::RPageSourceDaos::LoadSealedPage(ROOT::Descrip
{
const auto clusterId = localIndex.GetClusterId();

RClusterDescriptor::RPageRange::RPageInfo pageInfo;
RClusterDescriptor::RPageInfo pageInfo;
{
auto descriptorGuard = GetSharedDescriptorGuard();
const auto &clusterDescriptor = descriptorGuard->GetClusterDescriptor(clusterId);
Expand Down Expand Up @@ -699,7 +699,7 @@ ROOT::Experimental::Internal::RPageSourceDaos::LoadClusters(std::span<RCluster::
PrepareLoadCluster(
clusterKey, *pageZeroMap,
[&](ROOT::DescriptorId_t physicalColumnId, ROOT::NTupleSize_t pageNo,
const RClusterDescriptor::RPageRange::RPageInfo &pageInfo) {
const RClusterDescriptor::RPageInfo &pageInfo) {
const auto &pageLocator = pageInfo.GetLocator();
uint32_t position, offset;
std::tie(position, offset) = DecodeDaosPagePosition(pageLocator.GetPosition<RNTupleLocatorObject64>());
Expand Down
4 changes: 2 additions & 2 deletions tree/ntuple/v7/src/RPageStorageFile.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ void ROOT::Experimental::Internal::RPageSourceFile::LoadSealedPage(ROOT::Descrip
{
const auto clusterId = localIndex.GetClusterId();

RClusterDescriptor::RPageRange::RPageInfo pageInfo;
RClusterDescriptor::RPageInfo pageInfo;
{
auto descriptorGuard = GetSharedDescriptorGuard();
const auto &clusterDescriptor = descriptorGuard->GetClusterDescriptor(clusterId);
Expand Down Expand Up @@ -514,7 +514,7 @@ ROOT::Experimental::Internal::RPageSourceFile::PrepareSingleCluster(
auto pageZeroMap = std::make_unique<ROnDiskPageMap>();
PrepareLoadCluster(clusterKey, *pageZeroMap,
[&](ROOT::DescriptorId_t physicalColumnId, ROOT::NTupleSize_t pageNo,
const RClusterDescriptor::RPageRange::RPageInfo &pageInfo) {
const RClusterDescriptor::RPageInfo &pageInfo) {
const auto &pageLocator = pageInfo.GetLocator();
if (pageLocator.GetType() == RNTupleLocator::kTypeUnknown)
throw RException(R__FAIL("tried to read a page with an unknown locator"));
Expand Down
16 changes: 8 additions & 8 deletions tree/ntuple/v7/test/ntuple_serialize.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -672,7 +672,7 @@ TEST(RNTuple, SerializeFooter)
.Unwrap());

ROOT::Experimental::RClusterDescriptor::RColumnRange columnRange;
ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfo pageInfo;
ROOT::Experimental::RClusterDescriptor::RPageInfo pageInfo;
RClusterDescriptorBuilder clusterBuilder;
clusterBuilder.ClusterId(84).FirstEntryIndex(0).NEntries(100);
ROOT::Experimental::RClusterDescriptor::RPageRange pageRange;
Expand Down Expand Up @@ -994,7 +994,7 @@ TEST(RNTuple, SerializeMultiColumnRepresentation)

RClusterDescriptorBuilder clusterBuilder;
ROOT::Experimental::RClusterDescriptor::RPageRange pageRange;
ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfo pageInfo;
ROOT::Experimental::RClusterDescriptor::RPageInfo pageInfo;
// First cluster
clusterBuilder.ClusterId(13).FirstEntryIndex(0).NEntries(1);
clusterBuilder.MarkSuppressedColumnRange(0);
Expand Down Expand Up @@ -1190,7 +1190,7 @@ TEST(RNTuple, SerializeMultiColumnRepresentationProjection)

RClusterDescriptorBuilder clusterBuilder;
ROOT::Experimental::RClusterDescriptor::RPageRange pageRange;
ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfo pageInfo;
ROOT::Experimental::RClusterDescriptor::RPageInfo pageInfo;
// First cluster
clusterBuilder.ClusterId(13).FirstEntryIndex(0).NEntries(1);
clusterBuilder.MarkSuppressedColumnRange(0);
Expand Down Expand Up @@ -1315,7 +1315,7 @@ TEST(RNTuple, SerializeMultiColumnRepresentationDeferred)
context.MapSchema(builder.GetDescriptor(), /*forHeaderExtension=*/true);

ROOT::Experimental::RClusterDescriptor::RPageRange pageRange;
ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfo pageInfo;
ROOT::Experimental::RClusterDescriptor::RPageInfo pageInfo;
// Second cluster
clusterBuilder.ClusterId(17).FirstEntryIndex(1).NEntries(2);
clusterBuilder.MarkSuppressedColumnRange(1);
Expand Down Expand Up @@ -1425,7 +1425,7 @@ TEST(RNTuple, SerializeMultiColumnRepresentationIncremental)
// First cluster
RClusterDescriptorBuilder clusterBuilder;
ROOT::Experimental::RClusterDescriptor::RPageRange pageRange;
ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfo pageInfo;
ROOT::Experimental::RClusterDescriptor::RPageInfo pageInfo;
clusterBuilder.ClusterId(13).FirstEntryIndex(0).NEntries(1);
pageRange.SetPhysicalColumnId(0);
pageInfo.SetNElements(1);
Expand Down Expand Up @@ -1558,7 +1558,7 @@ TEST(RNTuple, DeserializeDescriptorModes)
sizeHeader = context.GetHeaderSize();

ROOT::Experimental::RClusterDescriptor::RPageRange pageRange;
ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfo pageInfo;
ROOT::Experimental::RClusterDescriptor::RPageInfo pageInfo;

// First cluster
RClusterDescriptorBuilder clusterBuilder;
Expand Down Expand Up @@ -1833,7 +1833,7 @@ TEST(RNTuple, SerializeMultiColumnRepresentationDeferred_HeaderExtBeforeSerializ
builder.AddCluster(clusterBuilder.MoveDescriptor().Unwrap());

ROOT::Experimental::RClusterDescriptor::RPageRange pageRange;
ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfo pageInfo;
ROOT::Experimental::RClusterDescriptor::RPageInfo pageInfo;
// Second cluster
clusterBuilder.ClusterId(17).FirstEntryIndex(1).NEntries(2);
clusterBuilder.MarkSuppressedColumnRange(1);
Expand Down Expand Up @@ -1959,7 +1959,7 @@ TEST(RNTuple, SerializeMultiColumnRepresentationDeferredInMainHeader)
builder.AddCluster(clusterBuilder.MoveDescriptor().Unwrap());

ROOT::Experimental::RClusterDescriptor::RPageRange pageRange;
ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfo pageInfo;
ROOT::Experimental::RClusterDescriptor::RPageInfo pageInfo;
// Second cluster
clusterBuilder.ClusterId(17).FirstEntryIndex(1).NEntries(2);
clusterBuilder.MarkSuppressedColumnRange(1);
Expand Down
Loading