Skip to content

Commit 9365f1f

Browse files
committed
[ntuple] Register kTypeS3 = 0x03 locator type, update compact type of kTestLocatorType and kTypeS3
1 parent c719f23 commit 9365f1f

4 files changed

Lines changed: 41 additions & 5 deletions

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
@@ -506,7 +506,7 @@ ROOT::RResult<void> DeserializeLocatorPayloadObject64(const unsigned char *buffe
506506
locator.SetNBytesOnStorage(nBytesOnStorage);
507507
RNTupleSerializer::DeserializeUInt64(buffer + sizeof(std::uint64_t), location);
508508
} else {
509-
return R__FAIL("invalid DAOS locator payload size: " + std::to_string(sizeofLocatorPayload));
509+
return R__FAIL("invalid Object64 locator payload size: " + std::to_string(sizeofLocatorPayload));
510510
}
511511
locator.SetPosition(ROOT::RNTupleLocatorObject64{location});
512512
return ROOT::RResult<void>::Success();
@@ -1091,6 +1091,10 @@ ROOT::Internal::RNTupleSerializer::SerializeLocator(const RNTupleLocator &locato
10911091
size += SerializeLocatorPayloadObject64(locator, payloadp);
10921092
locatorType = 0x02;
10931093
break;
1094+
case RNTupleLocator::kTypeS3:
1095+
size += SerializeLocatorPayloadObject64(locator, payloadp);
1096+
locatorType = 0x03;
1097+
break;
10941098
default:
10951099
if (locator.GetType() == ROOT::Internal::kTestLocatorType) {
10961100
// For the testing locator, use the same payload format as Object64. We won't read it back anyway.
@@ -1139,6 +1143,10 @@ ROOT::RResult<std::uint32_t> ROOT::Internal::RNTupleSerializer::DeserializeLocat
11391143
locator.SetType(RNTupleLocator::kTypeDAOS);
11401144
DeserializeLocatorPayloadObject64(bytes, payloadSize, locator);
11411145
break;
1146+
case 0x03:
1147+
locator.SetType(RNTupleLocator::kTypeS3);
1148+
DeserializeLocatorPayloadObject64(bytes, payloadSize, locator);
1149+
break;
11421150
default: locator.SetType(RNTupleLocator::kTypeUnknown);
11431151
}
11441152
bytes += payloadSize;

tree/ntuple/src/RNTupleTypes.cxx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ ROOT::RNTupleLocator::ELocatorType ROOT::RNTupleLocator::GetType() const
4545
case 1: return kTypeDAOS;
4646
case 2: return kTypePageZero;
4747
case 3: return kTypeUnknown;
48-
case 4: return Internal::kTestLocatorType;
48+
case 4: return kTypeS3;
49+
case 5: return Internal::kTestLocatorType;
4950
default: break;
5051
}
5152
R__ASSERT(false);
@@ -60,9 +61,10 @@ void ROOT::RNTupleLocator::SetType(ELocatorType type)
6061
case kTypeDAOS: compactType = 1; break;
6162
case kTypePageZero: compactType = 2; break;
6263
case kTypeUnknown: compactType = 3; break;
64+
case kTypeS3: compactType = 4; break;
6365
default:
6466
if (type == Internal::kTestLocatorType)
65-
compactType = 4;
67+
compactType = 5;
6668
else
6769
throw RException(R__FAIL("invalid locator type: " + std::to_string(type)));
6870
}
@@ -79,7 +81,7 @@ void ROOT::RNTupleLocator::SetPosition(std::uint64_t position)
7981

8082
void ROOT::RNTupleLocator::SetPosition(RNTupleLocatorObject64 position)
8183
{
82-
if (GetType() != kTypeDAOS)
84+
if (GetType() != kTypeDAOS && GetType() != kTypeS3)
8385
throw RException(R__FAIL("cannot set position as 64bit object for type " + std::to_string(GetType())));
8486
fPosition = position.GetLocation();
8587
}
@@ -94,7 +96,7 @@ std::uint64_t ROOT::Internal::RNTupleLocatorHelper<std::uint64_t>::Get(const RNT
9496
ROOT::RNTupleLocatorObject64
9597
ROOT::Internal::RNTupleLocatorHelper<ROOT::RNTupleLocatorObject64>::Get(const RNTupleLocator &loc)
9698
{
97-
if (loc.GetType() != ROOT::RNTupleLocator::kTypeDAOS)
99+
if (loc.GetType() != ROOT::RNTupleLocator::kTypeDAOS && loc.GetType() != ROOT::RNTupleLocator::kTypeS3)
98100
throw RException(R__FAIL("cannot retrieve position as 64bit object for type " + std::to_string(loc.GetType())));
99101
return RNTupleLocatorObject64{loc.fPosition};
100102
}

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)