Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RPageStorageDaos.cxx
Go to the documentation of this file.
1/// \file RPageStorageDaos.cxx
2/// \author Javier Lopez-Gomez <j.lopez@cern.ch>
3/// \date 2020-11-03
4/// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback
5/// is welcome!
6
7/*************************************************************************
8 * Copyright (C) 1995-2021, Rene Brun and Fons Rademakers. *
9 * All rights reserved. *
10 * *
11 * For the licensing terms see $ROOTSYS/LICENSE. *
12 * For the list of contributors see $ROOTSYS/README/CREDITS. *
13 *************************************************************************/
14
15#include <ROOT/RCluster.hxx>
16#include <ROOT/RLogger.hxx>
18#include <ROOT/RNTupleModel.hxx>
21#include <ROOT/RNTupleTypes.hxx>
22#include <ROOT/RNTupleUtils.hxx>
23#include <ROOT/RNTupleZip.hxx>
24#include <ROOT/RPage.hxx>
26#include <ROOT/RPagePool.hxx>
27#include <ROOT/RDaos.hxx>
29
30#include <RVersion.h>
31#include <TError.h>
32
33#include <algorithm>
34#include <cstdio>
35#include <cstdlib>
36#include <cstring>
37#include <limits>
38#include <tuple>
39#include <utility>
40#include <regex>
41#include <cassert>
42
43namespace {
52
53struct RDaosKey {
54 daos_obj_id_t fOid;
55 DistributionKey_t fDkey;
56 AttributeKey_t fAkey;
57};
58
59/// \brief Pre-defined keys for object store. `kDistributionKeyDefault` is the distribution key for metadata and
60/// pagelist values; optionally it can be used for ntuple pages (if under the `kOidPerPage` mapping strategy).
61/// `kAttributeKeyDefault` is the attribute key for ntuple pages under `kOidPerPage`.
62/// `kAttributeKey{Anchor,Header,Footer}` are the respective attribute keys for anchor/header/footer metadata elements.
63static constexpr DistributionKey_t kDistributionKeyDefault = 0x5a3c69f0cafe4a11;
64static constexpr AttributeKey_t kAttributeKeyDefault = 0x4243544b53444229;
65static constexpr AttributeKey_t kAttributeKeyAnchor = 0x4243544b5344422a;
66static constexpr AttributeKey_t kAttributeKeyHeader = 0x4243544b5344422b;
67static constexpr AttributeKey_t kAttributeKeyFooter = 0x4243544b5344422c;
68
69/// \brief Pre-defined 64 LSb of the OIDs for ntuple metadata (holds anchor/header/footer) and clusters' pagelists.
70static constexpr decltype(daos_obj_id_t::lo) kOidLowMetadata = -1;
71static constexpr decltype(daos_obj_id_t::lo) kOidLowPageList = -2;
72
73static constexpr daos_oclass_id_t kCidMetadata = OC_SX;
74
76{
77 return RDaosKey{daos_obj_id_t{static_cast<decltype(daos_obj_id_t::lo)>(pageCount),
78 static_cast<decltype(daos_obj_id_t::hi)>(ntplId)},
80}
81
82struct RDaosURI {
83 /// \brief Label of the DAOS pool
84 std::string fPoolLabel;
85 /// \brief Label of the container for this RNTuple
86 std::string fContainerLabel;
87};
88
89/**
90 \brief Parse a DAOS RNTuple URI of the form 'daos://pool_id/container_id'.
91*/
92RDaosURI ParseDaosURI(std::string_view uri)
93{
94 std::regex re("daos://([^/]+)/(.+)");
95 std::cmatch m;
96 if (!std::regex_match(uri.data(), m, re))
97 throw ROOT::RException(R__FAIL("Invalid DAOS pool URI."));
98 return {m[1], m[2]};
99}
100
101/// \brief Helper structure concentrating the functionality required to locate an ntuple within a DAOS container.
102/// It includes a hashing function that converts the RNTuple's name into a 32-bit identifier; this value is used to
103/// index the subspace for the ntuple among all objects in the container. A zero-value hash value is reserved for
104/// storing any future metadata related to container-wide management; a zero-index ntuple is thus disallowed and
105/// remapped to "1". Once the index is computed, `InitNTupleDescriptorBuilder()` can be called to return a
106/// partially-filled builder with the ntuple's anchor, header and footer, lacking only pagelists. Upon that call,
107/// a copy of the anchor is stored in `fAnchor`.
108struct RDaosContainerNTupleLocator {
109 std::string fName{};
110 ntuple_index_t fIndex{};
111 std::optional<ROOT::Experimental::Internal::RDaosNTupleAnchor> fAnchor;
112 static const ntuple_index_t kReservedIndex = 0;
113
114 RDaosContainerNTupleLocator() = default;
115 explicit RDaosContainerNTupleLocator(const std::string &ntupleName) : fName(ntupleName), fIndex(Hash(ntupleName)) {}
116
117 bool IsValid() { return fAnchor.has_value() && fAnchor->fNBytesHeader; }
118 [[nodiscard]] ntuple_index_t GetIndex() const { return fIndex; };
119 static ntuple_index_t Hash(const std::string &ntupleName)
120 {
121 // Convert string to numeric representation via `std::hash`.
122 uint64_t h = std::hash<std::string>{}(ntupleName);
123 // Fold the hash into 32-bit using `boost::hash_combine()` algorithm and magic number.
124 auto seed = static_cast<uint32_t>(h >> 32);
125 seed ^= static_cast<uint32_t>(h & 0xffffffff) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
126 auto hash = static_cast<ntuple_index_t>(seed);
127 return (hash == kReservedIndex) ? kReservedIndex + 1 : hash;
128 }
129
132 {
133 std::unique_ptr<unsigned char[]> buffer;
134 auto &anchor = fAnchor.emplace();
135 int err;
136
138 daos_obj_id_t oidMetadata{kOidLowMetadata, static_cast<decltype(daos_obj_id_t::hi)>(this->GetIndex())};
139
141 if ((err = cont.ReadSingleAkey(buffer.get(), anchorSize, oidMetadata, kDistributionKeyDefault,
143 return err;
144 }
145
146 anchor.Deserialize(buffer.get(), anchorSize).Unwrap();
147
148 builder.SetVersion(anchor.fVersionEpoch, anchor.fVersionMajor, anchor.fVersionMinor, anchor.fVersionPatch);
149 builder.SetOnDiskHeaderSize(anchor.fNBytesHeader);
150 builder.AddToOnDiskFooterSize(anchor.fNBytesFooter);
151
152 return 0;
153 }
154
155 static std::pair<RDaosContainerNTupleLocator, ROOT::Internal::RNTupleDescriptorBuilder>
157 {
158 auto result = std::make_pair(RDaosContainerNTupleLocator(ntupleName), ROOT::Internal::RNTupleDescriptorBuilder());
159
160 auto &loc = result.first;
161 auto &builder = result.second;
162
163 loc.InitNTupleDescriptorBuilder(cont, builder);
164 return result;
165 }
166};
167
168} // anonymous namespace
169
170////////////////////////////////////////////////////////////////////////////////
171
189
192{
193 if (bufSize < 32)
194 return R__FAIL("DAOS anchor too short");
195
196 auto bytes = reinterpret_cast<const unsigned char *>(buffer);
198 if (fVersionAnchor != RDaosNTupleAnchor().fVersionAnchor) {
199 return R__FAIL("unsupported DAOS anchor version: " + std::to_string(fVersionAnchor));
200 }
201
211 if (!result)
212 return R__FORWARD_ERROR(result);
213 return result.Unwrap() + 32;
214}
215
220
221////////////////////////////////////////////////////////////////////////////////
222
224 const ROOT::RNTupleWriteOptions &options)
225 : RPagePersistentSink(ntupleName, options), fURI(uri)
226{
227 static std::once_flag once;
228 std::call_once(once, []() {
229 R__LOG_WARNING(ROOT::Internal::NTupleLog()) << "The DAOS backend is experimental and still under development. "
230 << "Do not store real data with this version of RNTuple!";
231 });
232 EnableDefaultMetrics("RPageSinkDaos");
233}
234
236
238{
239 auto opts = dynamic_cast<RNTupleWriteOptionsDaos *>(fOptions.get());
240 fNTupleAnchor.fObjClass = opts ? opts->GetObjectClass() : RNTupleWriteOptionsDaos().GetObjectClass();
241 auto oclass = RDaosObject::ObjClassId(fNTupleAnchor.fObjClass);
242 if (oclass.IsUnknown())
243 throw ROOT::RException(R__FAIL("Unknown object class " + fNTupleAnchor.fObjClass));
244
245 auto args = ParseDaosURI(fURI);
246 auto pool = std::make_shared<RDaosPool>(args.fPoolLabel);
247
248 fDaosContainer = std::make_unique<RDaosContainer>(pool, args.fContainerLabel, /*create =*/true);
249 fDaosContainer->SetDefaultObjectClass(oclass);
250
251 auto [locator, _] = RDaosContainerNTupleLocator::LocateNTuple(*fDaosContainer, fNTupleName);
252 fNTupleIndex = locator.GetIndex();
253
255 auto szZipHeader =
256 RNTupleCompressor::Zip(serializedHeader, length, GetWriteOptions().GetCompression(), zipBuffer.get());
257 WriteNTupleHeader(zipBuffer.get(), szZipHeader, length);
258}
259
262{
263 auto element = columnHandle.fColumn->GetElement();
265 {
266 Detail::RNTupleAtomicTimer timer(fCounters->fTimeWallZip, fCounters->fTimeCpuZip);
267 sealedPage = SealPage(page, *element);
268 }
269
270 fCounters->fSzZip.Add(page.GetNBytes());
271 return CommitSealedPageImpl(columnHandle.fPhysicalId, sealedPage);
272}
273
277{
278 auto pageId = fPageId.fetch_add(1);
279
280 {
281 Detail::RNTupleAtomicTimer timer(fCounters->fTimeWallWrite, fCounters->fTimeCpuWrite);
282 RDaosKey daosKey = GetPageDaosKey(fNTupleIndex, pageId);
283 fDaosContainer->WriteSingleAkey(sealedPage.GetBuffer(), sealedPage.GetBufferSize(), daosKey.fOid, daosKey.fDkey,
284 daosKey.fAkey);
285 }
286
289 result.SetNBytesOnStorage(sealedPage.GetDataSize());
291 fCounters->fNPageCommitted.Inc();
292 fCounters->fSzWritePayload.Add(sealedPage.GetBufferSize());
293 fNBytesCurrentCluster += sealedPage.GetBufferSize();
294 return result;
295}
296
297std::vector<ROOT::RNTupleLocator>
298ROOT::Experimental::Internal::RPageSinkDaos::CommitSealedPageVImpl(std::span<RPageStorage::RSealedPageGroup> ranges,
299 const std::vector<bool> &mask)
300{
302 std::vector<RNTupleLocator> locators;
303 auto nPages = mask.size();
304 locators.reserve(nPages);
305
306 int64_t payloadSz = 0;
307
308 /// Aggregate batch of requests by object ID and distribution key, determined by the ntuple-DAOS mapping
309 for (auto &range : ranges) {
310 for (auto sealedPageIt = range.fFirst; sealedPageIt != range.fLast; ++sealedPageIt) {
312
313 const auto pageId = fPageId.fetch_add(1);
314
316 d_iov_set(&pageIov, const_cast<void *>(s.GetBuffer()), s.GetBufferSize());
317
318 RDaosKey daosKey = GetPageDaosKey(fNTupleIndex, pageId);
321 it->second.Insert(daosKey.fAkey, pageIov);
322
325 locator.SetNBytesOnStorage(s.GetDataSize());
327 locators.push_back(locator);
328
330 }
331 }
332 fNBytesCurrentCluster += payloadSz;
333
334 {
335 Detail::RNTupleAtomicTimer timer(fCounters->fTimeWallWrite, fCounters->fTimeCpuWrite);
336 if (int err = fDaosContainer->WriteV(writeRequests))
337 throw ROOT::RException(R__FAIL("WriteV: error" + std::string(d_errstr(err))));
338 }
339
340 fCounters->fNPageCommitted.Add(nPages);
341 fCounters->fSzWritePayload.Add(payloadSz);
342
343 return locators;
344}
345
347{
348 return std::exchange(fNBytesCurrentCluster, 0);
349}
350
353 std::uint32_t length)
354{
356 auto szPageListZip =
357 RNTupleCompressor::Zip(serializedPageList, length, GetWriteOptions().GetCompression(), bufPageListZip.get());
358
359 auto offsetData = fClusterGroupId.fetch_add(1);
360 fDaosContainer->WriteSingleAkey(
362 daos_obj_id_t{kOidLowPageList, static_cast<decltype(daos_obj_id_t::hi)>(fNTupleIndex)}, kDistributionKeyDefault,
366 result.SetNBytesOnStorage(szPageListZip);
368 fCounters->fSzWritePayload.Add(static_cast<int64_t>(szPageListZip));
369 return result;
370}
371
374{
376 auto szFooterZip =
377 RNTupleCompressor::Zip(serializedFooter, length, GetWriteOptions().GetCompression(), bufFooterZip.get());
378 WriteNTupleFooter(bufFooterZip.get(), szFooterZip, length);
379 WriteNTupleAnchor();
380
381 // TODO: return the proper anchor locator+length
382 return {};
383}
384
386{
387 fDaosContainer->WriteSingleAkey(
388 data, nbytes, daos_obj_id_t{kOidLowMetadata, static_cast<decltype(daos_obj_id_t::hi)>(fNTupleIndex)},
390 fNTupleAnchor.fLenHeader = lenHeader;
391 fNTupleAnchor.fNBytesHeader = nbytes;
392}
393
395{
396 fDaosContainer->WriteSingleAkey(
397 data, nbytes, daos_obj_id_t{kOidLowMetadata, static_cast<decltype(daos_obj_id_t::hi)>(fNTupleIndex)},
399 fNTupleAnchor.fLenFooter = lenFooter;
400 fNTupleAnchor.fNBytesFooter = nbytes;
401}
402
404{
407 fNTupleAnchor.Serialize(buffer.get());
408 fDaosContainer->WriteSingleAkey(
409 buffer.get(), ntplSize, daos_obj_id_t{kOidLowMetadata, static_cast<decltype(daos_obj_id_t::hi)>(fNTupleIndex)},
411}
412
413std::unique_ptr<ROOT::Internal::RPageSink>
415 const ROOT::RNTupleWriteOptions & /*opts*/) const
416{
417 throw ROOT::RException(R__FAIL("cloning a DAOS sink is not implemented yet"));
418}
419
420////////////////////////////////////////////////////////////////////////////////
421
423 const ROOT::RNTupleReadOptions &options)
424 : RPageSource(ntupleName, options), fURI(uri)
425{
426 EnableDefaultMetrics("RPageSourceDaos");
427
428 auto args = ParseDaosURI(uri);
429 auto pool = std::make_shared<RDaosPool>(args.fPoolLabel);
430 fDaosContainer = std::make_unique<RDaosContainer>(pool, args.fContainerLabel);
431}
432
434{
435 StopClusterPoolBackgroundThread();
436}
437
439{
440 RDaosContainerNTupleLocator ntupleLocator;
441 std::tie(ntupleLocator, fDescriptorBuilder) =
442 RDaosContainerNTupleLocator::LocateNTuple(*fDaosContainer, fNTupleName);
443 if (!ntupleLocator.IsValid()) {
444 throw ROOT::RException(
445 R__FAIL("LoadStructureImpl: requested ntuple '" + fNTupleName + "' is not present in DAOS container."));
446 }
447 fAnchor = *ntupleLocator.fAnchor;
448 fNTupleIndex = ntupleLocator.GetIndex();
449
450 auto oclass = RDaosObject::ObjClassId(fAnchor.fObjClass);
451 if (oclass.IsUnknown())
452 throw ROOT::RException(R__FAIL("LoadStructureImpl: unknown object class " + fAnchor.fObjClass));
453 fDaosContainer->SetDefaultObjectClass(oclass);
454
455 // Reserve enough space for the compressed and the uncompressed header/footer (see AttachImpl)
456 const auto bufSize =
457 fAnchor.fNBytesHeader + fAnchor.fNBytesFooter + std::max(fAnchor.fLenHeader, fAnchor.fLenFooter);
458 fStructureBuffer.fBuffer = MakeUninitArray<unsigned char>(bufSize);
459 fStructureBuffer.fPtrHeader = fStructureBuffer.fBuffer.get();
460 fStructureBuffer.fPtrFooter = fStructureBuffer.fBuffer.get() + fAnchor.fNBytesHeader;
461
462 int err;
464
465 if ((err = fDaosContainer->ReadSingleAkey(fStructureBuffer.fPtrHeader, fAnchor.fNBytesHeader, oidMetadata,
467 throw ROOT::RException(R__FAIL("LoadStructureImpl: cannot load header: " + std::to_string(err)));
468 }
469
470 if ((err = fDaosContainer->ReadSingleAkey(fStructureBuffer.fPtrFooter, fAnchor.fNBytesFooter, oidMetadata,
472 throw ROOT::RException(R__FAIL("LoadStructureImpl: cannot load footer: " + std::to_string(err)));
473 }
474}
475
477{
478 auto unzipBuf = reinterpret_cast<unsigned char *>(fStructureBuffer.fPtrFooter) + fAnchor.fNBytesFooter;
479
480 RNTupleDecompressor::Unzip(fStructureBuffer.fPtrHeader, fAnchor.fNBytesHeader, fAnchor.fLenHeader, unzipBuf);
481 RNTupleSerializer::DeserializeHeader(unzipBuf, fAnchor.fLenHeader, fDescriptorBuilder);
482
483 RNTupleDecompressor::Unzip(fStructureBuffer.fPtrFooter, fAnchor.fNBytesFooter, fAnchor.fLenFooter, unzipBuf);
484 RNTupleSerializer::DeserializeFooter(unzipBuf, fAnchor.fLenFooter, fDescriptorBuilder);
485
486 if (fDescriptorBuilder.GetDescriptor().GetName() != fNTupleName) {
487 // Hash already taken by a differently-named ntuple.
488 throw ROOT::RException(R__FAIL("LocateNTuple: ntuple name '" + fNTupleName + "' unavailable in this container."));
489 }
490
491 return fDescriptorBuilder.MoveDescriptor();
492}
493
495 unsigned char *buffer)
496{
498 fDaosContainer->ReadSingleAkey(buffer, locator.GetNBytesOnStorage(), oidPageList, kDistributionKeyDefault,
499 locator.GetPosition<RNTupleLocatorObject64>().GetLocation(), kCidMetadata);
500}
501
503{
504 return fDaosContainer->GetDefaultObjectClass().ToString();
505}
506
509{
510 RDaosKey daosKey = GetPageDaosKey(fNTupleIndex, locator.GetPosition<RNTupleLocatorObject64>().GetLocation());
511 fDaosContainer->ReadSingleAkey(const_cast<void *>(sealedPage.GetBuffer()), sealedPage.GetBufferSize(), daosKey.fOid,
512 daosKey.fDkey, daosKey.fAkey);
513}
514
515std::unique_ptr<ROOT::Internal::RPageSource> ROOT::Experimental::Internal::RPageSourceDaos::CloneImpl() const
516{
517 auto clone = new RPageSourceDaos(fNTupleName, fURI, fOptions);
518 return std::unique_ptr<RPageSourceDaos>(clone);
519}
520
521std::vector<std::unique_ptr<RCluster>>
523{
525 ROOT::DescriptorId_t fClusterId = 0;
526 ROOT::DescriptorId_t fColumnId = 0;
527 ROOT::NTupleSize_t fPageNo = 0;
528 std::uint64_t fPageId = 0;
529 std::uint64_t fDataSize = 0; // page payload
530 std::uint64_t fBufferSize = 0; // page payload + checksum (if available)
531 };
532
533 // Prepares read requests for a single cluster; `readRequests` is modified by this function. Requests are coalesced
534 // by OID and distribution key.
535 // TODO(jalopezg): this may be a private member function; that, however, requires additional changes given that
536 // `RDaosContainer::MultiObjectRWOperation_t` cannot be forward-declared
539 auto clusterId = clusterKey.fClusterId;
540 std::vector<RDaosSealedPageLocator> onDiskPages;
541
542 unsigned clusterBufSz = 0, nPages = 0;
543 auto pageZeroMap = std::make_unique<ROOT::Internal::ROnDiskPageMap>();
544 PrepareLoadCluster(
548 const auto &pageLocator = pageInfo.GetLocator();
549 const auto pageId = pageLocator.GetPosition<RNTupleLocatorObject64>().GetLocation();
550 const auto pageBufferSize = pageLocator.GetNBytesOnStorage() + pageInfo.HasChecksum() * kNBytesPageChecksum;
552 pageLocator.GetNBytesOnStorage(), pageBufferSize});
553
554 ++nPages;
556 });
557
558 auto clusterBuffer = new unsigned char[clusterBufSz];
559 auto pageMap =
560 std::make_unique<ROOT::Internal::ROnDiskPageMapHeap>(std::unique_ptr<unsigned char[]>(clusterBuffer));
561
562 // Fill the cluster page map and the read requests for the RDaosContainer::ReadV() call
563 for (const auto &sealedLoc : onDiskPages) {
565 pageMap->Register(key, ROOT::Internal::ROnDiskPage(clusterBuffer, sealedLoc.fBufferSize));
566
567 // Prepare new read request batched up by object ID and distribution key
568 d_iov_t iov;
569 d_iov_set(&iov, clusterBuffer, sealedLoc.fBufferSize);
570
571 RDaosKey daosKey = GetPageDaosKey(fNTupleIndex, sealedLoc.fPageId);
574 itReq->second.Insert(daosKey.fAkey, iov);
575
576 clusterBuffer += sealedLoc.fBufferSize;
577 }
578 fCounters->fNPageRead.Add(nPages);
579 fCounters->fSzReadPayload.Add(clusterBufSz);
580
581 auto cluster = std::make_unique<RCluster>(clusterId);
582 cluster->Adopt(std::move(pageMap));
583 cluster->Adopt(std::move(pageZeroMap));
584 for (auto colId : clusterKey.fPhysicalColumnSet)
585 cluster->SetColumnAvailable(colId);
586 return cluster;
587 };
588
589 fCounters->fNClusterLoaded.Add(clusterKeys.size());
590
591 std::vector<std::unique_ptr<ROOT::Internal::RCluster>> clusters;
593 for (auto key : clusterKeys) {
594 clusters.emplace_back(fnPrepareSingleCluster(key, readRequests));
595 }
596
597 {
598 Detail::RNTupleAtomicTimer timer(fCounters->fTimeWallRead, fCounters->fTimeCpuRead);
599 if (int err = fDaosContainer->ReadV(readRequests))
600 throw ROOT::RException(R__FAIL("ReadV: error" + std::string(d_errstr(err))));
601 }
602 fCounters->fNReadV.Inc();
603 fCounters->fNRead.Add(readRequests.size());
604
605 return clusters;
606}
607
609{
610 R__LOG_WARNING(ROOT::Internal::NTupleLog()) << "DAOS-backed sources have no associated StreamerInfo to load.";
611}
612
613std::unique_ptr<ROOT::Internal::RPageSource>
#define R__FORWARD_ERROR(res)
Short-hand to return an RResult<T> in an error state (i.e. after checking)
Definition RError.hxx:326
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
Definition RError.hxx:322
#define R__LOG_WARNING(...)
Definition RLogger.hxx:357
#define h(i)
Definition RSha256.hxx:106
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 mask
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 result
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
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 Atom_t Int_t ULong_t ULong_t bytes
UInt_t Hash(const TString &s)
Definition TString.h:505
#define _(A, B)
Definition cfortran.h:108
A RDaosContainer provides read/write access to objects in a given container.
Definition RDaos.hxx:156
RDaosObject::DistributionKey_t DistributionKey_t
Definition RDaos.hxx:159
std::unordered_map< ROidDkeyPair, RWOperation, ROidDkeyPair::Hash > MultiObjectRWOperation_t
Definition RDaos.hxx:230
RDaosObject::AttributeKey_t AttributeKey_t
Definition RDaos.hxx:160
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 ...
RNTupleLocator CommitPageImpl(ColumnHandle_t columnHandle, const ROOT::Internal::RPage &page) final
std::vector< RNTupleLocator > CommitSealedPageVImpl(std::span< RPageStorage::RSealedPageGroup > ranges, const std::vector< bool > &mask) final
Vector commit of preprocessed pages.
void WriteNTupleFooter(const void *data, size_t nbytes, size_t lenFooter)
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...
void WriteNTupleHeader(const void *data, size_t nbytes, size_t lenHeader)
void InitImpl(unsigned char *serializedHeader, std::uint32_t length) final
RPageSinkDaos(std::string_view ntupleName, std::string_view uri, const ROOT::RNTupleWriteOptions &options)
RNTupleLocator CommitSealedPageImpl(ROOT::DescriptorId_t physicalColumnId, const RPageStorage::RSealedPage &sealedPage) final
Storage provider that reads ntuple pages from a DAOS container.
ROOT::RNTupleDescriptor AttachImpl() final
LoadStructureImpl() has been called before AttachImpl() is called
void LoadStreamerInfo() final
Forces the loading of ROOT StreamerInfo from the underlying file.
std::string GetObjectClass() const
Return the object class used for user data OIDs in this ntuple.
std::unique_ptr< RPageSource > CloneImpl() const final
The cloned page source creates a new connection to the pool/container.
void LoadSealedPageImpl(const RNTupleLocator &locator, RSealedPage &sealedPage) final
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...
void LoadPageListImpl(const RNTupleLocator &locator, unsigned char *buffer) final
void LoadStructureImpl() final
Fills fStructureBuffer with the compressed header and footer.
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,...
std::unique_ptr< RDaosContainer > fDaosContainer
A container that stores object data (header/footer, pages, etc.)
RPageSourceDaos(std::string_view ntupleName, std::string_view uri, const ROOT::RNTupleReadOptions &options)
DAOS-specific user-tunable settings for storing ntuples.
An in-memory subset of the packed and compressed pages of a cluster.
Definition RCluster.hxx:147
Helper class to compress data blocks in the ROOT compression frame format.
static std::size_t Zip(const void *from, std::size_t nbytes, int compression, void *to)
Returns the size of the compressed data, written into the provided output buffer.
Helper class to uncompress data blocks in the ROOT compression frame format.
static void Unzip(const void *from, size_t nbytes, size_t dataLen, void *to)
The nbytes parameter provides the size ls of the from buffer.
A helper class for piece-wise construction of an RNTupleDescriptor.
void SetVersion(std::uint16_t versionEpoch, std::uint16_t versionMajor, std::uint16_t versionMinor, std::uint16_t versionPatch)
void AddToOnDiskFooterSize(std::uint64_t size)
The real footer size also include the page list envelopes.
A helper class for serializing and deserialization of the RNTuple binary format.
static RResult< std::uint32_t > DeserializeString(const void *buffer, std::uint64_t bufSize, std::string &val)
static std::uint32_t SerializeUInt32(std::uint32_t val, void *buffer)
static std::uint32_t DeserializeUInt32(const void *buffer, std::uint32_t &val)
static std::uint32_t SerializeUInt16(std::uint16_t val, void *buffer)
static RResult< void > DeserializeFooter(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder)
static std::uint32_t SerializeString(const std::string &val, void *buffer)
static std::uint32_t DeserializeUInt16(const void *buffer, std::uint16_t &val)
static RResult< void > DeserializeHeader(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder)
static std::uint32_t DeserializeUInt64(const void *buffer, std::uint64_t &val)
static std::uint32_t SerializeUInt64(std::uint64_t val, void *buffer)
A page as being stored on disk, that is packed and compressed.
Definition RCluster.hxx:40
Base class for a sink with a physical storage backend.
void EnableDefaultMetrics(const std::string &prefix)
Enables the default set of metrics provided by RPageSink.
Abstract interface to read data from an ntuple.
void EnableDefaultMetrics(const std::string &prefix)
Enables the default set of metrics provided by RPageSource.
A page is a slice of a column that is mapped into memory.
Definition RPage.hxx:43
Base class for all ROOT issued exceptions.
Definition RError.hxx:78
The on-storage metadata of an RNTuple.
RNTupleLocator payload that is common for object stores using 64bit location information.
std::uint64_t GetLocation() const
Generic information about the physical location of data.
Common user-tunable settings for reading RNTuples.
Common user-tunable settings for storing RNTuples.
The class is used as a return type for operations that can fail; wraps a value of type T or an RError...
Definition RError.hxx:222
@ OC_SX
Definition daos.h:129
const char * d_errstr(int rc)
static void d_iov_set(d_iov_t *iov, void *buf, size_t size)
Definition daos.h:50
uint16_t daos_oclass_id_t
Definition daos.h:135
ROOT::RLogChannel & NTupleLog()
Log channel for RNTuple diagnostics.
std::unique_ptr< T[]> MakeUninitArray(std::size_t size)
Make an array of default-initialized elements.
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.
A pair of <object ID, distribution key> that can be used to issue a fetch/update request for multiple...
Definition RDaos.hxx:165
Describes a read/write operation on multiple attribute keys under the same object ID and distribution...
Definition RDaos.hxx:189
Entry point for an RNTuple in a DAOS container.
std::uint32_t fNBytesFooter
The size of the compressed ntuple footer.
std::uint64_t fVersionAnchor
Allows for evolving the struct in future versions.
std::string fObjClass
The object class for user data OIDs, e.g. SX
std::uint16_t fVersionEpoch
Version of the binary format supported by the writer.
RResult< std::uint32_t > Deserialize(const void *buffer, std::uint32_t bufSize)
std::uint32_t fLenHeader
The size of the uncompressed ntuple header.
std::uint32_t fLenFooter
The size of the uncompressed ntuple footer.
std::uint32_t fNBytesHeader
The size of the compressed ntuple header.
static constexpr std::size_t kOCNameMaxLength
This limit is currently not defined in any header and any call to daos_oclass_id2name() within DAOS u...
Definition RDaos.hxx:107
The identifiers that specifies the content of a (partial) cluster.
Definition RCluster.hxx:151
On-disk pages within a page source are identified by the column and page number.
Definition RCluster.hxx:50
A sealed page contains the bytes of a page as written to storage (packed & compressed).
Information about a single page in the context of a cluster's page range.
iovec for memory buffer
Definition daos.h:37
uint64_t hi
Definition daos.h:147
uint64_t lo
Definition daos.h:146
TMarker m
Definition textangle.C:8