Skip to content

Commit 59e4b3b

Browse files
jalopezg-gitjblomer
authored andcommitted
[ntuple] DAOS support: drop class template for RDaosObject
As suggested in the code review, we demote the `RDaosObject` class template in favor of simpler code. Therefore, we will only support `std::uint64_t` as dkey/akey. This is a separate commit so that we can recover the old templated version if need be.
1 parent f2d337d commit 59e4b3b

File tree

4 files changed

+63
-97
lines changed

4 files changed

+63
-97
lines changed

core/foundation/inc/ROOT/TypeTraits.hxx

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -193,16 +193,6 @@ struct HasBeginAndEnd {
193193
static constexpr bool const value = Check<T>(0);
194194
};
195195

196-
template <typename... Ts> struct __HasMembers {};
197-
template <typename T, typename _ = void>
198-
struct HasDataAndSize : std::false_type {};
199-
template <typename T>
200-
struct HasDataAndSize<T, typename std::conditional<false,
201-
__HasMembers<typename T::pointer,
202-
decltype(std::declval<T>().size()),
203-
decltype(std::declval<T>().data())>, void>::type
204-
> : std::true_type {};
205-
206196
} // ns TypeTraits
207197
} // ns ROOT
208198
#endif // ROOT_TTypeTraits

tree/ntuple/v7/inc/ROOT/RDaos.hxx

