Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
ROOT::Experimental::Internal::RPageSourceS3 Class Reference

Storage provider that reads ntuple pages from S3-compatible object storage.

Counterpart of RPageSinkS3: implements Mode B reads (one sealed page per S3 object, kTypeObject64 locators). Pages are fetched one object at a time; batching them into concurrent GETs is left to a follow-up.

The anchor is read in a single GET that deliberately asks for more bytes than it holds: its size is not known up front, and a range running past the end of an object returns only what exists, so the length of the reply is the size of the anchor.

Warning
The S3 backend is experimental and under active development.

Definition at line 184 of file RPageStorageS3.hxx.

Classes

struct  RFromBaseUrl
 Tag to select the internal constructor that takes an already-resolved base URL. More...
 

Public Types

using ColumnHandle_t = RColumnHandle
 The column handle identifies a column with the current open page storage.
 
using SealedPageSequence_t = std::deque<RSealedPage>
 

Public Member Functions

 RPageSourceS3 (std::string_view ntupleName, std::string_view uri, const ROOT::RNTupleReadOptions &options)
 
 ~RPageSourceS3 () override
 
ColumnHandle_t AddColumn (ROOT::DescriptorId_t fieldId, ROOT::Internal::RColumn &column) override
 Register a new column.
 
void Attach (ROOT::Internal::RNTupleSerializer::EDescriptorDeserializeMode mode=ROOT::Internal::RNTupleSerializer::EDescriptorDeserializeMode::kForReading)
 Open the physical storage container and deserialize header and footer.
 
std::unique_ptr< RPageSource > Clone () const
 Open the same storage multiple time, e.g.
 
void DropColumn (ColumnHandle_t columnHandle) override
 Unregisters a column.
 
RSharedDescriptorGuard FindClusterId (ROOT::DescriptorId_t physicalColumnId, ROOT::NTupleSize_t index, ROOT::DescriptorId_t &cid)
 Returns a shared descriptor guard to ensure that the returned cluster id is useable, i.e.
 
RSharedDescriptorGuard FindClusterId (ROOT::NTupleSize_t entryIdx, ROOT::DescriptorId_t &cid)
 An overload of FindClusterId that searches using a certain column element index.
 
RSharedDescriptorGuard FindNextClusterId (ROOT::DescriptorId_t clusterId, ROOT::DescriptorId_t &nextId)
 Uses FindClusterId to search for the cluster with the entry index following the last entry index of the given cluster.
 
ROOT::DescriptorId_t GetColumnId (ColumnHandle_t columnHandle) const
 
REntryRange GetEntryRange () const
 
virtual ROOT::Experimental::Detail::RNTupleMetrics & GetMetrics ()
 Returns the default metrics object.
 
ROOT::NTupleSize_t GetNElements (ROOT::DescriptorId_t physicalColumnId)
 
ROOT::NTupleSize_t GetNEntries ()
 
const std::string & GetNTupleName () const
 Returns the NTuple name.
 
const std::unordered_set< ROOT::DescriptorId_t > & GetPinnedClusters () const
 
const ROOT::RNTupleReadOptions & GetReadOptions () const
 
RSharedDescriptorGuard GetSharedDescriptorGuard () const
 Takes the read lock for the descriptor.
 
EPageStorageType GetType () final
 Whether the concrete implementation is a sink or a source.
 
std::vector< std::unique_ptr< ROOT::Internal::RCluster > > LoadClusters (std::span< ROOT::Internal::RCluster::RKey > clusterKeys) final
 Populates all the pages of the given cluster ids and columns; it is possible that some columns do not contain any pages.
 
virtual ROOT::Internal::RPageRef LoadPage (ColumnHandle_t columnHandle, RNTupleLocalIndex localIndex)
 Another version of LoadPage that allows to specify cluster-relative indexes.
 
virtual ROOT::Internal::RPageRef LoadPage (ColumnHandle_t columnHandle, ROOT::NTupleSize_t globalIndex)
 Allocates and fills a page that contains the index-th element.
 
void LoadSealedPage (ROOT::DescriptorId_t physicalColumnId, RNTupleLocalIndex localIndex, RSealedPage &sealedPage)
 Read the packed and compressed bytes of a page into the memory buffer provided by sealedPage.
 
void LoadStructure ()
 Loads header and footer without decompressing or deserializing them.
 
std::unique_ptr< RPageSource > OpenWithDifferentAnchor (const ROOT::Internal::RNTupleLink &anchorLink, const ROOT::RNTupleReadOptions &options={}) final
 Creates a new PageSource using the same underlying file as this but referring to a different RNTuple, described by anchorLink.
 
void PinCluster (ROOT::DescriptorId_t clusterId)
 Instructs the cluster pool and page pool to consider the given cluster as active (should stay cached).
 
void RegisterStreamerInfos ()
 Builds the streamer info records from the descriptor's extra type info section.
 
