Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RPageStorageS3.hxx
Go to the documentation of this file.
1/// \file ROOT/RPageStorageS3.hxx
2/// \author Jas Mehta <jasmehta805@gmail.com>
3/// \date 2026-06-01
4
5/*************************************************************************
6 * Copyright (C) 1995-2026, Rene Brun and Fons Rademakers. *
7 * All rights reserved. *
8 * *
9 * For the licensing terms see $ROOTSYS/LICENSE. *
10 * For the list of contributors see $ROOTSYS/README/CREDITS. *
11 *************************************************************************/
12
13#ifndef ROOT_RPageStorageS3
14#define ROOT_RPageStorageS3
15
16#include <ROOT/RCurlConnection.hxx>
17#include <ROOT/RError.hxx>
18#include <ROOT/RNTuple.hxx>
19#include <ROOT/RPageStorage.hxx>
20
21#include <cstdint>
22#include <memory>
23#include <string>
24#include <string_view>
25
26namespace ROOT {
27namespace Experimental {
28namespace Internal {
29
30// clang-format off
31/**
32\class ROOT::Experimental::Internal::RNTupleAnchorS3
33\ingroup NTuple
34\brief Entry point for an RNTuple stored in S3-compatible object storage.
35
36The anchor is serialized as a JSON object and stored at the base URL of the ntuple.
37It contains the information needed to locate and read the header and footer envelopes.
38The anchor is always the last object written during CommitDatasetImpl, ensuring atomicity:
39if the anchor exists, the entire ntuple is complete.
40*/
41// clang-format on
43 friend class RPageSinkS3;
44
45private:
46 /// Allows evolving the anchor JSON schema in future versions
47 std::uint32_t fVersionAnchor = 0;
48 /// Version of the RNTuple binary format supported by the writer
53 /// Pattern for resolving object IDs to full S3 URLs. ${baseurl} is replaced with the anchor URL,
54 /// ${objid} with the numeric object ID. Defaults to the scheme this writer uses; the reader
55 /// overrides it from the stored anchor.
56 std::string fUrlTemplate = "${baseurl}/${objid}";
57 /// Pattern for resolving clone (attribute-set) names to base URLs.
58 /// ${baseurl} is replaced with the anchor URL, ${name} with the clone name.
59 std::string fCloneTemplate = "${baseurl}/_clone/${name}";
60 /// Object ID and byte offset of the compressed header within the S3 object
61 std::uint64_t fHeaderObjId = 0;
62 std::uint64_t fHeaderOffset = 0;
63 /// Compressed and uncompressed sizes of the header envelope
64 std::uint64_t fNBytesHeader = 0;
65 std::uint64_t fLenHeader = 0;
66 /// Object ID and byte offset of the compressed footer within the S3 object
67 std::uint64_t fFooterObjId = 0;
68 std::uint64_t fFooterOffset = 0;
69 /// Compressed and uncompressed sizes of the footer envelope
70 std::uint64_t fNBytesFooter = 0;
71 std::uint64_t fLenFooter = 0;
72
73public:
74 RNTupleAnchorS3() = default;
75
76 /// Deserialize the anchor from a JSON string. Returns an error on malformed or incompatible input.
77 static RResult<RNTupleAnchorS3> CreateFromJSON(const std::string &json);
78 /// Serialize the anchor to a JSON string suitable for storage at the base URL
79 std::string ToJSON() const;
80
81 bool operator==(const RNTupleAnchorS3 &other) const;
82 bool operator!=(const RNTupleAnchorS3 &other) const { return !(*this == other); }
83
84 std::uint32_t GetVersionAnchor() const { return fVersionAnchor; }
85 std::uint16_t GetVersionEpoch() const { return fVersionEpoch; }
86 std::uint16_t GetVersionMajor() const { return fVersionMajor; }
87 std::uint16_t GetVersionMinor() const { return fVersionMinor; }
88 std::uint16_t GetVersionPatch() const { return fVersionPatch; }
89 const std::string &GetUrlTemplate() const { return fUrlTemplate; }
90 const std::string &GetCloneTemplate() const { return fCloneTemplate; }
91 std::uint64_t GetHeaderObjId() const { return fHeaderObjId; }
92 std::uint64_t GetHeaderOffset() const { return fHeaderOffset; }
93 std::uint64_t GetNBytesHeader() const { return fNBytesHeader; }
94 std::uint64_t GetLenHeader() const { return fLenHeader; }
95 std::uint64_t GetFooterObjId() const { return fFooterObjId; }
96 std::uint64_t GetFooterOffset() const { return fFooterOffset; }
97 std::uint64_t GetNBytesFooter() const { return fNBytesFooter; }
98 std::uint64_t GetLenFooter() const { return fLenFooter; }
99};
100
101/// \brief Translate an ntpl+s3 URI into its plain HTTP(S) equivalent.
102///
103/// Accepts `ntpl+s3+http://host/bucket/path` and `ntpl+s3+https://host/bucket/path`, returning the
104/// URL with the scheme replaced by http or https respectively. Returns an error result for any other
105/// scheme or a malformed URI (rather than throwing), so callers on untrusted input can handle it.
106RResult<std::string> ParseS3Url(std::string_view uri);
107
108// clang-format off
109/**
110\class ROOT::Experimental::Internal::RPageSinkS3
111\ingroup NTuple
112\brief Storage provider that writes ntuple pages into S3-compatible object storage.
113
114Currently implements Mode B (one sealed page per S3 object, kTypeObject64 locators).
115Mode A (multiple packed pages per object, kTypeMulti locators) will be added separately.
116
117\warning The S3 backend is experimental and under active development.
118*/
119// clang-format on
121private:
122 /// HTTP base URL for this ntuple (derived from the s3 scheme URI); never has a trailing slash
123 std::string fBaseUrl;
124 /// One HTTP connection reused for every upload, so curl keeps it alive across objects on the same
125 /// host instead of re-handshaking per object.
126 ROOT::Internal::RCurlConnection fConnection;
127 /// Object ID counter; incremented for each object written.
128 std::uint64_t fObjectId{0};
129 /// Tracks the number of bytes committed to the current cluster (reset in StageClusterImpl)
130 std::uint64_t fNBytesCurrentCluster{0};
131 /// Anchor metadata populated during the write path and uploaded last in CommitDatasetImpl
133
134 /// Resolve a numeric object ID to its full HTTP URL
135 std::string MakeObjectUrl(std::uint64_t objId) const;
136 /// Upload raw bytes to the given S3 URL via an HTTP PUT request
137 void PutObject(const std::string &url, const unsigned char *data, std::size_t size);
138
139 /// Tag to select the internal constructor that takes an already-resolved base URL.
140 struct RFromBaseUrl {};
141 /// Internal constructor used by CloneAsHidden: the public constructor derives the base URL by parsing
142 /// an s3 scheme URI, whereas a clone already has a resolved base URL to write under.
143 RPageSinkS3(std::string_view ntupleName, std::string_view baseUrl, const ROOT::RNTupleWriteOptions &options,
145
146protected:
148 void InitImpl(unsigned char *serializedHeader, std::uint32_t length) final;
151 std::uint64_t StageClusterImpl() final;
154 ROOT::Internal::RNTupleLink CommitDatasetImpl(unsigned char *serializedFooter, std::uint32_t length) final;
155
156public:
157 RPageSinkS3(std::string_view ntupleName, std::string_view uri, const ROOT::RNTupleWriteOptions &options);
159
160 std::unique_ptr<ROOT::Internal::RPageSink>
162}; // class RPageSinkS3
163
164} // namespace Internal
165} // namespace Experimental
166} // namespace ROOT
167
168#endif
nlohmann::json json
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
char name[80]
Definition TGX11.cxx:148
Entry point for an RNTuple stored in S3-compatible object storage.
bool operator==(const RNTupleAnchorS3 &other) const
Field-by-field equality check across all data members.
std::uint64_t fHeaderObjId
Object ID and byte offset of the compressed header within the S3 object.
std::string fUrlTemplate
Pattern for resolving object IDs to full S3 URLs.
std::uint32_t fVersionAnchor
Allows evolving the anchor JSON schema in future versions.
std::uint16_t fVersionEpoch
Version of the RNTuple binary format supported by the writer.
bool operator!=(const RNTupleAnchorS3 &other) const
std::string fCloneTemplate
Pattern for resolving clone (attribute-set) names to base URLs.
std::uint64_t fNBytesHeader
Compressed and uncompressed sizes of the header envelope.
std::string ToJSON() const
Serialize the anchor to a JSON string suitable for storage at the base URL.
std::uint64_t fNBytesFooter
Compressed and uncompressed sizes of the footer envelope.
static RResult< RNTupleAnchorS3 > CreateFromJSON(const std::string &json)
Deserialize the anchor from a JSON string. Returns an error on malformed or incompatible input.
std::uint64_t fFooterObjId
Object ID and byte offset of the compressed footer within the S3 object.
Storage provider that writes ntuple pages into S3-compatible object storage.
ROOT::Internal::RCurlConnection fConnection
One HTTP connection reused for every upload, so curl keeps it alive across objects on the same host i...
void InitImpl(unsigned char *serializedHeader, std::uint32_t length) final
std::uint64_t StageClusterImpl() final
Returns the number of bytes written to storage (excluding metadata)
RNTupleLocator CommitClusterGroupImpl(unsigned char *serializedPageList, std::uint32_t length) final
Returns the locator of the page list envelope of the given buffer that contains the serialized page l...
std::unique_ptr< ROOT::Internal::RPageSink > CloneAsHidden(std::string_view name, const ROOT::RNTupleWriteOptions &opts) const final
Creates a new sink with the same underlying storage as this but writing to a different RNTuple named ...
RNTupleAnchorS3 fAnchor
Anchor metadata populated during the write path and uploaded last in CommitDatasetImpl.
std::string MakeObjectUrl(std::uint64_t objId) const
Resolve a numeric object ID to its full HTTP URL.
std::string fBaseUrl
HTTP base URL for this ntuple (derived from the s3 scheme URI); never has a trailing slash.
RNTupleLocator CommitSealedPageImpl(ROOT::DescriptorId_t physicalColumnId, const RPageStorage::RSealedPage &sealedPage) final
std::uint64_t fNBytesCurrentCluster
Tracks the number of bytes committed to the current cluster (reset in StageClusterImpl)
RPageSinkS3(std::string_view ntupleName, std::string_view baseUrl, const ROOT::RNTupleWriteOptions &options, RFromBaseUrl)
Internal constructor used by CloneAsHidden: the public constructor derives the base URL by parsing an...
std::uint64_t fObjectId
Object ID counter; incremented for each object written.
void PutObject(const std::string &url, const unsigned char *data, std::size_t size)
Upload raw bytes to the given S3 URL via an HTTP PUT request.
Base class for a sink with a physical storage backend.
virtual void InitImpl(unsigned char *serializedHeader, std::uint32_t length)=0
Abstract interface to write data into an ntuple.
Generic information about the physical location of data.
Common user-tunable settings for storing RNTuples.
static constexpr std::uint16_t kVersionPatch
Definition RNTuple.hxx:81
static constexpr std::uint16_t kVersionMajor
Definition RNTuple.hxx:79
static constexpr std::uint16_t kVersionEpoch
Definition RNTuple.hxx:78
static constexpr std::uint16_t kVersionMinor
Definition RNTuple.hxx:80
RResult< std::string > ParseS3Url(std::string_view uri)
Translate an ntpl+s3 URI into its plain HTTP(S) equivalent.
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
Tag to select the internal constructor that takes an already-resolved base URL.
A sealed page contains the bytes of a page as written to storage (packed & compressed).