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()
40 int libradosstriper::MultiAioCompletion::set_complete_callback
41 (void *cb_arg
, rados_callback_t cb
)
43 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
44 return c
->set_complete_callback(cb_arg
, cb
);
47 int libradosstriper::MultiAioCompletion::set_safe_callback
48 (void *cb_arg
, rados_callback_t cb
)
50 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
51 return c
->set_safe_callback(cb_arg
, cb
);
54 void libradosstriper::MultiAioCompletion::wait_for_complete()
56 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
57 c
->wait_for_complete();
60 void libradosstriper::MultiAioCompletion::wait_for_safe()
62 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
66 bool libradosstriper::MultiAioCompletion::is_complete()
68 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
69 return c
->is_complete();
72 bool libradosstriper::MultiAioCompletion::is_safe()
74 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
78 void libradosstriper::MultiAioCompletion::wait_for_complete_and_cb()
80 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
81 c
->wait_for_complete_and_cb();
84 void libradosstriper::MultiAioCompletion::MultiAioCompletion::wait_for_safe_and_cb()
86 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
87 c
->wait_for_safe_and_cb();
90 bool libradosstriper::MultiAioCompletion::is_complete_and_cb()
92 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
93 return c
->is_complete_and_cb();
96 bool libradosstriper::MultiAioCompletion::is_safe_and_cb()
98 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
99 return c
->is_safe_and_cb();
102 int libradosstriper::MultiAioCompletion::get_return_value()
104 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
105 return c
->get_return_value();
108 void libradosstriper::MultiAioCompletion::release()
110 MultiAioCompletionImpl
*c
= (MultiAioCompletionImpl
*)pc
;
115 libradosstriper::RadosStriper::RadosStriper() :
116 rados_striper_impl(0)
120 void libradosstriper::RadosStriper::to_rados_striper_t(RadosStriper
&striper
, rados_striper_t
*s
)
122 *s
= (rados_striper_t
)striper
.rados_striper_impl
;
123 striper
.rados_striper_impl
->get();
126 libradosstriper::RadosStriper::RadosStriper(const RadosStriper
& rs
)
128 rados_striper_impl
= rs
.rados_striper_impl
;
129 if (rados_striper_impl
) {
130 rados_striper_impl
->get();
134 libradosstriper::RadosStriper
& libradosstriper::RadosStriper::operator=(const RadosStriper
& rs
)
136 if (rados_striper_impl
)
137 rados_striper_impl
->put();
138 rados_striper_impl
= rs
.rados_striper_impl
;
139 rados_striper_impl
->get();
143 libradosstriper::RadosStriper::~RadosStriper()
145 if (rados_striper_impl
)
146 rados_striper_impl
->put();
147 rados_striper_impl
= 0;
150 int libradosstriper::RadosStriper::striper_create(librados::IoCtx
& ioctx
,
151 RadosStriper
*striper
)
154 striper
->rados_striper_impl
= new libradosstriper::RadosStriperImpl(ioctx
, ioctx
.io_ctx_impl
);
155 striper
->rados_striper_impl
->get();
162 int libradosstriper::RadosStriper::set_object_layout_stripe_unit
163 (unsigned int stripe_unit
)
165 return rados_striper_impl
->setObjectLayoutStripeUnit(stripe_unit
);
168 int libradosstriper::RadosStriper::set_object_layout_stripe_count
169 (unsigned int stripe_count
)
171 return rados_striper_impl
->setObjectLayoutStripeCount(stripe_count
);
174 int libradosstriper::RadosStriper::set_object_layout_object_size
175 (unsigned int object_size
)
177 return rados_striper_impl
->setObjectLayoutObjectSize(object_size
);
180 int libradosstriper::RadosStriper::getxattr(const std::string
& oid
, const char *name
, bufferlist
& bl
)
182 return rados_striper_impl
->getxattr(oid
, name
, bl
);
185 int libradosstriper::RadosStriper::setxattr(const std::string
& oid
, const char *name
, bufferlist
& bl
)
187 return rados_striper_impl
->setxattr(oid
, name
, bl
);
190 int libradosstriper::RadosStriper::rmxattr(const std::string
& oid
, const char *name
)
192 return rados_striper_impl
->rmxattr(oid
, name
);
195 int libradosstriper::RadosStriper::getxattrs(const std::string
& oid
,
196 std::map
<std::string
, bufferlist
>& attrset
)
198 return rados_striper_impl
->getxattrs(oid
, attrset
);
201 int libradosstriper::RadosStriper::write(const std::string
& soid
,
202 const bufferlist
& bl
,
206 return rados_striper_impl
->write(soid
, bl
, len
, off
);
209 int libradosstriper::RadosStriper::write_full(const std::string
& soid
,
210 const bufferlist
& bl
)
212 return rados_striper_impl
->write_full(soid
, bl
);
215 int libradosstriper::RadosStriper::append(const std::string
& soid
,
216 const bufferlist
& bl
,
219 return rados_striper_impl
->append(soid
, bl
, len
);
222 int libradosstriper::RadosStriper::aio_write(const std::string
& soid
,
223 librados::AioCompletion
*c
,
224 const bufferlist
& bl
,
228 return rados_striper_impl
->aio_write(soid
, c
->pc
, bl
, len
, off
);
231 int libradosstriper::RadosStriper::aio_write_full(const std::string
& soid
,
232 librados::AioCompletion
*c
,
233 const bufferlist
& bl
)
235 return rados_striper_impl
->aio_write_full(soid
, c
->pc
, bl
);
238 int libradosstriper::RadosStriper::aio_append(const std::string
& soid
,
239 librados::AioCompletion
*c
,
240 const bufferlist
& bl
,
243 return rados_striper_impl
->aio_append(soid
, c
->pc
, bl
, len
);
246 int libradosstriper::RadosStriper::read(const std::string
& soid
,
252 bl
->push_back(buffer::create(len
));
253 return rados_striper_impl
->read(soid
, bl
, len
, off
);
256 int libradosstriper::RadosStriper::aio_read(const std::string
& soid
,
257 librados::AioCompletion
*c
,
263 bl
->push_back(buffer::create(len
));
264 return rados_striper_impl
->aio_read(soid
, c
->pc
, bl
, len
, off
);
267 int libradosstriper::RadosStriper::stat(const std::string
& soid
, uint64_t *psize
, time_t *pmtime
)
269 return rados_striper_impl
->stat(soid
, psize
, pmtime
);
272 int libradosstriper::RadosStriper::aio_stat(const std::string
& soid
,
273 librados::AioCompletion
*c
,
277 return rados_striper_impl
->aio_stat(soid
, c
->pc
, psize
, pmtime
);
280 int libradosstriper::RadosStriper::stat2(const std::string
& soid
, uint64_t *psize
, struct timespec
*pts
)
282 return rados_striper_impl
->stat2(soid
, psize
, pts
);
285 int libradosstriper::RadosStriper::aio_stat2(const std::string
& soid
,
286 librados::AioCompletion
*c
,
288 struct timespec
*pts
)
290 return rados_striper_impl
->aio_stat2(soid
, c
->pc
, psize
, pts
);
293 int libradosstriper::RadosStriper::remove(const std::string
& soid
)
295 return rados_striper_impl
->remove(soid
);
298 int libradosstriper::RadosStriper::aio_remove(const std::string
& soid
,
299 librados::AioCompletion
*c
)
301 return rados_striper_impl
->aio_remove(soid
, c
->pc
);
304 int libradosstriper::RadosStriper::remove(const std::string
& soid
, int flags
)
306 return rados_striper_impl
->remove(soid
, flags
);
309 int libradosstriper::RadosStriper::aio_remove(const std::string
& soid
,
310 librados::AioCompletion
*c
,
313 return rados_striper_impl
->aio_remove(soid
, c
->pc
, flags
);
316 int libradosstriper::RadosStriper::trunc(const std::string
& soid
, uint64_t size
)
318 return rados_striper_impl
->trunc(soid
, size
);
321 int libradosstriper::RadosStriper::aio_flush()
323 return rados_striper_impl
->aio_flush();
326 libradosstriper::MultiAioCompletion
* libradosstriper::RadosStriper::multi_aio_create_completion()
328 MultiAioCompletionImpl
*c
= new MultiAioCompletionImpl
;
329 return new MultiAioCompletion(c
);
332 libradosstriper::MultiAioCompletion
*
333 libradosstriper::RadosStriper::multi_aio_create_completion(void *cb_arg
,
334 librados::callback_t cb_complete
,
335 librados::callback_t cb_safe
)
337 MultiAioCompletionImpl
*c
;
338 int r
= rados_striper_multi_aio_create_completion(cb_arg
, cb_complete
, cb_safe
, (void**)&c
);
340 return new MultiAioCompletion(c
);
343 ///////////////////////////// C API //////////////////////////////
345 extern "C" int rados_striper_create(rados_ioctx_t ioctx
,
346 rados_striper_t
*striper
)
349 librados::IoCtx::from_rados_ioctx_t(ioctx
, ctx
);
350 libradosstriper::RadosStriper striperp
;
351 int rc
= libradosstriper::RadosStriper::striper_create(ctx
, &striperp
);
353 libradosstriper::RadosStriper::to_rados_striper_t(striperp
, striper
);
357 extern "C" void rados_striper_destroy(rados_striper_t striper
)
359 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
363 extern "C" int rados_striper_set_object_layout_stripe_unit(rados_striper_t striper
,
364 unsigned int stripe_unit
)
366 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
367 return impl
->setObjectLayoutStripeUnit(stripe_unit
);
370 extern "C" int rados_striper_set_object_layout_stripe_count(rados_striper_t striper
,
371 unsigned int stripe_count
)
373 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
374 return impl
->setObjectLayoutStripeCount(stripe_count
);
377 extern "C" int rados_striper_set_object_layout_object_size(rados_striper_t striper
,
378 unsigned int object_size
)
380 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
381 return impl
->setObjectLayoutObjectSize(object_size
);
384 extern "C" int rados_striper_write(rados_striper_t striper
,
390 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
393 return impl
->write(soid
, bl
, len
, off
);
396 extern "C" int rados_striper_write_full(rados_striper_t striper
,
401 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
404 return impl
->write_full(soid
, bl
);
408 extern "C" int rados_striper_append(rados_striper_t striper
,
413 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
416 return impl
->append(soid
, bl
, len
);
419 extern "C" int rados_striper_read(rados_striper_t striper
,
425 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
427 bufferptr bp
= buffer::create_static(len
, buf
);
429 int ret
= impl
->read(soid
, &bl
, len
, off
);
431 if (bl
.length() > len
)
433 if (!bl
.is_provided_buffer(buf
))
434 bl
.copy(0, bl
.length(), buf
);
435 ret
= bl
.length(); // hrm :/
440 extern "C" int rados_striper_remove(rados_striper_t striper
, const char* soid
)
442 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
443 return impl
->remove(soid
);
446 extern "C" int rados_striper_trunc(rados_striper_t striper
, const char* soid
, uint64_t size
)
448 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
449 return impl
->trunc(soid
, size
);
452 extern "C" int rados_striper_getxattr(rados_striper_t striper
,
458 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
461 int ret
= impl
->getxattr(oid
, name
, bl
);
463 if (bl
.length() > len
)
465 bl
.copy(0, bl
.length(), buf
);
471 extern "C" int rados_striper_setxattr(rados_striper_t striper
,
477 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
481 return impl
->setxattr(obj
, name
, bl
);
484 extern "C" int rados_striper_rmxattr(rados_striper_t striper
,
488 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
490 return impl
->rmxattr(obj
, name
);
493 extern "C" int rados_striper_getxattrs(rados_striper_t striper
,
495 rados_xattrs_iter_t
*iter
)
497 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
499 librados::RadosXattrsIter
*it
= new librados::RadosXattrsIter();
502 int ret
= impl
->getxattrs(obj
, it
->attrset
);
507 it
->i
= it
->attrset
.begin();
508 librados::RadosXattrsIter
**iret
= (librados::RadosXattrsIter
**)iter
;
514 extern "C" int rados_striper_getxattrs_next(rados_xattrs_iter_t iter
,
519 return rados_getxattrs_next(iter
, name
, val
, len
);
522 extern "C" void rados_striper_getxattrs_end(rados_xattrs_iter_t iter
)
524 return rados_getxattrs_end(iter
);
527 extern "C" int rados_striper_stat(rados_striper_t striper
,
532 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
533 return impl
->stat(soid
, psize
, pmtime
);
536 extern "C" int rados_striper_multi_aio_create_completion(void *cb_arg
,
537 rados_callback_t cb_complete
,
538 rados_callback_t cb_safe
,
539 rados_striper_multi_completion_t
*pc
)
541 libradosstriper::MultiAioCompletionImpl
*c
= new libradosstriper::MultiAioCompletionImpl
;
543 c
->set_complete_callback(cb_arg
, cb_complete
);
545 c
->set_safe_callback(cb_arg
, cb_safe
);
550 extern "C" void rados_striper_multi_aio_wait_for_complete(rados_striper_multi_completion_t c
)
552 ((libradosstriper::MultiAioCompletionImpl
*)c
)->wait_for_complete();
555 extern "C" void rados_striper_multi_aio_wait_for_safe(rados_striper_multi_completion_t c
)
557 ((libradosstriper::MultiAioCompletionImpl
*)c
)->wait_for_safe();
560 extern "C" int rados_striper_multi_aio_is_complete(rados_striper_multi_completion_t c
)
562 return ((libradosstriper::MultiAioCompletionImpl
*)c
)->is_complete();
565 extern "C" int rados_striper_multi_aio_is_safe(rados_striper_multi_completion_t c
)
567 return ((libradosstriper::MultiAioCompletionImpl
*)c
)->is_safe();
570 extern "C" void rados_striper_multi_aio_wait_for_complete_and_cb(rados_striper_multi_completion_t c
)
572 ((libradosstriper::MultiAioCompletionImpl
*)c
)->wait_for_complete_and_cb();
575 extern "C" void rados_striper_multi_aio_wait_for_safe_and_cb(rados_striper_multi_completion_t c
)
577 ((libradosstriper::MultiAioCompletionImpl
*)c
)->wait_for_safe_and_cb();
580 extern "C" int rados_striper_multi_aio_is_complete_and_cb(rados_striper_multi_completion_t c
)
582 return ((libradosstriper::MultiAioCompletionImpl
*)c
)->is_complete_and_cb();
585 extern "C" int rados_striper_multi_aio_is_safe_and_cb(rados_striper_multi_completion_t c
)
587 return ((libradosstriper::MultiAioCompletionImpl
*)c
)->is_safe_and_cb();
590 extern "C" int rados_striper_multi_aio_get_return_value(rados_striper_multi_completion_t c
)
592 return ((libradosstriper::MultiAioCompletionImpl
*)c
)->get_return_value();
595 extern "C" void rados_striper_multi_aio_release(rados_striper_multi_completion_t c
)
597 ((libradosstriper::MultiAioCompletionImpl
*)c
)->put();
600 extern "C" int rados_striper_aio_write(rados_striper_t striper
,
602 rados_completion_t completion
,
607 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
610 return impl
->aio_write(soid
, (librados::AioCompletionImpl
*)completion
, bl
, len
, off
);
613 extern "C" int rados_striper_aio_append(rados_striper_t striper
,
615 rados_completion_t completion
,
619 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
622 return impl
->aio_append(soid
, (librados::AioCompletionImpl
*)completion
, bl
, len
);
625 extern "C" int rados_striper_aio_write_full(rados_striper_t striper
,
627 rados_completion_t completion
,
631 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
634 return impl
->aio_write_full(soid
, (librados::AioCompletionImpl
*)completion
, bl
);
637 extern "C" int rados_striper_aio_read(rados_striper_t striper
,
639 rados_completion_t completion
,
644 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
645 return impl
->aio_read(soid
, (librados::AioCompletionImpl
*)completion
, buf
, len
, off
);
648 extern "C" int rados_striper_aio_remove(rados_striper_t striper
,
650 rados_completion_t completion
)
652 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
653 return impl
->aio_remove(soid
, (librados::AioCompletionImpl
*)completion
);
656 extern "C" void rados_striper_aio_flush(rados_striper_t striper
)
658 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
662 extern "C" int rados_striper_aio_stat(rados_striper_t striper
,
664 rados_completion_t completion
,
668 libradosstriper::RadosStriperImpl
*impl
= (libradosstriper::RadosStriperImpl
*)striper
;
669 return impl
->aio_stat(soid
, (librados::AioCompletionImpl
*)completion
, psize
, pmtime
);