Lines changed: 22 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -57,28 +57,12 @@ public:
5757
\class RDaosObject
5858
\brief Provides low-level access to DAOS objects in a container.
5959
*/
60-
template <typename DKeyT, typename AKeyT>
6160
class RDaosObject {
6261
private:
6362
daos_handle_t fObjectHandle;
64-
65-
// Provide support for UINT64 dkey/akey.
66-
template <typename T, typename std::enable_if<!ROOT::TypeTraits::HasDataAndSize<T>::value, int>::type = 0>
67-
static size_t key_size(T& x) { return sizeof(x); }
68-
69-
template <typename T, typename std::enable_if<!ROOT::TypeTraits::HasDataAndSize<T>::value, int>::type = 0>
70-
static typename std::add_pointer<T>::type key_data(T& x) { return &x; }
71-
72-
// Provide support for std::string/std::vector dkey/akey.
73-
template <typename T, typename std::enable_if<ROOT::TypeTraits::HasDataAndSize<T>::value, int>::type = 0>
74-
static size_t key_size(T& x) { return x.size(); }
75-
76-
template <typename T, typename std::enable_if<ROOT::TypeTraits::HasDataAndSize<T>::value, int>::type = 0>
77-
static typename T::pointer key_data(T& x) { return const_cast<typename T::pointer>(x.data()); }
78-
7963
public:
80-
using DistributionKey_t = DKeyT;
81-
using AttributeKey_t = AKeyT;
64+
using DistributionKey_t = std::uint64_t;
65+
using AttributeKey_t = std::uint64_t;
8266

8367
/// \brief Contains required information for a single fetch/update operation.
8468
struct FetchUpdateArgs {
@@ -115,18 +99,19 @@ public:
11599
\brief A RDaosContainer provides read/write access to objects in a given container.
116100
*/
117101
class RDaosContainer {
118-
template <typename DKeyT, typename AKeyT>
119102
friend class RDaosObject;
120103
public:
104+
using DistributionKey_t = std::uint64_t;
105+
using AttributeKey_t = std::uint64_t;
106+
121107
/// \brief Describes a read/write operation on multiple objects; see the `ReadV`/`WriteV` functions.
122-
template <typename DKeyT, typename AKeyT>
123108
struct RWOperation {
124109
RWOperation() = default;
125-
RWOperation(daos_obj_id_t o, DKeyT d, AKeyT a, std::vector<d_iov_t> &v)
110+
RWOperation(daos_obj_id_t o, DistributionKey_t d, AttributeKey_t a, std::vector<d_iov_t> &v)
126111
: fOid(o), fDistributionKey(d), fAttributeKey(a), fIovs(v) {};
127112
daos_obj_id_t fOid{};
128-
DKeyT fDistributionKey{};
129-
AKeyT fAttributeKey{};
113+
DistributionKey_t fDistributionKey{};
114+
AttributeKey_t fAttributeKey{};
130115
std::vector<d_iov_t> fIovs{};
131116
};
132117

@@ -147,7 +132,7 @@ private:
147132
daos_handle_t fContainerHandle{};
148133
uuid_t fContainerUuid{};
149134
std::shared_ptr<RDaosPool> fPool;
150-
/// OID that will be used by the next call to `WriteObject(const void *, std::size_t, DKeyT, AKeyT)`.
135+
/// OID that will be used by the next call to `WriteObject(const void *, std::size_t, DistributionKey_t, AttributeKey_t)`.
151136
daos_obj_id_t fSequentialWrOid{};
152137

153138
/**
@@ -156,17 +141,16 @@ private:
156141
\param fn Either `std::mem_fn<&RDaosObject::Fetch>` (read) or `std::mem_fn<&RDaosObject::Update>` (write).
157142
\return Number of requests that did not complete; this should be 0 after a successful call.
158143
*/
159-
template <typename Fn, typename DKeyT, typename AKeyT>
160-
int VectorReadWrite(std::vector<RWOperation<DKeyT, AKeyT>> &vec, Fn fn) {
161-
using _RDaosObject = RDaosObject<DKeyT, AKeyT>;
144+
template <typename Fn>
145+
int VectorReadWrite(std::vector<RWOperation> &vec, Fn fn) {
162146
int ret;
163147
DaosEventQueue eventQueue(vec.size());
164148
{
165-
std::vector<std::tuple<std::unique_ptr<_RDaosObject>, typename _RDaosObject::FetchUpdateArgs>> requests{};
149+
std::vector<std::tuple<std::unique_ptr<RDaosObject>, RDaosObject::FetchUpdateArgs>> requests{};
166150
requests.reserve(vec.size());
167151
for (size_t i = 0; i < vec.size(); ++i) {
168-
requests.push_back(std::make_tuple(std::unique_ptr<_RDaosObject>(new _RDaosObject(*this, vec[i].fOid)),
169-
typename _RDaosObject::FetchUpdateArgs{
152+
requests.push_back(std::make_tuple(std::unique_ptr<RDaosObject>(new RDaosObject(*this, vec[i].fOid)),
153+
RDaosObject::FetchUpdateArgs{
170154
vec[i].fDistributionKey, vec[i].fAttributeKey,
171155
vec[i].fIovs, &eventQueue.fEvs[i]}));
172156
fn(std::get<0>(requests.back()).get(), std::get<1>(requests.back()));
@@ -189,14 +173,7 @@ public:
189173
\param akey The attribute key used for this operation.
190174
\return 0 if the operation succeeded; a negative DAOS error number otherwise.
191175
*/
192-
template <typename DKeyT, typename AKeyT>
193-
int ReadObject(daos_obj_id_t oid, void *buffer, std::size_t length, DKeyT dkey, AKeyT akey)
194-
{
195-
std::vector<d_iov_t> iovs(1);
196-
d_iov_set(&iovs[0], buffer, length);
197-
typename RDaosObject<DKeyT, AKeyT>::FetchUpdateArgs args(dkey, akey, iovs);
198-
return RDaosObject<DKeyT, AKeyT>(*this, oid).Fetch(args);
199-
}
176+
int ReadObject(daos_obj_id_t oid, void *buffer, std::size_t length, DistributionKey_t dkey, AttributeKey_t akey);
200177

201178
/**
202179
\brief Write the given buffer to an object in this container.
@@ -207,14 +184,7 @@ public:
207184
\param akey The attribute key used for this operation.
208185
\return 0 if the operation succeeded; a negative DAOS error number otherwise.
209186
*/
210-
template <typename DKeyT, typename AKeyT>
211-
int WriteObject(daos_obj_id_t oid, const void *buffer, std::size_t length, DKeyT dkey, AKeyT akey)
212-
{
213-
std::vector<d_iov_t> iovs(1);
214-
d_iov_set(&iovs[0], const_cast<void *>(buffer), length);
215-
typename RDaosObject<DKeyT, AKeyT>::FetchUpdateArgs args(dkey, akey, iovs);
216-
return RDaosObject<DKeyT, AKeyT>(*this, oid).Update(args);
217-
}
187+
int WriteObject(daos_obj_id_t oid, const void *buffer, std::size_t length, DistributionKey_t dkey, AttributeKey_t akey);
218188

219189
/**
220190
\brief Write the given buffer to an object in this container and return a generated OID.
@@ -224,32 +194,24 @@ public:
224194
\param akey The attribute key used for this operation.
225195
\return A `std::tuple<>` that contains the generated OID and a DAOS error number (0 if the operation succeeded).
226196
*/
227-
template <typename DKeyT, typename AKeyT>
228-
std::tuple<daos_obj_id_t, int> WriteObject(const void *buffer, std::size_t length, DKeyT dkey, AKeyT akey)
229-
{
230-
auto ret = std::make_tuple(fSequentialWrOid,
231-
WriteObject(fSequentialWrOid, buffer, length, dkey, akey));
232-
fSequentialWrOid.lo++;
233-
return ret;
234-
}
197+
std::tuple<daos_obj_id_t, int>
198+
WriteObject(const void *buffer, std::size_t length, DistributionKey_t dkey, AttributeKey_t akey);
235199

236200
/**
237201
\brief Perform a vector read operation on (possibly) multiple objects.
238202
\param vec A `std::vector<RWOperation>` that describes read operations to perform.
239203
\return Number of operations that could not complete.
240204
*/
241-
template <typename DKeyT, typename AKeyT>
242-
int ReadV(std::vector<RWOperation<DKeyT, AKeyT>> &vec)
243-
{ return VectorReadWrite(vec, std::mem_fn(&RDaosObject<DKeyT, AKeyT>::Fetch)); }
205+
int ReadV(std::vector<RWOperation> &vec)
206+
{ return VectorReadWrite(vec, std::mem_fn(&RDaosObject::Fetch)); }
244207

245208
/**
246209
\brief Perform a vector write operation on (possibly) multiple objects.
247210
\param vec A `std::vector<RWOperation>` that describes write operations to perform.
248211
\return Number of operations that could not complete.
249212
*/
250-
template <typename DKeyT, typename AKeyT>
251-
int WriteV(std::vector<RWOperation<DKeyT, AKeyT>> &vec)
252-
{ return VectorReadWrite(vec, std::mem_fn(&RDaosObject<DKeyT, AKeyT>::Update)); }
213+
int WriteV(std::vector<RWOperation> &vec)
214+
{ return VectorReadWrite(vec, std::mem_fn(&RDaosObject::Update)); }
253215
};
254216

255217
} // namespace Detail

tree/ntuple/v7/src/RDaos.cxx

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,21 @@ ROOT::Experimental::Detail::RDaosPool::~RDaosPool() {
4040
////////////////////////////////////////////////////////////////////////////////
4141

4242

43-
template <typename DKeyT, typename AKeyT>
44-
ROOT::Experimental::Detail::RDaosObject<DKeyT, AKeyT>::FetchUpdateArgs::FetchUpdateArgs(FetchUpdateArgs&& fua)
43+
ROOT::Experimental::Detail::RDaosObject::FetchUpdateArgs::FetchUpdateArgs(FetchUpdateArgs&& fua)
4544
: fDkey(fua.fDkey), fAkey(fua.fAkey),
4645
fIods{fua.fIods[0]}, fSgls{fua.fSgls[0]}, fIovs(std::move(fua.fIovs)), fEv(fua.fEv)
4746
{
48-
d_iov_set(&fDistributionKey, key_data(fDkey), key_size(fDkey));
49-
d_iov_set(&fIods[0].iod_name, key_data(fAkey), key_size(fAkey));
47+
d_iov_set(&fDistributionKey, &fDkey, sizeof(fDkey));
48+
d_iov_set(&fIods[0].iod_name, &fAkey, sizeof(fAkey));
5049
}
5150

52-
template <typename DKeyT, typename AKeyT>
53-
ROOT::Experimental::Detail::RDaosObject<DKeyT, AKeyT>::FetchUpdateArgs::FetchUpdateArgs
51+
ROOT::Experimental::Detail::RDaosObject::FetchUpdateArgs::FetchUpdateArgs
5452
(DistributionKey_t &d, AttributeKey_t &a, std::vector<d_iov_t> &v, daos_event_t *p)
5553
: fDkey(d), fAkey(a), fIovs(v), fEv(p)
5654
{
57-
d_iov_set(&fDistributionKey, key_data(fDkey), key_size(fDkey));
55+
d_iov_set(&fDistributionKey, &fDkey, sizeof(fDkey));
5856

59-
d_iov_set(&fIods[0].iod_name, key_data(fAkey), key_size(fAkey));
57+
d_iov_set(&fIods[0].iod_name, &fAkey, sizeof(fAkey));
6058
fIods[0].iod_nr = 1;
6159
fIods[0].iod_size = std::accumulate(v.begin(), v.end(), 0,
6260
[](daos_size_t _a, d_iov_t _b) { return _a + _b.iov_len; });
@@ -68,36 +66,27 @@ ROOT::Experimental::Detail::RDaosObject<DKeyT, AKeyT>::FetchUpdateArgs::FetchUpd
6866
fSgls[0].sg_iovs = fIovs.data();
6967
}
7068

71-
template <typename DKeyT, typename AKeyT>
72-
ROOT::Experimental::Detail::RDaosObject<DKeyT, AKeyT>::RDaosObject(RDaosContainer &container, daos_obj_id_t oid,
73-
daos_oclass_id_t cid)
69+
ROOT::Experimental::Detail::RDaosObject::RDaosObject(RDaosContainer &container, daos_obj_id_t oid,
70+
daos_oclass_id_t cid)
7471
{
75-
daos_ofeat_t ofeats{};
76-
if (std::is_same<std::uint64_t, DKeyT>::value)
77-
ofeats |= DAOS_OF_DKEY_UINT64;
78-
if (std::is_same<std::uint64_t, AKeyT>::value)
79-
ofeats |= DAOS_OF_AKEY_UINT64;
80-
daos_obj_generate_id(&oid, ofeats /*| DAOS_OF_ARRAY_BYTE*/, cid, 0);
72+
daos_obj_generate_id(&oid, DAOS_OF_DKEY_UINT64 | DAOS_OF_AKEY_UINT64 /*| DAOS_OF_ARRAY_BYTE*/, cid, 0);
8173
if (int err = daos_obj_open(container.fContainerHandle, oid, DAOS_OO_RW, &fObjectHandle, nullptr))
8274
throw RException(R__FAIL("daos_obj_open: error: " + std::string(d_errstr(err))));
8375
}
8476

85-
template <typename DKeyT, typename AKeyT>
86-
ROOT::Experimental::Detail::RDaosObject<DKeyT, AKeyT>::~RDaosObject()
77+
ROOT::Experimental::Detail::RDaosObject::~RDaosObject()
8778
{
8879
daos_obj_close(fObjectHandle, nullptr);
8980
}
9081

91-
template <typename DKeyT, typename AKeyT>
92-
int ROOT::Experimental::Detail::RDaosObject<DKeyT, AKeyT>::Fetch(FetchUpdateArgs &args)
82+
int ROOT::Experimental::Detail::RDaosObject::Fetch(FetchUpdateArgs &args)
9383
{
9484
args.fIods[0].iod_size = (daos_size_t)DAOS_REC_ANY;
9585
return daos_obj_fetch(fObjectHandle, DAOS_TX_NONE, 0, &args.fDistributionKey, 1,
9686
args.fIods, args.fSgls, nullptr, args.fEv);
9787
}
9888

99-
template <typename DKeyT, typename AKeyT>
100-
int ROOT::Experimental::Detail::RDaosObject<DKeyT, AKeyT>::Update(FetchUpdateArgs &args)
89+
int ROOT::Experimental::Detail::RDaosObject::Update(FetchUpdateArgs &args)
10190
{
10291
return daos_obj_update(fObjectHandle, DAOS_TX_NONE, DAOS_COND_DKEY_INSERT, &args.fDistributionKey, 1,
10392
args.fIods, args.fSgls, args.fEv);
@@ -157,6 +146,34 @@ ROOT::Experimental::Detail::RDaosContainer::~RDaosContainer() {
157146
daos_cont_close(fContainerHandle, nullptr);
158147
}
159148

149+
int ROOT::Experimental::Detail::RDaosContainer::ReadObject(daos_obj_id_t oid, void *buffer, std::size_t length,
150+
DistributionKey_t dkey, AttributeKey_t akey)
151+
{
152+
std::vector<d_iov_t> iovs(1);
153+
d_iov_set(&iovs[0], buffer, length);
154+
RDaosObject::FetchUpdateArgs args(dkey, akey, iovs);
155+
return RDaosObject(*this, oid).Fetch(args);
156+
}
157+
158+
int ROOT::Experimental::Detail::RDaosContainer::WriteObject(daos_obj_id_t oid, const void *buffer, std::size_t length,
159+
DistributionKey_t dkey, AttributeKey_t akey)
160+
{
161+
std::vector<d_iov_t> iovs(1);
162+
d_iov_set(&iovs[0], const_cast<void *>(buffer), length);
163+
RDaosObject::FetchUpdateArgs args(dkey, akey, iovs);
164+
return RDaosObject(*this, oid).Update(args);
165+
}
166+
167+
std::tuple<daos_obj_id_t, int>
168+
ROOT::Experimental::Detail::RDaosContainer::WriteObject(const void *buffer, std::size_t length,
169+
DistributionKey_t dkey, AttributeKey_t akey)
170+
{
171+
auto ret = std::make_tuple(fSequentialWrOid,
172+
WriteObject(fSequentialWrOid, buffer, length, dkey, akey));
173+
fSequentialWrOid.lo++;
174+
return ret;
175+
}
176+
160177

161178
////////////////////////////////////////////////////////////////////////////////
162179

@@ -167,6 +184,3 @@ static struct RDaosRAII {
167184
~RDaosRAII() { daos_fini(); }
168185
} RAII{};
169186
} // anonymous namespace
170-
171-
// Explicit instantiations of `RDaosObject` for specific dkey/akey types
172-
template class ROOT::Experimental::Detail::RDaosObject<uint64_t, uint64_t>;

tree/ntuple/v7/src/RPageStorageDaos.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ ROOT::Experimental::Detail::RPageSourceDaos::LoadCluster(DescriptorId_t clusterI
472472
}
473473

474474
// Prepare the input vector for the RDaosContainer::ReadV() call
475-
std::vector<RDaosContainer::RWOperation<std::uint64_t, std::uint64_t>> readRequests;
475+
std::vector<RDaosContainer::RWOperation> readRequests;
476476
auto buffer = new unsigned char[szPayload];
477477
for (auto &s : onDiskPages) {
478478
std::vector<d_iov_t> iovs(1);

0 commit comments

Comments
 (0)