1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2014 Sebastien Ponce <sebastien.ponce@cern.ch>
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
17 #include "libradosstriper/RadosStriperImpl.h"
18 #include "libradosstriper/MultiAioCompletionImpl.h"
20 #include "include/types.h"
22 #include "include/radosstriper/libradosstriper.h"
23 #include "include/radosstriper/libradosstriper.hpp"
24 #include "librados/RadosXattrIter.h"
27 * This file implements the rados striper API.
28 * There are 2 flavours of it :
29 * - the C API, found in include/rados/libradosstriper.h
30 * - the C++ API, found in include/rados/libradosstriper.hpp
33 ///////////////////////////// C++ API //////////////////////////////
35 libradosstriper::MultiAioCompletion::~MultiAioCompletion()
41 int libradosstriper::MultiAioCompletion::set_complete_callback
42 (void *cb_arg
, rados_callback_t cb
)
44 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
45 return c
->set_complete_callback(cb_arg
, cb
);
48 int libradosstriper::MultiAioCompletion::set_safe_callback
49 (void *cb_arg
, rados_callback_t cb
)
51 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
52 return c
->set_safe_callback(cb_arg
, cb
);
55 void libradosstriper::MultiAioCompletion::wait_for_complete()
57 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
58 c
->wait_for_complete();
61 void libradosstriper::MultiAioCompletion::wait_for_safe()
63 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
67 bool libradosstriper::MultiAioCompletion::is_complete()
69 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
70 return c
->is_complete();
73 bool libradosstriper::MultiAioCompletion::is_safe()
75 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
79 void libradosstriper::MultiAioCompletion::wait_for_complete_and_cb()
81 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
82 c
->wait_for_complete_and_cb();
85 void libradosstriper::MultiAioCompletion::MultiAioCompletion::wait_for_safe_and_cb()
87 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
88 c
->wait_for_safe_and_cb();
91 bool libradosstriper::MultiAioCompletion::is_complete_and_cb()
93 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
94 return c
->is_complete_and_cb();
97 bool libradosstriper::MultiAioCompletion::is_safe_and_cb()
99 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
100 return c
->is_safe_and_cb();
103 int libradosstriper::MultiAioCompletion::get_return_value()
105 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
106 return c
->get_return_value();
109 void libradosstriper::MultiAioCompletion::release()
111 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
116 libradosstriper::RadosStriper::RadosStriper() :
117 rados_striper_impl(0)
121 void libradosstriper::RadosStriper::to_rados_striper_t(RadosStriper
&striper
, rados_striper_t
*s
)
123 *s
= (rados_striper_t
)striper
.rados_striper_impl
;
124 striper
.rados_striper_impl
->get();
127 libradosstriper::RadosStriper::RadosStriper(const RadosStriper
& rs
)
129 rados_striper_impl
= rs
.rados_striper_impl
;
130 if (rados_striper_impl
) {
131 rados_striper_impl
->get();
135 libradosstriper::RadosStriper
& libradosstriper::RadosStriper::operator=(const RadosStriper
& rs
)
137 if (rados_striper_impl
)
138 rados_striper_impl
->put();
139 rados_striper_impl
= rs
.rados_striper_impl
;
140 rados_striper_impl
->get();
144 libradosstriper::RadosStriper::~RadosStriper()
146 if (rados_striper_impl
)
147 rados_striper_impl
->put();
148 rados_striper_impl
= 0;
151 int libradosstriper::RadosStriper::striper_create(librados::IoCtx
& ioctx
,
152 RadosStriper
*striper
)
155 striper
->rados_striper_impl
= new libradosstriper::RadosStriperImpl(ioctx
, ioctx
.io_ctx_impl
);
156 striper
->rados_striper_impl
->get();
163 int libradosstriper::RadosStriper::set_object_layout_stripe_unit
164 (unsigned int stripe_unit
)
166 return rados_striper_impl
->setObjectLayoutStripeUnit(stripe_unit
);
169 int libradosstriper::RadosStriper::set_object_layout_stripe_count
170 (unsigned int stripe_count
)
172 return rados_striper_impl
->setObjectLayoutStripeCount(stripe_count
);
175 int libradosstriper::RadosStriper::set_object_layout_object_size
176 (unsigned int object_size
)
178 return rados_striper_impl
->setObjectLayoutObjectSize(object_size
);
181 int libradosstriper::RadosStriper::getxattr(const std::string
& oid
, const char *name
, bufferlist
& bl
)
183 return rados_striper_impl
->getxattr(oid
, name
, bl
);
186 int libradosstriper::RadosStriper::setxattr(const std::string
& oid
, const char *name
, bufferlist
& bl
)
188 return rados_striper_impl
->setxattr(oid
, name
, bl
);
191 int libradosstriper::RadosStriper::rmxattr(const std::string
& oid
, const char *name
)
193 return rados_striper_impl
->rmxattr(oid
, name
);
196 int libradosstriper::RadosStriper::getxattrs(const std::string
& oid
,
197 std::map
<std::string
, bufferlist
>& attrset
)
199 return rados_striper_impl
->getxattrs(oid
, attrset
);
202 int libradosstriper::RadosStriper::write(const std::string
& soid
,
203 const bufferlist
& bl
,
207 return rados_striper_impl
->write(soid
, bl
, len
, off
);
210 int libradosstriper::RadosStriper::write_full(const std::string
& soid
,
211 const bufferlist
& bl
)
213 return rados_striper_impl
->write_full(soid
, bl
);
216 int libradosstriper::RadosStriper::append(const std::string
& soid
,
217 const bufferlist
& bl
,
220 return rados_striper_impl
->append(soid
, bl
, len
);
223 int libradosstriper::RadosStriper::aio_write(const std::string
& soid
,
224 librados::AioCompletion
*c
,
225 const bufferlist
& bl
,
229 return rados_striper_impl
->aio_write(soid
, c
->pc
, bl
, len
, off
);
232 int libradosstriper::RadosStriper::aio_write_full(const std::string
& soid
,
233 librados::AioCompletion
*c
,
234 const bufferlist
& bl
)
236 return rados_striper_impl
->aio_write_full(soid
, c
->pc
, bl
);
239 int libradosstriper::RadosStriper::aio_append(const std::string
& soid
,
240 librados::AioCompletion
*c
,
241 const bufferlist
& bl
,
244 return rados_striper_impl
->aio_append(soid
, c
->pc
, bl
, len
);
247 int libradosstriper::RadosStriper::read(const std::string
& soid
,
253 bl
->push_back(buffer::create(len
));
254 return rados_striper_impl
->read(soid
, bl
, len
, off
);
257 int libradosstriper::RadosStriper::aio_read(const std::string
& soid
,
258 librados::AioCompletion
*c
,
264 bl
->push_back(buffer::create(len
));
265 return rados_striper_impl
->aio_read(soid
, c
->pc
, bl
, len
, off
);
268 int libradosstriper::RadosStriper::stat(const std::string
& soid
, uint64_t *psize
, time_t *pmtime
)
270 return rados_striper_impl
->stat(soid
, psize
, pmtime
);
273 int libradosstriper::RadosStriper::aio_stat(const std::string
& soid
,
274 librados::AioCompletion
*c
,
278 return rados_striper_impl
->aio_stat(soid
, c
->pc
, psize
, pmtime
);
281 int libradosstriper::RadosStriper::stat2(const std::string
& soid
, uint64_t *psize
, struct timespec
*pts
)
283 return rados_striper_impl
->stat2(soid
, psize
, pts
);
286 int libradosstriper::RadosStriper::aio_stat2(const std::string
& soid
,
287 librados::AioCompletion
*c
,
289 struct timespec
*pts
)
291 return rados_striper_impl
->aio_stat2(soid
, c
->pc
, psize
, pts
);
294 int libradosstriper::RadosStriper::remove(const std::string
& soid
)
296 return rados_striper_impl
->remove(soid
);
299 int libradosstriper::RadosStriper::aio_remove(const std::string
& soid
,
300 librados::AioCompletion
*c
)
302 return rados_striper_impl
->aio_remove(soid
, c
->pc
);
305 int libradosstriper::RadosStriper::remove(const std::string
& soid
, int flags
)
307 return rados_striper_impl
->remove(soid
, flags
);
310 int libradosstriper::RadosStriper::aio_remove(const std::string
& soid
,
311 librados::AioCompletion
*c
,
314 return rados_striper_impl
->aio_remove(soid
, c
->pc
, flags
);
317 int libradosstriper::RadosStriper::trunc(const std::string
& soid
, uint64_t size
)
319 return rados_striper_impl
->trunc(soid
, size
);
322 int libradosstriper::RadosStriper::aio_flush()
324 return rados_striper_impl
->aio_flush();
327 libradosstriper::MultiAioCompletion
* libradosstriper::RadosStriper::multi_aio_create_completion()
329 MultiAioCompletionImpl
*c
= new MultiAioCompletionImpl
;
330 return new MultiAioCompletion(c
);
333 libradosstriper::MultiAioCompletion
*
334 libradosstriper::RadosStriper::multi_aio_create_completion(void *cb_arg
,
335 librados::callback_t cb_complete
,
336 librados::callback_t cb_safe
)
338 MultiAioCompletionImpl
*c
;
339 int r
= rados_striper_multi_aio_create_completion(cb_arg
, cb_complete
, cb_safe
, (void**)&c
);
341 return new MultiAioCompletion(c
);
344 ///////////////////////////// C API //////////////////////////////
346 extern "C" int rados_striper_create(rados_ioctx_t ioctx
,
347 rados_striper_t
*striper
)
350 librados::IoCtx::from_rados_ioctx_t(ioctx
, ctx
);
351 libradosstriper::RadosStriper striperp
;
352 int rc
= libradosstriper::RadosStriper::striper_create(ctx
, &striperp
);
354 libradosstriper::RadosStriper::to_rados_striper_t(striperp
, striper
);
358 extern "C" void rados_striper_destroy(rados_striper_t striper
)
360 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
364 extern "C" int rados_striper_set_object_layout_stripe_unit(rados_striper_t striper
,
365 unsigned int stripe_unit
)
367 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
368 return impl
->setObjectLayoutStripeUnit(stripe_unit
);
371 extern "C" int rados_striper_set_object_layout_stripe_count(rados_striper_t striper
,
372 unsigned int stripe_count
)
374 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
375 return impl
->setObjectLayoutStripeCount(stripe_count
);
378 extern "C" int rados_striper_set_object_layout_object_size(rados_striper_t striper
,
379 unsigned int object_size
)
381 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
382 return impl
->setObjectLayoutObjectSize(object_size
);
385 extern "C" int rados_striper_write(rados_striper_t striper
,
391 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
394 return impl
->write(soid
, bl
, len
, off
);
397 extern "C" int rados_striper_write_full(rados_striper_t striper
,
402 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
405 return impl
->write_full(soid
, bl
);
409 extern "C" int rados_striper_append(rados_striper_t striper
,
414 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
417 return impl
->append(soid
, bl
, len
);
420 extern "C" int rados_striper_read(rados_striper_t striper
,
426 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
428 bufferptr bp
= buffer::create_static(len
, buf
);
430 int ret
= impl
->read(soid
, &bl
, len
, off
);
432 if (bl
.length() > len
)
434 if (!bl
.is_provided_buffer(buf
))
435 bl
.copy(0, bl
.length(), buf
);
436 ret
= bl
.length(); // hrm :/
441 extern "C" int rados_striper_remove(rados_striper_t striper
, const char* soid
)
443 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
444 return impl
->remove(soid
);
447 extern "C" int rados_striper_trunc(rados_striper_t striper
, const char* soid
, uint64_t size
)
449 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
450 return impl
->trunc(soid
, size
);
453 extern "C" int rados_striper_getxattr(rados_striper_t striper
,
459 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
462 int ret
= impl
->getxattr(oid
, name
, bl
);
464 if (bl
.length() > len
)
466 bl
.copy(0, bl
.length(), buf
);
472 extern "C" int rados_striper_setxattr(rados_striper_t striper
,
478 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
482 return impl
->setxattr(obj
, name
, bl
);
485 extern "C" int rados_striper_rmxattr(rados_striper_t striper
,
489 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
491 return impl
->rmxattr(obj
, name
);
494 extern "C" int rados_striper_getxattrs(rados_striper_t striper
,
496 rados_xattrs_iter_t
*iter
)
498 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
500 librados::RadosXattrsIter
*it
= new librados::RadosXattrsIter();
503 int ret
= impl
->getxattrs(obj
, it
->attrset
);
508 it
->i
= it
->attrset
.begin();
509 librados::RadosXattrsIter
**iret
= (librados::RadosXattrsIter
**)iter
;
515 extern "C" int rados_striper_getxattrs_next(rados_xattrs_iter_t iter
,
520 return rados_getxattrs_next(iter
, name
, val
, len
);
523 extern "C" void rados_striper_getxattrs_end(rados_xattrs_iter_t iter
)
525 return rados_getxattrs_end(iter
);
528 extern "C" int rados_striper_stat(rados_striper_t striper
,
533 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
534 return impl
->stat(soid
, psize
, pmtime
);
537 extern "C" int rados_striper_multi_aio_create_completion(void *cb_arg
,
538 rados_callback_t cb_complete
,
539 rados_callback_t cb_safe
,
540 rados_striper_multi_completion_t
*pc
)
542 libradosstriper::MultiAioCompletionImpl
*c
= new libradosstriper::MultiAioCompletionImpl
;
544 c
->set_complete_callback(cb_arg
, cb_complete
);
546 c
->set_safe_callback(cb_arg
, cb_safe
);
551 extern "C" void rados_striper_multi_aio_wait_for_complete(rados_striper_multi_completion_t c
)
553 ((libradosstriper::MultiAioCompletionImpl
*)c
)->wait_for_complete();
556 extern "C" void rados_striper_multi_aio_wait_for_safe(rados_striper_multi_completion_t c
)
558 ((libradosstriper::MultiAioCompletionImpl
*)c
)->wait_for_safe();
561 extern "C" int rados_striper_multi_aio_is_complete(rados_striper_multi_completion_t c
)
563 return ((libradosstriper::MultiAioCompletionImpl
*)c
)->is_complete();
566 extern "C" int rados_striper_multi_aio_is_safe(rados_striper_multi_completion_t c
)
568 return ((libradosstriper::MultiAioCompletionImpl
*)c
)->is_safe();
571 extern "C" void rados_striper_multi_aio_wait_for_complete_and_cb(rados_striper_multi_completion_t c
)
573 ((libradosstriper::MultiAioCompletionImpl
*)c
)->wait_for_complete_and_cb();
576 extern "C" void rados_striper_multi_aio_wait_for_safe_and_cb(rados_striper_multi_completion_t c
)
578 ((libradosstriper::MultiAioCompletionImpl
*)c
)->wait_for_safe_and_cb();
581 extern "C" int rados_striper_multi_aio_is_complete_and_cb(rados_striper_multi_completion_t c
)
583 return ((libradosstriper::MultiAioCompletionImpl
*)c
)->is_complete_and_cb();
586 extern "C" int rados_striper_multi_aio_is_safe_and_cb(rados_striper_multi_completion_t c
)
588 return ((libradosstriper::MultiAioCompletionImpl
*)c
)->is_safe_and_cb();
591 extern "C" int rados_striper_multi_aio_get_return_value(rados_striper_multi_completion_t c
)
593 return ((libradosstriper::MultiAioCompletionImpl
*)c
)->get_return_value();
596 extern "C" void rados_striper_multi_aio_release(rados_striper_multi_completion_t c
)
598 ((libradosstriper::MultiAioCompletionImpl
*)c
)->put();
601 extern "C" int rados_striper_aio_write(rados_striper_t striper
,
603 rados_completion_t completion
,
608 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
611 return impl
->aio_write(soid
, (librados::AioCompletionImpl
*)completion
, bl
, len
, off
);
614 extern "C" int rados_striper_aio_append(rados_striper_t striper
,
616 rados_completion_t completion
,
620 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
623 return impl
->aio_append(soid
, (librados::AioCompletionImpl
*)completion
, bl
, len
);
626 extern "C" int rados_striper_aio_write_full(rados_striper_t striper
,
628 rados_completion_t completion
,
632 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
635 return impl
->aio_write_full(soid
, (librados::AioCompletionImpl
*)completion
, bl
);
638 extern "C" int rados_striper_aio_read(rados_striper_t striper
,
640 rados_completion_t completion
,
645 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
646 return impl
->aio_read(soid
, (librados::AioCompletionImpl
*)completion
, buf
, len
, off
);
649 extern "C" int rados_striper_aio_remove(rados_striper_t striper
,
651 rados_completion_t completion
)
653 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
654 return impl
->aio_remove(soid
, (librados::AioCompletionImpl
*)completion
);
657 extern "C" void rados_striper_aio_flush(rados_striper_t striper
)
659 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
663 extern "C" int rados_striper_aio_stat(rados_striper_t striper
,
665 rados_completion_t completion
,
669 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
670 return impl
->aio_stat(soid
, (librados::AioCompletionImpl
*)completion
, psize
, pmtime
);