void SetEntryRange (const REntryRange &range)
 Promise to only read from the given entry range.
 
void SetTaskScheduler (RTaskScheduler *taskScheduler)
 
void UnpinCluster (ROOT::DescriptorId_t clusterId)
 Allows the given cluster to be evicted from the cluster pool and page pool.
 
RResult< ROOT::Internal::RPage > UnsealPage (const RSealedPage &sealedPage, const ROOT::Internal::RColumnElementBase &element)
 
void UnzipCluster (ROOT::Internal::RCluster *cluster)
 Parallel decompression and unpacking of the pages in the given cluster.
 

Static Public Member Functions

static std::unique_ptr< RPageSource > Create (std::string_view ntupleName, std::string_view location, const ROOT::RNTupleReadOptions &options=ROOT::RNTupleReadOptions())
 Guess the concrete derived page source from the file name (location)
 
static RResult< ROOT::Internal::RPage > UnsealPage (const RSealedPage &sealedPage, const ROOT::Internal::RColumnElementBase &element, ROOT::Internal::RPageAllocator &pageAlloc)
 Helper for unstreaming a page.
 

Static Public Attributes

static constexpr std::size_t kNBytesPageChecksum = sizeof(std::uint64_t)
 The page checksum is a 64bit xxhash3.
 

Protected Member Functions

ROOT::RNTupleDescriptor AttachImpl () final
 LoadStructureImpl() has been called before AttachImpl() is called
 
std::unique_ptr< RPageSource > CloneImpl () const final
 The cloned page source opens its own pair of HTTP connections to the same base URL.
 
void EnableDefaultMetrics (const std::string &prefix)
 Enables the default set of metrics provided by RPageSource.
 
RExclDescriptorGuard GetExclDescriptorGuard ()
 Note that the underlying lock is not recursive. See GetSharedDescriptorGuard() for further information.
 
void LoadPageListImpl (const RNTupleLocator &locator, unsigned char *buffer) final
 
void LoadSealedPageImpl (const RNTupleLocator &locator, RSealedPage &sealedPage) final
 
void LoadStructureImpl () final
 Fills fStructureBuffer with the compressed header and footer.
 
void PrepareLoadCluster (const ROOT::Internal::RCluster::RKey &clusterKey, ROOT::Internal::ROnDiskPageMap &pageZeroMap, const std::function< void(ROOT::DescriptorId_t, ROOT::NTupleSize_t, const ROOT::RClusterDescriptor::RPageInfo &)> &perPageFunc)
 Prepare a page range read for the column set in clusterKey.
 
void StopClusterPoolBackgroundThread ()
 
virtual void UnzipClusterImpl (ROOT::Internal::RCluster *cluster)
 
void WaitForAllTasks ()
 

Protected Attributes

std::unique_ptr< RCounters > fCounters
 
ROOT::Experimental::Detail::RNTupleMetrics fMetrics
 
std::string fNTupleName
 
ROOT::RNTupleReadOptions fOptions
 
std::unique_ptr< ROOT::Internal::RPageAllocator > fPageAllocator
 For the time being, we will use the heap allocator for all sources and sinks. This may change in the future.
 
RStructureBuffer fStructureBuffer
 Populated by LoadStructureImpl(), reset at the end of Attach()
 
RTaskScheduler * fTaskScheduler = nullptr
 

Private Member Functions

 RPageSourceS3 (std::string_view ntupleName, std::string_view baseUrl, const ROOT::RNTupleReadOptions &options, RFromBaseUrl)
 Internal constructor used by CloneImpl: the public constructor derives the base URL by parsing an s3 scheme URI, whereas a clone of an open source already has one and must not re-parse it.
 
void GetObject (ROOT::Internal::RCurlConnection &connection, const std::string &url, unsigned char *buffer, std::size_t size)
 Download size bytes from url into the caller-provided buffer via an HTTP GET request.
 
std::size_t GetShortObject (ROOT::Internal::RCurlConnection &connection, const std::string &url, unsigned char *buffer, std::size_t size)
 Download at most size bytes of url, returning how many arrived.
 
ROOT::Internal::RPageRef LoadPageFromSummary (ColumnHandle_t columnHandle, const RPageSummary &pageSummary)
 
ROOT::Internal::RPageRef LoadZeroPage (ColumnHandle_t columnHandle, const RPageSummary &pageSummary)
 
std::string MakeObjectUrl (std::uint64_t objId) const
 Resolve a numeric object ID to its full HTTP URL through the anchor's URL template.
 
void UpdateLastUsedCluster (ROOT::DescriptorId_t clusterId)
 Does nothing if fLastUsedCluster == clusterId.
 

Private Attributes

RActivePhysicalColumns fActivePhysicalColumns
 The active columns are implicitly defined by the model fields or views.
 
RNTupleAnchorS3 fAnchor
 Anchor metadata, fetched and parsed in LoadStructureImpl.
 
