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);