Skip to content

Commit d340dd8

Browse files
committed
[ntuple] Week 1: Register kTypeS3 = 0x03 locator type
1 parent 9fdfd5c commit d340dd8

3 files changed

Lines changed: 35 additions & 1 deletion

File tree

tree/ntuple/inc/ROOT/RNTupleTypes.hxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ public:
236236
// if the size of the referenced data block is >2GB
237237
kTypeFile = 0x00,
238238
kTypeDAOS = 0x02,
239+
kTypeS3 = 0x03,
239240

240241
kLastSerializableType = 0x7f,
241242
kTypePageZero = kLastSerializableType + 1,

tree/ntuple/src/RNTupleSerialize.cxx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ ROOT::RResult<void> DeserializeLocatorPayloadObject64(const unsigned char *buffe
505505
locator.SetNBytesOnStorage(nBytesOnStorage);
506506
RNTupleSerializer::DeserializeUInt64(buffer + sizeof(std::uint64_t), location);
507507
} else {
508-
return R__FAIL("invalid DAOS locator payload size: " + std::to_string(sizeofLocatorPayload));
508+
return R__FAIL("invalid Object64 locator payload size: " + std::to_string(sizeofLocatorPayload));
509509
}
510510
locator.SetPosition(ROOT::RNTupleLocatorObject64{location});
511511
return ROOT::RResult<void>::Success();
@@ -1090,6 +1090,10 @@ ROOT::Internal::RNTupleSerializer::SerializeLocator(const RNTupleLocator &locato
10901090
size += SerializeLocatorPayloadObject64(locator, payloadp);
10911091
locatorType = 0x02;
10921092
break;
1093+
case RNTupleLocator::kTypeS3:
1094+
size += SerializeLocatorPayloadObject64(locator, payloadp);
1095+
locatorType = 0x03;
1096+
break;
10931097
default:
10941098
if (locator.GetType() == ROOT::Internal::kTestLocatorType) {
10951099
// For the testing locator, use the same payload format as Object64. We won't read it back anyway.
@@ -1138,6 +1142,10 @@ ROOT::RResult<std::uint32_t> ROOT::Internal::RNTupleSerializer::DeserializeLocat
11381142
locator.SetType(RNTupleLocator::kTypeDAOS);
11391143
DeserializeLocatorPayloadObject64(bytes, payloadSize, locator);
11401144
break;
1145+
case 0x03:
1146+
locator.SetType(RNTupleLocator::kTypeS3);
1147+
DeserializeLocatorPayloadObject64(bytes, payloadSize, locator);
1148+
break;
11411149
default: locator.SetType(RNTupleLocator::kTypeUnknown);
11421150
}
11431151
bytes += payloadSize;

tree/ntuple/test/ntuple_serialize.cxx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,31 @@ TEST(RNTuple, SerializeLocator)
399399
EXPECT_EQ(locator.GetReserved(), 1);
400400
EXPECT_EQ(1337U, locator.GetPosition<RNTupleLocatorObject64>().GetLocation());
401401

402+
// S3 locator round-trip with 32-bit nBytesOnStorage
403+
locator = RNTupleLocator{};
404+
locator.SetType(RNTupleLocator::kTypeS3);
405+
locator.SetPosition(RNTupleLocatorObject64{42U});
406+
locator.SetNBytesOnStorage(1024U);
407+
locator.SetReserved(0);
408+
EXPECT_EQ(16u, RNTupleSerializer::SerializeLocator(locator, buffer).Unwrap());
409+
locator = RNTupleLocator{};
410+
EXPECT_EQ(16u, RNTupleSerializer::DeserializeLocator(buffer, 16, locator).Unwrap());
411+
EXPECT_EQ(locator.GetType(), RNTupleLocator::kTypeS3);
412+
EXPECT_EQ(locator.GetNBytesOnStorage(), 1024U);
413+
EXPECT_EQ(locator.GetReserved(), 0);
414+
EXPECT_EQ(42U, locator.GetPosition<RNTupleLocatorObject64>().GetLocation());
415+
416+
// S3 locator round-trip with 64-bit nBytesOnStorage and reserved bit
417+
locator.SetNBytesOnStorage(static_cast<std::uint64_t>(std::numeric_limits<std::uint32_t>::max()) + 1);
418+
locator.SetReserved(1);
419+
EXPECT_EQ(20u, RNTupleSerializer::SerializeLocator(locator, buffer).Unwrap());
420+
locator = RNTupleLocator{};
421+
EXPECT_EQ(20u, RNTupleSerializer::DeserializeLocator(buffer, 20, locator).Unwrap());
422+
EXPECT_EQ(locator.GetType(), RNTupleLocator::kTypeS3);
423+
EXPECT_EQ(locator.GetNBytesOnStorage(), static_cast<std::uint64_t>(std::numeric_limits<std::uint32_t>::max()) + 1);
424+
EXPECT_EQ(locator.GetReserved(), 1);
425+
EXPECT_EQ(42U, locator.GetPosition<RNTupleLocatorObject64>().GetLocation());
426+
402427
std::int32_t *head = reinterpret_cast<std::int32_t *>(buffer);
403428
#ifndef R__BYTESWAP
404429
// on big endian system

0 commit comments

Comments
 (0)