std::string fBaseUrl
 HTTP base URL for this ntuple (derived from the s3 scheme URI); never has a trailing slash.
 
ROOT::Internal::RCurlConnection fClusterConnection
 Connection used exclusively by LoadClusters(), which the cluster pool calls on its own I/O thread.
 
ROOT::Internal::RClusterPool fClusterPool
 The cluster pool asynchronously preloads the next few clusters.
 
ROOT::Internal::RCluster * fCurrentCluster = nullptr
 The last cluster from which a page got loaded. Points into fClusterPool->fPool.
 
ROOT::RNTupleDescriptor fDescriptor
 
ROOT::Internal::RNTupleDescriptorBuilder fDescriptorBuilder
 Populated by LoadStructureImpl and AttachImpl, moved out at the end of AttachImpl.
 
std::shared_mutex fDescriptorLock
 
REntryRange fEntryRange
 Used by the cluster pool to prevent reading beyond the given range.
 
bool fHasStreamerInfosRegistered = false
 Set to true when RegisterStreamerInfos() is called.
 
bool fHasStructure = false
 Set to true once LoadStructure() is called.
 
bool fIsAttached = false
 Set to true once Attach() is called.
 
ROOT::DescriptorId_t fLastUsedCluster = ROOT::kInvalidDescriptorId
 Remembers the last cluster id from which a page was requested.
 
ROOT::Internal::RCurlConnection fMainConnection
 Connection used by everything that runs on the calling thread: the anchor, header and footer in LoadStructureImpl, the page lists in LoadPageListImpl and single pages in LoadSealedPageImpl.
 
ROOT::Internal::RPagePool fPagePool
 Pages that are unzipped with IMT are staged into the page pool.
 
std::unordered_set< ROOT::DescriptorId_t > fPinnedClusters
 Pinned clusters and their $2 * (cluster bunch size) - 1$ successors will not be evicted from the cluster pool.
 
std::map< ROOT::NTupleSize_t, ROOT::DescriptorId_t > fPreloadedClusters
 Clusters from where pages got preloaded in UnzipClusterImpl(), ordered by first entry number of the clusters.
 
std::string fResolvedUrlTemplate
 The anchor's URL template with ${baseurl} already substituted, so that resolving an object ID only has to replace ${objid}.
 

#include <ROOT/RPageStorageS3.hxx>

Inheritance diagram for ROOT::Experimental::Internal::RPageSourceS3:
[legend]

Member Typedef Documentation

◆ ColumnHandle_t

The column handle identifies a column with the current open page storage.

Definition at line 180 of file RPageStorage.hxx.

◆ SealedPageSequence_t

Definition at line 130 of file RPageStorage.hxx.

Constructor & Destructor Documentation

◆ RPageSourceS3() [1/2]

ROOT::Experimental::Internal::RPageSourceS3::RPageSourceS3 ( std::string_view ntupleName,
std::string_view baseUrl,
const ROOT::RNTupleReadOptions & options,
RFromBaseUrl  )
private

Internal constructor used by CloneImpl: the public constructor derives the base URL by parsing an s3 scheme URI, whereas a clone of an open source already has one and must not re-parse it.

Definition at line 372 of file RPageStorageS3.cxx.

◆ RPageSourceS3() [2/2]

ROOT::Experimental::Internal::RPageSourceS3::RPageSourceS3 ( std::string_view ntupleName,
std::string_view uri,
const ROOT::RNTupleReadOptions & options )

Definition at line 366 of file RPageStorageS3.cxx.

◆ ~RPageSourceS3()

ROOT::Experimental::Internal::RPageSourceS3::~RPageSourceS3 ( )
override

Definition at line 382 of file RPageStorageS3.cxx.

Member Function Documentation

◆ AddColumn()

ROOT::Internal::RPageStorage::ColumnHandle_t ROOT::Internal::RPageSource::AddColumn ( ROOT::DescriptorId_t fieldId,
ROOT::Internal::RColumn & column )
overridevirtualinherited

Register a new column.

When reading, the column must exist in the ntuple on disk corresponding to the metadata. When writing, every column can only be attached once.

Implements ROOT::Internal::RPageStorage.

Definition at line 206 of file RPageStorage.cxx.

◆ Attach()

Open the physical storage container and deserialize header and footer.

Definition at line 236 of file RPageStorage.cxx.

◆ AttachImpl()

ROOT::RNTupleDescriptor ROOT::Experimental::Internal::RPageSourceS3::AttachImpl ( )
finalprotectedvirtual

LoadStructureImpl() has been called before AttachImpl() is called

Implements ROOT::Internal::RPageSource.

Definition at line 512 of file RPageStorageS3.cxx.

◆ Clone()

std::unique_ptr< ROOT::Internal::RPageSource > ROOT::Internal::RPageSource::Clone ( ) const
inherited

Open the same storage multiple time, e.g.

for reading in multiple threads. If the source is already attached, the clone will be attached, too. The clone will use, however, it's own connection to the underlying storage (e.g., file descriptor, XRootD handle, etc.)

Definition at line 262 of file RPageStorage.cxx.

◆ CloneImpl()

std::unique_ptr< ROOT::Internal::RPageSource > ROOT::Experimental::Internal::RPageSourceS3::CloneImpl ( ) const
finalprotectedvirtual

The cloned page source opens its own pair of HTTP connections to the same base URL.

Implements ROOT::Internal::RPageSource.

Definition at line 612 of file RPageStorageS3.cxx.

◆ Create()

std::unique_ptr< ROOT::Internal::RPageSource > ROOT::Internal::RPageSource::Create ( std::string_view ntupleName,
std::string_view location,
const ROOT::RNTupleReadOptions & options = ROOT::RNTupleReadOptions() )
staticinherited

Guess the concrete derived page source from the file name (location)

Definition at line 177 of file RPageStorage.cxx.

◆ DropColumn()

void ROOT::Internal::RPageSource::DropColumn ( ColumnHandle_t columnHandle)
overridevirtualinherited

Unregisters a column.

A page source decreases the reference counter for the corresponding active column. For a page sink, dropping columns is currently a no-op.

Implements ROOT::Internal::RPageStorage.

Definition at line 216 of file RPageStorage.cxx.

◆ EnableDefaultMetrics()

void ROOT::Internal::RPageSource::EnableDefaultMetrics ( const std::string & prefix)
protectedinherited

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. A subclass using the default set of metrics is responsible for updating the counters appropriately, e.g. fCounters->fNRead.Inc() Alternatively, a subclass might provide its own RNTupleMetrics object by overriding the GetMetrics() member function.

Definition at line 744 of file RPageStorage.cxx.

◆ FindClusterId() [1/2]

ROOT::Internal::RPageSource::RSharedDescriptorGuard ROOT::Internal::RPageSource::FindClusterId ( ROOT::DescriptorId_t physicalColumnId,
ROOT::NTupleSize_t index,
ROOT::DescriptorId_t & cid )
inherited

Returns a shared descriptor guard to ensure that the returned cluster id is useable, i.e.

that the corresponding cluster was not meanwhile evicted from the set of active clusters.

Definition at line 365 of file RPageStorage.cxx.

◆ FindClusterId() [2/2]

ROOT::Internal::RPageSource::RSharedDescriptorGuard ROOT::Internal::RPageSource::FindClusterId ( ROOT::NTupleSize_t entryIdx,
ROOT::DescriptorId_t & cid )
inherited

An overload of FindClusterId that searches using a certain column element index.

Definition at line 306 of file RPageStorage.cxx.

◆ FindNextClusterId()

ROOT::Internal::RPageSource::RSharedDescriptorGuard ROOT::Internal::RPageSource::FindNextClusterId ( ROOT::DescriptorId_t clusterId,
ROOT::DescriptorId_t & nextId )
inherited

Uses FindClusterId to search for the cluster with the entry index following the last entry index of the given cluster.

Definition at line 294 of file RPageStorage.cxx.

◆ GetColumnId()

ROOT::DescriptorId_t ROOT::Internal::RPageStorage::GetColumnId ( ColumnHandle_t columnHandle) const
inlineinherited

Definition at line 188 of file RPageStorage.hxx.

◆ GetEntryRange()

REntryRange ROOT::Internal::RPageSource::GetEntryRange ( ) const
inlineinherited

Definition at line 875 of file RPageStorage.hxx.

◆ GetExclDescriptorGuard()

RExclDescriptorGuard ROOT::Internal::RPageSource::GetExclDescriptorGuard ( )
inlineprotectedinherited

Note that the underlying lock is not recursive. See GetSharedDescriptorGuard() for further information.

Definition at line 807 of file RPageStorage.hxx.

◆ GetMetrics()

virtual ROOT::Experimental::Detail::RNTupleMetrics & ROOT::Internal::RPageStorage::GetMetrics ( )
inlinevirtualinherited

Returns the default metrics object.

Subclasses might alternatively provide their own metrics object by overriding this.

Definition at line 192 of file RPageStorage.hxx.

◆ GetNElements()

ROOT::NTupleSize_t ROOT::Internal::RPageSource::GetNElements ( ROOT::DescriptorId_t physicalColumnId)
inherited

Definition at line 278 of file RPageStorage.cxx.

◆ GetNEntries()

ROOT::NTupleSize_t ROOT::Internal::RPageSource::GetNEntries ( )
inherited

Definition at line 273 of file RPageStorage.cxx.

◆ GetNTupleName()

const std::string & ROOT::Internal::RPageStorage::GetNTupleName ( ) const
inlineinherited

Returns the NTuple name.

Definition at line 195 of file RPageStorage.hxx.

◆ GetObject()

void ROOT::Experimental::Internal::RPageSourceS3::GetObject ( ROOT::Internal::RCurlConnection & connection,
const std::string & url,
unsigned char * buffer,
std::size_t size )
private

Download size bytes from url into the caller-provided buffer via an HTTP GET request.

The connection is explicit because the caller's thread determines which one may be used.

Definition at line 402 of file RPageStorageS3.cxx.

◆ GetPinnedClusters()

const std::unordered_set< ROOT::DescriptorId_t > & ROOT::Internal::RPageSource::GetPinnedClusters ( ) const
inlineinherited

Definition at line 913 of file RPageStorage.hxx.

◆ GetReadOptions()

const ROOT::RNTupleReadOptions & ROOT::Internal::RPageSource::GetReadOptions ( ) const
inlineinherited

Definition at line 835 of file RPageStorage.hxx.

◆ GetSharedDescriptorGuard()

RSharedDescriptorGuard ROOT::Internal::RPageSource::GetSharedDescriptorGuard ( ) const
inlineinherited

Takes the read lock for the descriptor.

Multiple threads can take the lock concurrently. The underlying std::shared_mutex, however, is neither read nor write recursive: within one thread, only one lock (shared or exclusive) must be acquired at the same time. This requires special care in sections protected by GetSharedDescriptorGuard() and GetExclDescriptorGuard() especially to avoid that the locks are acquired indirectly. As a general guideline, no other method of the page source should be called (directly or indirectly) in a guarded section.

Definition at line 843 of file RPageStorage.hxx.

◆ GetShortObject()

std::size_t ROOT::Experimental::Internal::RPageSourceS3::GetShortObject ( ROOT::Internal::RCurlConnection & connection,
const std::string & url,
unsigned char * buffer,
std::size_t size )
private

Download at most size bytes of url, returning how many arrived.

Used to read an object of unknown length, where a reply shorter than the request is the answer rather than an error.

Definition at line 426 of file RPageStorageS3.cxx.

◆ GetType()

EPageStorageType ROOT::Internal::RPageSource::GetType ( )
inlinefinalvirtualinherited

Whether the concrete implementation is a sink or a source.

Implements ROOT::Internal::RPageStorage.

Definition at line 834 of file RPageStorage.hxx.

◆ LoadClusters()

std::vector< std::unique_ptr< ROOT::Internal::RCluster > > ROOT::Experimental::Internal::RPageSourceS3::LoadClusters ( std::span< ROOT::Internal::RCluster::RKey > clusterKeys)
finalvirtual

Populates all the pages of the given cluster ids and columns; it is possible that some columns do not contain any pages.

The page source may load more columns than the minimal necessary set from columns. To indicate which columns have been loaded, LoadClusters()must mark them withSetColumnAvailable(). That includes the ones from thecolumnsthat don't have pages; otherwise subsequent requests for the cluster would assume an incomplete cluster and trigger loading again. LoadClusters()` is typically called from the I/O thread of a cluster pool, i.e. the method runs concurrently to other methods of the page source.

Implements ROOT::Internal::RPageSource.

Definition at line 550 of file RPageStorageS3.cxx.

◆ LoadPage() [1/2]

ROOT::Internal::RPageRef ROOT::Internal::RPageSource::LoadPage ( ColumnHandle_t columnHandle,
RNTupleLocalIndex localIndex )
virtualinherited

Another version of LoadPage that allows to specify cluster-relative indexes.

Returns a default-constructed RPage for suppressed columns.

Definition at line 713 of file RPageStorage.cxx.

◆ LoadPage() [2/2]

ROOT::Internal::RPageRef ROOT::Internal::RPageSource::LoadPage ( ColumnHandle_t columnHandle,
ROOT::NTupleSize_t globalIndex )
virtualinherited

Allocates and fills a page that contains the index-th element.

Calls into the concrete page source for loading the corresponding sealed page of cluster where necessary. Returns a default-constructed RPage for suppressed columns.

Definition at line 681 of file RPageStorage.cxx.

◆ LoadPageFromSummary()

ROOT::Internal::RPageRef ROOT::Internal::RPageSource::LoadPageFromSummary ( ColumnHandle_t columnHandle,
const RPageSummary & pageSummary )
privateinherited

Definition at line 617 of file RPageStorage.cxx.

◆ LoadPageListImpl()

void ROOT::Experimental::Internal::RPageSourceS3::LoadPageListImpl ( const RNTupleLocator & locator,
unsigned char * buffer )
finalprotectedvirtual

Implements ROOT::Internal::RPageSource.

Definition at line 533 of file RPageStorageS3.cxx.

◆ LoadSealedPage()

void ROOT::Internal::RPageSource::LoadSealedPage ( ROOT::DescriptorId_t physicalColumnId,
RNTupleLocalIndex localIndex,
RSealedPage & sealedPage )
inherited

Read the packed and compressed bytes of a page into the memory buffer provided by sealedPage.

The sealed page can be used subsequently in a call to RPageSink::CommitSealedPage. The fSize and fNElements member of the sealedPage parameters are always set. If sealedPage.fBuffer is nullptr, no data will be copied but the returned size information can be used by the caller to allocate a large enough buffer and call LoadSealedPage again.

Definition at line 573 of file RPageStorage.cxx.

◆ LoadSealedPageImpl()

void ROOT::Experimental::Internal::RPageSourceS3::LoadSealedPageImpl ( const RNTupleLocator & locator,
RSealedPage & sealedPage )
finalprotectedvirtual

Implements ROOT::Internal::RPageSource.

Definition at line 539 of file RPageStorageS3.cxx.

◆ LoadStructure()

void ROOT::Internal::RPageSource::LoadStructure ( )
inherited

Loads header and footer without decompressing or deserializing them.

This can be used to asynchronously open a file in the background. The method is idempotent and it is called as a first step in Attach(). Pages sources may or may not make use of splitting loading and processing metadata. Therefore, LoadStructure() may do nothing and defer loading the metadata to Attach().

Definition at line 229 of file RPageStorage.cxx.

◆ LoadStructureImpl()

void ROOT::Experimental::Internal::RPageSourceS3::LoadStructureImpl ( )
finalprotectedvirtual

Fills fStructureBuffer with the compressed header and footer.

Implements ROOT::Internal::RPageSource.

Definition at line 446 of file RPageStorageS3.cxx.

◆ LoadZeroPage()

ROOT::Internal::RPageRef ROOT::Internal::RPageSource::LoadZeroPage ( ColumnHandle_t columnHandle,
const RPageSummary & pageSummary )
privateinherited

Definition at line 599 of file RPageStorage.cxx.

◆ MakeObjectUrl()

std::string ROOT::Experimental::Internal::RPageSourceS3::MakeObjectUrl ( std::uint64_t objId) const
private

Resolve a numeric object ID to its full HTTP URL through the anchor's URL template.

Definition at line 389 of file RPageStorageS3.cxx.

◆ OpenWithDifferentAnchor()

std::unique_ptr< ROOT::Internal::RPageSource > ROOT::Experimental::Internal::RPageSourceS3::OpenWithDifferentAnchor ( const ROOT::Internal::RNTupleLink & anchorLink,
const ROOT::RNTupleReadOptions & options = {} )
finalvirtual

Creates a new PageSource using the same underlying file as this but referring to a different RNTuple, described by anchorLink.

Implements ROOT::Internal::RPageSource.

Definition at line 624 of file RPageStorageS3.cxx.

◆ PinCluster()

void ROOT::Internal::RPageSource::PinCluster ( ROOT::DescriptorId_t clusterId)
inlineinherited

Instructs the cluster pool and page pool to consider the given cluster as active (should stay cached).

Definition at line 910 of file RPageStorage.hxx.

◆ PrepareLoadCluster()

void ROOT::Internal::RPageSource::PrepareLoadCluster ( const ROOT::Internal::RCluster::RKey & clusterKey,
ROOT::Internal::ROnDiskPageMap & pageZeroMap,
const std::function< void(ROOT::DescriptorId_t, ROOT::NTupleSize_t, const ROOT::RClusterDescriptor::RPageInfo &)> & perPageFunc )
protectedinherited

Prepare a page range read for the column set in clusterKey.

Specifically, pages referencing the kTypePageZero locator are filled in pageZeroMap; otherwise, perPageFunc is called for each page. This is commonly used as part of LoadClusters() in derived classes.

Definition at line 512 of file RPageStorage.cxx.

◆ RegisterStreamerInfos()

void ROOT::Internal::RPageSource::RegisterStreamerInfos ( )
inherited

Builds the streamer info records from the descriptor's extra type info section.

This is necessary when connecting streamer fields so that emulated classes can be read.

Definition at line 881 of file RPageStorage.cxx.

◆ SetEntryRange()

void ROOT::Internal::RPageSource::SetEntryRange ( const REntryRange & range)
inherited

Promise to only read from the given entry range.

If set, prevents the cluster pool from reading-ahead beyond the given range. The range needs to be within [0, GetNEntries()).

Definition at line 221 of file RPageStorage.cxx.

◆ SetTaskScheduler()

void ROOT::Internal::RPageStorage::SetTaskScheduler ( RTaskScheduler * taskScheduler)
inlineinherited

Definition at line 197 of file RPageStorage.hxx.

◆ StopClusterPoolBackgroundThread()

void ROOT::Internal::RPageSource::StopClusterPoolBackgroundThread ( )
inlineprotectedinherited

Definition at line 810 of file RPageStorage.hxx.

◆ UnpinCluster()

void ROOT::Internal::RPageSource::UnpinCluster ( ROOT::DescriptorId_t clusterId)
inlineinherited

Allows the given cluster to be evicted from the cluster pool and page pool.

Definition at line 912 of file RPageStorage.hxx.

◆ UnsealPage() [1/2]

ROOT::RResult< ROOT::Internal::RPage > ROOT::Internal::RPageSource::UnsealPage ( const RSealedPage & sealedPage,
const ROOT::Internal::RColumnElementBase & element )
inherited

Definition at line 837 of file RPageStorage.cxx.

◆ UnsealPage() [2/2]

ROOT::RResult< ROOT::Internal::RPage > ROOT::Internal::RPageSource::UnsealPage ( const RSealedPage & sealedPage,
const ROOT::Internal::RColumnElementBase & element,
ROOT::Internal::RPageAllocator & pageAlloc )
staticinherited

Helper for unstreaming a page.

This is commonly used in derived, concrete page sources. The implementation currently always makes a memory copy, even if the sealed page is uncompressed and in the final memory layout. The optimization of directly mapping pages is left to the concrete page source implementations.

Definition at line 842 of file RPageStorage.cxx.

◆ UnzipCluster()

void ROOT::Internal::RPageSource::UnzipCluster ( ROOT::Internal::RCluster * cluster)
inherited

Parallel decompression and unpacking of the pages in the given cluster.

The unzipped pages are supposed to be preloaded in a page pool attached to the source. The method is triggered by the cluster pool's unzip thread. It is an optional optimization, the method can safely do nothing. In particular, the actual implementation will only run if a task scheduler is set. In practice, a task scheduler is set if implicit multi-threading is turned on.

Definition at line 434 of file RPageStorage.cxx.

◆ UnzipClusterImpl()

void ROOT::Internal::RPageSource::UnzipClusterImpl ( ROOT::Internal::RCluster * cluster)
protectedvirtualinherited

Definition at line 440 of file RPageStorage.cxx.

◆ UpdateLastUsedCluster()

void ROOT::Internal::RPageSource::UpdateLastUsedCluster ( ROOT::DescriptorId_t clusterId)
privateinherited

Does nothing if fLastUsedCluster == clusterId.

Otherwise, updated fLastUsedCluster and evict unused paged from the page pool of all previous clusters. Must not be called when the descriptor guard is taken.

Definition at line 539 of file RPageStorage.cxx.

◆ WaitForAllTasks()

void ROOT::Internal::RPageStorage::WaitForAllTasks ( )
inlineprotectedinherited

Definition at line 153 of file RPageStorage.hxx.

Member Data Documentation

◆ fActivePhysicalColumns

RActivePhysicalColumns ROOT::Internal::RPageSource::fActivePhysicalColumns
privateinherited

The active columns are implicitly defined by the model fields or views.

Definition at line 697 of file RPageStorage.hxx.

◆ fAnchor

RNTupleAnchorS3 ROOT::Experimental::Internal::RPageSourceS3::fAnchor
private

Anchor metadata, fetched and parsed in LoadStructureImpl.

Definition at line 197 of file RPageStorageS3.hxx.

◆ fBaseUrl

std::string ROOT::Experimental::Internal::RPageSourceS3::fBaseUrl
private

HTTP base URL for this ntuple (derived from the s3 scheme URI); never has a trailing slash.

Definition at line 187 of file RPageStorageS3.hxx.

◆ fClusterConnection

ROOT::Internal::RCurlConnection ROOT::Experimental::Internal::RPageSourceS3::fClusterConnection
private

Connection used exclusively by LoadClusters(), which the cluster pool calls on its own I/O thread.

A libcurl easy handle carries per-request state and must not be driven by two threads at once, so the prefetch path needs a handle of its own rather than sharing fMainConnection.

Definition at line 195 of file RPageStorageS3.hxx.

◆ fClusterPool

ROOT::Internal::RClusterPool ROOT::Internal::RPageSource::fClusterPool
privateinherited

The cluster pool asynchronously preloads the next few clusters.

Note that derived classes should call StopClusterPoolBackgroundThread() in their destructor so that the I/O background thread does not call methods from the destructed derived class.

Definition at line 702 of file RPageStorage.hxx.

◆ fCounters

std::unique_ptr<RCounters> ROOT::Internal::RPageSource::fCounters
protectedinherited

Definition at line 767 of file RPageStorage.hxx.

◆ fCurrentCluster

ROOT::Internal::RCluster* ROOT::Internal::RPageSource::fCurrentCluster = nullptr
privateinherited

The last cluster from which a page got loaded. Points into fClusterPool->fPool.

Definition at line 704 of file RPageStorage.hxx.

◆ fDescriptor

ROOT::RNTupleDescriptor ROOT::Internal::RPageSource::fDescriptor
privateinherited

Definition at line 689 of file RPageStorage.hxx.

◆ fDescriptorBuilder

ROOT::Internal::RNTupleDescriptorBuilder ROOT::Experimental::Internal::RPageSourceS3::fDescriptorBuilder
private

Populated by LoadStructureImpl and AttachImpl, moved out at the end of AttachImpl.

Definition at line 202 of file RPageStorageS3.hxx.

◆ fDescriptorLock

std::shared_mutex ROOT::Internal::RPageSource::fDescriptorLock
mutableprivateinherited

Definition at line 690 of file RPageStorage.hxx.

◆ fEntryRange

REntryRange ROOT::Internal::RPageSource::fEntryRange
privateinherited

Used by the cluster pool to prevent reading beyond the given range.

Definition at line 691 of file RPageStorage.hxx.

◆ fHasStreamerInfosRegistered

bool ROOT::Internal::RPageSource::fHasStreamerInfosRegistered = false
privateinherited

Set to true when RegisterStreamerInfos() is called.

Definition at line 694 of file RPageStorage.hxx.

◆ fHasStructure

bool ROOT::Internal::RPageSource::fHasStructure = false
privateinherited

Set to true once LoadStructure() is called.

Definition at line 692 of file RPageStorage.hxx.

◆ fIsAttached

bool ROOT::Internal::RPageSource::fIsAttached = false
privateinherited

Set to true once Attach() is called.

Definition at line 693 of file RPageStorage.hxx.

◆ fLastUsedCluster

ROOT::DescriptorId_t ROOT::Internal::RPageSource::fLastUsedCluster = ROOT::kInvalidDescriptorId
privateinherited

Remembers the last cluster id from which a page was requested.

Definition at line 709 of file RPageStorage.hxx.

◆ fMainConnection

ROOT::Internal::RCurlConnection ROOT::Experimental::Internal::RPageSourceS3::fMainConnection
private

Connection used by everything that runs on the calling thread: the anchor, header and footer in LoadStructureImpl, the page lists in LoadPageListImpl and single pages in LoadSealedPageImpl.

Reused across objects so curl keeps it alive instead of re-handshaking per object.

Definition at line 191 of file RPageStorageS3.hxx.

◆ fMetrics

ROOT::Experimental::Detail::RNTupleMetrics ROOT::Internal::RPageStorage::fMetrics
protectedinherited

Definition at line 146 of file RPageStorage.hxx.

◆ fNTupleName

std::string ROOT::Internal::RPageStorage::fNTupleName
protectedinherited

Definition at line 151 of file RPageStorage.hxx.

◆ fOptions

ROOT::RNTupleReadOptions ROOT::Internal::RPageSource::fOptions
protectedinherited

Definition at line 770 of file RPageStorage.hxx.

◆ fPageAllocator

std::unique_ptr<ROOT::Internal::RPageAllocator> ROOT::Internal::RPageStorage::fPageAllocator
protectedinherited

For the time being, we will use the heap allocator for all sources and sinks. This may change in the future.

Definition at line 149 of file RPageStorage.hxx.

◆ fPagePool

ROOT::Internal::RPagePool ROOT::Internal::RPageSource::fPagePool
privateinherited

Pages that are unzipped with IMT are staged into the page pool.

Definition at line 706 of file RPageStorage.hxx.

◆ fPinnedClusters

std::unordered_set<ROOT::DescriptorId_t> ROOT::Internal::RPageSource::fPinnedClusters
privateinherited

Pinned clusters and their $2 * (cluster bunch size) - 1$ successors will not be evicted from the cluster pool.

Pages of pinned clusters won't be evicted from the page pool.

Definition at line 717 of file RPageStorage.hxx.

◆ fPreloadedClusters

std::map<ROOT::NTupleSize_t, ROOT::DescriptorId_t> ROOT::Internal::RPageSource::fPreloadedClusters
privateinherited

Clusters from where pages got preloaded in UnzipClusterImpl(), ordered by first entry number of the clusters.

If the last used cluster changes in LoadPage(), all unused pages from previous clusters are evicted from the page pool. Pinned clusters won't be evicted.

Definition at line 713 of file RPageStorage.hxx.

◆ fResolvedUrlTemplate

std::string ROOT::Experimental::Internal::RPageSourceS3::fResolvedUrlTemplate
private

The anchor's URL template with ${baseurl} already substituted, so that resolving an object ID only has to replace ${objid}.

Set from the anchor in LoadStructureImpl and carried into clones.

Definition at line 200 of file RPageStorageS3.hxx.

◆ fStructureBuffer

RStructureBuffer ROOT::Internal::RPageSource::fStructureBuffer
protectedinherited

Populated by LoadStructureImpl(), reset at the end of Attach()

Definition at line 768 of file RPageStorage.hxx.

◆ fTaskScheduler

RTaskScheduler* ROOT::Internal::RPageStorage::fTaskScheduler = nullptr
protectedinherited

Definition at line 152 of file RPageStorage.hxx.

◆ kNBytesPageChecksum

constexpr std::size_t ROOT::Internal::RPageStorage::kNBytesPageChecksum = sizeof(std::uint64_t)
staticconstexprinherited

The page checksum is a 64bit xxhash3.

Definition at line 73 of file RPageStorage.hxx.

Libraries for ROOT::Experimental::Internal::RPageSourceS3:

The documentation for this class was generated from the following files: