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) 2004-2012 Sage Weil <sage@newdream.net>
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 "common/config.h"
18 #include "common/errno.h"
19 #include "common/ceph_argparse.h"
20 #include "common/ceph_json.h"
21 #include "common/common_init.h"
22 #include "common/TracepointProvider.h"
23 #include "common/hobject.h"
24 #include "include/rados/librados.h"
25 #include "include/rados/librados.hpp"
26 #include "include/types.h"
27 #include <include/stringify.h>
29 #include "librados/AioCompletionImpl.h"
30 #include "librados/IoCtxImpl.h"
31 #include "librados/PoolAsyncCompletionImpl.h"
32 #include "librados/RadosClient.h"
33 #include "librados/RadosXattrIter.h"
34 #include "librados/ListObjectImpl.h"
35 #include <cls/lock/cls_lock_client.h>
45 #define TRACEPOINT_DEFINE
46 #define TRACEPOINT_PROBE_DYNAMIC_LINKAGE
47 #include "tracing/librados.h"
48 #undef TRACEPOINT_PROBE_DYNAMIC_LINKAGE
49 #undef TRACEPOINT_DEFINE
51 #define tracepoint(...)
59 using std::runtime_error
;
61 #define dout_subsys ceph_subsys_rados
63 #define dout_prefix *_dout << "librados: "
65 #define RADOS_LIST_MAX_ENTRIES 1024
69 TracepointProvider::Traits
tracepoint_traits("librados_tp.so", "rados_tracing");
71 uint8_t get_checksum_op_type(rados_checksum_type_t type
) {
73 case LIBRADOS_CHECKSUM_TYPE_XXHASH32
:
74 return CEPH_OSD_CHECKSUM_OP_TYPE_XXHASH32
;
75 case LIBRADOS_CHECKSUM_TYPE_XXHASH64
:
76 return CEPH_OSD_CHECKSUM_OP_TYPE_XXHASH64
;
77 case LIBRADOS_CHECKSUM_TYPE_CRC32C
:
78 return CEPH_OSD_CHECKSUM_OP_TYPE_CRC32C
;
84 } // anonymous namespace
87 * Structure of this file
89 * RadosClient and the related classes are the internal implementation of librados.
90 * Above that layer sits the C API, found in include/rados/librados.h, and
91 * the C++ API, found in include/rados/librados.hpp
93 * The C++ API sometimes implements things in terms of the C API.
94 * Both the C++ and C API rely on RadosClient.
97 * +--------------------------------------+
99 * +--------------------+ |
101 * +--------------------+-----------------+
103 * +--------------------------------------+
108 struct ObjectOperationImpl
{
113 ObjectOperationImpl() : prt(NULL
) {}
118 size_t librados::ObjectOperation::size()
120 ::ObjectOperation
*o
= &impl
->o
;
124 static void set_op_flags(::ObjectOperation
*o
, int flags
)
127 if (flags
& LIBRADOS_OP_FLAG_EXCL
)
128 rados_flags
|= CEPH_OSD_OP_FLAG_EXCL
;
129 if (flags
& LIBRADOS_OP_FLAG_FAILOK
)
130 rados_flags
|= CEPH_OSD_OP_FLAG_FAILOK
;
131 if (flags
& LIBRADOS_OP_FLAG_FADVISE_RANDOM
)
132 rados_flags
|= CEPH_OSD_OP_FLAG_FADVISE_RANDOM
;
133 if (flags
& LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL
)
134 rados_flags
|= CEPH_OSD_OP_FLAG_FADVISE_SEQUENTIAL
;
135 if (flags
& LIBRADOS_OP_FLAG_FADVISE_WILLNEED
)
136 rados_flags
|= CEPH_OSD_OP_FLAG_FADVISE_WILLNEED
;
137 if (flags
& LIBRADOS_OP_FLAG_FADVISE_DONTNEED
)
138 rados_flags
|= CEPH_OSD_OP_FLAG_FADVISE_DONTNEED
;
139 if (flags
& LIBRADOS_OP_FLAG_FADVISE_NOCACHE
)
140 rados_flags
|= CEPH_OSD_OP_FLAG_FADVISE_NOCACHE
;
141 o
->set_last_op_flags(rados_flags
);
145 void librados::ObjectOperation::set_op_flags(ObjectOperationFlags flags
)
147 ::set_op_flags(&impl
->o
, (int)flags
);
150 void librados::ObjectOperation::set_op_flags2(int flags
)
152 ::ObjectOperation
*o
= &impl
->o
;
153 ::set_op_flags(o
, flags
);
156 void librados::ObjectOperation::cmpext(uint64_t off
,
160 ::ObjectOperation
*o
= &impl
->o
;
161 o
->cmpext(off
, cmp_bl
, prval
);
164 void librados::ObjectOperation::cmpxattr(const char *name
, uint8_t op
, const bufferlist
& v
)
166 ::ObjectOperation
*o
= &impl
->o
;
167 o
->cmpxattr(name
, op
, CEPH_OSD_CMPXATTR_MODE_STRING
, v
);
170 void librados::ObjectOperation::cmpxattr(const char *name
, uint8_t op
, uint64_t v
)
172 ::ObjectOperation
*o
= &impl
->o
;
175 o
->cmpxattr(name
, op
, CEPH_OSD_CMPXATTR_MODE_U64
, bl
);
178 void librados::ObjectOperation::assert_version(uint64_t ver
)
180 ::ObjectOperation
*o
= &impl
->o
;
181 o
->assert_version(ver
);
184 void librados::ObjectOperation::assert_exists()
186 ::ObjectOperation
*o
= &impl
->o
;
187 o
->stat(NULL
, (ceph::real_time
*) NULL
, NULL
);
190 void librados::ObjectOperation::exec(const char *cls
, const char *method
, bufferlist
& inbl
)
192 ::ObjectOperation
*o
= &impl
->o
;
193 o
->call(cls
, method
, inbl
);
196 void librados::ObjectOperation::exec(const char *cls
, const char *method
, bufferlist
& inbl
, bufferlist
*outbl
, int *prval
)
198 ::ObjectOperation
*o
= &impl
->o
;
199 o
->call(cls
, method
, inbl
, outbl
, NULL
, prval
);
202 class ObjectOpCompletionCtx
: public Context
{
203 librados::ObjectOperationCompletion
*completion
;
206 explicit ObjectOpCompletionCtx(librados::ObjectOperationCompletion
*c
) : completion(c
) {}
207 void finish(int r
) override
{
208 completion
->handle_completion(r
, bl
);
212 bufferlist
*outbl() {
217 void librados::ObjectOperation::exec(const char *cls
, const char *method
, bufferlist
& inbl
, librados::ObjectOperationCompletion
*completion
)
219 ::ObjectOperation
*o
= &impl
->o
;
221 ObjectOpCompletionCtx
*ctx
= new ObjectOpCompletionCtx(completion
);
223 o
->call(cls
, method
, inbl
, ctx
->outbl(), ctx
, NULL
);
226 void librados::ObjectReadOperation::stat(uint64_t *psize
, time_t *pmtime
, int *prval
)
228 ::ObjectOperation
*o
= &impl
->o
;
229 o
->stat(psize
, pmtime
, prval
);
232 void librados::ObjectReadOperation::stat2(uint64_t *psize
, struct timespec
*pts
, int *prval
)
234 ::ObjectOperation
*o
= &impl
->o
;
235 o
->stat(psize
, pts
, prval
);
238 void librados::ObjectReadOperation::read(size_t off
, uint64_t len
, bufferlist
*pbl
, int *prval
)
240 ::ObjectOperation
*o
= &impl
->o
;
241 o
->read(off
, len
, pbl
, prval
, NULL
);
244 void librados::ObjectReadOperation::sparse_read(uint64_t off
, uint64_t len
,
245 std::map
<uint64_t,uint64_t> *m
,
246 bufferlist
*data_bl
, int *prval
)
248 ::ObjectOperation
*o
= &impl
->o
;
249 o
->sparse_read(off
, len
, m
, data_bl
, prval
);
252 void librados::ObjectReadOperation::checksum(rados_checksum_type_t type
,
253 const bufferlist
&init_value_bl
,
254 uint64_t off
, size_t len
,
255 size_t chunk_size
, bufferlist
*pbl
,
258 ::ObjectOperation
*o
= &impl
->o
;
259 o
->checksum(get_checksum_op_type(type
), init_value_bl
, off
, len
, chunk_size
,
260 pbl
, prval
, nullptr);
263 void librados::ObjectReadOperation::tmap_get(bufferlist
*pbl
, int *prval
)
265 ::ObjectOperation
*o
= &impl
->o
;
266 o
->tmap_get(pbl
, prval
);
269 void librados::ObjectReadOperation::getxattr(const char *name
, bufferlist
*pbl
, int *prval
)
271 ::ObjectOperation
*o
= &impl
->o
;
272 o
->getxattr(name
, pbl
, prval
);
275 void librados::ObjectReadOperation::omap_get_vals(
276 const std::string
&start_after
,
277 const std::string
&filter_prefix
,
279 std::map
<std::string
, bufferlist
> *out_vals
,
282 ::ObjectOperation
*o
= &impl
->o
;
283 o
->omap_get_vals(start_after
, filter_prefix
, max_return
, out_vals
, nullptr,
287 void librados::ObjectReadOperation::omap_get_vals2(
288 const std::string
&start_after
,
289 const std::string
&filter_prefix
,
291 std::map
<std::string
, bufferlist
> *out_vals
,
295 ::ObjectOperation
*o
= &impl
->o
;
296 o
->omap_get_vals(start_after
, filter_prefix
, max_return
, out_vals
, pmore
,
300 void librados::ObjectReadOperation::omap_get_vals(
301 const std::string
&start_after
,
303 std::map
<std::string
, bufferlist
> *out_vals
,
306 ::ObjectOperation
*o
= &impl
->o
;
307 o
->omap_get_vals(start_after
, "", max_return
, out_vals
, nullptr, prval
);
310 void librados::ObjectReadOperation::omap_get_vals2(
311 const std::string
&start_after
,
313 std::map
<std::string
, bufferlist
> *out_vals
,
317 ::ObjectOperation
*o
= &impl
->o
;
318 o
->omap_get_vals(start_after
, "", max_return
, out_vals
, pmore
, prval
);
321 void librados::ObjectReadOperation::omap_get_keys(
322 const std::string
&start_after
,
324 std::set
<std::string
> *out_keys
,
327 ::ObjectOperation
*o
= &impl
->o
;
328 o
->omap_get_keys(start_after
, max_return
, out_keys
, nullptr, prval
);
331 void librados::ObjectReadOperation::omap_get_keys2(
332 const std::string
&start_after
,
334 std::set
<std::string
> *out_keys
,
338 ::ObjectOperation
*o
= &impl
->o
;
339 o
->omap_get_keys(start_after
, max_return
, out_keys
, pmore
, prval
);
342 void librados::ObjectReadOperation::omap_get_header(bufferlist
*bl
, int *prval
)
344 ::ObjectOperation
*o
= &impl
->o
;
345 o
->omap_get_header(bl
, prval
);
348 void librados::ObjectReadOperation::omap_get_vals_by_keys(
349 const std::set
<std::string
> &keys
,
350 std::map
<std::string
, bufferlist
> *map
,
353 ::ObjectOperation
*o
= &impl
->o
;
354 o
->omap_get_vals_by_keys(keys
, map
, prval
);
357 void librados::ObjectOperation::omap_cmp(
358 const std::map
<std::string
, pair
<bufferlist
, int> > &assertions
,
361 ::ObjectOperation
*o
= &impl
->o
;
362 o
->omap_cmp(assertions
, prval
);
365 void librados::ObjectReadOperation::list_watchers(
366 list
<obj_watch_t
> *out_watchers
,
369 ::ObjectOperation
*o
= &impl
->o
;
370 o
->list_watchers(out_watchers
, prval
);
373 void librados::ObjectReadOperation::list_snaps(
374 snap_set_t
*out_snaps
,
377 ::ObjectOperation
*o
= &impl
->o
;
378 o
->list_snaps(out_snaps
, prval
);
381 void librados::ObjectReadOperation::is_dirty(bool *is_dirty
, int *prval
)
383 ::ObjectOperation
*o
= &impl
->o
;
384 o
->is_dirty(is_dirty
, prval
);
387 int librados::IoCtx::omap_get_vals(const std::string
& oid
,
388 const std::string
& orig_start_after
,
389 const std::string
& filter_prefix
,
391 std::map
<std::string
, bufferlist
> *out_vals
)
394 string start_after
= orig_start_after
;
396 while (max_return
> 0 && more
) {
397 std::map
<std::string
,bufferlist
> out
;
398 ObjectReadOperation op
;
399 op
.omap_get_vals2(start_after
, filter_prefix
, max_return
, &out
, &more
,
402 int ret
= operate(oid
, &op
, &bl
);
408 return -EINVAL
; // wth
410 start_after
= out
.rbegin()->first
;
412 if (out
.size() <= max_return
) {
413 max_return
-= out
.size();
421 out_vals
->insert(out
.begin(), out
.end());
428 int librados::IoCtx::omap_get_vals2(
429 const std::string
& oid
,
430 const std::string
& start_after
,
431 const std::string
& filter_prefix
,
433 std::map
<std::string
, bufferlist
> *out_vals
,
436 ObjectReadOperation op
;
438 op
.omap_get_vals2(start_after
, filter_prefix
, max_return
, out_vals
, pmore
, &r
);
440 int ret
= operate(oid
, &op
, &bl
);
446 void librados::ObjectReadOperation::getxattrs(map
<string
, bufferlist
> *pattrs
, int *prval
)
448 ::ObjectOperation
*o
= &impl
->o
;
449 o
->getxattrs(pattrs
, prval
);
452 void librados::ObjectWriteOperation::mtime(time_t *pt
)
455 impl
->rt
= ceph::real_clock::from_time_t(*pt
);
456 impl
->prt
= &impl
->rt
;
460 void librados::ObjectWriteOperation::mtime2(struct timespec
*pts
)
463 impl
->rt
= ceph::real_clock::from_timespec(*pts
);
464 impl
->prt
= &impl
->rt
;
468 void librados::ObjectWriteOperation::create(bool exclusive
)
470 ::ObjectOperation
*o
= &impl
->o
;
471 o
->create(exclusive
);
474 void librados::ObjectWriteOperation::create(bool exclusive
,
475 const std::string
& category
) // unused
477 ::ObjectOperation
*o
= &impl
->o
;
478 o
->create(exclusive
);
481 void librados::ObjectWriteOperation::write(uint64_t off
, const bufferlist
& bl
)
483 ::ObjectOperation
*o
= &impl
->o
;
488 void librados::ObjectWriteOperation::write_full(const bufferlist
& bl
)
490 ::ObjectOperation
*o
= &impl
->o
;
495 void librados::ObjectWriteOperation::writesame(uint64_t off
, uint64_t write_len
,
496 const bufferlist
& bl
)
498 ::ObjectOperation
*o
= &impl
->o
;
500 o
->writesame(off
, write_len
, c
);
503 void librados::ObjectWriteOperation::append(const bufferlist
& bl
)
505 ::ObjectOperation
*o
= &impl
->o
;
510 void librados::ObjectWriteOperation::remove()
512 ::ObjectOperation
*o
= &impl
->o
;
516 void librados::ObjectWriteOperation::truncate(uint64_t off
)
518 ::ObjectOperation
*o
= &impl
->o
;
522 void librados::ObjectWriteOperation::zero(uint64_t off
, uint64_t len
)
524 ::ObjectOperation
*o
= &impl
->o
;
528 void librados::ObjectWriteOperation::rmxattr(const char *name
)
530 ::ObjectOperation
*o
= &impl
->o
;
534 void librados::ObjectWriteOperation::setxattr(const char *name
, const bufferlist
& v
)
536 ::ObjectOperation
*o
= &impl
->o
;
537 o
->setxattr(name
, v
);
540 void librados::ObjectWriteOperation::omap_set(
541 const map
<string
, bufferlist
> &map
)
543 ::ObjectOperation
*o
= &impl
->o
;
547 void librados::ObjectWriteOperation::omap_set_header(const bufferlist
&bl
)
550 ::ObjectOperation
*o
= &impl
->o
;
551 o
->omap_set_header(c
);
554 void librados::ObjectWriteOperation::omap_clear()
556 ::ObjectOperation
*o
= &impl
->o
;
560 void librados::ObjectWriteOperation::omap_rm_keys(
561 const std::set
<std::string
> &to_rm
)
563 ::ObjectOperation
*o
= &impl
->o
;
564 o
->omap_rm_keys(to_rm
);
567 void librados::ObjectWriteOperation::copy_from(const std::string
& src
,
568 const IoCtx
& src_ioctx
,
569 uint64_t src_version
)
571 copy_from2(src
, src_ioctx
, src_version
, 0);
574 void librados::ObjectWriteOperation::copy_from2(const std::string
& src
,
575 const IoCtx
& src_ioctx
,
576 uint64_t src_version
,
577 uint32_t src_fadvise_flags
)
579 ::ObjectOperation
*o
= &impl
->o
;
580 o
->copy_from(object_t(src
), src_ioctx
.io_ctx_impl
->snap_seq
,
581 src_ioctx
.io_ctx_impl
->oloc
, src_version
, 0, src_fadvise_flags
);
584 void librados::ObjectWriteOperation::undirty()
586 ::ObjectOperation
*o
= &impl
->o
;
590 void librados::ObjectReadOperation::cache_flush()
592 ::ObjectOperation
*o
= &impl
->o
;
596 void librados::ObjectReadOperation::cache_try_flush()
598 ::ObjectOperation
*o
= &impl
->o
;
599 o
->cache_try_flush();
602 void librados::ObjectReadOperation::cache_evict()
604 ::ObjectOperation
*o
= &impl
->o
;
608 void librados::ObjectWriteOperation::set_redirect(const std::string
& tgt_obj
,
609 const IoCtx
& tgt_ioctx
,
610 uint64_t tgt_version
)
612 ::ObjectOperation
*o
= &impl
->o
;
613 o
->set_redirect(object_t(tgt_obj
), tgt_ioctx
.io_ctx_impl
->snap_seq
,
614 tgt_ioctx
.io_ctx_impl
->oloc
, tgt_version
);
617 void librados::ObjectWriteOperation::tmap_put(const bufferlist
&bl
)
619 ::ObjectOperation
*o
= &impl
->o
;
624 void librados::ObjectWriteOperation::tmap_update(const bufferlist
& cmdbl
)
626 ::ObjectOperation
*o
= &impl
->o
;
627 bufferlist c
= cmdbl
;
631 void librados::ObjectWriteOperation::selfmanaged_snap_rollback(snap_t snapid
)
633 ::ObjectOperation
*o
= &impl
->o
;
637 // You must specify the snapid not the name normally used with pool snapshots
638 void librados::ObjectWriteOperation::snap_rollback(snap_t snapid
)
640 ::ObjectOperation
*o
= &impl
->o
;
644 void librados::ObjectWriteOperation::set_alloc_hint(
645 uint64_t expected_object_size
,
646 uint64_t expected_write_size
)
648 ::ObjectOperation
*o
= &impl
->o
;
649 o
->set_alloc_hint(expected_object_size
, expected_write_size
, 0);
651 void librados::ObjectWriteOperation::set_alloc_hint2(
652 uint64_t expected_object_size
,
653 uint64_t expected_write_size
,
656 ::ObjectOperation
*o
= &impl
->o
;
657 o
->set_alloc_hint(expected_object_size
, expected_write_size
, flags
);
660 void librados::ObjectWriteOperation::cache_pin()
662 ::ObjectOperation
*o
= &impl
->o
;
666 void librados::ObjectWriteOperation::cache_unpin()
668 ::ObjectOperation
*o
= &impl
->o
;
677 librados::WatchCtx2::
683 struct librados::ObjListCtx
{
684 librados::IoCtxImpl dupctx
;
685 librados::IoCtxImpl
*ctx
;
686 Objecter::NListContext
*nlc
;
687 bool legacy_list_api
;
689 ObjListCtx(IoCtxImpl
*c
, Objecter::NListContext
*nl
, bool legacy
=false)
691 legacy_list_api(legacy
) {
692 // Get our own private IoCtxImpl so that namespace setting isn't
693 // changed by caller between uses.
703 ///////////////////////////// NObjectIteratorImpl /////////////////////////////
704 librados::NObjectIteratorImpl::NObjectIteratorImpl(ObjListCtx
*ctx_
)
709 librados::NObjectIteratorImpl::~NObjectIteratorImpl()
714 librados::NObjectIteratorImpl::NObjectIteratorImpl(const NObjectIteratorImpl
&rhs
)
719 librados::NObjectIteratorImpl
& librados::NObjectIteratorImpl::operator=(const librados::NObjectIteratorImpl
&rhs
)
723 if (rhs
.ctx
.get() == NULL
) {
727 Objecter::NListContext
*list_ctx
= new Objecter::NListContext(*rhs
.ctx
->nlc
);
728 ctx
.reset(new ObjListCtx(rhs
.ctx
->ctx
, list_ctx
));
729 cur_obj
= rhs
.cur_obj
;
733 bool librados::NObjectIteratorImpl::operator==(const librados::NObjectIteratorImpl
& rhs
) const {
735 if (ctx
.get() == NULL
) {
736 if (rhs
.ctx
.get() == NULL
)
738 return rhs
.ctx
->nlc
->at_end();
740 if (rhs
.ctx
.get() == NULL
) {
741 // Redundant but same as ObjectIterator version
742 if (ctx
.get() == NULL
)
744 return ctx
->nlc
->at_end();
746 return ctx
.get() == rhs
.ctx
.get();
749 bool librados::NObjectIteratorImpl::operator!=(const librados::NObjectIteratorImpl
& rhs
) const {
750 return !(*this == rhs
);
753 const librados::ListObject
& librados::NObjectIteratorImpl::operator*() const {
757 const librados::ListObject
* librados::NObjectIteratorImpl::operator->() const {
761 librados::NObjectIteratorImpl
& librados::NObjectIteratorImpl::operator++()
767 librados::NObjectIteratorImpl
librados::NObjectIteratorImpl::operator++(int)
769 librados::NObjectIteratorImpl
ret(*this);
774 uint32_t librados::NObjectIteratorImpl::seek(uint32_t pos
)
776 uint32_t r
= rados_nobjects_list_seek(ctx
.get(), pos
);
781 uint32_t librados::NObjectIteratorImpl::seek(const ObjectCursor
& cursor
)
783 uint32_t r
= rados_nobjects_list_seek_cursor(ctx
.get(), (rados_object_list_cursor
)cursor
.c_cursor
);
788 librados::ObjectCursor
librados::NObjectIteratorImpl::get_cursor()
790 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)ctx
.get();
791 librados::ObjectCursor oc
;
792 oc
.set(lh
->ctx
->nlist_get_cursor(lh
->nlc
));
796 void librados::NObjectIteratorImpl::set_filter(const bufferlist
&bl
)
799 ctx
->nlc
->filter
= bl
;
802 void librados::NObjectIteratorImpl::get_next()
804 const char *entry
, *key
, *nspace
;
805 if (ctx
->nlc
->at_end())
807 int ret
= rados_nobjects_list_next(ctx
.get(), &entry
, &key
, &nspace
);
808 if (ret
== -ENOENT
) {
813 oss
<< "rados returned " << cpp_strerror(ret
);
814 throw std::runtime_error(oss
.str());
817 if (cur_obj
.impl
== NULL
)
818 cur_obj
.impl
= new ListObjectImpl();
819 cur_obj
.impl
->nspace
= nspace
;
820 cur_obj
.impl
->oid
= entry
;
821 cur_obj
.impl
->locator
= key
? key
: string();
824 uint32_t librados::NObjectIteratorImpl::get_pg_hash_position() const
826 return ctx
->nlc
->get_pg_hash_position();
829 ///////////////////////////// NObjectIterator /////////////////////////////
830 librados::NObjectIterator::NObjectIterator(ObjListCtx
*ctx_
)
832 impl
= new NObjectIteratorImpl(ctx_
);
835 librados::NObjectIterator::~NObjectIterator()
840 librados::NObjectIterator::NObjectIterator(const NObjectIterator
&rhs
)
842 if (rhs
.impl
== NULL
) {
846 impl
= new NObjectIteratorImpl();
850 librados::NObjectIterator
& librados::NObjectIterator::operator=(const librados::NObjectIterator
&rhs
)
852 if (rhs
.impl
== NULL
) {
858 impl
= new NObjectIteratorImpl();
863 bool librados::NObjectIterator::operator==(const librados::NObjectIterator
& rhs
) const
865 if (impl
&& rhs
.impl
) {
866 return *impl
== *(rhs
.impl
);
868 return impl
== rhs
.impl
;
872 bool librados::NObjectIterator::operator!=(const librados::NObjectIterator
& rhs
) const
874 return !(*this == rhs
);
877 const librados::ListObject
& librados::NObjectIterator::operator*() const {
879 return *(impl
->get_listobjectp());
882 const librados::ListObject
* librados::NObjectIterator::operator->() const {
884 return impl
->get_listobjectp();
887 librados::NObjectIterator
& librados::NObjectIterator::operator++()
894 librados::NObjectIterator
librados::NObjectIterator::operator++(int)
896 librados::NObjectIterator
ret(*this);
901 uint32_t librados::NObjectIterator::seek(uint32_t pos
)
904 return impl
->seek(pos
);
907 uint32_t librados::NObjectIterator::seek(const ObjectCursor
& cursor
)
910 return impl
->seek(cursor
);
913 librados::ObjectCursor
librados::NObjectIterator::get_cursor()
916 return impl
->get_cursor();
919 void librados::NObjectIterator::set_filter(const bufferlist
&bl
)
921 impl
->set_filter(bl
);
924 void librados::NObjectIterator::get_next()
930 uint32_t librados::NObjectIterator::get_pg_hash_position() const
933 return impl
->get_pg_hash_position();
936 const librados::NObjectIterator
librados::NObjectIterator::__EndObjectIterator(NULL
);
938 ///////////////////////////// PoolAsyncCompletion //////////////////////////////
939 int librados::PoolAsyncCompletion::PoolAsyncCompletion::set_callback(void *cb_arg
,
942 PoolAsyncCompletionImpl
*c
= (PoolAsyncCompletionImpl
*)pc
;
943 return c
->set_callback(cb_arg
, cb
);
946 int librados::PoolAsyncCompletion::PoolAsyncCompletion::wait()
948 PoolAsyncCompletionImpl
*c
= (PoolAsyncCompletionImpl
*)pc
;
952 bool librados::PoolAsyncCompletion::PoolAsyncCompletion::is_complete()
954 PoolAsyncCompletionImpl
*c
= (PoolAsyncCompletionImpl
*)pc
;
955 return c
->is_complete();
958 int librados::PoolAsyncCompletion::PoolAsyncCompletion::get_return_value()
960 PoolAsyncCompletionImpl
*c
= (PoolAsyncCompletionImpl
*)pc
;
961 return c
->get_return_value();
964 void librados::PoolAsyncCompletion::PoolAsyncCompletion::release()
966 PoolAsyncCompletionImpl
*c
= (PoolAsyncCompletionImpl
*)pc
;
971 ///////////////////////////// AioCompletion //////////////////////////////
972 int librados::AioCompletion::AioCompletion::set_complete_callback(void *cb_arg
, rados_callback_t cb
)
974 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
975 return c
->set_complete_callback(cb_arg
, cb
);
978 int librados::AioCompletion::AioCompletion::set_safe_callback(void *cb_arg
, rados_callback_t cb
)
980 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
981 return c
->set_safe_callback(cb_arg
, cb
);
984 int librados::AioCompletion::AioCompletion::wait_for_complete()
986 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
987 return c
->wait_for_complete();
990 int librados::AioCompletion::AioCompletion::wait_for_safe()
992 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
993 return c
->wait_for_safe();
996 bool librados::AioCompletion::AioCompletion::is_complete()
998 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
999 return c
->is_complete();
1002 bool librados::AioCompletion::AioCompletion::is_safe()
1004 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
1005 return c
->is_safe();
1008 int librados::AioCompletion::AioCompletion::wait_for_complete_and_cb()
1010 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
1011 return c
->wait_for_complete_and_cb();
1014 int librados::AioCompletion::AioCompletion::wait_for_safe_and_cb()
1016 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
1017 return c
->wait_for_safe_and_cb();
1020 bool librados::AioCompletion::AioCompletion::is_complete_and_cb()
1022 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
1023 return c
->is_complete_and_cb();
1026 bool librados::AioCompletion::AioCompletion::is_safe_and_cb()
1028 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
1029 return c
->is_safe_and_cb();
1032 int librados::AioCompletion::AioCompletion::get_return_value()
1034 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
1035 return c
->get_return_value();
1038 int librados::AioCompletion::AioCompletion::get_version()
1040 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
1041 return c
->get_version();
1044 uint64_t librados::AioCompletion::AioCompletion::get_version64()
1046 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
1047 return c
->get_version();
1050 void librados::AioCompletion::AioCompletion::release()
1052 AioCompletionImpl
*c
= (AioCompletionImpl
*)pc
;
1057 ///////////////////////////// IoCtx //////////////////////////////
1058 librados::IoCtx::IoCtx() : io_ctx_impl(NULL
)
1062 void librados::IoCtx::from_rados_ioctx_t(rados_ioctx_t p
, IoCtx
&io
)
1064 IoCtxImpl
*io_ctx_impl
= (IoCtxImpl
*)p
;
1066 io
.io_ctx_impl
= io_ctx_impl
;
1072 librados::IoCtx::IoCtx(const IoCtx
& rhs
)
1074 io_ctx_impl
= rhs
.io_ctx_impl
;
1080 librados::IoCtx
& librados::IoCtx::operator=(const IoCtx
& rhs
)
1084 io_ctx_impl
= rhs
.io_ctx_impl
;
1089 librados::IoCtx::~IoCtx()
1094 void librados::IoCtx::close()
1101 void librados::IoCtx::dup(const IoCtx
& rhs
)
1105 io_ctx_impl
= new IoCtxImpl();
1107 io_ctx_impl
->dup(*rhs
.io_ctx_impl
);
1110 int librados::IoCtx::set_auid(uint64_t auid_
)
1112 return io_ctx_impl
->pool_change_auid(auid_
);
1115 int librados::IoCtx::set_auid_async(uint64_t auid_
, PoolAsyncCompletion
*c
)
1117 return io_ctx_impl
->pool_change_auid_async(auid_
, c
->pc
);
1120 int librados::IoCtx::get_auid(uint64_t *auid_
)
1122 return rados_ioctx_pool_get_auid(io_ctx_impl
, auid_
);
1125 bool librados::IoCtx::pool_requires_alignment()
1127 return io_ctx_impl
->client
->pool_requires_alignment(get_id());
1130 int librados::IoCtx::pool_requires_alignment2(bool *requires
)
1132 return io_ctx_impl
->client
->pool_requires_alignment2(get_id(), requires
);
1135 uint64_t librados::IoCtx::pool_required_alignment()
1137 return io_ctx_impl
->client
->pool_required_alignment(get_id());
1140 int librados::IoCtx::pool_required_alignment2(uint64_t *alignment
)
1142 return io_ctx_impl
->client
->pool_required_alignment2(get_id(), alignment
);
1145 std::string
librados::IoCtx::get_pool_name()
1148 io_ctx_impl
->client
->pool_get_name(get_id(), &s
);
1152 std::string
librados::IoCtx::get_pool_name() const
1154 return io_ctx_impl
->get_cached_pool_name();
1157 uint64_t librados::IoCtx::get_instance_id() const
1159 return io_ctx_impl
->client
->get_instance_id();
1162 int librados::IoCtx::create(const std::string
& oid
, bool exclusive
)
1165 return io_ctx_impl
->create(obj
, exclusive
);
1168 int librados::IoCtx::create(const std::string
& oid
, bool exclusive
,
1169 const std::string
& category
) // unused
1172 return io_ctx_impl
->create(obj
, exclusive
);
1175 int librados::IoCtx::write(const std::string
& oid
, bufferlist
& bl
, size_t len
, uint64_t off
)
1178 return io_ctx_impl
->write(obj
, bl
, len
, off
);
1181 int librados::IoCtx::append(const std::string
& oid
, bufferlist
& bl
, size_t len
)
1184 return io_ctx_impl
->append(obj
, bl
, len
);
1187 int librados::IoCtx::write_full(const std::string
& oid
, bufferlist
& bl
)
1190 return io_ctx_impl
->write_full(obj
, bl
);
1193 int librados::IoCtx::writesame(const std::string
& oid
, bufferlist
& bl
,
1194 size_t write_len
, uint64_t off
)
1197 return io_ctx_impl
->writesame(obj
, bl
, write_len
, off
);
1201 int librados::IoCtx::read(const std::string
& oid
, bufferlist
& bl
, size_t len
, uint64_t off
)
1204 return io_ctx_impl
->read(obj
, bl
, len
, off
);
1207 int librados::IoCtx::checksum(const std::string
& oid
,
1208 rados_checksum_type_t type
,
1209 const bufferlist
&init_value_bl
, size_t len
,
1210 uint64_t off
, size_t chunk_size
, bufferlist
*pbl
)
1213 return io_ctx_impl
->checksum(obj
, get_checksum_op_type(type
), init_value_bl
,
1214 len
, off
, chunk_size
, pbl
);
1217 int librados::IoCtx::remove(const std::string
& oid
)
1220 return io_ctx_impl
->remove(obj
);
1223 int librados::IoCtx::remove(const std::string
& oid
, int flags
)
1226 return io_ctx_impl
->remove(obj
, flags
);
1229 int librados::IoCtx::trunc(const std::string
& oid
, uint64_t size
)
1232 return io_ctx_impl
->trunc(obj
, size
);
1235 int librados::IoCtx::mapext(const std::string
& oid
, uint64_t off
, size_t len
,
1236 std::map
<uint64_t,uint64_t>& m
)
1239 return io_ctx_impl
->mapext(obj
, off
, len
, m
);
1242 int librados::IoCtx::cmpext(const std::string
& oid
, uint64_t off
, bufferlist
& cmp_bl
)
1245 return io_ctx_impl
->cmpext(obj
, off
, cmp_bl
);
1248 int librados::IoCtx::sparse_read(const std::string
& oid
, std::map
<uint64_t,uint64_t>& m
,
1249 bufferlist
& bl
, size_t len
, uint64_t off
)
1252 return io_ctx_impl
->sparse_read(obj
, m
, bl
, len
, off
);
1255 int librados::IoCtx::getxattr(const std::string
& oid
, const char *name
, bufferlist
& bl
)
1258 return io_ctx_impl
->getxattr(obj
, name
, bl
);
1261 int librados::IoCtx::getxattrs(const std::string
& oid
, map
<std::string
, bufferlist
>& attrset
)
1264 return io_ctx_impl
->getxattrs(obj
, attrset
);
1267 int librados::IoCtx::setxattr(const std::string
& oid
, const char *name
, bufferlist
& bl
)
1270 return io_ctx_impl
->setxattr(obj
, name
, bl
);
1273 int librados::IoCtx::rmxattr(const std::string
& oid
, const char *name
)
1276 return io_ctx_impl
->rmxattr(obj
, name
);
1279 int librados::IoCtx::stat(const std::string
& oid
, uint64_t *psize
, time_t *pmtime
)
1282 return io_ctx_impl
->stat(obj
, psize
, pmtime
);
1285 int librados::IoCtx::stat2(const std::string
& oid
, uint64_t *psize
, struct timespec
*pts
)
1288 return io_ctx_impl
->stat2(obj
, psize
, pts
);
1291 int librados::IoCtx::exec(const std::string
& oid
, const char *cls
, const char *method
,
1292 bufferlist
& inbl
, bufferlist
& outbl
)
1295 return io_ctx_impl
->exec(obj
, cls
, method
, inbl
, outbl
);
1298 int librados::IoCtx::tmap_update(const std::string
& oid
, bufferlist
& cmdbl
)
1301 return io_ctx_impl
->tmap_update(obj
, cmdbl
);
1304 int librados::IoCtx::tmap_put(const std::string
& oid
, bufferlist
& bl
)
1307 return io_ctx_impl
->tmap_put(obj
, bl
);
1310 int librados::IoCtx::tmap_get(const std::string
& oid
, bufferlist
& bl
)
1313 return io_ctx_impl
->tmap_get(obj
, bl
);
1316 int librados::IoCtx::tmap_to_omap(const std::string
& oid
, bool nullok
)
1319 return io_ctx_impl
->tmap_to_omap(obj
, nullok
);
1322 int librados::IoCtx::omap_get_vals(const std::string
& oid
,
1323 const std::string
& start_after
,
1324 uint64_t max_return
,
1325 std::map
<std::string
, bufferlist
> *out_vals
)
1327 return omap_get_vals(oid
, start_after
, string(), max_return
, out_vals
);
1330 int librados::IoCtx::omap_get_vals2(
1331 const std::string
& oid
,
1332 const std::string
& start_after
,
1333 uint64_t max_return
,
1334 std::map
<std::string
, bufferlist
> *out_vals
,
1337 ObjectReadOperation op
;
1339 op
.omap_get_vals2(start_after
, max_return
, out_vals
, pmore
, &r
);
1341 int ret
= operate(oid
, &op
, &bl
);
1347 int librados::IoCtx::omap_get_keys(const std::string
& oid
,
1348 const std::string
& orig_start_after
,
1349 uint64_t max_return
,
1350 std::set
<std::string
> *out_keys
)
1353 string start_after
= orig_start_after
;
1355 while (max_return
> 0 && more
) {
1356 std::set
<std::string
> out
;
1357 ObjectReadOperation op
;
1358 op
.omap_get_keys2(start_after
, max_return
, &out
, &more
, nullptr);
1360 int ret
= operate(oid
, &op
, &bl
);
1366 return -EINVAL
; // wth
1368 start_after
= *out
.rbegin();
1370 if (out
.size() <= max_return
) {
1371 max_return
-= out
.size();
1376 out_keys
->swap(out
);
1379 out_keys
->insert(out
.begin(), out
.end());
1386 int librados::IoCtx::omap_get_keys2(
1387 const std::string
& oid
,
1388 const std::string
& start_after
,
1389 uint64_t max_return
,
1390 std::set
<std::string
> *out_keys
,
1393 ObjectReadOperation op
;
1395 op
.omap_get_keys2(start_after
, max_return
, out_keys
, pmore
, &r
);
1397 int ret
= operate(oid
, &op
, &bl
);
1403 int librados::IoCtx::omap_get_header(const std::string
& oid
,
1406 ObjectReadOperation op
;
1408 op
.omap_get_header(bl
, &r
);
1410 int ret
= operate(oid
, &op
, &b
);
1417 int librados::IoCtx::omap_get_vals_by_keys(const std::string
& oid
,
1418 const std::set
<std::string
>& keys
,
1419 std::map
<std::string
, bufferlist
> *vals
)
1421 ObjectReadOperation op
;
1424 op
.omap_get_vals_by_keys(keys
, vals
, &r
);
1425 int ret
= operate(oid
, &op
, &bl
);
1432 int librados::IoCtx::omap_set(const std::string
& oid
,
1433 const map
<string
, bufferlist
>& m
)
1435 ObjectWriteOperation op
;
1437 return operate(oid
, &op
);
1440 int librados::IoCtx::omap_set_header(const std::string
& oid
,
1441 const bufferlist
& bl
)
1443 ObjectWriteOperation op
;
1444 op
.omap_set_header(bl
);
1445 return operate(oid
, &op
);
1448 int librados::IoCtx::omap_clear(const std::string
& oid
)
1450 ObjectWriteOperation op
;
1452 return operate(oid
, &op
);
1455 int librados::IoCtx::omap_rm_keys(const std::string
& oid
,
1456 const std::set
<std::string
>& keys
)
1458 ObjectWriteOperation op
;
1459 op
.omap_rm_keys(keys
);
1460 return operate(oid
, &op
);
1465 static int translate_flags(int flags
)
1468 if (flags
& librados::OPERATION_BALANCE_READS
)
1469 op_flags
|= CEPH_OSD_FLAG_BALANCE_READS
;
1470 if (flags
& librados::OPERATION_LOCALIZE_READS
)
1471 op_flags
|= CEPH_OSD_FLAG_LOCALIZE_READS
;
1472 if (flags
& librados::OPERATION_ORDER_READS_WRITES
)
1473 op_flags
|= CEPH_OSD_FLAG_RWORDERED
;
1474 if (flags
& librados::OPERATION_IGNORE_CACHE
)
1475 op_flags
|= CEPH_OSD_FLAG_IGNORE_CACHE
;
1476 if (flags
& librados::OPERATION_SKIPRWLOCKS
)
1477 op_flags
|= CEPH_OSD_FLAG_SKIPRWLOCKS
;
1478 if (flags
& librados::OPERATION_IGNORE_OVERLAY
)
1479 op_flags
|= CEPH_OSD_FLAG_IGNORE_OVERLAY
;
1480 if (flags
& librados::OPERATION_FULL_TRY
)
1481 op_flags
|= CEPH_OSD_FLAG_FULL_TRY
;
1482 if (flags
& librados::OPERATION_FULL_FORCE
)
1483 op_flags
|= CEPH_OSD_FLAG_FULL_FORCE
;
1484 if (flags
& librados::OPERATION_IGNORE_REDIRECT
)
1485 op_flags
|= CEPH_OSD_FLAG_IGNORE_REDIRECT
;
1490 int librados::IoCtx::operate(const std::string
& oid
, librados::ObjectWriteOperation
*o
)
1493 return io_ctx_impl
->operate(obj
, &o
->impl
->o
, (ceph::real_time
*)o
->impl
->prt
);
1496 int librados::IoCtx::operate(const std::string
& oid
, librados::ObjectReadOperation
*o
, bufferlist
*pbl
)
1499 return io_ctx_impl
->operate_read(obj
, &o
->impl
->o
, pbl
);
1502 int librados::IoCtx::aio_operate(const std::string
& oid
, AioCompletion
*c
,
1503 librados::ObjectWriteOperation
*o
)
1506 return io_ctx_impl
->aio_operate(obj
, &o
->impl
->o
, c
->pc
,
1507 io_ctx_impl
->snapc
, 0);
1509 int librados::IoCtx::aio_operate(const std::string
& oid
, AioCompletion
*c
,
1510 ObjectWriteOperation
*o
, int flags
)
1513 return io_ctx_impl
->aio_operate(obj
, &o
->impl
->o
, c
->pc
,
1515 translate_flags(flags
));
1518 int librados::IoCtx::aio_operate(const std::string
& oid
, AioCompletion
*c
,
1519 librados::ObjectWriteOperation
*o
,
1520 snap_t snap_seq
, std::vector
<snap_t
>& snaps
)
1523 vector
<snapid_t
> snv
;
1524 snv
.resize(snaps
.size());
1525 for (size_t i
= 0; i
< snaps
.size(); ++i
)
1527 SnapContext
snapc(snap_seq
, snv
);
1528 return io_ctx_impl
->aio_operate(obj
, &o
->impl
->o
, c
->pc
,
1532 int librados::IoCtx::aio_operate(const std::string
& oid
, AioCompletion
*c
,
1533 librados::ObjectWriteOperation
*o
,
1534 snap_t snap_seq
, std::vector
<snap_t
>& snaps
,
1535 const blkin_trace_info
*trace_info
)
1538 vector
<snapid_t
> snv
;
1539 snv
.resize(snaps
.size());
1540 for (size_t i
= 0; i
< snaps
.size(); ++i
)
1542 SnapContext
snapc(snap_seq
, snv
);
1543 return io_ctx_impl
->aio_operate(obj
, &o
->impl
->o
, c
->pc
,
1544 snapc
, 0, trace_info
);
1547 int librados::IoCtx::aio_operate(const std::string
& oid
, AioCompletion
*c
,
1548 librados::ObjectReadOperation
*o
,
1552 return io_ctx_impl
->aio_operate_read(obj
, &o
->impl
->o
, c
->pc
,
1557 int librados::IoCtx::aio_operate(const std::string
& oid
, AioCompletion
*c
,
1558 librados::ObjectReadOperation
*o
,
1559 snap_t snapid_unused_deprecated
,
1560 int flags
, bufferlist
*pbl
)
1564 if (flags
& OPERATION_BALANCE_READS
)
1565 op_flags
|= CEPH_OSD_FLAG_BALANCE_READS
;
1566 if (flags
& OPERATION_LOCALIZE_READS
)
1567 op_flags
|= CEPH_OSD_FLAG_LOCALIZE_READS
;
1568 if (flags
& OPERATION_ORDER_READS_WRITES
)
1569 op_flags
|= CEPH_OSD_FLAG_RWORDERED
;
1571 return io_ctx_impl
->aio_operate_read(obj
, &o
->impl
->o
, c
->pc
,
1575 int librados::IoCtx::aio_operate(const std::string
& oid
, AioCompletion
*c
,
1576 librados::ObjectReadOperation
*o
,
1577 int flags
, bufferlist
*pbl
)
1580 return io_ctx_impl
->aio_operate_read(obj
, &o
->impl
->o
, c
->pc
,
1581 translate_flags(flags
), pbl
);
1584 int librados::IoCtx::aio_operate(const std::string
& oid
, AioCompletion
*c
,
1585 librados::ObjectReadOperation
*o
,
1586 int flags
, bufferlist
*pbl
, const blkin_trace_info
*trace_info
)
1589 return io_ctx_impl
->aio_operate_read(obj
, &o
->impl
->o
, c
->pc
,
1590 translate_flags(flags
), pbl
, trace_info
);
1593 void librados::IoCtx::snap_set_read(snap_t seq
)
1595 io_ctx_impl
->set_snap_read(seq
);
1598 int librados::IoCtx::selfmanaged_snap_set_write_ctx(snap_t seq
, vector
<snap_t
>& snaps
)
1600 vector
<snapid_t
> snv
;
1601 snv
.resize(snaps
.size());
1602 for (unsigned i
=0; i
<snaps
.size(); i
++)
1604 return io_ctx_impl
->set_snap_write_context(seq
, snv
);
1607 int librados::IoCtx::snap_create(const char *snapname
)
1609 return io_ctx_impl
->snap_create(snapname
);
1612 int librados::IoCtx::snap_lookup(const char *name
, snap_t
*snapid
)
1614 return io_ctx_impl
->snap_lookup(name
, snapid
);
1617 int librados::IoCtx::snap_get_stamp(snap_t snapid
, time_t *t
)
1619 return io_ctx_impl
->snap_get_stamp(snapid
, t
);
1622 int librados::IoCtx::snap_get_name(snap_t snapid
, std::string
*s
)
1624 return io_ctx_impl
->snap_get_name(snapid
, s
);
1627 int librados::IoCtx::snap_remove(const char *snapname
)
1629 return io_ctx_impl
->snap_remove(snapname
);
1632 int librados::IoCtx::snap_list(std::vector
<snap_t
> *snaps
)
1634 return io_ctx_impl
->snap_list(snaps
);
1637 int librados::IoCtx::snap_rollback(const std::string
& oid
, const char *snapname
)
1639 return io_ctx_impl
->rollback(oid
, snapname
);
1642 // Deprecated name kept for backward compatibility
1643 int librados::IoCtx::rollback(const std::string
& oid
, const char *snapname
)
1645 return snap_rollback(oid
, snapname
);
1648 int librados::IoCtx::selfmanaged_snap_create(uint64_t *snapid
)
1650 return io_ctx_impl
->selfmanaged_snap_create(snapid
);
1653 void librados::IoCtx::aio_selfmanaged_snap_create(uint64_t *snapid
,
1656 io_ctx_impl
->aio_selfmanaged_snap_create(snapid
, c
->pc
);
1659 int librados::IoCtx::selfmanaged_snap_remove(uint64_t snapid
)
1661 return io_ctx_impl
->selfmanaged_snap_remove(snapid
);
1664 void librados::IoCtx::aio_selfmanaged_snap_remove(uint64_t snapid
,
1667 io_ctx_impl
->aio_selfmanaged_snap_remove(snapid
, c
->pc
);
1670 int librados::IoCtx::selfmanaged_snap_rollback(const std::string
& oid
, uint64_t snapid
)
1672 return io_ctx_impl
->selfmanaged_snap_rollback_object(oid
,
1677 int librados::IoCtx::lock_exclusive(const std::string
&oid
, const std::string
&name
,
1678 const std::string
&cookie
,
1679 const std::string
&description
,
1680 struct timeval
* duration
, uint8_t flags
)
1682 utime_t dur
= utime_t();
1684 dur
.set_from_timeval(duration
);
1686 return rados::cls::lock::lock(this, oid
, name
, LOCK_EXCLUSIVE
, cookie
, "",
1687 description
, dur
, flags
);
1690 int librados::IoCtx::lock_shared(const std::string
&oid
, const std::string
&name
,
1691 const std::string
&cookie
, const std::string
&tag
,
1692 const std::string
&description
,
1693 struct timeval
* duration
, uint8_t flags
)
1695 utime_t dur
= utime_t();
1697 dur
.set_from_timeval(duration
);
1699 return rados::cls::lock::lock(this, oid
, name
, LOCK_SHARED
, cookie
, tag
,
1700 description
, dur
, flags
);
1703 int librados::IoCtx::unlock(const std::string
&oid
, const std::string
&name
,
1704 const std::string
&cookie
)
1706 return rados::cls::lock::unlock(this, oid
, name
, cookie
);
1709 struct AioUnlockCompletion
: public librados::ObjectOperationCompletion
{
1710 librados::AioCompletionImpl
*completion
;
1711 AioUnlockCompletion(librados::AioCompletion
*c
) : completion(c
->pc
) {
1714 void handle_completion(int r
, bufferlist
& outbl
) override
{
1715 rados_callback_t cb
= completion
->callback_complete
;
1716 void *cb_arg
= completion
->callback_complete_arg
;
1717 cb(completion
, cb_arg
);
1718 completion
->lock
.Lock();
1719 completion
->callback_complete
= NULL
;
1720 completion
->cond
.Signal();
1721 completion
->put_unlock();
1725 int librados::IoCtx::aio_unlock(const std::string
&oid
, const std::string
&name
,
1726 const std::string
&cookie
, AioCompletion
*c
)
1728 return rados::cls::lock::aio_unlock(this, oid
, name
, cookie
, c
);
1731 int librados::IoCtx::break_lock(const std::string
&oid
, const std::string
&name
,
1732 const std::string
&client
, const std::string
&cookie
)
1734 entity_name_t locker
;
1735 if (!locker
.parse(client
))
1737 return rados::cls::lock::break_lock(this, oid
, name
, cookie
, locker
);
1740 int librados::IoCtx::list_lockers(const std::string
&oid
, const std::string
&name
,
1743 std::list
<librados::locker_t
> *lockers
)
1745 std::list
<librados::locker_t
> tmp_lockers
;
1746 map
<rados::cls::lock::locker_id_t
, rados::cls::lock::locker_info_t
> rados_lockers
;
1747 std::string tmp_tag
;
1748 ClsLockType tmp_type
;
1749 int r
= rados::cls::lock::get_lock_info(this, oid
, name
, &rados_lockers
, &tmp_type
, &tmp_tag
);
1753 map
<rados::cls::lock::locker_id_t
, rados::cls::lock::locker_info_t
>::iterator map_it
;
1754 for (map_it
= rados_lockers
.begin(); map_it
!= rados_lockers
.end(); ++map_it
) {
1755 librados::locker_t locker
;
1756 locker
.client
= stringify(map_it
->first
.locker
);
1757 locker
.cookie
= map_it
->first
.cookie
;
1758 locker
.address
= stringify(map_it
->second
.addr
);
1759 tmp_lockers
.push_back(locker
);
1763 *lockers
= tmp_lockers
;
1767 if (tmp_type
== LOCK_EXCLUSIVE
)
1773 return tmp_lockers
.size();
1776 librados::NObjectIterator
librados::IoCtx::nobjects_begin()
1779 return nobjects_begin(bl
);
1782 librados::NObjectIterator
librados::IoCtx::nobjects_begin(
1783 const bufferlist
&filter
)
1785 rados_list_ctx_t listh
;
1786 rados_nobjects_list_open(io_ctx_impl
, &listh
);
1787 NObjectIterator
iter((ObjListCtx
*)listh
);
1788 if (filter
.length() > 0) {
1789 iter
.set_filter(filter
);
1795 librados::NObjectIterator
librados::IoCtx::nobjects_begin(uint32_t pos
)
1798 return nobjects_begin(pos
, bl
);
1801 librados::NObjectIterator
librados::IoCtx::nobjects_begin(
1802 uint32_t pos
, const bufferlist
&filter
)
1804 rados_list_ctx_t listh
;
1805 rados_nobjects_list_open(io_ctx_impl
, &listh
);
1806 NObjectIterator
iter((ObjListCtx
*)listh
);
1807 if (filter
.length() > 0) {
1808 iter
.set_filter(filter
);
1814 librados::NObjectIterator
librados::IoCtx::nobjects_begin(const ObjectCursor
& cursor
)
1817 return nobjects_begin(cursor
, bl
);
1820 librados::NObjectIterator
librados::IoCtx::nobjects_begin(
1821 const ObjectCursor
& cursor
, const bufferlist
&filter
)
1823 rados_list_ctx_t listh
;
1824 rados_nobjects_list_open(io_ctx_impl
, &listh
);
1825 NObjectIterator
iter((ObjListCtx
*)listh
);
1826 if (filter
.length() > 0) {
1827 iter
.set_filter(filter
);
1833 const librados::NObjectIterator
& librados::IoCtx::nobjects_end() const
1835 return NObjectIterator::__EndObjectIterator
;
1838 int librados::IoCtx::hit_set_list(uint32_t hash
, AioCompletion
*c
,
1839 std::list
< std::pair
<time_t, time_t> > *pls
)
1841 return io_ctx_impl
->hit_set_list(hash
, c
->pc
, pls
);
1844 int librados::IoCtx::hit_set_get(uint32_t hash
, AioCompletion
*c
, time_t stamp
,
1847 return io_ctx_impl
->hit_set_get(hash
, c
->pc
, stamp
, pbl
);
1852 uint64_t librados::IoCtx::get_last_version()
1854 return io_ctx_impl
->last_version();
1857 int librados::IoCtx::aio_read(const std::string
& oid
, librados::AioCompletion
*c
,
1858 bufferlist
*pbl
, size_t len
, uint64_t off
)
1860 return io_ctx_impl
->aio_read(oid
, c
->pc
, pbl
, len
, off
,
1861 io_ctx_impl
->snap_seq
);
1864 int librados::IoCtx::aio_read(const std::string
& oid
, librados::AioCompletion
*c
,
1865 bufferlist
*pbl
, size_t len
, uint64_t off
,
1868 return io_ctx_impl
->aio_read(oid
, c
->pc
, pbl
, len
, off
, snapid
);
1871 int librados::IoCtx::aio_exec(const std::string
& oid
,
1872 librados::AioCompletion
*c
, const char *cls
,
1873 const char *method
, bufferlist
& inbl
,
1877 return io_ctx_impl
->aio_exec(obj
, c
->pc
, cls
, method
, inbl
, outbl
);
1880 int librados::IoCtx::aio_cmpext(const std::string
& oid
,
1881 librados::AioCompletion
*c
,
1885 return io_ctx_impl
->aio_cmpext(oid
, c
->pc
, off
, cmp_bl
);
1888 int librados::IoCtx::aio_sparse_read(const std::string
& oid
, librados::AioCompletion
*c
,
1889 std::map
<uint64_t,uint64_t> *m
, bufferlist
*data_bl
,
1890 size_t len
, uint64_t off
)
1892 return io_ctx_impl
->aio_sparse_read(oid
, c
->pc
,
1893 m
, data_bl
, len
, off
,
1894 io_ctx_impl
->snap_seq
);
1897 int librados::IoCtx::aio_sparse_read(const std::string
& oid
, librados::AioCompletion
*c
,
1898 std::map
<uint64_t,uint64_t> *m
, bufferlist
*data_bl
,
1899 size_t len
, uint64_t off
, uint64_t snapid
)
1901 return io_ctx_impl
->aio_sparse_read(oid
, c
->pc
,
1902 m
, data_bl
, len
, off
, snapid
);
1905 int librados::IoCtx::aio_write(const std::string
& oid
, librados::AioCompletion
*c
,
1906 const bufferlist
& bl
, size_t len
, uint64_t off
)
1908 return io_ctx_impl
->aio_write(oid
, c
->pc
, bl
, len
, off
);
1911 int librados::IoCtx::aio_append(const std::string
& oid
, librados::AioCompletion
*c
,
1912 const bufferlist
& bl
, size_t len
)
1914 return io_ctx_impl
->aio_append(oid
, c
->pc
, bl
, len
);
1917 int librados::IoCtx::aio_write_full(const std::string
& oid
, librados::AioCompletion
*c
,
1918 const bufferlist
& bl
)
1921 return io_ctx_impl
->aio_write_full(obj
, c
->pc
, bl
);
1924 int librados::IoCtx::aio_writesame(const std::string
& oid
, librados::AioCompletion
*c
,
1925 const bufferlist
& bl
, size_t write_len
,
1928 return io_ctx_impl
->aio_writesame(oid
, c
->pc
, bl
, write_len
, off
);
1932 int librados::IoCtx::aio_remove(const std::string
& oid
, librados::AioCompletion
*c
)
1934 return io_ctx_impl
->aio_remove(oid
, c
->pc
);
1937 int librados::IoCtx::aio_remove(const std::string
& oid
, librados::AioCompletion
*c
, int flags
)
1939 return io_ctx_impl
->aio_remove(oid
, c
->pc
, flags
);
1942 int librados::IoCtx::aio_flush_async(librados::AioCompletion
*c
)
1944 io_ctx_impl
->flush_aio_writes_async(c
->pc
);
1948 int librados::IoCtx::aio_flush()
1950 io_ctx_impl
->flush_aio_writes();
1954 struct AioGetxattrDataPP
{
1955 AioGetxattrDataPP(librados::AioCompletionImpl
*c
, bufferlist
*_bl
) :
1956 bl(_bl
), completion(c
) {}
1958 struct librados::C_AioCompleteAndSafe completion
;
1961 static void rados_aio_getxattr_completepp(rados_completion_t c
, void *arg
) {
1962 AioGetxattrDataPP
*cdata
= reinterpret_cast<AioGetxattrDataPP
*>(arg
);
1963 int rc
= rados_aio_get_return_value(c
);
1965 rc
= cdata
->bl
->length();
1967 cdata
->completion
.finish(rc
);
1971 int librados::IoCtx::aio_getxattr(const std::string
& oid
, librados::AioCompletion
*c
,
1972 const char *name
, bufferlist
& bl
)
1974 // create data object to be passed to async callback
1975 AioGetxattrDataPP
*cdata
= new AioGetxattrDataPP(c
->pc
, &bl
);
1979 // create completion callback
1980 librados::AioCompletionImpl
*comp
= new librados::AioCompletionImpl
;
1981 comp
->set_complete_callback(cdata
, rados_aio_getxattr_completepp
);
1982 // call actual getxattr from IoCtxImpl
1984 return io_ctx_impl
->aio_getxattr(obj
, comp
, name
, bl
);
1987 int librados::IoCtx::aio_getxattrs(const std::string
& oid
, AioCompletion
*c
,
1988 map
<std::string
, bufferlist
>& attrset
)
1991 return io_ctx_impl
->aio_getxattrs(obj
, c
->pc
, attrset
);
1994 int librados::IoCtx::aio_setxattr(const std::string
& oid
, AioCompletion
*c
,
1995 const char *name
, bufferlist
& bl
)
1998 return io_ctx_impl
->aio_setxattr(obj
, c
->pc
, name
, bl
);
2001 int librados::IoCtx::aio_rmxattr(const std::string
& oid
, AioCompletion
*c
,
2005 return io_ctx_impl
->aio_rmxattr(obj
, c
->pc
, name
);
2008 int librados::IoCtx::aio_stat(const std::string
& oid
, librados::AioCompletion
*c
,
2009 uint64_t *psize
, time_t *pmtime
)
2012 return io_ctx_impl
->aio_stat(obj
, c
->pc
, psize
, pmtime
);
2015 int librados::IoCtx::aio_cancel(librados::AioCompletion
*c
)
2017 return io_ctx_impl
->aio_cancel(c
->pc
);
2020 int librados::IoCtx::watch(const string
& oid
, uint64_t ver
, uint64_t *cookie
,
2021 librados::WatchCtx
*ctx
)
2024 return io_ctx_impl
->watch(obj
, cookie
, ctx
, NULL
);
2027 int librados::IoCtx::watch2(const string
& oid
, uint64_t *cookie
,
2028 librados::WatchCtx2
*ctx2
)
2031 return io_ctx_impl
->watch(obj
, cookie
, NULL
, ctx2
);
2034 int librados::IoCtx::watch3(const string
& oid
, uint64_t *cookie
,
2035 librados::WatchCtx2
*ctx2
, uint32_t timeout
)
2038 return io_ctx_impl
->watch(obj
, cookie
, NULL
, ctx2
, timeout
);
2041 int librados::IoCtx::aio_watch(const string
& oid
, AioCompletion
*c
,
2043 librados::WatchCtx2
*ctx2
)
2046 return io_ctx_impl
->aio_watch(obj
, c
->pc
, cookie
, NULL
, ctx2
);
2049 int librados::IoCtx::aio_watch2(const string
& oid
, AioCompletion
*c
,
2051 librados::WatchCtx2
*ctx2
,
2055 return io_ctx_impl
->aio_watch(obj
, c
->pc
, cookie
, NULL
, ctx2
, timeout
);
2058 int librados::IoCtx::unwatch(const string
& oid
, uint64_t handle
)
2060 return io_ctx_impl
->unwatch(handle
);
2063 int librados::IoCtx::unwatch2(uint64_t handle
)
2065 return io_ctx_impl
->unwatch(handle
);
2068 int librados::IoCtx::aio_unwatch(uint64_t handle
, AioCompletion
*c
)
2070 return io_ctx_impl
->aio_unwatch(handle
, c
->pc
);
2073 int librados::IoCtx::watch_check(uint64_t handle
)
2075 return io_ctx_impl
->watch_check(handle
);
2078 int librados::IoCtx::notify(const string
& oid
, uint64_t ver
, bufferlist
& bl
)
2081 return io_ctx_impl
->notify(obj
, bl
, 0, NULL
, NULL
, NULL
);
2084 int librados::IoCtx::notify2(const string
& oid
, bufferlist
& bl
,
2085 uint64_t timeout_ms
, bufferlist
*preplybl
)
2088 return io_ctx_impl
->notify(obj
, bl
, timeout_ms
, preplybl
, NULL
, NULL
);
2091 int librados::IoCtx::aio_notify(const string
& oid
, AioCompletion
*c
,
2092 bufferlist
& bl
, uint64_t timeout_ms
,
2093 bufferlist
*preplybl
)
2096 return io_ctx_impl
->aio_notify(obj
, c
->pc
, bl
, timeout_ms
, preplybl
, NULL
,
2100 void librados::IoCtx::notify_ack(const std::string
& o
,
2101 uint64_t notify_id
, uint64_t handle
,
2104 io_ctx_impl
->notify_ack(o
, notify_id
, handle
, bl
);
2107 int librados::IoCtx::list_watchers(const std::string
& oid
,
2108 std::list
<obj_watch_t
> *out_watchers
)
2110 ObjectReadOperation op
;
2112 op
.list_watchers(out_watchers
, &r
);
2114 int ret
= operate(oid
, &op
, &bl
);
2121 int librados::IoCtx::list_snaps(const std::string
& oid
,
2122 snap_set_t
*out_snaps
)
2124 ObjectReadOperation op
;
2126 if (io_ctx_impl
->snap_seq
!= CEPH_SNAPDIR
)
2128 op
.list_snaps(out_snaps
, &r
);
2130 int ret
= operate(oid
, &op
, &bl
);
2137 void librados::IoCtx::set_notify_timeout(uint32_t timeout
)
2139 io_ctx_impl
->set_notify_timeout(timeout
);
2142 int librados::IoCtx::set_alloc_hint(const std::string
& o
,
2143 uint64_t expected_object_size
,
2144 uint64_t expected_write_size
)
2147 return io_ctx_impl
->set_alloc_hint(oid
, expected_object_size
,
2148 expected_write_size
, 0);
2151 int librados::IoCtx::set_alloc_hint2(const std::string
& o
,
2152 uint64_t expected_object_size
,
2153 uint64_t expected_write_size
,
2157 return io_ctx_impl
->set_alloc_hint(oid
, expected_object_size
,
2158 expected_write_size
, flags
);
2161 void librados::IoCtx::set_assert_version(uint64_t ver
)
2163 io_ctx_impl
->set_assert_version(ver
);
2166 void librados::IoCtx::locator_set_key(const string
& key
)
2168 io_ctx_impl
->oloc
.key
= key
;
2171 void librados::IoCtx::set_namespace(const string
& nspace
)
2173 io_ctx_impl
->oloc
.nspace
= nspace
;
2176 int64_t librados::IoCtx::get_id()
2178 return io_ctx_impl
->get_id();
2181 uint32_t librados::IoCtx::get_object_hash_position(const std::string
& oid
)
2184 int r
= io_ctx_impl
->get_object_hash_position(oid
, &hash
);
2190 uint32_t librados::IoCtx::get_object_pg_hash_position(const std::string
& oid
)
2193 int r
= io_ctx_impl
->get_object_pg_hash_position(oid
, &hash
);
2199 int librados::IoCtx::get_object_hash_position2(
2200 const std::string
& oid
, uint32_t *hash_position
)
2202 return io_ctx_impl
->get_object_hash_position(oid
, hash_position
);
2205 int librados::IoCtx::get_object_pg_hash_position2(
2206 const std::string
& oid
, uint32_t *pg_hash_position
)
2208 return io_ctx_impl
->get_object_pg_hash_position(oid
, pg_hash_position
);
2211 librados::config_t
librados::IoCtx::cct()
2213 return (config_t
)io_ctx_impl
->client
->cct
;
2216 librados::IoCtx::IoCtx(IoCtxImpl
*io_ctx_impl_
)
2217 : io_ctx_impl(io_ctx_impl_
)
2221 void librados::IoCtx::set_osdmap_full_try()
2223 io_ctx_impl
->objecter
->set_osdmap_full_try();
2226 void librados::IoCtx::unset_osdmap_full_try()
2228 io_ctx_impl
->objecter
->unset_osdmap_full_try();
2231 ///////////////////////////// Rados //////////////////////////////
2232 void librados::Rados::version(int *major
, int *minor
, int *extra
)
2234 rados_version(major
, minor
, extra
);
2237 librados::Rados::Rados() : client(NULL
)
2241 librados::Rados::Rados(IoCtx
&ioctx
)
2243 client
= ioctx
.io_ctx_impl
->client
;
2244 assert(client
!= NULL
);
2248 librados::Rados::~Rados()
2253 int librados::Rados::init(const char * const id
)
2255 return rados_create((rados_t
*)&client
, id
);
2258 int librados::Rados::init2(const char * const name
,
2259 const char * const clustername
, uint64_t flags
)
2261 return rados_create2((rados_t
*)&client
, clustername
, name
, flags
);
2264 int librados::Rados::init_with_context(config_t cct_
)
2266 return rados_create_with_context((rados_t
*)&client
, (rados_config_t
)cct_
);
2269 int librados::Rados::connect()
2271 return client
->connect();
2274 librados::config_t
librados::Rados::cct()
2276 return (config_t
)client
->cct
;
2279 int librados::Rados::watch_flush()
2283 return client
->watch_flush();
2286 int librados::Rados::aio_watch_flush(AioCompletion
*c
)
2290 return client
->async_watch_flush(c
->pc
);
2293 void librados::Rados::shutdown()
2297 if (client
->put()) {
2304 uint64_t librados::Rados::get_instance_id()
2306 return client
->get_instance_id();
2309 int librados::Rados::conf_read_file(const char * const path
) const
2311 return rados_conf_read_file((rados_t
)client
, path
);
2314 int librados::Rados::conf_parse_argv(int argc
, const char ** argv
) const
2316 return rados_conf_parse_argv((rados_t
)client
, argc
, argv
);
2319 int librados::Rados::conf_parse_argv_remainder(int argc
, const char ** argv
,
2320 const char ** remargv
) const
2322 return rados_conf_parse_argv_remainder((rados_t
)client
, argc
, argv
, remargv
);
2325 int librados::Rados::conf_parse_env(const char *name
) const
2327 return rados_conf_parse_env((rados_t
)client
, name
);
2330 int librados::Rados::conf_set(const char *option
, const char *value
)
2332 return rados_conf_set((rados_t
)client
, option
, value
);
2335 int librados::Rados::conf_get(const char *option
, std::string
&val
)
2338 md_config_t
*conf
= client
->cct
->_conf
;
2339 int ret
= conf
->get_val(option
, &str
, -1);
2349 int librados::Rados::service_daemon_register(
2350 const std::string
& service
, ///< service name (e.g., 'rgw')
2351 const std::string
& name
, ///< daemon name (e.g., 'gwfoo')
2352 const std::map
<std::string
,std::string
>& metadata
) ///< static metadata about daemon
2354 return client
->service_daemon_register(service
, name
, metadata
);
2357 int librados::Rados::service_daemon_update_status(
2358 const std::map
<std::string
,std::string
>& status
)
2360 return client
->service_daemon_update_status(status
);
2363 int librados::Rados::pool_create(const char *name
)
2366 return client
->pool_create(str
);
2369 int librados::Rados::pool_create(const char *name
, uint64_t auid
)
2372 return client
->pool_create(str
, auid
);
2375 int librados::Rados::pool_create(const char *name
, uint64_t auid
, __u8 crush_rule
)
2378 return client
->pool_create(str
, auid
, crush_rule
);
2381 int librados::Rados::pool_create_async(const char *name
, PoolAsyncCompletion
*c
)
2384 return client
->pool_create_async(str
, c
->pc
);
2387 int librados::Rados::pool_create_async(const char *name
, uint64_t auid
, PoolAsyncCompletion
*c
)
2390 return client
->pool_create_async(str
, c
->pc
, auid
);
2393 int librados::Rados::pool_create_async(const char *name
, uint64_t auid
, __u8 crush_rule
,
2394 PoolAsyncCompletion
*c
)
2397 return client
->pool_create_async(str
, c
->pc
, auid
, crush_rule
);
2400 int librados::Rados::pool_get_base_tier(int64_t pool_id
, int64_t* base_tier
)
2402 tracepoint(librados
, rados_pool_get_base_tier_enter
, (rados_t
)client
, pool_id
);
2403 int retval
= client
->pool_get_base_tier(pool_id
, base_tier
);
2404 tracepoint(librados
, rados_pool_get_base_tier_exit
, retval
, *base_tier
);
2408 int librados::Rados::pool_delete(const char *name
)
2410 return client
->pool_delete(name
);
2413 int librados::Rados::pool_delete_async(const char *name
, PoolAsyncCompletion
*c
)
2415 return client
->pool_delete_async(name
, c
->pc
);
2418 int librados::Rados::pool_list(std::list
<std::string
>& v
)
2420 std::list
<std::pair
<int64_t, std::string
> > pools
;
2421 int r
= client
->pool_list(pools
);
2427 for (std::list
<std::pair
<int64_t, std::string
> >::iterator it
= pools
.begin();
2428 it
!= pools
.end(); ++it
) {
2429 v
.push_back(it
->second
);
2434 int librados::Rados::pool_list2(std::list
<std::pair
<int64_t, std::string
> >& v
)
2436 return client
->pool_list(v
);
2439 int64_t librados::Rados::pool_lookup(const char *name
)
2441 return client
->lookup_pool(name
);
2444 int librados::Rados::pool_reverse_lookup(int64_t id
, std::string
*name
)
2446 return client
->pool_get_name(id
, name
);
2449 int librados::Rados::mon_command(string cmd
, const bufferlist
& inbl
,
2450 bufferlist
*outbl
, string
*outs
)
2452 vector
<string
> cmdvec
;
2453 cmdvec
.push_back(cmd
);
2454 return client
->mon_command(cmdvec
, inbl
, outbl
, outs
);
2457 int librados::Rados::osd_command(int osdid
, std::string cmd
, const bufferlist
& inbl
,
2458 bufferlist
*outbl
, std::string
*outs
)
2460 vector
<string
> cmdvec
;
2461 cmdvec
.push_back(cmd
);
2462 return client
->osd_command(osdid
, cmdvec
, inbl
, outbl
, outs
);
2465 int librados::Rados::mgr_command(std::string cmd
, const bufferlist
& inbl
,
2466 bufferlist
*outbl
, std::string
*outs
)
2468 vector
<string
> cmdvec
;
2469 cmdvec
.push_back(cmd
);
2470 return client
->mgr_command(cmdvec
, inbl
, outbl
, outs
);
2475 int librados::Rados::pg_command(const char *pgstr
, std::string cmd
, const bufferlist
& inbl
,
2476 bufferlist
*outbl
, std::string
*outs
)
2478 vector
<string
> cmdvec
;
2479 cmdvec
.push_back(cmd
);
2482 if (!pgid
.parse(pgstr
))
2485 return client
->pg_command(pgid
, cmdvec
, inbl
, outbl
, outs
);
2488 int librados::Rados::ioctx_create(const char *name
, IoCtx
&io
)
2491 int ret
= rados_ioctx_create((rados_t
)client
, name
, &p
);
2495 io
.io_ctx_impl
= (IoCtxImpl
*)p
;
2499 int librados::Rados::ioctx_create2(int64_t pool_id
, IoCtx
&io
)
2502 int ret
= rados_ioctx_create2((rados_t
)client
, pool_id
, &p
);
2506 io
.io_ctx_impl
= (IoCtxImpl
*)p
;
2510 void librados::Rados::test_blacklist_self(bool set
)
2512 client
->blacklist_self(set
);
2515 int librados::Rados::get_pool_stats(std::list
<string
>& v
,
2518 map
<string
,::pool_stat_t
> rawresult
;
2519 int r
= client
->get_pool_stats(v
, rawresult
);
2520 for (map
<string
,::pool_stat_t
>::iterator p
= rawresult
.begin();
2521 p
!= rawresult
.end();
2523 pool_stat_t
& pv
= result
[p
->first
];
2524 object_stat_sum_t
*sum
= &p
->second
.stats
.sum
;
2525 pv
.num_kb
= SHIFT_ROUND_UP(sum
->num_bytes
, 10);
2526 pv
.num_bytes
= sum
->num_bytes
;
2527 pv
.num_objects
= sum
->num_objects
;
2528 pv
.num_object_clones
= sum
->num_object_clones
;
2529 pv
.num_object_copies
= sum
->num_object_copies
;
2530 pv
.num_objects_missing_on_primary
= sum
->num_objects_missing_on_primary
;
2531 pv
.num_objects_unfound
= sum
->num_objects_unfound
;
2532 pv
.num_objects_degraded
= sum
->num_objects_degraded
;
2533 pv
.num_rd
= sum
->num_rd
;
2534 pv
.num_rd_kb
= sum
->num_rd_kb
;
2535 pv
.num_wr
= sum
->num_wr
;
2536 pv
.num_wr_kb
= sum
->num_wr_kb
;
2541 int librados::Rados::get_pool_stats(std::list
<string
>& v
,
2542 std::map
<string
, stats_map
>& result
)
2545 int r
= get_pool_stats(v
, m
);
2548 for (map
<string
,pool_stat_t
>::iterator p
= m
.begin();
2551 result
[p
->first
][string()] = p
->second
;
2556 int librados::Rados::get_pool_stats(std::list
<string
>& v
,
2557 string
& category
, // unused
2558 std::map
<string
, stats_map
>& result
)
2563 bool librados::Rados::get_pool_is_selfmanaged_snaps_mode(const std::string
& pool
)
2565 return client
->get_pool_is_selfmanaged_snaps_mode(pool
);
2568 int librados::Rados::cluster_stat(cluster_stat_t
& result
)
2571 int r
= client
->get_fs_stats(stats
);
2572 result
.kb
= stats
.kb
;
2573 result
.kb_used
= stats
.kb_used
;
2574 result
.kb_avail
= stats
.kb_avail
;
2575 result
.num_objects
= stats
.num_objects
;
2579 int librados::Rados::cluster_fsid(string
*fsid
)
2581 return client
->get_fsid(fsid
);
2584 namespace librados
{
2585 struct PlacementGroupImpl
{
2589 PlacementGroup::PlacementGroup()
2590 : impl
{new PlacementGroupImpl
}
2593 PlacementGroup::PlacementGroup(const PlacementGroup
& pg
)
2594 : impl
{new PlacementGroupImpl
}
2596 impl
->pgid
= pg
.impl
->pgid
;
2599 PlacementGroup::~PlacementGroup()
2602 bool PlacementGroup::parse(const char* s
)
2604 return impl
->pgid
.parse(s
);
2608 std::ostream
& librados::operator<<(std::ostream
& out
,
2609 const librados::PlacementGroup
& pg
)
2611 return out
<< pg
.impl
->pgid
;
2615 int decode_json(JSONObj
*obj
, pg_t
& pg
)
2618 JSONDecoder::decode_json("pgid", pg_str
, obj
);
2619 if (pg
.parse(pg_str
.c_str())) {
2626 int get_inconsistent_pgs(librados::RadosClient
& client
,
2628 std::vector
<librados::PlacementGroup
>* pgs
)
2630 vector
<string
> cmd
= {
2631 "{\"prefix\": \"pg ls\","
2632 "\"pool\": " + std::to_string(pool_id
) + ","
2633 "\"states\": [\"inconsistent\"],"
2634 "\"format\": \"json\"}"
2636 bufferlist inbl
, outbl
;
2638 int ret
= client
.mon_command(cmd
, inbl
, &outbl
, &outstring
);
2642 if (!outbl
.length()) {
2647 if (!parser
.parse(outbl
.c_str(), outbl
.length())) {
2650 if (!parser
.is_array()) {
2653 vector
<string
> v
= parser
.get_array_elements();
2656 if (!pg_json
.parse(i
.c_str(), i
.length())) {
2659 librados::PlacementGroup pg
;
2660 if (decode_json(&pg_json
, pg
.impl
->pgid
)) {
2663 pgs
->emplace_back(pg
);
2669 int librados::Rados::get_inconsistent_pgs(int64_t pool_id
,
2670 std::vector
<PlacementGroup
>* pgs
)
2672 return ::get_inconsistent_pgs(*client
, pool_id
, pgs
);
2675 int librados::Rados::get_inconsistent_objects(const PlacementGroup
& pg
,
2676 const object_id_t
&start_after
,
2677 unsigned max_return
,
2679 std::vector
<inconsistent_obj_t
>* objects
,
2683 const pg_t pgid
= pg
.impl
->pgid
;
2684 int r
= ioctx_create2(pgid
.pool(), ioctx
);
2689 return ioctx
.io_ctx_impl
->get_inconsistent_objects(pgid
,
2697 int librados::Rados::get_inconsistent_snapsets(const PlacementGroup
& pg
,
2698 const object_id_t
&start_after
,
2699 unsigned max_return
,
2701 std::vector
<inconsistent_snapset_t
>* snapsets
,
2705 const pg_t pgid
= pg
.impl
->pgid
;
2706 int r
= ioctx_create2(pgid
.pool(), ioctx
);
2711 return ioctx
.io_ctx_impl
->get_inconsistent_snapsets(pgid
,
2719 int librados::Rados::wait_for_latest_osdmap()
2721 return client
->wait_for_latest_osdmap();
2724 int librados::Rados::blacklist_add(const std::string
& client_address
,
2725 uint32_t expire_seconds
)
2727 return client
->blacklist_add(client_address
, expire_seconds
);
2730 librados::PoolAsyncCompletion
*librados::Rados::pool_async_create_completion()
2732 PoolAsyncCompletionImpl
*c
= new PoolAsyncCompletionImpl
;
2733 return new PoolAsyncCompletion(c
);
2736 librados::AioCompletion
*librados::Rados::aio_create_completion()
2738 AioCompletionImpl
*c
= new AioCompletionImpl
;
2739 return new AioCompletion(c
);
2742 librados::AioCompletion
*librados::Rados::aio_create_completion(void *cb_arg
,
2743 callback_t cb_complete
,
2746 AioCompletionImpl
*c
;
2747 int r
= rados_aio_create_completion(cb_arg
, cb_complete
, cb_safe
, (void**)&c
);
2749 return new AioCompletion(c
);
2752 librados::ObjectOperation::ObjectOperation()
2754 impl
= new ObjectOperationImpl
;
2757 librados::ObjectOperation::~ObjectOperation()
2762 ///////////////////////////// C API //////////////////////////////
2764 static CephContext
*rados_create_cct(const char * const clustername
,
2765 CephInitParameters
*iparams
)
2767 // missing things compared to global_init:
2768 // g_ceph_context, g_conf, g_lockdep, signal handlers
2769 CephContext
*cct
= common_preinit(*iparams
, CODE_ENVIRONMENT_LIBRARY
, 0);
2771 cct
->_conf
->cluster
= clustername
;
2772 cct
->_conf
->parse_env(); // environment variables override
2773 cct
->_conf
->apply_changes(NULL
);
2775 TracepointProvider::initialize
<tracepoint_traits
>(cct
);
2779 extern "C" int rados_create(rados_t
*pcluster
, const char * const id
)
2781 CephInitParameters
iparams(CEPH_ENTITY_TYPE_CLIENT
);
2783 iparams
.name
.set(CEPH_ENTITY_TYPE_CLIENT
, id
);
2785 CephContext
*cct
= rados_create_cct("", &iparams
);
2787 tracepoint(librados
, rados_create_enter
, id
);
2788 *pcluster
= reinterpret_cast<rados_t
>(new librados::RadosClient(cct
));
2789 tracepoint(librados
, rados_create_exit
, 0, *pcluster
);
2796 // 1) don't assume 'client.'; name is a full type.id namestr
2797 // 2) allow setting clustername
2798 // 3) flags is for future expansion (maybe some of the global_init()
2799 // behavior is appropriate for some consumers of librados, for instance)
2801 extern "C" int rados_create2(rados_t
*pcluster
, const char *const clustername
,
2802 const char * const name
, uint64_t flags
)
2804 // client is assumed, but from_str will override
2806 CephInitParameters
iparams(CEPH_ENTITY_TYPE_CLIENT
);
2807 if (!name
|| !iparams
.name
.from_str(name
)) {
2811 CephContext
*cct
= rados_create_cct(clustername
, &iparams
);
2812 tracepoint(librados
, rados_create2_enter
, clustername
, name
, flags
);
2814 *pcluster
= reinterpret_cast<rados_t
>(new librados::RadosClient(cct
));
2816 tracepoint(librados
, rados_create2_exit
, retval
, *pcluster
);
2822 /* This function is intended for use by Ceph daemons. These daemons have
2823 * already called global_init and want to use that particular configuration for
2826 extern "C" int rados_create_with_context(rados_t
*pcluster
, rados_config_t cct_
)
2828 CephContext
*cct
= (CephContext
*)cct_
;
2829 TracepointProvider::initialize
<tracepoint_traits
>(cct
);
2831 tracepoint(librados
, rados_create_with_context_enter
, cct_
);
2832 librados::RadosClient
*radosp
= new librados::RadosClient(cct
);
2833 *pcluster
= (void *)radosp
;
2834 tracepoint(librados
, rados_create_with_context_exit
, 0, *pcluster
);
2838 extern "C" rados_config_t
rados_cct(rados_t cluster
)
2840 tracepoint(librados
, rados_cct_enter
, cluster
);
2841 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
2842 rados_config_t retval
= (rados_config_t
)client
->cct
;
2843 tracepoint(librados
, rados_cct_exit
, retval
);
2847 extern "C" int rados_connect(rados_t cluster
)
2849 tracepoint(librados
, rados_connect_enter
, cluster
);
2850 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
2851 int retval
= client
->connect();
2852 tracepoint(librados
, rados_connect_exit
, retval
);
2856 extern "C" void rados_shutdown(rados_t cluster
)
2858 tracepoint(librados
, rados_shutdown_enter
, cluster
);
2859 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
2862 tracepoint(librados
, rados_shutdown_exit
);
2865 extern "C" uint64_t rados_get_instance_id(rados_t cluster
)
2867 tracepoint(librados
, rados_get_instance_id_enter
, cluster
);
2868 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
2869 uint64_t retval
= client
->get_instance_id();
2870 tracepoint(librados
, rados_get_instance_id_exit
, retval
);
2874 extern "C" void rados_version(int *major
, int *minor
, int *extra
)
2876 tracepoint(librados
, rados_version_enter
, major
, minor
, extra
);
2878 *major
= LIBRADOS_VER_MAJOR
;
2880 *minor
= LIBRADOS_VER_MINOR
;
2882 *extra
= LIBRADOS_VER_EXTRA
;
2883 tracepoint(librados
, rados_version_exit
, LIBRADOS_VER_MAJOR
, LIBRADOS_VER_MINOR
, LIBRADOS_VER_EXTRA
);
2888 extern "C" int rados_conf_read_file(rados_t cluster
, const char *path_list
)
2890 tracepoint(librados
, rados_conf_read_file_enter
, cluster
, path_list
);
2891 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
2892 md_config_t
*conf
= client
->cct
->_conf
;
2893 ostringstream warnings
;
2894 int ret
= conf
->parse_config_files(path_list
, &warnings
, 0);
2896 if (warnings
.tellp() > 0)
2897 lderr(client
->cct
) << warnings
.str() << dendl
;
2898 client
->cct
->_conf
->complain_about_parse_errors(client
->cct
);
2899 tracepoint(librados
, rados_conf_read_file_exit
, ret
);
2902 conf
->parse_env(); // environment variables override
2904 conf
->apply_changes(NULL
);
2905 client
->cct
->_conf
->complain_about_parse_errors(client
->cct
);
2906 tracepoint(librados
, rados_conf_read_file_exit
, 0);
2910 extern "C" int rados_conf_parse_argv(rados_t cluster
, int argc
, const char **argv
)
2912 tracepoint(librados
, rados_conf_parse_argv_enter
, cluster
, argc
);
2914 for(i
= 0; i
< argc
; i
++) {
2915 tracepoint(librados
, rados_conf_parse_argv_arg
, argv
[i
]);
2917 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
2918 md_config_t
*conf
= client
->cct
->_conf
;
2919 vector
<const char*> args
;
2920 argv_to_vec(argc
, argv
, args
);
2921 int ret
= conf
->parse_argv(args
);
2923 tracepoint(librados
, rados_conf_parse_argv_exit
, ret
);
2926 conf
->apply_changes(NULL
);
2927 tracepoint(librados
, rados_conf_parse_argv_exit
, 0);
2931 // like above, but return the remainder of argv to contain remaining
2932 // unparsed args. Must be allocated to at least argc by caller.
2933 // remargv will contain n <= argc pointers to original argv[], the end
2934 // of which may be NULL
2936 extern "C" int rados_conf_parse_argv_remainder(rados_t cluster
, int argc
,
2938 const char **remargv
)
2940 tracepoint(librados
, rados_conf_parse_argv_remainder_enter
, cluster
, argc
);
2942 for(i
= 0; i
< (unsigned int) argc
; i
++) {
2943 tracepoint(librados
, rados_conf_parse_argv_remainder_arg
, argv
[i
]);
2945 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
2946 md_config_t
*conf
= client
->cct
->_conf
;
2947 vector
<const char*> args
;
2948 for (int i
=0; i
<argc
; i
++)
2949 args
.push_back(argv
[i
]);
2950 int ret
= conf
->parse_argv(args
);
2952 tracepoint(librados
, rados_conf_parse_argv_remainder_exit
, ret
);
2955 conf
->apply_changes(NULL
);
2956 assert(args
.size() <= (unsigned int)argc
);
2957 for (i
= 0; i
< (unsigned int)argc
; ++i
) {
2958 if (i
< args
.size())
2959 remargv
[i
] = args
[i
];
2961 remargv
[i
] = (const char *)NULL
;
2962 tracepoint(librados
, rados_conf_parse_argv_remainder_remarg
, remargv
[i
]);
2964 tracepoint(librados
, rados_conf_parse_argv_remainder_exit
, 0);
2968 extern "C" int rados_conf_parse_env(rados_t cluster
, const char *env
)
2970 tracepoint(librados
, rados_conf_parse_env_enter
, cluster
, env
);
2971 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
2972 md_config_t
*conf
= client
->cct
->_conf
;
2973 vector
<const char*> args
;
2974 env_to_vec(args
, env
);
2975 int ret
= conf
->parse_argv(args
);
2977 tracepoint(librados
, rados_conf_parse_env_exit
, ret
);
2980 conf
->apply_changes(NULL
);
2981 tracepoint(librados
, rados_conf_parse_env_exit
, 0);
2985 extern "C" int rados_conf_set(rados_t cluster
, const char *option
, const char *value
)
2987 tracepoint(librados
, rados_conf_set_enter
, cluster
, option
, value
);
2988 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
2989 md_config_t
*conf
= client
->cct
->_conf
;
2990 int ret
= conf
->set_val(option
, value
);
2992 tracepoint(librados
, rados_conf_set_exit
, ret
);
2995 conf
->apply_changes(NULL
);
2996 tracepoint(librados
, rados_conf_set_exit
, 0);
3001 extern "C" int rados_cluster_stat(rados_t cluster
, rados_cluster_stat_t
*result
)
3003 tracepoint(librados
, rados_cluster_stat_enter
, cluster
);
3004 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3007 int r
= client
->get_fs_stats(stats
);
3008 result
->kb
= stats
.kb
;
3009 result
->kb_used
= stats
.kb_used
;
3010 result
->kb_avail
= stats
.kb_avail
;
3011 result
->num_objects
= stats
.num_objects
;
3012 tracepoint(librados
, rados_cluster_stat_exit
, r
, result
->kb
, result
->kb_used
, result
->kb_avail
, result
->num_objects
);
3016 extern "C" int rados_conf_get(rados_t cluster
, const char *option
, char *buf
, size_t len
)
3018 tracepoint(librados
, rados_conf_get_enter
, cluster
, option
, len
);
3020 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3021 md_config_t
*conf
= client
->cct
->_conf
;
3022 int retval
= conf
->get_val(option
, &tmp
, len
);
3023 tracepoint(librados
, rados_conf_get_exit
, retval
, retval
? "" : option
);
3027 extern "C" int64_t rados_pool_lookup(rados_t cluster
, const char *name
)
3029 tracepoint(librados
, rados_pool_lookup_enter
, cluster
, name
);
3030 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3031 int64_t retval
= radosp
->lookup_pool(name
);
3032 tracepoint(librados
, rados_pool_lookup_exit
, retval
);
3036 extern "C" int rados_pool_reverse_lookup(rados_t cluster
, int64_t id
,
3037 char *buf
, size_t maxlen
)
3039 tracepoint(librados
, rados_pool_reverse_lookup_enter
, cluster
, id
, maxlen
);
3040 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3042 int r
= radosp
->pool_get_name(id
, &name
);
3044 tracepoint(librados
, rados_pool_reverse_lookup_exit
, r
, "");
3047 if (name
.length() >= maxlen
) {
3048 tracepoint(librados
, rados_pool_reverse_lookup_exit
, -ERANGE
, "");
3051 strcpy(buf
, name
.c_str());
3052 int retval
= name
.length();
3053 tracepoint(librados
, rados_pool_reverse_lookup_exit
, retval
, buf
);
3057 extern "C" int rados_cluster_fsid(rados_t cluster
, char *buf
,
3060 tracepoint(librados
, rados_cluster_fsid_enter
, cluster
, maxlen
);
3061 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3063 radosp
->get_fsid(&fsid
);
3064 if (fsid
.length() >= maxlen
) {
3065 tracepoint(librados
, rados_cluster_fsid_exit
, -ERANGE
, "");
3068 strcpy(buf
, fsid
.c_str());
3069 int retval
= fsid
.length();
3070 tracepoint(librados
, rados_cluster_fsid_exit
, retval
, buf
);
3074 extern "C" int rados_wait_for_latest_osdmap(rados_t cluster
)
3076 tracepoint(librados
, rados_wait_for_latest_osdmap_enter
, cluster
);
3077 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3078 int retval
= radosp
->wait_for_latest_osdmap();
3079 tracepoint(librados
, rados_wait_for_latest_osdmap_exit
, retval
);
3083 extern "C" int rados_blacklist_add(rados_t cluster
, char *client_address
,
3084 uint32_t expire_seconds
)
3086 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3087 return radosp
->blacklist_add(client_address
, expire_seconds
);
3090 extern "C" int rados_pool_list(rados_t cluster
, char *buf
, size_t len
)
3092 tracepoint(librados
, rados_pool_list_enter
, cluster
, len
);
3093 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3094 std::list
<std::pair
<int64_t, std::string
> > pools
;
3095 int r
= client
->pool_list(pools
);
3097 tracepoint(librados
, rados_pool_list_exit
, r
);
3101 if (len
> 0 && !buf
) {
3102 tracepoint(librados
, rados_pool_list_exit
, -EINVAL
);
3110 std::list
<std::pair
<int64_t, std::string
> >::const_iterator i
= pools
.begin();
3111 std::list
<std::pair
<int64_t, std::string
> >::const_iterator p_end
=
3113 for (; i
!= p_end
; ++i
) {
3114 int rl
= i
->second
.length() + 1;
3115 if (len
< (unsigned)rl
)
3117 const char* pool
= i
->second
.c_str();
3118 tracepoint(librados
, rados_pool_list_pool
, pool
);
3120 strncat(b
, pool
, rl
);
3126 for (; i
!= p_end
; ++i
) {
3127 int rl
= i
->second
.length() + 1;
3130 int retval
= needed
+ 1;
3131 tracepoint(librados
, rados_pool_list_exit
, retval
);
3135 CEPH_RADOS_API
int rados_inconsistent_pg_list(rados_t cluster
, int64_t pool_id
,
3136 char *buf
, size_t len
)
3138 tracepoint(librados
, rados_inconsistent_pg_list_enter
, cluster
, pool_id
, len
);
3139 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3140 std::vector
<librados::PlacementGroup
> pgs
;
3141 int r
= ::get_inconsistent_pgs(*client
, pool_id
, &pgs
);
3143 tracepoint(librados
, rados_inconsistent_pg_list_exit
, r
);
3147 if (len
> 0 && !buf
) {
3148 tracepoint(librados
, rados_inconsistent_pg_list_exit
, -EINVAL
);
3156 for (const auto pg
: pgs
) {
3157 std::ostringstream ss
;
3160 unsigned rl
= s
.length() + 1;
3161 if (b
&& len
>= rl
) {
3162 tracepoint(librados
, rados_inconsistent_pg_list_pg
, s
.c_str());
3163 strncat(b
, s
.c_str(), rl
);
3169 int retval
= needed
+ 1;
3170 tracepoint(librados
, rados_inconsistent_pg_list_exit
, retval
);
3174 static void do_out_buffer(bufferlist
& outbl
, char **outbuf
, size_t *outbuflen
)
3177 if (outbl
.length() > 0) {
3178 *outbuf
= (char *)malloc(outbl
.length());
3179 memcpy(*outbuf
, outbl
.c_str(), outbl
.length());
3185 *outbuflen
= outbl
.length();
3188 static void do_out_buffer(string
& outbl
, char **outbuf
, size_t *outbuflen
)
3191 if (outbl
.length() > 0) {
3192 *outbuf
= (char *)malloc(outbl
.length());
3193 memcpy(*outbuf
, outbl
.c_str(), outbl
.length());
3199 *outbuflen
= outbl
.length();
3202 extern "C" int rados_ping_monitor(rados_t cluster
, const char *mon_id
,
3203 char **outstr
, size_t *outstrlen
)
3205 tracepoint(librados
, rados_ping_monitor_enter
, cluster
, mon_id
);
3206 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3210 tracepoint(librados
, rados_ping_monitor_exit
, -EINVAL
, NULL
, NULL
);
3214 int ret
= client
->ping_monitor(mon_id
, &str
);
3216 do_out_buffer(str
, outstr
, outstrlen
);
3218 tracepoint(librados
, rados_ping_monitor_exit
, ret
, ret
< 0 ? NULL
: outstr
, ret
< 0 ? NULL
: outstrlen
);
3222 extern "C" int rados_mon_command(rados_t cluster
, const char **cmd
,
3224 const char *inbuf
, size_t inbuflen
,
3225 char **outbuf
, size_t *outbuflen
,
3226 char **outs
, size_t *outslen
)
3228 tracepoint(librados
, rados_mon_command_enter
, cluster
, cmdlen
, inbuf
, inbuflen
);
3229 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3233 vector
<string
> cmdvec
;
3235 for (size_t i
= 0; i
< cmdlen
; i
++) {
3236 tracepoint(librados
, rados_mon_command_cmd
, cmd
[i
]);
3237 cmdvec
.push_back(cmd
[i
]);
3240 inbl
.append(inbuf
, inbuflen
);
3241 int ret
= client
->mon_command(cmdvec
, inbl
, &outbl
, &outstring
);
3243 do_out_buffer(outbl
, outbuf
, outbuflen
);
3244 do_out_buffer(outstring
, outs
, outslen
);
3245 tracepoint(librados
, rados_mon_command_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
3249 extern "C" int rados_mon_command_target(rados_t cluster
, const char *name
,
3252 const char *inbuf
, size_t inbuflen
,
3253 char **outbuf
, size_t *outbuflen
,
3254 char **outs
, size_t *outslen
)
3256 tracepoint(librados
, rados_mon_command_target_enter
, cluster
, name
, cmdlen
, inbuf
, inbuflen
);
3257 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3261 vector
<string
> cmdvec
;
3263 // is this a numeric id?
3266 long rank
= strtol(name
, &endptr
, 10);
3267 if ((errno
== ERANGE
&& (rank
== LONG_MAX
|| rank
== LONG_MIN
)) ||
3268 (errno
!= 0 && rank
== 0) ||
3269 endptr
== name
|| // no digits
3270 *endptr
!= '\0') { // extra characters
3274 for (size_t i
= 0; i
< cmdlen
; i
++) {
3275 tracepoint(librados
, rados_mon_command_target_cmd
, cmd
[i
]);
3276 cmdvec
.push_back(cmd
[i
]);
3279 inbl
.append(inbuf
, inbuflen
);
3282 ret
= client
->mon_command(rank
, cmdvec
, inbl
, &outbl
, &outstring
);
3284 ret
= client
->mon_command(name
, cmdvec
, inbl
, &outbl
, &outstring
);
3286 do_out_buffer(outbl
, outbuf
, outbuflen
);
3287 do_out_buffer(outstring
, outs
, outslen
);
3288 tracepoint(librados
, rados_mon_command_target_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
3292 extern "C" int rados_osd_command(rados_t cluster
, int osdid
, const char **cmd
,
3294 const char *inbuf
, size_t inbuflen
,
3295 char **outbuf
, size_t *outbuflen
,
3296 char **outs
, size_t *outslen
)
3298 tracepoint(librados
, rados_osd_command_enter
, cluster
, osdid
, cmdlen
, inbuf
, inbuflen
);
3299 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3303 vector
<string
> cmdvec
;
3305 for (size_t i
= 0; i
< cmdlen
; i
++) {
3306 tracepoint(librados
, rados_osd_command_cmd
, cmd
[i
]);
3307 cmdvec
.push_back(cmd
[i
]);
3310 inbl
.append(inbuf
, inbuflen
);
3311 int ret
= client
->osd_command(osdid
, cmdvec
, inbl
, &outbl
, &outstring
);
3313 do_out_buffer(outbl
, outbuf
, outbuflen
);
3314 do_out_buffer(outstring
, outs
, outslen
);
3315 tracepoint(librados
, rados_osd_command_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
3319 extern "C" int rados_mgr_command(rados_t cluster
, const char **cmd
,
3321 const char *inbuf
, size_t inbuflen
,
3322 char **outbuf
, size_t *outbuflen
,
3323 char **outs
, size_t *outslen
)
3325 tracepoint(librados
, rados_mgr_command_enter
, cluster
, cmdlen
, inbuf
,
3328 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3332 vector
<string
> cmdvec
;
3334 for (size_t i
= 0; i
< cmdlen
; i
++) {
3335 tracepoint(librados
, rados_mgr_command_cmd
, cmd
[i
]);
3336 cmdvec
.push_back(cmd
[i
]);
3339 inbl
.append(inbuf
, inbuflen
);
3340 int ret
= client
->mgr_command(cmdvec
, inbl
, &outbl
, &outstring
);
3342 do_out_buffer(outbl
, outbuf
, outbuflen
);
3343 do_out_buffer(outstring
, outs
, outslen
);
3344 tracepoint(librados
, rados_mgr_command_exit
, ret
, outbuf
, outbuflen
, outs
,
3349 extern "C" int rados_pg_command(rados_t cluster
, const char *pgstr
,
3350 const char **cmd
, size_t cmdlen
,
3351 const char *inbuf
, size_t inbuflen
,
3352 char **outbuf
, size_t *outbuflen
,
3353 char **outs
, size_t *outslen
)
3355 tracepoint(librados
, rados_pg_command_enter
, cluster
, pgstr
, cmdlen
, inbuf
, inbuflen
);
3356 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3361 vector
<string
> cmdvec
;
3363 for (size_t i
= 0; i
< cmdlen
; i
++) {
3364 tracepoint(librados
, rados_pg_command_cmd
, cmd
[i
]);
3365 cmdvec
.push_back(cmd
[i
]);
3368 inbl
.append(inbuf
, inbuflen
);
3369 if (!pgid
.parse(pgstr
))
3372 int ret
= client
->pg_command(pgid
, cmdvec
, inbl
, &outbl
, &outstring
);
3374 do_out_buffer(outbl
, outbuf
, outbuflen
);
3375 do_out_buffer(outstring
, outs
, outslen
);
3376 tracepoint(librados
, rados_pg_command_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
3380 extern "C" void rados_buffer_free(char *buf
)
3382 tracepoint(librados
, rados_buffer_free_enter
, buf
);
3385 tracepoint(librados
, rados_buffer_free_exit
);
3388 extern "C" int rados_monitor_log(rados_t cluster
, const char *level
, rados_log_callback_t cb
, void *arg
)
3390 tracepoint(librados
, rados_monitor_log_enter
, cluster
, level
, cb
, arg
);
3391 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3392 int retval
= client
->monitor_log(level
, cb
, nullptr, arg
);
3393 tracepoint(librados
, rados_monitor_log_exit
, retval
);
3397 extern "C" int rados_monitor_log2(rados_t cluster
, const char *level
,
3398 rados_log_callback2_t cb
, void *arg
)
3400 tracepoint(librados
, rados_monitor_log2_enter
, cluster
, level
, cb
, arg
);
3401 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3402 int retval
= client
->monitor_log(level
, nullptr, cb
, arg
);
3403 tracepoint(librados
, rados_monitor_log2_exit
, retval
);
3407 extern "C" int rados_ioctx_create(rados_t cluster
, const char *name
, rados_ioctx_t
*io
)
3409 tracepoint(librados
, rados_ioctx_create_enter
, cluster
, name
);
3410 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3411 librados::IoCtxImpl
*ctx
;
3413 int r
= client
->create_ioctx(name
, &ctx
);
3415 tracepoint(librados
, rados_ioctx_create_exit
, r
, NULL
);
3421 tracepoint(librados
, rados_ioctx_create_exit
, 0, ctx
);
3425 extern "C" int rados_ioctx_create2(rados_t cluster
, int64_t pool_id
,
3428 tracepoint(librados
, rados_ioctx_create2_enter
, cluster
, pool_id
);
3429 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3430 librados::IoCtxImpl
*ctx
;
3432 int r
= client
->create_ioctx(pool_id
, &ctx
);
3434 tracepoint(librados
, rados_ioctx_create2_exit
, r
, NULL
);
3440 tracepoint(librados
, rados_ioctx_create2_exit
, 0, ctx
);
3444 extern "C" void rados_ioctx_destroy(rados_ioctx_t io
)
3446 tracepoint(librados
, rados_ioctx_destroy_enter
, io
);
3447 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3449 tracepoint(librados
, rados_ioctx_destroy_exit
);
3452 extern "C" int rados_ioctx_pool_stat(rados_ioctx_t io
, struct rados_pool_stat_t
*stats
)
3454 tracepoint(librados
, rados_ioctx_pool_stat_enter
, io
);
3455 librados::IoCtxImpl
*io_ctx_impl
= (librados::IoCtxImpl
*)io
;
3457 std::string pool_name
;
3459 int err
= io_ctx_impl
->client
->pool_get_name(io_ctx_impl
->get_id(), &pool_name
);
3461 tracepoint(librados
, rados_ioctx_pool_stat_exit
, err
, stats
);
3464 ls
.push_back(pool_name
);
3466 map
<string
, ::pool_stat_t
> rawresult
;
3467 err
= io_ctx_impl
->client
->get_pool_stats(ls
, rawresult
);
3469 tracepoint(librados
, rados_ioctx_pool_stat_exit
, err
, stats
);
3473 ::pool_stat_t
& r
= rawresult
[pool_name
];
3474 stats
->num_kb
= SHIFT_ROUND_UP(r
.stats
.sum
.num_bytes
, 10);
3475 stats
->num_bytes
= r
.stats
.sum
.num_bytes
;
3476 stats
->num_objects
= r
.stats
.sum
.num_objects
;
3477 stats
->num_object_clones
= r
.stats
.sum
.num_object_clones
;
3478 stats
->num_object_copies
= r
.stats
.sum
.num_object_copies
;
3479 stats
->num_objects_missing_on_primary
= r
.stats
.sum
.num_objects_missing_on_primary
;
3480 stats
->num_objects_unfound
= r
.stats
.sum
.num_objects_unfound
;
3481 stats
->num_objects_degraded
=
3482 r
.stats
.sum
.num_objects_degraded
+
3483 r
.stats
.sum
.num_objects_misplaced
; // FIXME: this is imprecise
3484 stats
->num_rd
= r
.stats
.sum
.num_rd
;
3485 stats
->num_rd_kb
= r
.stats
.sum
.num_rd_kb
;
3486 stats
->num_wr
= r
.stats
.sum
.num_wr
;
3487 stats
->num_wr_kb
= r
.stats
.sum
.num_wr_kb
;
3488 tracepoint(librados
, rados_ioctx_pool_stat_exit
, 0, stats
);
3492 extern "C" rados_config_t
rados_ioctx_cct(rados_ioctx_t io
)
3494 tracepoint(librados
, rados_ioctx_cct_enter
, io
);
3495 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3496 rados_config_t retval
= (rados_config_t
)ctx
->client
->cct
;
3497 tracepoint(librados
, rados_ioctx_cct_exit
, retval
);
3501 extern "C" void rados_ioctx_snap_set_read(rados_ioctx_t io
, rados_snap_t seq
)
3503 tracepoint(librados
, rados_ioctx_snap_set_read_enter
, io
, seq
);
3504 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3505 ctx
->set_snap_read((snapid_t
)seq
);
3506 tracepoint(librados
, rados_ioctx_snap_set_read_exit
);
3509 extern "C" int rados_ioctx_selfmanaged_snap_set_write_ctx(rados_ioctx_t io
,
3510 rados_snap_t seq
, rados_snap_t
*snaps
, int num_snaps
)
3512 tracepoint(librados
, rados_ioctx_selfmanaged_snap_set_write_ctx_enter
, io
, seq
, snaps
, num_snaps
);
3513 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3514 vector
<snapid_t
> snv
;
3515 snv
.resize(num_snaps
);
3516 for (int i
=0; i
<num_snaps
; i
++) {
3517 snv
[i
] = (snapid_t
)snaps
[i
];
3519 int retval
= ctx
->set_snap_write_context((snapid_t
)seq
, snv
);
3520 tracepoint(librados
, rados_ioctx_selfmanaged_snap_set_write_ctx_exit
, retval
);
3524 extern "C" int rados_write(rados_ioctx_t io
, const char *o
, const char *buf
, size_t len
, uint64_t off
)
3526 tracepoint(librados
, rados_write_enter
, io
, o
, buf
, len
, off
);
3527 if (len
> UINT_MAX
/2)
3529 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3532 bl
.append(buf
, len
);
3533 int retval
= ctx
->write(oid
, bl
, len
, off
);
3534 tracepoint(librados
, rados_write_exit
, retval
);
3538 extern "C" int rados_append(rados_ioctx_t io
, const char *o
, const char *buf
, size_t len
)
3540 tracepoint(librados
, rados_append_enter
, io
, o
, buf
, len
);
3541 if (len
> UINT_MAX
/2)
3543 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3546 bl
.append(buf
, len
);
3547 int retval
= ctx
->append(oid
, bl
, len
);
3548 tracepoint(librados
, rados_append_exit
, retval
);
3552 extern "C" int rados_write_full(rados_ioctx_t io
, const char *o
, const char *buf
, size_t len
)
3554 tracepoint(librados
, rados_write_full_enter
, io
, o
, buf
, len
);
3555 if (len
> UINT_MAX
/2)
3557 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3560 bl
.append(buf
, len
);
3561 int retval
= ctx
->write_full(oid
, bl
);
3562 tracepoint(librados
, rados_write_full_exit
, retval
);
3566 extern "C" int rados_writesame(rados_ioctx_t io
,
3573 tracepoint(librados
, rados_writesame_enter
, io
, o
, buf
, data_len
, write_len
, off
);
3574 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3577 bl
.append(buf
, data_len
);
3578 int retval
= ctx
->writesame(oid
, bl
, write_len
, off
);
3579 tracepoint(librados
, rados_writesame_exit
, retval
);
3583 extern "C" int rados_trunc(rados_ioctx_t io
, const char *o
, uint64_t size
)
3585 tracepoint(librados
, rados_trunc_enter
, io
, o
, size
);
3586 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3588 int retval
= ctx
->trunc(oid
, size
);
3589 tracepoint(librados
, rados_trunc_exit
, retval
);
3593 extern "C" int rados_remove(rados_ioctx_t io
, const char *o
)
3595 tracepoint(librados
, rados_remove_enter
, io
, o
);
3596 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3598 int retval
= ctx
->remove(oid
);
3599 tracepoint(librados
, rados_remove_exit
, retval
);
3603 extern "C" int rados_read(rados_ioctx_t io
, const char *o
, char *buf
, size_t len
, uint64_t off
)
3605 tracepoint(librados
, rados_read_enter
, io
, o
, buf
, len
, off
);
3606 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3611 bufferptr bp
= buffer::create_static(len
, buf
);
3614 ret
= ctx
->read(oid
, bl
, len
, off
);
3616 if (bl
.length() > len
) {
3617 tracepoint(librados
, rados_read_exit
, -ERANGE
, NULL
);
3620 if (!bl
.is_provided_buffer(buf
))
3621 bl
.copy(0, bl
.length(), buf
);
3622 ret
= bl
.length(); // hrm :/
3625 tracepoint(librados
, rados_read_exit
, ret
, buf
);
3629 extern "C" int rados_checksum(rados_ioctx_t io
, const char *o
,
3630 rados_checksum_type_t type
,
3631 const char *init_value
, size_t init_value_len
,
3632 size_t len
, uint64_t off
, size_t chunk_size
,
3633 char *pchecksum
, size_t checksum_len
)
3635 tracepoint(librados
, rados_checksum_enter
, io
, o
, type
, init_value
,
3636 init_value_len
, len
, off
, chunk_size
);
3637 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3640 bufferlist init_value_bl
;
3641 init_value_bl
.append(init_value
, init_value_len
);
3643 bufferlist checksum_bl
;
3645 int retval
= ctx
->checksum(oid
, get_checksum_op_type(type
), init_value_bl
,
3646 len
, off
, chunk_size
, &checksum_bl
);
3648 if (checksum_bl
.length() > checksum_len
) {
3649 tracepoint(librados
, rados_checksum_exit
, -ERANGE
, NULL
, 0);
3653 checksum_bl
.copy(0, checksum_bl
.length(), pchecksum
);
3655 tracepoint(librados
, rados_checksum_exit
, retval
, pchecksum
, checksum_len
);
3659 extern "C" uint64_t rados_get_last_version(rados_ioctx_t io
)
3661 tracepoint(librados
, rados_get_last_version_enter
, io
);
3662 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3663 uint64_t retval
= ctx
->last_version();
3664 tracepoint(librados
, rados_get_last_version_exit
, retval
);
3668 extern "C" int rados_pool_create(rados_t cluster
, const char *name
)
3670 tracepoint(librados
, rados_pool_create_enter
, cluster
, name
);
3671 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3673 int retval
= radosp
->pool_create(sname
);
3674 tracepoint(librados
, rados_pool_create_exit
, retval
);
3678 extern "C" int rados_pool_create_with_auid(rados_t cluster
, const char *name
,
3681 tracepoint(librados
, rados_pool_create_with_auid_enter
, cluster
, name
, auid
);
3682 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3684 int retval
= radosp
->pool_create(sname
, auid
);
3685 tracepoint(librados
, rados_pool_create_with_auid_exit
, retval
);
3689 extern "C" int rados_pool_create_with_crush_rule(rados_t cluster
, const char *name
,
3690 __u8 crush_rule_num
)
3692 tracepoint(librados
, rados_pool_create_with_crush_rule_enter
, cluster
, name
, crush_rule_num
);
3693 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3695 int retval
= radosp
->pool_create(sname
, 0, crush_rule_num
);
3696 tracepoint(librados
, rados_pool_create_with_crush_rule_exit
, retval
);
3700 extern "C" int rados_pool_create_with_all(rados_t cluster
, const char *name
,
3701 uint64_t auid
, __u8 crush_rule_num
)
3703 tracepoint(librados
, rados_pool_create_with_all_enter
, cluster
, name
, auid
, crush_rule_num
);
3704 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3706 int retval
= radosp
->pool_create(sname
, auid
, crush_rule_num
);
3707 tracepoint(librados
, rados_pool_create_with_all_exit
, retval
);
3711 extern "C" int rados_pool_get_base_tier(rados_t cluster
, int64_t pool_id
, int64_t* base_tier
)
3713 tracepoint(librados
, rados_pool_get_base_tier_enter
, cluster
, pool_id
);
3714 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3715 int retval
= client
->pool_get_base_tier(pool_id
, base_tier
);
3716 tracepoint(librados
, rados_pool_get_base_tier_exit
, retval
, *base_tier
);
3720 extern "C" int rados_pool_delete(rados_t cluster
, const char *pool_name
)
3722 tracepoint(librados
, rados_pool_delete_enter
, cluster
, pool_name
);
3723 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3724 int retval
= client
->pool_delete(pool_name
);
3725 tracepoint(librados
, rados_pool_delete_exit
, retval
);
3729 extern "C" int rados_ioctx_pool_set_auid(rados_ioctx_t io
, uint64_t auid
)
3731 tracepoint(librados
, rados_ioctx_pool_set_auid_enter
, io
, auid
);
3732 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3733 int retval
= ctx
->pool_change_auid(auid
);
3734 tracepoint(librados
, rados_ioctx_pool_set_auid_exit
, retval
);
3738 extern "C" int rados_ioctx_pool_get_auid(rados_ioctx_t io
, uint64_t *auid
)
3740 tracepoint(librados
, rados_ioctx_pool_get_auid_enter
, io
);
3741 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3742 int retval
= ctx
->client
->pool_get_auid(ctx
->get_id(), (unsigned long long *)auid
);
3743 tracepoint(librados
, rados_ioctx_pool_get_auid_exit
, retval
, *auid
);
3747 extern "C" int rados_ioctx_pool_requires_alignment(rados_ioctx_t io
)
3749 tracepoint(librados
, rados_ioctx_pool_requires_alignment_enter
, io
);
3750 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3751 int retval
= ctx
->client
->pool_requires_alignment(ctx
->get_id());
3752 tracepoint(librados
, rados_ioctx_pool_requires_alignment_exit
, retval
);
3756 extern "C" int rados_ioctx_pool_requires_alignment2(rados_ioctx_t io
,
3759 tracepoint(librados
, rados_ioctx_pool_requires_alignment_enter2
, io
);
3760 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3761 bool requires_alignment
;
3762 int retval
= ctx
->client
->pool_requires_alignment2(ctx
->get_id(),
3763 &requires_alignment
);
3764 tracepoint(librados
, rados_ioctx_pool_requires_alignment_exit2
, retval
,
3765 requires_alignment
);
3767 *requires
= requires_alignment
;
3771 extern "C" uint64_t rados_ioctx_pool_required_alignment(rados_ioctx_t io
)
3773 tracepoint(librados
, rados_ioctx_pool_required_alignment_enter
, io
);
3774 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3775 uint64_t retval
= ctx
->client
->pool_required_alignment(ctx
->get_id());
3776 tracepoint(librados
, rados_ioctx_pool_required_alignment_exit
, retval
);
3780 extern "C" int rados_ioctx_pool_required_alignment2(rados_ioctx_t io
,
3781 uint64_t *alignment
)
3783 tracepoint(librados
, rados_ioctx_pool_required_alignment_enter2
, io
);
3784 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3785 int retval
= ctx
->client
->pool_required_alignment2(ctx
->get_id(),
3787 tracepoint(librados
, rados_ioctx_pool_required_alignment_exit2
, retval
,
3792 extern "C" void rados_ioctx_locator_set_key(rados_ioctx_t io
, const char *key
)
3794 tracepoint(librados
, rados_ioctx_locator_set_key_enter
, io
, key
);
3795 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3797 ctx
->oloc
.key
= key
;
3800 tracepoint(librados
, rados_ioctx_locator_set_key_exit
);
3803 extern "C" void rados_ioctx_set_namespace(rados_ioctx_t io
, const char *nspace
)
3805 tracepoint(librados
, rados_ioctx_set_namespace_enter
, io
, nspace
);
3806 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3808 ctx
->oloc
.nspace
= nspace
;
3810 ctx
->oloc
.nspace
= "";
3811 tracepoint(librados
, rados_ioctx_set_namespace_exit
);
3814 extern "C" rados_t
rados_ioctx_get_cluster(rados_ioctx_t io
)
3816 tracepoint(librados
, rados_ioctx_get_cluster_enter
, io
);
3817 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3818 rados_t retval
= (rados_t
)ctx
->client
;
3819 tracepoint(librados
, rados_ioctx_get_cluster_exit
, retval
);
3823 extern "C" int64_t rados_ioctx_get_id(rados_ioctx_t io
)
3825 tracepoint(librados
, rados_ioctx_get_id_enter
, io
);
3826 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3827 int64_t retval
= ctx
->get_id();
3828 tracepoint(librados
, rados_ioctx_get_id_exit
, retval
);
3832 extern "C" int rados_ioctx_get_pool_name(rados_ioctx_t io
, char *s
, unsigned maxlen
)
3834 tracepoint(librados
, rados_ioctx_get_pool_name_enter
, io
, maxlen
);
3835 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3836 std::string pool_name
;
3838 int err
= ctx
->client
->pool_get_name(ctx
->get_id(), &pool_name
);
3840 tracepoint(librados
, rados_ioctx_get_pool_name_exit
, err
, "");
3843 if (pool_name
.length() >= maxlen
) {
3844 tracepoint(librados
, rados_ioctx_get_pool_name_exit
, -ERANGE
, "");
3847 strcpy(s
, pool_name
.c_str());
3848 int retval
= pool_name
.length();
3849 tracepoint(librados
, rados_ioctx_get_pool_name_exit
, retval
, s
);
3855 extern "C" int rados_ioctx_snap_create(rados_ioctx_t io
, const char *snapname
)
3857 tracepoint(librados
, rados_ioctx_snap_create_enter
, io
, snapname
);
3858 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3859 int retval
= ctx
->snap_create(snapname
);
3860 tracepoint(librados
, rados_ioctx_snap_create_exit
, retval
);
3864 extern "C" int rados_ioctx_snap_remove(rados_ioctx_t io
, const char *snapname
)
3866 tracepoint(librados
, rados_ioctx_snap_remove_enter
, io
, snapname
);
3867 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3868 int retval
= ctx
->snap_remove(snapname
);
3869 tracepoint(librados
, rados_ioctx_snap_remove_exit
, retval
);
3873 extern "C" int rados_ioctx_snap_rollback(rados_ioctx_t io
, const char *oid
,
3874 const char *snapname
)
3876 tracepoint(librados
, rados_ioctx_snap_rollback_enter
, io
, oid
, snapname
);
3877 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3878 int retval
= ctx
->rollback(oid
, snapname
);
3879 tracepoint(librados
, rados_ioctx_snap_rollback_exit
, retval
);
3883 // Deprecated name kept for backward compatibility
3884 extern "C" int rados_rollback(rados_ioctx_t io
, const char *oid
,
3885 const char *snapname
)
3887 return rados_ioctx_snap_rollback(io
, oid
, snapname
);
3890 extern "C" int rados_ioctx_selfmanaged_snap_create(rados_ioctx_t io
,
3893 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_enter
, io
);
3894 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3895 int retval
= ctx
->selfmanaged_snap_create(snapid
);
3896 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_exit
, retval
, *snapid
);
3901 rados_aio_ioctx_selfmanaged_snap_create(rados_ioctx_t io
,
3902 rados_snap_t
*snapid
,
3903 rados_completion_t completion
)
3905 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_enter
, io
);
3906 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3907 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
3908 ctx
->aio_selfmanaged_snap_create(snapid
, c
);
3909 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_exit
, 0, 0);
3912 extern "C" int rados_ioctx_selfmanaged_snap_remove(rados_ioctx_t io
,
3915 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_enter
, io
, snapid
);
3916 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3917 int retval
= ctx
->selfmanaged_snap_remove(snapid
);
3918 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_exit
, retval
);
3923 rados_aio_ioctx_selfmanaged_snap_remove(rados_ioctx_t io
,
3924 rados_snap_t snapid
,
3925 rados_completion_t completion
)
3927 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_enter
, io
, snapid
);
3928 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3929 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
3930 ctx
->aio_selfmanaged_snap_remove(snapid
, c
);
3931 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_exit
, 0);
3934 extern "C" int rados_ioctx_selfmanaged_snap_rollback(rados_ioctx_t io
,
3938 tracepoint(librados
, rados_ioctx_selfmanaged_snap_rollback_enter
, io
, oid
, snapid
);
3939 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3940 int retval
= ctx
->selfmanaged_snap_rollback_object(oid
, ctx
->snapc
, snapid
);
3941 tracepoint(librados
, rados_ioctx_selfmanaged_snap_rollback_exit
, retval
);
3945 extern "C" int rados_ioctx_snap_list(rados_ioctx_t io
, rados_snap_t
*snaps
,
3948 tracepoint(librados
, rados_ioctx_snap_list_enter
, io
, maxlen
);
3949 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3950 vector
<uint64_t> snapvec
;
3951 int r
= ctx
->snap_list(&snapvec
);
3953 tracepoint(librados
, rados_ioctx_snap_list_exit
, r
, snaps
, 0);
3956 if ((int)snapvec
.size() <= maxlen
) {
3957 for (unsigned i
=0; i
<snapvec
.size(); i
++) {
3958 snaps
[i
] = snapvec
[i
];
3960 int retval
= snapvec
.size();
3961 tracepoint(librados
, rados_ioctx_snap_list_exit
, retval
, snaps
, retval
);
3964 int retval
= -ERANGE
;
3965 tracepoint(librados
, rados_ioctx_snap_list_exit
, retval
, snaps
, 0);
3969 extern "C" int rados_ioctx_snap_lookup(rados_ioctx_t io
, const char *name
,
3972 tracepoint(librados
, rados_ioctx_snap_lookup_enter
, io
, name
);
3973 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3974 int retval
= ctx
->snap_lookup(name
, (uint64_t *)id
);
3975 tracepoint(librados
, rados_ioctx_snap_lookup_exit
, retval
, *id
);
3979 extern "C" int rados_ioctx_snap_get_name(rados_ioctx_t io
, rados_snap_t id
,
3980 char *name
, int maxlen
)
3982 tracepoint(librados
, rados_ioctx_snap_get_name_enter
, io
, id
, maxlen
);
3983 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3985 int r
= ctx
->snap_get_name(id
, &sname
);
3987 tracepoint(librados
, rados_ioctx_snap_get_name_exit
, r
, "");
3990 if ((int)sname
.length() >= maxlen
) {
3991 int retval
= -ERANGE
;
3992 tracepoint(librados
, rados_ioctx_snap_get_name_exit
, retval
, "");
3995 strncpy(name
, sname
.c_str(), maxlen
);
3996 tracepoint(librados
, rados_ioctx_snap_get_name_exit
, 0, name
);
4000 extern "C" int rados_ioctx_snap_get_stamp(rados_ioctx_t io
, rados_snap_t id
, time_t *t
)
4002 tracepoint(librados
, rados_ioctx_snap_get_stamp_enter
, io
, id
);
4003 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4004 int retval
= ctx
->snap_get_stamp(id
, t
);
4005 tracepoint(librados
, rados_ioctx_snap_get_stamp_exit
, retval
, *t
);
4009 extern "C" int rados_cmpext(rados_ioctx_t io
, const char *o
,
4010 const char *cmp_buf
, size_t cmp_len
, uint64_t off
)
4012 tracepoint(librados
, rados_cmpext_enter
, io
, o
, cmp_buf
, cmp_len
, off
);
4013 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4018 cmp_bl
.append(cmp_buf
, cmp_len
);
4020 ret
= ctx
->cmpext(oid
, off
, cmp_bl
);
4021 tracepoint(librados
, rados_cmpext_exit
, ret
);
4026 extern "C" int rados_getxattr(rados_ioctx_t io
, const char *o
, const char *name
,
4027 char *buf
, size_t len
)
4029 tracepoint(librados
, rados_getxattr_enter
, io
, o
, name
, len
);
4030 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4034 bl
.push_back(buffer::create_static(len
, buf
));
4035 ret
= ctx
->getxattr(oid
, name
, bl
);
4037 if (bl
.length() > len
) {
4038 tracepoint(librados
, rados_getxattr_exit
, -ERANGE
, buf
, 0);
4041 if (!bl
.is_provided_buffer(buf
))
4042 bl
.copy(0, bl
.length(), buf
);
4046 tracepoint(librados
, rados_getxattr_exit
, ret
, buf
, ret
);
4050 extern "C" int rados_getxattrs(rados_ioctx_t io
, const char *oid
,
4051 rados_xattrs_iter_t
*iter
)
4053 tracepoint(librados
, rados_getxattrs_enter
, io
, oid
);
4054 librados::RadosXattrsIter
*it
= new librados::RadosXattrsIter();
4056 tracepoint(librados
, rados_getxattrs_exit
, -ENOMEM
, NULL
);
4059 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4061 int ret
= ctx
->getxattrs(obj
, it
->attrset
);
4064 tracepoint(librados
, rados_getxattrs_exit
, ret
, NULL
);
4067 it
->i
= it
->attrset
.begin();
4069 librados::RadosXattrsIter
**iret
= (librados::RadosXattrsIter
**)iter
;
4072 tracepoint(librados
, rados_getxattrs_exit
, 0, *iter
);
4076 extern "C" int rados_getxattrs_next(rados_xattrs_iter_t iter
,
4077 const char **name
, const char **val
, size_t *len
)
4079 tracepoint(librados
, rados_getxattrs_next_enter
, iter
);
4080 librados::RadosXattrsIter
*it
= static_cast<librados::RadosXattrsIter
*>(iter
);
4081 if (it
->i
== it
->attrset
.end()) {
4085 tracepoint(librados
, rados_getxattrs_next_exit
, 0, NULL
, NULL
, 0);
4089 const std::string
&s(it
->i
->first
);
4091 bufferlist
&bl(it
->i
->second
);
4092 size_t bl_len
= bl
.length();
4094 // malloc(0) is not guaranteed to return a valid pointer
4095 *val
= (char *)NULL
;
4097 it
->val
= (char*)malloc(bl_len
);
4099 tracepoint(librados
, rados_getxattrs_next_exit
, -ENOMEM
, *name
, NULL
, 0);
4102 memcpy(it
->val
, bl
.c_str(), bl_len
);
4107 tracepoint(librados
, rados_getxattrs_next_exit
, 0, *name
, *val
, *len
);
4111 extern "C" void rados_getxattrs_end(rados_xattrs_iter_t iter
)
4113 tracepoint(librados
, rados_getxattrs_end_enter
, iter
);
4114 librados::RadosXattrsIter
*it
= static_cast<librados::RadosXattrsIter
*>(iter
);
4116 tracepoint(librados
, rados_getxattrs_end_exit
);
4119 extern "C" int rados_setxattr(rados_ioctx_t io
, const char *o
, const char *name
, const char *buf
, size_t len
)
4121 tracepoint(librados
, rados_setxattr_enter
, io
, o
, name
, buf
, len
);
4122 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4125 bl
.append(buf
, len
);
4126 int retval
= ctx
->setxattr(oid
, name
, bl
);
4127 tracepoint(librados
, rados_setxattr_exit
, retval
);
4131 extern "C" int rados_rmxattr(rados_ioctx_t io
, const char *o
, const char *name
)
4133 tracepoint(librados
, rados_rmxattr_enter
, io
, o
, name
);
4134 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4136 int retval
= ctx
->rmxattr(oid
, name
);
4137 tracepoint(librados
, rados_rmxattr_exit
, retval
);
4141 extern "C" int rados_stat(rados_ioctx_t io
, const char *o
, uint64_t *psize
, time_t *pmtime
)
4143 tracepoint(librados
, rados_stat_enter
, io
, o
);
4144 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4146 int retval
= ctx
->stat(oid
, psize
, pmtime
);
4147 tracepoint(librados
, rados_stat_exit
, retval
, psize
, pmtime
);
4151 extern "C" int rados_tmap_update(rados_ioctx_t io
, const char *o
, const char *cmdbuf
, size_t cmdbuflen
)
4153 tracepoint(librados
, rados_tmap_update_enter
, io
, o
, cmdbuf
, cmdbuflen
);
4154 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4157 cmdbl
.append(cmdbuf
, cmdbuflen
);
4158 int retval
= ctx
->tmap_update(oid
, cmdbl
);
4159 tracepoint(librados
, rados_tmap_update_exit
, retval
);
4163 extern "C" int rados_tmap_put(rados_ioctx_t io
, const char *o
, const char *buf
, size_t buflen
)
4165 tracepoint(librados
, rados_tmap_put_enter
, io
, o
, buf
, buflen
);
4166 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4169 bl
.append(buf
, buflen
);
4170 int retval
= ctx
->tmap_put(oid
, bl
);
4171 tracepoint(librados
, rados_tmap_put_exit
, retval
);
4175 extern "C" int rados_tmap_get(rados_ioctx_t io
, const char *o
, char *buf
, size_t buflen
)
4177 tracepoint(librados
, rados_tmap_get_enter
, io
, o
, buflen
);
4178 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4181 int r
= ctx
->tmap_get(oid
, bl
);
4183 tracepoint(librados
, rados_tmap_get_exit
, r
, buf
, 0);
4186 if (bl
.length() > buflen
) {
4187 tracepoint(librados
, rados_tmap_get_exit
, -ERANGE
, buf
, 0);
4190 bl
.copy(0, bl
.length(), buf
);
4191 int retval
= bl
.length();
4192 tracepoint(librados
, rados_tmap_get_exit
, retval
, buf
, retval
);
4196 extern "C" int rados_tmap_to_omap(rados_ioctx_t io
, const char *o
, bool nullok
)
4198 tracepoint(librados
, rados_tmap_to_omap_enter
, io
, o
, nullok
);
4199 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4201 int retval
= ctx
->tmap_to_omap(oid
, nullok
);
4202 tracepoint(librados
, rados_tmap_to_omap_exit
, retval
);
4206 extern "C" int rados_exec(rados_ioctx_t io
, const char *o
, const char *cls
, const char *method
,
4207 const char *inbuf
, size_t in_len
, char *buf
, size_t out_len
)
4209 tracepoint(librados
, rados_exec_enter
, io
, o
, cls
, method
, inbuf
, in_len
, out_len
);
4210 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4212 bufferlist inbl
, outbl
;
4214 inbl
.append(inbuf
, in_len
);
4215 ret
= ctx
->exec(oid
, cls
, method
, inbl
, outbl
);
4217 if (outbl
.length()) {
4218 if (outbl
.length() > out_len
) {
4219 tracepoint(librados
, rados_exec_exit
, -ERANGE
, buf
, 0);
4222 outbl
.copy(0, outbl
.length(), buf
);
4223 ret
= outbl
.length(); // hrm :/
4226 tracepoint(librados
, rados_exec_exit
, ret
, buf
, ret
);
4230 extern "C" rados_object_list_cursor
rados_object_list_begin(rados_ioctx_t io
)
4232 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4234 hobject_t
*result
= new hobject_t(ctx
->objecter
->enumerate_objects_begin());
4235 return (rados_object_list_cursor
)result
;
4238 extern "C" rados_object_list_cursor
rados_object_list_end(rados_ioctx_t io
)
4240 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4242 hobject_t
*result
= new hobject_t(ctx
->objecter
->enumerate_objects_end());
4243 return (rados_object_list_cursor
)result
;
4246 extern "C" int rados_object_list_is_end(
4247 rados_ioctx_t io
, rados_object_list_cursor cur
)
4249 hobject_t
*hobj
= (hobject_t
*)cur
;
4250 return hobj
->is_max();
4253 extern "C" void rados_object_list_cursor_free(
4254 rados_ioctx_t io
, rados_object_list_cursor cur
)
4256 hobject_t
*hobj
= (hobject_t
*)cur
;
4260 extern "C" int rados_object_list_cursor_cmp(
4262 rados_object_list_cursor lhs_cur
,
4263 rados_object_list_cursor rhs_cur
)
4265 hobject_t
*lhs
= (hobject_t
*)lhs_cur
;
4266 hobject_t
*rhs
= (hobject_t
*)rhs_cur
;
4267 return cmp(*lhs
, *rhs
);
4270 extern "C" int rados_object_list(rados_ioctx_t io
,
4271 const rados_object_list_cursor start
,
4272 const rados_object_list_cursor finish
,
4273 const size_t result_item_count
,
4274 const char *filter_buf
,
4275 const size_t filter_buf_len
,
4276 rados_object_list_item
*result_items
,
4277 rados_object_list_cursor
*next
)
4281 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4283 // Zero out items so that they will be safe to free later
4284 memset(result_items
, 0, sizeof(rados_object_list_item
) * result_item_count
);
4286 std::list
<librados::ListObjectImpl
> result
;
4287 hobject_t next_hash
;
4289 bufferlist filter_bl
;
4290 if (filter_buf
!= nullptr) {
4291 filter_bl
.append(filter_buf
, filter_buf_len
);
4295 ctx
->objecter
->enumerate_objects(
4298 *((hobject_t
*)start
),
4299 *((hobject_t
*)finish
),
4306 hobject_t
*next_hobj
= (hobject_t
*)(*next
);
4309 int r
= cond
.wait();
4311 *next_hobj
= hobject_t::get_max();
4315 assert(result
.size() <= result_item_count
); // Don't overflow!
4318 for (std::list
<librados::ListObjectImpl
>::iterator i
= result
.begin();
4319 i
!= result
.end(); ++i
) {
4320 rados_object_list_item
&item
= result_items
[k
++];
4321 do_out_buffer(i
->oid
, &item
.oid
, &item
.oid_length
);
4322 do_out_buffer(i
->nspace
, &item
.nspace
, &item
.nspace_length
);
4323 do_out_buffer(i
->locator
, &item
.locator
, &item
.locator_length
);
4326 *next_hobj
= next_hash
;
4328 return result
.size();
4331 extern "C" void rados_object_list_free(
4332 const size_t result_size
,
4333 rados_object_list_item
*results
)
4337 for (unsigned int i
= 0; i
< result_size
; ++i
) {
4338 rados_buffer_free(results
[i
].oid
);
4339 rados_buffer_free(results
[i
].locator
);
4340 rados_buffer_free(results
[i
].nspace
);
4346 extern "C" int rados_nobjects_list_open(rados_ioctx_t io
, rados_list_ctx_t
*listh
)
4348 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4350 tracepoint(librados
, rados_nobjects_list_open_enter
, io
);
4352 Objecter::NListContext
*h
= new Objecter::NListContext
;
4353 h
->pool_id
= ctx
->poolid
;
4354 h
->pool_snap_seq
= ctx
->snap_seq
;
4355 h
->nspace
= ctx
->oloc
.nspace
; // After dropping compatibility need nspace
4356 *listh
= (void *)new librados::ObjListCtx(ctx
, h
);
4357 tracepoint(librados
, rados_nobjects_list_open_exit
, 0, *listh
);
4361 extern "C" void rados_nobjects_list_close(rados_list_ctx_t h
)
4363 tracepoint(librados
, rados_nobjects_list_close_enter
, h
);
4364 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)h
;
4366 tracepoint(librados
, rados_nobjects_list_close_exit
);
4369 extern "C" uint32_t rados_nobjects_list_seek(rados_list_ctx_t listctx
,
4372 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
4373 tracepoint(librados
, rados_nobjects_list_seek_enter
, listctx
, pos
);
4374 uint32_t r
= lh
->ctx
->nlist_seek(lh
->nlc
, pos
);
4375 tracepoint(librados
, rados_nobjects_list_seek_exit
, r
);
4379 extern "C" uint32_t rados_nobjects_list_seek_cursor(rados_list_ctx_t listctx
,
4380 rados_object_list_cursor cursor
)
4382 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
4384 tracepoint(librados
, rados_nobjects_list_seek_cursor_enter
, listctx
);
4385 uint32_t r
= lh
->ctx
->nlist_seek(lh
->nlc
, cursor
);
4386 tracepoint(librados
, rados_nobjects_list_seek_cursor_exit
, r
);
4390 extern "C" int rados_nobjects_list_get_cursor(rados_list_ctx_t listctx
,
4391 rados_object_list_cursor
*cursor
)
4393 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
4395 tracepoint(librados
, rados_nobjects_list_get_cursor_enter
, listctx
);
4396 *cursor
= lh
->ctx
->nlist_get_cursor(lh
->nlc
);
4397 tracepoint(librados
, rados_nobjects_list_get_cursor_exit
, 0);
4401 extern "C" uint32_t rados_nobjects_list_get_pg_hash_position(
4402 rados_list_ctx_t listctx
)
4404 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
4405 tracepoint(librados
, rados_nobjects_list_get_pg_hash_position_enter
, listctx
);
4406 uint32_t retval
= lh
->nlc
->get_pg_hash_position();
4407 tracepoint(librados
, rados_nobjects_list_get_pg_hash_position_exit
, retval
);
4411 extern "C" int rados_nobjects_list_next(rados_list_ctx_t listctx
, const char **entry
, const char **key
, const char **nspace
)
4413 tracepoint(librados
, rados_nobjects_list_next_enter
, listctx
);
4414 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
4415 Objecter::NListContext
*h
= lh
->nlc
;
4417 // if the list is non-empty, this method has been called before
4418 if (!h
->list
.empty())
4419 // so let's kill the previously-returned object
4420 h
->list
.pop_front();
4422 if (h
->list
.empty()) {
4423 int ret
= lh
->ctx
->nlist(lh
->nlc
, RADOS_LIST_MAX_ENTRIES
);
4425 tracepoint(librados
, rados_nobjects_list_next_exit
, ret
, NULL
, NULL
, NULL
);
4428 if (h
->list
.empty()) {
4429 tracepoint(librados
, rados_nobjects_list_next_exit
, -ENOENT
, NULL
, NULL
, NULL
);
4434 *entry
= h
->list
.front().oid
.c_str();
4437 if (h
->list
.front().locator
.size())
4438 *key
= h
->list
.front().locator
.c_str();
4443 *nspace
= h
->list
.front().nspace
.c_str();
4444 tracepoint(librados
, rados_nobjects_list_next_exit
, 0, *entry
, key
, nspace
);
4450 * removed legacy v2 list objects stubs
4452 * thse return -ENOTSUP where possible.
4454 extern "C" int rados_objects_list_open(
4456 rados_list_ctx_t
*ctx
)
4461 extern "C" uint32_t rados_objects_list_get_pg_hash_position(
4462 rados_list_ctx_t ctx
)
4467 extern "C" uint32_t rados_objects_list_seek(
4468 rados_list_ctx_t ctx
,
4474 extern "C" int rados_objects_list_next(
4475 rados_list_ctx_t ctx
,
4482 extern "C" void rados_objects_list_close(
4483 rados_list_ctx_t ctx
)
4488 // -------------------------
4491 extern "C" int rados_aio_create_completion(void *cb_arg
,
4492 rados_callback_t cb_complete
,
4493 rados_callback_t cb_safe
,
4494 rados_completion_t
*pc
)
4496 tracepoint(librados
, rados_aio_create_completion_enter
, cb_arg
, cb_complete
, cb_safe
);
4497 librados::AioCompletionImpl
*c
= new librados::AioCompletionImpl
;
4499 c
->set_complete_callback(cb_arg
, cb_complete
);
4501 c
->set_safe_callback(cb_arg
, cb_safe
);
4503 tracepoint(librados
, rados_aio_create_completion_exit
, 0, *pc
);
4507 extern "C" int rados_aio_wait_for_complete(rados_completion_t c
)
4509 tracepoint(librados
, rados_aio_wait_for_complete_enter
, c
);
4510 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_complete();
4511 tracepoint(librados
, rados_aio_wait_for_complete_exit
, retval
);
4515 extern "C" int rados_aio_wait_for_safe(rados_completion_t c
)
4517 tracepoint(librados
, rados_aio_wait_for_safe_enter
, c
);
4518 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_safe();
4519 tracepoint(librados
, rados_aio_wait_for_safe_exit
, retval
);
4523 extern "C" int rados_aio_is_complete(rados_completion_t c
)
4525 tracepoint(librados
, rados_aio_is_complete_enter
, c
);
4526 int retval
= ((librados::AioCompletionImpl
*)c
)->is_complete();
4527 tracepoint(librados
, rados_aio_is_complete_exit
, retval
);
4531 extern "C" int rados_aio_is_safe(rados_completion_t c
)
4533 tracepoint(librados
, rados_aio_is_safe_enter
, c
);
4534 int retval
= ((librados::AioCompletionImpl
*)c
)->is_safe();
4535 tracepoint(librados
, rados_aio_is_safe_exit
, retval
);
4539 extern "C" int rados_aio_wait_for_complete_and_cb(rados_completion_t c
)
4541 tracepoint(librados
, rados_aio_wait_for_complete_and_cb_enter
, c
);
4542 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_complete_and_cb();
4543 tracepoint(librados
, rados_aio_wait_for_complete_and_cb_exit
, retval
);
4547 extern "C" int rados_aio_wait_for_safe_and_cb(rados_completion_t c
)
4549 tracepoint(librados
, rados_aio_wait_for_safe_and_cb_enter
, c
);
4550 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_safe_and_cb();
4551 tracepoint(librados
, rados_aio_wait_for_safe_and_cb_exit
, retval
);
4555 extern "C" int rados_aio_is_complete_and_cb(rados_completion_t c
)
4557 tracepoint(librados
, rados_aio_is_complete_and_cb_enter
, c
);
4558 int retval
= ((librados::AioCompletionImpl
*)c
)->is_complete_and_cb();
4559 tracepoint(librados
, rados_aio_is_complete_and_cb_exit
, retval
);
4563 extern "C" int rados_aio_is_safe_and_cb(rados_completion_t c
)
4565 tracepoint(librados
, rados_aio_is_safe_and_cb_enter
, c
);
4566 int retval
= ((librados::AioCompletionImpl
*)c
)->is_safe_and_cb();
4567 tracepoint(librados
, rados_aio_is_safe_and_cb_exit
, retval
);
4571 extern "C" int rados_aio_get_return_value(rados_completion_t c
)
4573 tracepoint(librados
, rados_aio_get_return_value_enter
, c
);
4574 int retval
= ((librados::AioCompletionImpl
*)c
)->get_return_value();
4575 tracepoint(librados
, rados_aio_get_return_value_exit
, retval
);
4579 extern "C" uint64_t rados_aio_get_version(rados_completion_t c
)
4581 tracepoint(librados
, rados_aio_get_version_enter
, c
);
4582 uint64_t retval
= ((librados::AioCompletionImpl
*)c
)->get_version();
4583 tracepoint(librados
, rados_aio_get_version_exit
, retval
);
4587 extern "C" void rados_aio_release(rados_completion_t c
)
4589 tracepoint(librados
, rados_aio_release_enter
, c
);
4590 ((librados::AioCompletionImpl
*)c
)->put();
4591 tracepoint(librados
, rados_aio_release_exit
);
4594 extern "C" int rados_aio_read(rados_ioctx_t io
, const char *o
,
4595 rados_completion_t completion
,
4596 char *buf
, size_t len
, uint64_t off
)
4598 tracepoint(librados
, rados_aio_read_enter
, io
, o
, completion
, len
, off
);
4599 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4601 int retval
= ctx
->aio_read(oid
, (librados::AioCompletionImpl
*)completion
,
4602 buf
, len
, off
, ctx
->snap_seq
);
4603 tracepoint(librados
, rados_aio_read_exit
, retval
);
4608 extern "C" int rados_aio_read_traced(rados_ioctx_t io
, const char *o
,
4609 rados_completion_t completion
,
4610 char *buf
, size_t len
, uint64_t off
,
4611 struct blkin_trace_info
*info
)
4613 tracepoint(librados
, rados_aio_read_enter
, io
, o
, completion
, len
, off
);
4614 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4616 int retval
= ctx
->aio_read(oid
, (librados::AioCompletionImpl
*)completion
,
4617 buf
, len
, off
, ctx
->snap_seq
, info
);
4618 tracepoint(librados
, rados_aio_read_exit
, retval
);
4623 extern "C" int rados_aio_write(rados_ioctx_t io
, const char *o
,
4624 rados_completion_t completion
,
4625 const char *buf
, size_t len
, uint64_t off
)
4627 tracepoint(librados
, rados_aio_write_enter
, io
, o
, completion
, buf
, len
, off
);
4628 if (len
> UINT_MAX
/2)
4630 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4633 bl
.append(buf
, len
);
4634 int retval
= ctx
->aio_write(oid
, (librados::AioCompletionImpl
*)completion
,
4636 tracepoint(librados
, rados_aio_write_exit
, retval
);
4641 extern "C" int rados_aio_write_traced(rados_ioctx_t io
, const char *o
,
4642 rados_completion_t completion
,
4643 const char *buf
, size_t len
, uint64_t off
,
4644 struct blkin_trace_info
*info
)
4646 tracepoint(librados
, rados_aio_write_enter
, io
, o
, completion
, buf
, len
, off
);
4647 if (len
> UINT_MAX
/2)
4649 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4652 bl
.append(buf
, len
);
4653 int retval
= ctx
->aio_write(oid
, (librados::AioCompletionImpl
*)completion
,
4654 bl
, len
, off
, info
);
4655 tracepoint(librados
, rados_aio_write_exit
, retval
);
4660 extern "C" int rados_aio_append(rados_ioctx_t io
, const char *o
,
4661 rados_completion_t completion
,
4662 const char *buf
, size_t len
)
4664 tracepoint(librados
, rados_aio_append_enter
, io
, o
, completion
, buf
, len
);
4665 if (len
> UINT_MAX
/2)
4667 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4670 bl
.append(buf
, len
);
4671 int retval
= ctx
->aio_append(oid
, (librados::AioCompletionImpl
*)completion
,
4673 tracepoint(librados
, rados_aio_append_exit
, retval
);
4677 extern "C" int rados_aio_write_full(rados_ioctx_t io
, const char *o
,
4678 rados_completion_t completion
,
4679 const char *buf
, size_t len
)
4681 tracepoint(librados
, rados_aio_write_full_enter
, io
, o
, completion
, buf
, len
);
4682 if (len
> UINT_MAX
/2)
4684 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4687 bl
.append(buf
, len
);
4688 int retval
= ctx
->aio_write_full(oid
, (librados::AioCompletionImpl
*)completion
, bl
);
4689 tracepoint(librados
, rados_aio_write_full_exit
, retval
);
4693 extern "C" int rados_aio_writesame(rados_ioctx_t io
, const char *o
,
4694 rados_completion_t completion
,
4695 const char *buf
, size_t data_len
,
4696 size_t write_len
, uint64_t off
)
4698 tracepoint(librados
, rados_aio_writesame_enter
, io
, o
, completion
, buf
,
4699 data_len
, write_len
, off
);
4700 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4703 bl
.append(buf
, data_len
);
4704 int retval
= ctx
->aio_writesame(o
, (librados::AioCompletionImpl
*)completion
,
4705 bl
, write_len
, off
);
4706 tracepoint(librados
, rados_aio_writesame_exit
, retval
);
4710 extern "C" int rados_aio_remove(rados_ioctx_t io
, const char *o
,
4711 rados_completion_t completion
)
4713 tracepoint(librados
, rados_aio_remove_enter
, io
, o
, completion
);
4714 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4716 int retval
= ctx
->aio_remove(oid
, (librados::AioCompletionImpl
*)completion
);
4717 tracepoint(librados
, rados_aio_remove_exit
, retval
);
4721 extern "C" int rados_aio_flush_async(rados_ioctx_t io
,
4722 rados_completion_t completion
)
4724 tracepoint(librados
, rados_aio_flush_async_enter
, io
, completion
);
4725 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4726 ctx
->flush_aio_writes_async((librados::AioCompletionImpl
*)completion
);
4727 tracepoint(librados
, rados_aio_flush_async_exit
, 0);
4731 extern "C" int rados_aio_flush(rados_ioctx_t io
)
4733 tracepoint(librados
, rados_aio_flush_enter
, io
);
4734 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4735 ctx
->flush_aio_writes();
4736 tracepoint(librados
, rados_aio_flush_exit
, 0);
4740 struct AioGetxattrData
{
4741 AioGetxattrData(char* buf
, rados_completion_t c
, size_t l
) :
4742 user_buf(buf
), len(l
), user_completion((librados::AioCompletionImpl
*)c
) {}
4746 struct librados::C_AioCompleteAndSafe user_completion
;
4749 static void rados_aio_getxattr_complete(rados_completion_t c
, void *arg
) {
4750 AioGetxattrData
*cdata
= reinterpret_cast<AioGetxattrData
*>(arg
);
4751 int rc
= rados_aio_get_return_value(c
);
4753 if (cdata
->bl
.length() > cdata
->len
) {
4756 if (!cdata
->bl
.is_provided_buffer(cdata
->user_buf
))
4757 cdata
->bl
.copy(0, cdata
->bl
.length(), cdata
->user_buf
);
4758 rc
= cdata
->bl
.length();
4761 cdata
->user_completion
.finish(rc
);
4765 extern "C" int rados_aio_getxattr(rados_ioctx_t io
, const char *o
,
4766 rados_completion_t completion
,
4767 const char *name
, char *buf
, size_t len
)
4769 tracepoint(librados
, rados_aio_getxattr_enter
, io
, o
, completion
, name
, len
);
4770 // create data object to be passed to async callback
4771 AioGetxattrData
*cdata
= new AioGetxattrData(buf
, completion
, len
);
4773 tracepoint(librados
, rados_aio_getxattr_exit
, -ENOMEM
, NULL
, 0);
4776 cdata
->bl
.push_back(buffer::create_static(len
, buf
));
4777 // create completion callback
4778 librados::AioCompletionImpl
*c
= new librados::AioCompletionImpl
;
4779 c
->set_complete_callback(cdata
, rados_aio_getxattr_complete
);
4780 // call async getxattr of IoCtx
4781 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4783 int ret
= ctx
->aio_getxattr(oid
, c
, name
, cdata
->bl
);
4784 tracepoint(librados
, rados_aio_getxattr_exit
, ret
, buf
, ret
);
4789 struct AioGetxattrsData
{
4790 AioGetxattrsData(rados_completion_t c
, rados_xattrs_iter_t
*_iter
) :
4791 iter(_iter
), user_completion((librados::AioCompletionImpl
*)c
) {
4792 it
= new librados::RadosXattrsIter();
4794 ~AioGetxattrsData() {
4797 librados::RadosXattrsIter
*it
;
4798 rados_xattrs_iter_t
*iter
;
4799 struct librados::C_AioCompleteAndSafe user_completion
;
4803 static void rados_aio_getxattrs_complete(rados_completion_t c
, void *arg
) {
4804 AioGetxattrsData
*cdata
= reinterpret_cast<AioGetxattrsData
*>(arg
);
4805 int rc
= rados_aio_get_return_value(c
);
4807 cdata
->user_completion
.finish(rc
);
4809 cdata
->it
->i
= cdata
->it
->attrset
.begin();
4810 *cdata
->iter
= cdata
->it
;
4812 cdata
->user_completion
.finish(0);
4817 extern "C" int rados_aio_getxattrs(rados_ioctx_t io
, const char *oid
,
4818 rados_completion_t completion
,
4819 rados_xattrs_iter_t
*iter
)
4821 tracepoint(librados
, rados_aio_getxattrs_enter
, io
, oid
, completion
);
4822 // create data object to be passed to async callback
4823 AioGetxattrsData
*cdata
= new AioGetxattrsData(completion
, iter
);
4825 tracepoint(librados
, rados_getxattrs_exit
, -ENOMEM
, NULL
);
4828 // create completion callback
4829 librados::AioCompletionImpl
*c
= new librados::AioCompletionImpl
;
4830 c
->set_complete_callback(cdata
, rados_aio_getxattrs_complete
);
4831 // call async getxattrs of IoCtx
4832 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4834 int ret
= ctx
->aio_getxattrs(obj
, c
, cdata
->it
->attrset
);
4835 tracepoint(librados
, rados_aio_getxattrs_exit
, ret
, cdata
->it
);
4839 extern "C" int rados_aio_setxattr(rados_ioctx_t io
, const char *o
,
4840 rados_completion_t completion
,
4841 const char *name
, const char *buf
, size_t len
)
4843 tracepoint(librados
, rados_aio_setxattr_enter
, io
, o
, completion
, name
, buf
, len
);
4844 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4847 bl
.append(buf
, len
);
4848 int retval
= ctx
->aio_setxattr(oid
, (librados::AioCompletionImpl
*)completion
, name
, bl
);
4849 tracepoint(librados
, rados_aio_setxattr_exit
, retval
);
4853 extern "C" int rados_aio_rmxattr(rados_ioctx_t io
, const char *o
,
4854 rados_completion_t completion
,
4857 tracepoint(librados
, rados_aio_rmxattr_enter
, io
, o
, completion
, name
);
4858 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4860 int retval
= ctx
->aio_rmxattr(oid
, (librados::AioCompletionImpl
*)completion
, name
);
4861 tracepoint(librados
, rados_aio_rmxattr_exit
, retval
);
4865 extern "C" int rados_aio_stat(rados_ioctx_t io
, const char *o
,
4866 rados_completion_t completion
,
4867 uint64_t *psize
, time_t *pmtime
)
4869 tracepoint(librados
, rados_aio_stat_enter
, io
, o
, completion
);
4870 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4872 int retval
= ctx
->aio_stat(oid
, (librados::AioCompletionImpl
*)completion
,
4874 tracepoint(librados
, rados_aio_stat_exit
, retval
);
4878 extern "C" int rados_aio_cmpext(rados_ioctx_t io
, const char *o
,
4879 rados_completion_t completion
, const char *cmp_buf
,
4880 size_t cmp_len
, uint64_t off
)
4882 tracepoint(librados
, rados_aio_cmpext_enter
, io
, o
, completion
, cmp_buf
,
4884 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4886 int retval
= ctx
->aio_cmpext(oid
, (librados::AioCompletionImpl
*)completion
,
4887 cmp_buf
, cmp_len
, off
);
4888 tracepoint(librados
, rados_aio_cmpext_exit
, retval
);
4892 extern "C" int rados_aio_cancel(rados_ioctx_t io
, rados_completion_t completion
)
4894 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4895 return ctx
->aio_cancel((librados::AioCompletionImpl
*)completion
);
4898 extern "C" int rados_aio_exec(rados_ioctx_t io
, const char *o
,
4899 rados_completion_t completion
,
4900 const char *cls
, const char *method
,
4901 const char *inbuf
, size_t in_len
,
4902 char *buf
, size_t out_len
)
4904 tracepoint(librados
, rados_aio_exec_enter
, io
, o
, completion
);
4905 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4908 inbl
.append(inbuf
, in_len
);
4909 int retval
= ctx
->aio_exec(oid
, (librados::AioCompletionImpl
*)completion
,
4910 cls
, method
, inbl
, buf
, out_len
);
4911 tracepoint(librados
, rados_aio_exec_exit
, retval
);
4915 struct C_WatchCB
: public librados::WatchCtx
{
4916 rados_watchcb_t wcb
;
4918 C_WatchCB(rados_watchcb_t _wcb
, void *_arg
) : wcb(_wcb
), arg(_arg
) {}
4919 void notify(uint8_t opcode
, uint64_t ver
, bufferlist
& bl
) override
{
4920 wcb(opcode
, ver
, arg
);
4924 extern "C" int rados_watch(rados_ioctx_t io
, const char *o
, uint64_t ver
,
4926 rados_watchcb_t watchcb
, void *arg
)
4928 tracepoint(librados
, rados_watch_enter
, io
, o
, ver
, watchcb
, arg
);
4929 uint64_t *cookie
= handle
;
4930 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4932 C_WatchCB
*wc
= new C_WatchCB(watchcb
, arg
);
4933 int retval
= ctx
->watch(oid
, cookie
, wc
, NULL
, true);
4934 tracepoint(librados
, rados_watch_exit
, retval
, *handle
);
4938 struct C_WatchCB2
: public librados::WatchCtx2
{
4939 rados_watchcb2_t wcb
;
4940 rados_watcherrcb_t errcb
;
4942 C_WatchCB2(rados_watchcb2_t _wcb
,
4943 rados_watcherrcb_t _errcb
,
4944 void *_arg
) : wcb(_wcb
), errcb(_errcb
), arg(_arg
) {}
4945 void handle_notify(uint64_t notify_id
,
4947 uint64_t notifier_gid
,
4948 bufferlist
& bl
) override
{
4949 wcb(arg
, notify_id
, cookie
, notifier_gid
, bl
.c_str(), bl
.length());
4951 void handle_error(uint64_t cookie
, int err
) override
{
4953 errcb(arg
, cookie
, err
);
4957 extern "C" int rados_watch2(rados_ioctx_t io
, const char *o
, uint64_t *handle
,
4958 rados_watchcb2_t watchcb
,
4959 rados_watcherrcb_t watcherrcb
,
4961 return rados_watch3(io
, o
, handle
, watchcb
, watcherrcb
, 0, arg
);
4964 extern "C" int rados_watch3(rados_ioctx_t io
, const char *o
, uint64_t *handle
,
4965 rados_watchcb2_t watchcb
,
4966 rados_watcherrcb_t watcherrcb
,
4970 tracepoint(librados
, rados_watch3_enter
, io
, o
, handle
, watchcb
, timeout
, arg
);
4972 if (!watchcb
|| !o
|| !handle
) {
4975 uint64_t *cookie
= handle
;
4976 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4978 C_WatchCB2
*wc
= new C_WatchCB2(watchcb
, watcherrcb
, arg
);
4979 ret
= ctx
->watch(oid
, cookie
, NULL
, wc
, timeout
, true);
4981 tracepoint(librados
, rados_watch3_exit
, ret
, handle
? *handle
: 0);
4985 extern "C" int rados_aio_watch(rados_ioctx_t io
, const char *o
,
4986 rados_completion_t completion
,
4988 rados_watchcb2_t watchcb
,
4989 rados_watcherrcb_t watcherrcb
, void *arg
) {
4990 return rados_aio_watch2(io
, o
, completion
, handle
, watchcb
, watcherrcb
, 0, arg
);
4993 extern "C" int rados_aio_watch2(rados_ioctx_t io
, const char *o
,
4994 rados_completion_t completion
,
4996 rados_watchcb2_t watchcb
,
4997 rados_watcherrcb_t watcherrcb
,
4998 uint32_t timeout
, void *arg
)
5000 tracepoint(librados
, rados_aio_watch2_enter
, io
, o
, completion
, handle
, watchcb
, timeout
, arg
);
5002 if (!completion
|| !watchcb
|| !o
|| !handle
) {
5005 uint64_t *cookie
= handle
;
5006 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5008 librados::AioCompletionImpl
*c
=
5009 reinterpret_cast<librados::AioCompletionImpl
*>(completion
);
5010 C_WatchCB2
*wc
= new C_WatchCB2(watchcb
, watcherrcb
, arg
);
5011 ret
= ctx
->aio_watch(oid
, c
, cookie
, NULL
, wc
, timeout
, true);
5013 tracepoint(librados
, rados_aio_watch2_exit
, ret
, handle
? *handle
: 0);
5018 extern "C" int rados_unwatch(rados_ioctx_t io
, const char *o
, uint64_t handle
)
5020 tracepoint(librados
, rados_unwatch_enter
, io
, o
, handle
);
5021 uint64_t cookie
= handle
;
5022 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5023 int retval
= ctx
->unwatch(cookie
);
5024 tracepoint(librados
, rados_unwatch_exit
, retval
);
5028 extern "C" int rados_unwatch2(rados_ioctx_t io
, uint64_t handle
)
5030 tracepoint(librados
, rados_unwatch2_enter
, io
, handle
);
5031 uint64_t cookie
= handle
;
5032 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5033 int retval
= ctx
->unwatch(cookie
);
5034 tracepoint(librados
, rados_unwatch2_exit
, retval
);
5038 extern "C" int rados_aio_unwatch(rados_ioctx_t io
, uint64_t handle
,
5039 rados_completion_t completion
)
5041 tracepoint(librados
, rados_aio_unwatch_enter
, io
, handle
, completion
);
5042 uint64_t cookie
= handle
;
5043 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5044 librados::AioCompletionImpl
*c
=
5045 reinterpret_cast<librados::AioCompletionImpl
*>(completion
);
5046 int retval
= ctx
->aio_unwatch(cookie
, c
);
5047 tracepoint(librados
, rados_aio_unwatch_exit
, retval
);
5051 extern "C" int rados_watch_check(rados_ioctx_t io
, uint64_t handle
)
5053 tracepoint(librados
, rados_watch_check_enter
, io
, handle
);
5054 uint64_t cookie
= handle
;
5055 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5056 int retval
= ctx
->watch_check(cookie
);
5057 tracepoint(librados
, rados_watch_check_exit
, retval
);
5061 extern "C" int rados_notify(rados_ioctx_t io
, const char *o
,
5062 uint64_t ver
, const char *buf
, int buf_len
)
5064 tracepoint(librados
, rados_notify_enter
, io
, o
, ver
, buf
, buf_len
);
5065 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5069 bufferptr p
= buffer::create(buf_len
);
5070 memcpy(p
.c_str(), buf
, buf_len
);
5073 int retval
= ctx
->notify(oid
, bl
, 0, NULL
, NULL
, NULL
);
5074 tracepoint(librados
, rados_notify_exit
, retval
);
5078 extern "C" int rados_notify2(rados_ioctx_t io
, const char *o
,
5079 const char *buf
, int buf_len
,
5080 uint64_t timeout_ms
,
5081 char **reply_buffer
,
5082 size_t *reply_buffer_len
)
5084 tracepoint(librados
, rados_notify2_enter
, io
, o
, buf
, buf_len
, timeout_ms
);
5085 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5089 bufferptr p
= buffer::create(buf_len
);
5090 memcpy(p
.c_str(), buf
, buf_len
);
5093 int ret
= ctx
->notify(oid
, bl
, timeout_ms
, NULL
, reply_buffer
, reply_buffer_len
);
5094 tracepoint(librados
, rados_notify2_exit
, ret
);
5098 extern "C" int rados_aio_notify(rados_ioctx_t io
, const char *o
,
5099 rados_completion_t completion
,
5100 const char *buf
, int buf_len
,
5101 uint64_t timeout_ms
, char **reply_buffer
,
5102 size_t *reply_buffer_len
)
5104 tracepoint(librados
, rados_aio_notify_enter
, io
, o
, completion
, buf
, buf_len
,
5106 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5110 bl
.push_back(buffer::copy(buf
, buf_len
));
5112 librados::AioCompletionImpl
*c
=
5113 reinterpret_cast<librados::AioCompletionImpl
*>(completion
);
5114 int ret
= ctx
->aio_notify(oid
, c
, bl
, timeout_ms
, NULL
, reply_buffer
,
5116 tracepoint(librados
, rados_aio_notify_exit
, ret
);
5120 extern "C" int rados_notify_ack(rados_ioctx_t io
, const char *o
,
5121 uint64_t notify_id
, uint64_t handle
,
5122 const char *buf
, int buf_len
)
5124 tracepoint(librados
, rados_notify_ack_enter
, io
, o
, notify_id
, handle
, buf
, buf_len
);
5125 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5129 bufferptr p
= buffer::create(buf_len
);
5130 memcpy(p
.c_str(), buf
, buf_len
);
5133 ctx
->notify_ack(oid
, notify_id
, handle
, bl
);
5134 tracepoint(librados
, rados_notify_ack_exit
, 0);
5138 extern "C" int rados_watch_flush(rados_t cluster
)
5140 tracepoint(librados
, rados_watch_flush_enter
, cluster
);
5141 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
5142 int retval
= client
->watch_flush();
5143 tracepoint(librados
, rados_watch_flush_exit
, retval
);
5147 extern "C" int rados_aio_watch_flush(rados_t cluster
, rados_completion_t completion
)
5149 tracepoint(librados
, rados_aio_watch_flush_enter
, cluster
, completion
);
5150 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
5151 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
5152 int retval
= client
->async_watch_flush(c
);
5153 tracepoint(librados
, rados_aio_watch_flush_exit
, retval
);
5157 extern "C" int rados_set_alloc_hint(rados_ioctx_t io
, const char *o
,
5158 uint64_t expected_object_size
,
5159 uint64_t expected_write_size
)
5161 tracepoint(librados
, rados_set_alloc_hint_enter
, io
, o
, expected_object_size
, expected_write_size
);
5162 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5164 int retval
= ctx
->set_alloc_hint(oid
, expected_object_size
,
5165 expected_write_size
, 0);
5166 tracepoint(librados
, rados_set_alloc_hint_exit
, retval
);
5170 extern "C" int rados_set_alloc_hint2(rados_ioctx_t io
, const char *o
,
5171 uint64_t expected_object_size
,
5172 uint64_t expected_write_size
,
5175 tracepoint(librados
, rados_set_alloc_hint2_enter
, io
, o
, expected_object_size
, expected_write_size
, flags
);
5176 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5178 int retval
= ctx
->set_alloc_hint(oid
, expected_object_size
,
5179 expected_write_size
, flags
);
5180 tracepoint(librados
, rados_set_alloc_hint2_exit
, retval
);
5184 extern "C" int rados_lock_exclusive(rados_ioctx_t io
, const char * o
,
5185 const char * name
, const char * cookie
,
5186 const char * desc
, struct timeval
* duration
,
5189 tracepoint(librados
, rados_lock_exclusive_enter
, io
, o
, name
, cookie
, desc
, duration
, flags
);
5190 librados::IoCtx ctx
;
5191 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5193 int retval
= ctx
.lock_exclusive(o
, name
, cookie
, desc
, duration
, flags
);
5194 tracepoint(librados
, rados_lock_exclusive_exit
, retval
);
5198 extern "C" int rados_lock_shared(rados_ioctx_t io
, const char * o
,
5199 const char * name
, const char * cookie
,
5200 const char * tag
, const char * desc
,
5201 struct timeval
* duration
, uint8_t flags
)
5203 tracepoint(librados
, rados_lock_shared_enter
, io
, o
, name
, cookie
, tag
, desc
, duration
, flags
);
5204 librados::IoCtx ctx
;
5205 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5207 int retval
= ctx
.lock_shared(o
, name
, cookie
, tag
, desc
, duration
, flags
);
5208 tracepoint(librados
, rados_lock_shared_exit
, retval
);
5211 extern "C" int rados_unlock(rados_ioctx_t io
, const char *o
, const char *name
,
5214 tracepoint(librados
, rados_unlock_enter
, io
, o
, name
, cookie
);
5215 librados::IoCtx ctx
;
5216 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5218 int retval
= ctx
.unlock(o
, name
, cookie
);
5219 tracepoint(librados
, rados_unlock_exit
, retval
);
5223 extern "C" int rados_aio_unlock(rados_ioctx_t io
, const char *o
, const char *name
,
5224 const char *cookie
, rados_completion_t completion
)
5226 tracepoint(librados
, rados_aio_unlock_enter
, io
, o
, name
, cookie
, completion
);
5227 librados::IoCtx ctx
;
5228 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5229 librados::AioCompletionImpl
*comp
= (librados::AioCompletionImpl
*)completion
;
5230 librados::AioCompletion
c(comp
);
5231 int retval
= ctx
.aio_unlock(o
, name
, cookie
, &c
);
5232 tracepoint(librados
, rados_aio_unlock_exit
, retval
);
5236 extern "C" ssize_t
rados_list_lockers(rados_ioctx_t io
, const char *o
,
5237 const char *name
, int *exclusive
,
5238 char *tag
, size_t *tag_len
,
5239 char *clients
, size_t *clients_len
,
5240 char *cookies
, size_t *cookies_len
,
5241 char *addrs
, size_t *addrs_len
)
5243 tracepoint(librados
, rados_list_lockers_enter
, io
, o
, name
, *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
5244 librados::IoCtx ctx
;
5245 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5246 std::string name_str
= name
;
5247 std::string oid
= o
;
5248 std::string tag_str
;
5250 std::list
<librados::locker_t
> lockers
;
5251 int r
= ctx
.list_lockers(oid
, name_str
, &tmp_exclusive
, &tag_str
, &lockers
);
5253 tracepoint(librados
, rados_list_lockers_exit
, r
, *exclusive
, "", *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
5257 size_t clients_total
= 0;
5258 size_t cookies_total
= 0;
5259 size_t addrs_total
= 0;
5260 list
<librados::locker_t
>::const_iterator it
;
5261 for (it
= lockers
.begin(); it
!= lockers
.end(); ++it
) {
5262 clients_total
+= it
->client
.length() + 1;
5263 cookies_total
+= it
->cookie
.length() + 1;
5264 addrs_total
+= it
->address
.length() + 1;
5267 bool too_short
= ((clients_total
> *clients_len
) ||
5268 (cookies_total
> *cookies_len
) ||
5269 (addrs_total
> *addrs_len
) ||
5270 (tag_str
.length() + 1 > *tag_len
));
5271 *clients_len
= clients_total
;
5272 *cookies_len
= cookies_total
;
5273 *addrs_len
= addrs_total
;
5274 *tag_len
= tag_str
.length() + 1;
5276 tracepoint(librados
, rados_list_lockers_exit
, -ERANGE
, *exclusive
, "", *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
5280 strcpy(tag
, tag_str
.c_str());
5281 char *clients_p
= clients
;
5282 char *cookies_p
= cookies
;
5283 char *addrs_p
= addrs
;
5284 for (it
= lockers
.begin(); it
!= lockers
.end(); ++it
) {
5285 strcpy(clients_p
, it
->client
.c_str());
5286 strcpy(cookies_p
, it
->cookie
.c_str());
5287 strcpy(addrs_p
, it
->address
.c_str());
5288 tracepoint(librados
, rados_list_lockers_locker
, clients_p
, cookies_p
, addrs_p
);
5289 clients_p
+= it
->client
.length() + 1;
5290 cookies_p
+= it
->cookie
.length() + 1;
5291 addrs_p
+= it
->address
.length() + 1;
5298 int retval
= lockers
.size();
5299 tracepoint(librados
, rados_list_lockers_exit
, retval
, *exclusive
, tag
, *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
5303 extern "C" int rados_break_lock(rados_ioctx_t io
, const char *o
,
5304 const char *name
, const char *client
,
5307 tracepoint(librados
, rados_break_lock_enter
, io
, o
, name
, client
, cookie
);
5308 librados::IoCtx ctx
;
5309 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5311 int retval
= ctx
.break_lock(o
, name
, client
, cookie
);
5312 tracepoint(librados
, rados_break_lock_exit
, retval
);
5316 extern "C" rados_write_op_t
rados_create_write_op()
5318 tracepoint(librados
, rados_create_write_op_enter
);
5319 rados_write_op_t retval
= new (std::nothrow
)::ObjectOperation
;
5320 tracepoint(librados
, rados_create_write_op_exit
, retval
);
5324 extern "C" void rados_release_write_op(rados_write_op_t write_op
)
5326 tracepoint(librados
, rados_release_write_op_enter
, write_op
);
5327 delete (::ObjectOperation
*)write_op
;
5328 tracepoint(librados
, rados_release_write_op_exit
);
5331 extern "C" void rados_write_op_set_flags(rados_write_op_t write_op
, int flags
)
5333 tracepoint(librados
, rados_write_op_set_flags_enter
, write_op
, flags
);
5334 set_op_flags((::ObjectOperation
*)write_op
, flags
);
5335 tracepoint(librados
, rados_write_op_set_flags_exit
);
5338 extern "C" void rados_write_op_assert_version(rados_write_op_t write_op
, uint64_t ver
)
5340 tracepoint(librados
, rados_write_op_assert_version_enter
, write_op
, ver
);
5341 ((::ObjectOperation
*)write_op
)->assert_version(ver
);
5342 tracepoint(librados
, rados_write_op_assert_version_exit
);
5345 extern "C" void rados_write_op_assert_exists(rados_write_op_t write_op
)
5347 tracepoint(librados
, rados_write_op_assert_exists_enter
, write_op
);
5348 ((::ObjectOperation
*)write_op
)->stat(NULL
, (ceph::real_time
*)NULL
, NULL
);
5349 tracepoint(librados
, rados_write_op_assert_exists_exit
);
5352 extern "C" void rados_write_op_cmpext(rados_write_op_t write_op
,
5353 const char *cmp_buf
,
5358 tracepoint(librados
, rados_write_op_cmpext_enter
, write_op
, cmp_buf
,
5359 cmp_len
, off
, prval
);
5360 ((::ObjectOperation
*)write_op
)->cmpext(off
, cmp_len
, cmp_buf
, prval
);
5361 tracepoint(librados
, rados_write_op_cmpext_exit
);
5364 extern "C" void rados_write_op_cmpxattr(rados_write_op_t write_op
,
5366 uint8_t comparison_operator
,
5370 tracepoint(librados
, rados_write_op_cmpxattr_enter
, write_op
, name
, comparison_operator
, value
, value_len
);
5372 bl
.append(value
, value_len
);
5373 ((::ObjectOperation
*)write_op
)->cmpxattr(name
,
5374 comparison_operator
,
5375 CEPH_OSD_CMPXATTR_MODE_STRING
,
5377 tracepoint(librados
, rados_write_op_cmpxattr_exit
);
5380 static void rados_c_omap_cmp(ObjectOperation
*op
,
5382 uint8_t comparison_operator
,
5388 bl
.append(val
, val_len
);
5389 std::map
<std::string
, pair
<bufferlist
, int> > assertions
;
5390 assertions
[key
] = std::make_pair(bl
, comparison_operator
);
5391 op
->omap_cmp(assertions
, prval
);
5394 extern "C" void rados_write_op_omap_cmp(rados_write_op_t write_op
,
5396 uint8_t comparison_operator
,
5401 tracepoint(librados
, rados_write_op_omap_cmp_enter
, write_op
, key
, comparison_operator
, val
, val_len
, prval
);
5402 rados_c_omap_cmp((::ObjectOperation
*)write_op
, key
, comparison_operator
,
5403 val
, val_len
, prval
);
5404 tracepoint(librados
, rados_write_op_omap_cmp_exit
);
5407 extern "C" void rados_write_op_setxattr(rados_write_op_t write_op
,
5412 tracepoint(librados
, rados_write_op_setxattr_enter
, write_op
, name
, value
, value_len
);
5414 bl
.append(value
, value_len
);
5415 ((::ObjectOperation
*)write_op
)->setxattr(name
, bl
);
5416 tracepoint(librados
, rados_write_op_setxattr_exit
);
5419 extern "C" void rados_write_op_rmxattr(rados_write_op_t write_op
,
5422 tracepoint(librados
, rados_write_op_rmxattr_enter
, write_op
, name
);
5423 ((::ObjectOperation
*)write_op
)->rmxattr(name
);
5424 tracepoint(librados
, rados_write_op_rmxattr_exit
);
5427 extern "C" void rados_write_op_create(rados_write_op_t write_op
,
5429 const char* category
) // unused
5431 tracepoint(librados
, rados_write_op_create_enter
, write_op
, exclusive
);
5432 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
5433 oo
->create(!!exclusive
);
5434 tracepoint(librados
, rados_write_op_create_exit
);
5437 extern "C" void rados_write_op_write(rados_write_op_t write_op
,
5442 tracepoint(librados
, rados_write_op_write_enter
, write_op
, buffer
, len
, offset
);
5444 bl
.append(buffer
,len
);
5445 ((::ObjectOperation
*)write_op
)->write(offset
, bl
);
5446 tracepoint(librados
, rados_write_op_write_exit
);
5449 extern "C" void rados_write_op_write_full(rados_write_op_t write_op
,
5453 tracepoint(librados
, rados_write_op_write_full_enter
, write_op
, buffer
, len
);
5455 bl
.append(buffer
,len
);
5456 ((::ObjectOperation
*)write_op
)->write_full(bl
);
5457 tracepoint(librados
, rados_write_op_write_full_exit
);
5460 extern "C" void rados_write_op_writesame(rados_write_op_t write_op
,
5466 tracepoint(librados
, rados_write_op_writesame_enter
, write_op
, buffer
, data_len
, write_len
, offset
);
5468 bl
.append(buffer
, data_len
);
5469 ((::ObjectOperation
*)write_op
)->writesame(offset
, write_len
, bl
);
5470 tracepoint(librados
, rados_write_op_writesame_exit
);
5473 extern "C" void rados_write_op_append(rados_write_op_t write_op
,
5477 tracepoint(librados
, rados_write_op_append_enter
, write_op
, buffer
, len
);
5479 bl
.append(buffer
,len
);
5480 ((::ObjectOperation
*)write_op
)->append(bl
);
5481 tracepoint(librados
, rados_write_op_append_exit
);
5484 extern "C" void rados_write_op_remove(rados_write_op_t write_op
)
5486 tracepoint(librados
, rados_write_op_remove_enter
, write_op
);
5487 ((::ObjectOperation
*)write_op
)->remove();
5488 tracepoint(librados
, rados_write_op_remove_exit
);
5491 extern "C" void rados_write_op_truncate(rados_write_op_t write_op
,
5494 tracepoint(librados
, rados_write_op_truncate_enter
, write_op
, offset
);
5495 ((::ObjectOperation
*)write_op
)->truncate(offset
);
5496 tracepoint(librados
, rados_write_op_truncate_exit
);
5499 extern "C" void rados_write_op_zero(rados_write_op_t write_op
,
5503 tracepoint(librados
, rados_write_op_zero_enter
, write_op
, offset
, len
);
5504 ((::ObjectOperation
*)write_op
)->zero(offset
, len
);
5505 tracepoint(librados
, rados_write_op_zero_exit
);
5508 extern "C" void rados_write_op_exec(rados_write_op_t write_op
,
5515 tracepoint(librados
, rados_write_op_exec_enter
, write_op
, cls
, method
, in_buf
, in_len
, prval
);
5517 inbl
.append(in_buf
, in_len
);
5518 ((::ObjectOperation
*)write_op
)->call(cls
, method
, inbl
, NULL
, NULL
, prval
);
5519 tracepoint(librados
, rados_write_op_exec_exit
);
5522 extern "C" void rados_write_op_omap_set(rados_write_op_t write_op
,
5523 char const* const* keys
,
5524 char const* const* vals
,
5528 tracepoint(librados
, rados_write_op_omap_set_enter
, write_op
, num
);
5529 std::map
<std::string
, bufferlist
> entries
;
5530 for (size_t i
= 0; i
< num
; ++i
) {
5531 tracepoint(librados
, rados_write_op_omap_set_entry
, keys
[i
], vals
[i
], lens
[i
]);
5532 bufferlist
bl(lens
[i
]);
5533 bl
.append(vals
[i
], lens
[i
]);
5534 entries
[keys
[i
]] = bl
;
5536 ((::ObjectOperation
*)write_op
)->omap_set(entries
);
5537 tracepoint(librados
, rados_write_op_omap_set_exit
);
5540 extern "C" void rados_write_op_omap_rm_keys(rados_write_op_t write_op
,
5541 char const* const* keys
,
5544 tracepoint(librados
, rados_write_op_omap_rm_keys_enter
, write_op
, keys_len
);
5545 for(size_t i
= 0; i
< keys_len
; i
++) {
5546 tracepoint(librados
, rados_write_op_omap_rm_keys_entry
, keys
[i
]);
5548 std::set
<std::string
> to_remove(keys
, keys
+ keys_len
);
5549 ((::ObjectOperation
*)write_op
)->omap_rm_keys(to_remove
);
5550 tracepoint(librados
, rados_write_op_omap_rm_keys_exit
);
5553 extern "C" void rados_write_op_omap_clear(rados_write_op_t write_op
)
5555 tracepoint(librados
, rados_write_op_omap_clear_enter
, write_op
);
5556 ((::ObjectOperation
*)write_op
)->omap_clear();
5557 tracepoint(librados
, rados_write_op_omap_clear_exit
);
5560 extern "C" void rados_write_op_set_alloc_hint(rados_write_op_t write_op
,
5561 uint64_t expected_object_size
,
5562 uint64_t expected_write_size
)
5564 tracepoint(librados
, rados_write_op_set_alloc_hint_enter
, write_op
, expected_object_size
, expected_write_size
);
5565 ((::ObjectOperation
*)write_op
)->set_alloc_hint(expected_object_size
,
5566 expected_write_size
, 0);
5567 tracepoint(librados
, rados_write_op_set_alloc_hint_exit
);
5570 extern "C" void rados_write_op_set_alloc_hint2(rados_write_op_t write_op
,
5571 uint64_t expected_object_size
,
5572 uint64_t expected_write_size
,
5575 tracepoint(librados
, rados_write_op_set_alloc_hint2_enter
, write_op
, expected_object_size
, expected_write_size
, flags
);
5576 ((::ObjectOperation
*)write_op
)->set_alloc_hint(expected_object_size
,
5577 expected_write_size
,
5579 tracepoint(librados
, rados_write_op_set_alloc_hint2_exit
);
5582 extern "C" int rados_write_op_operate(rados_write_op_t write_op
,
5588 tracepoint(librados
, rados_write_op_operate_enter
, write_op
, io
, oid
, mtime
, flags
);
5590 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
5591 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5593 ceph::real_time
*prt
= NULL
;
5597 rt
= ceph::real_clock::from_time_t(*mtime
);
5601 int retval
= ctx
->operate(obj
, oo
, prt
, translate_flags(flags
));
5602 tracepoint(librados
, rados_write_op_operate_exit
, retval
);
5606 extern "C" int rados_write_op_operate2(rados_write_op_t write_op
,
5609 struct timespec
*ts
,
5612 tracepoint(librados
, rados_write_op_operate2_enter
, write_op
, io
, oid
, ts
, flags
);
5614 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
5615 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5617 ceph::real_time
*prt
= NULL
;
5621 rt
= ceph::real_clock::from_timespec(*ts
);
5625 int retval
= ctx
->operate(obj
, oo
, prt
, translate_flags(flags
));
5626 tracepoint(librados
, rados_write_op_operate_exit
, retval
);
5630 extern "C" int rados_aio_write_op_operate(rados_write_op_t write_op
,
5632 rados_completion_t completion
,
5637 tracepoint(librados
, rados_aio_write_op_operate_enter
, write_op
, io
, completion
, oid
, mtime
, flags
);
5639 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
5640 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5641 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
5642 int retval
= ctx
->aio_operate(obj
, oo
, c
, ctx
->snapc
, translate_flags(flags
));
5643 tracepoint(librados
, rados_aio_write_op_operate_exit
, retval
);
5647 extern "C" rados_read_op_t
rados_create_read_op()
5649 tracepoint(librados
, rados_create_read_op_enter
);
5650 rados_read_op_t retval
= new (std::nothrow
)::ObjectOperation
;
5651 tracepoint(librados
, rados_create_read_op_exit
, retval
);
5655 extern "C" void rados_release_read_op(rados_read_op_t read_op
)
5657 tracepoint(librados
, rados_release_read_op_enter
, read_op
);
5658 delete (::ObjectOperation
*)read_op
;
5659 tracepoint(librados
, rados_release_read_op_exit
);
5662 extern "C" void rados_read_op_set_flags(rados_read_op_t read_op
, int flags
)
5664 tracepoint(librados
, rados_read_op_set_flags_enter
, read_op
, flags
);
5665 set_op_flags((::ObjectOperation
*)read_op
, flags
);
5666 tracepoint(librados
, rados_read_op_set_flags_exit
);
5669 extern "C" void rados_read_op_assert_version(rados_read_op_t read_op
, uint64_t ver
)
5671 tracepoint(librados
, rados_read_op_assert_version_enter
, read_op
, ver
);
5672 ((::ObjectOperation
*)read_op
)->assert_version(ver
);
5673 tracepoint(librados
, rados_read_op_assert_version_exit
);
5676 extern "C" void rados_read_op_assert_exists(rados_read_op_t read_op
)
5678 tracepoint(librados
, rados_read_op_assert_exists_enter
, read_op
);
5679 ((::ObjectOperation
*)read_op
)->stat(NULL
, (ceph::real_time
*)NULL
, NULL
);
5680 tracepoint(librados
, rados_read_op_assert_exists_exit
);
5683 extern "C" void rados_read_op_cmpext(rados_read_op_t read_op
,
5684 const char *cmp_buf
,
5689 tracepoint(librados
, rados_read_op_cmpext_enter
, read_op
, cmp_buf
,
5690 cmp_len
, off
, prval
);
5691 ((::ObjectOperation
*)read_op
)->cmpext(off
, cmp_len
, cmp_buf
, prval
);
5692 tracepoint(librados
, rados_read_op_cmpext_exit
);
5695 extern "C" void rados_read_op_cmpxattr(rados_read_op_t read_op
,
5697 uint8_t comparison_operator
,
5701 tracepoint(librados
, rados_read_op_cmpxattr_enter
, read_op
, name
, comparison_operator
, value
, value_len
);
5703 bl
.append(value
, value_len
);
5704 ((::ObjectOperation
*)read_op
)->cmpxattr(name
,
5705 comparison_operator
,
5706 CEPH_OSD_CMPXATTR_MODE_STRING
,
5708 tracepoint(librados
, rados_read_op_cmpxattr_exit
);
5711 extern "C" void rados_read_op_omap_cmp(rados_read_op_t read_op
,
5713 uint8_t comparison_operator
,
5718 tracepoint(librados
, rados_read_op_omap_cmp_enter
, read_op
, key
, comparison_operator
, val
, val_len
, prval
);
5719 rados_c_omap_cmp((::ObjectOperation
*)read_op
, key
, comparison_operator
,
5720 val
, val_len
, prval
);
5721 tracepoint(librados
, rados_read_op_omap_cmp_exit
);
5724 extern "C" void rados_read_op_stat(rados_read_op_t read_op
,
5729 tracepoint(librados
, rados_read_op_stat_enter
, read_op
, psize
, pmtime
, prval
);
5730 ((::ObjectOperation
*)read_op
)->stat(psize
, pmtime
, prval
);
5731 tracepoint(librados
, rados_read_op_stat_exit
);
5734 class C_bl_to_buf
: public Context
{
5741 C_bl_to_buf(char *out_buf
,
5744 int *prval
) : out_buf(out_buf
), out_len(out_len
),
5745 bytes_read(bytes_read
), prval(prval
) {}
5746 void finish(int r
) override
{
5747 if (out_bl
.length() > out_len
) {
5755 *bytes_read
= out_bl
.length();
5756 if (out_buf
&& !out_bl
.is_provided_buffer(out_buf
))
5757 out_bl
.copy(0, out_bl
.length(), out_buf
);
5761 extern "C" void rados_read_op_read(rados_read_op_t read_op
,
5768 tracepoint(librados
, rados_read_op_read_enter
, read_op
, offset
, len
, buf
, bytes_read
, prval
);
5769 C_bl_to_buf
*ctx
= new C_bl_to_buf(buf
, len
, bytes_read
, prval
);
5770 ctx
->out_bl
.push_back(buffer::create_static(len
, buf
));
5771 ((::ObjectOperation
*)read_op
)->read(offset
, len
, &ctx
->out_bl
, prval
, ctx
);
5772 tracepoint(librados
, rados_read_op_read_exit
);
5775 extern "C" void rados_read_op_checksum(rados_read_op_t read_op
,
5776 rados_checksum_type_t type
,
5777 const char *init_value
,
5778 size_t init_value_len
,
5779 uint64_t offset
, size_t len
,
5780 size_t chunk_size
, char *pchecksum
,
5781 size_t checksum_len
, int *prval
)
5783 tracepoint(librados
, rados_read_op_checksum_enter
, read_op
, type
, init_value
,
5784 init_value_len
, offset
, len
, chunk_size
);
5785 bufferlist init_value_bl
;
5786 init_value_bl
.append(init_value
, init_value_len
);
5788 C_bl_to_buf
*ctx
= nullptr;
5789 if (pchecksum
!= nullptr) {
5790 ctx
= new C_bl_to_buf(pchecksum
, checksum_len
, nullptr, prval
);
5792 ((::ObjectOperation
*)read_op
)->checksum(get_checksum_op_type(type
),
5793 init_value_bl
, offset
, len
,
5795 (ctx
? &ctx
->out_bl
: nullptr),
5797 tracepoint(librados
, rados_read_op_checksum_exit
);
5800 class C_out_buffer
: public Context
{
5805 C_out_buffer(char **out_buf
, size_t *out_len
) : out_buf(out_buf
),
5807 void finish(int r
) override
{
5808 // ignore r since we don't know the meaning of return values
5809 // from custom class methods
5810 do_out_buffer(out_bl
, out_buf
, out_len
);
5814 extern "C" void rados_read_op_exec(rados_read_op_t read_op
,
5823 tracepoint(librados
, rados_read_op_exec_enter
, read_op
, cls
, method
, in_buf
, in_len
, out_buf
, out_len
, prval
);
5825 inbl
.append(in_buf
, in_len
);
5826 C_out_buffer
*ctx
= new C_out_buffer(out_buf
, out_len
);
5827 ((::ObjectOperation
*)read_op
)->call(cls
, method
, inbl
, &ctx
->out_bl
, ctx
,
5829 tracepoint(librados
, rados_read_op_exec_exit
);
5832 extern "C" void rados_read_op_exec_user_buf(rados_read_op_t read_op
,
5842 tracepoint(librados
, rados_read_op_exec_user_buf_enter
, read_op
, cls
, method
, in_buf
, in_len
, out_buf
, out_len
, used_len
, prval
);
5843 C_bl_to_buf
*ctx
= new C_bl_to_buf(out_buf
, out_len
, used_len
, prval
);
5845 inbl
.append(in_buf
, in_len
);
5846 ((::ObjectOperation
*)read_op
)->call(cls
, method
, inbl
, &ctx
->out_bl
, ctx
,
5848 tracepoint(librados
, rados_read_op_exec_user_buf_exit
);
5851 struct RadosOmapIter
{
5852 std::map
<std::string
, bufferlist
> values
;
5853 std::map
<std::string
, bufferlist
>::iterator i
;
5856 class C_OmapIter
: public Context
{
5857 RadosOmapIter
*iter
;
5859 explicit C_OmapIter(RadosOmapIter
*iter
) : iter(iter
) {}
5860 void finish(int r
) override
{
5861 iter
->i
= iter
->values
.begin();
5865 class C_XattrsIter
: public Context
{
5866 librados::RadosXattrsIter
*iter
;
5868 explicit C_XattrsIter(librados::RadosXattrsIter
*iter
) : iter(iter
) {}
5869 void finish(int r
) override
{
5870 iter
->i
= iter
->attrset
.begin();
5874 extern "C" void rados_read_op_getxattrs(rados_read_op_t read_op
,
5875 rados_xattrs_iter_t
*iter
,
5878 tracepoint(librados
, rados_read_op_getxattrs_enter
, read_op
, prval
);
5879 librados::RadosXattrsIter
*xattrs_iter
= new librados::RadosXattrsIter
;
5880 ((::ObjectOperation
*)read_op
)->getxattrs(&xattrs_iter
->attrset
, prval
);
5881 ((::ObjectOperation
*)read_op
)->add_handler(new C_XattrsIter(xattrs_iter
));
5882 *iter
= xattrs_iter
;
5883 tracepoint(librados
, rados_read_op_getxattrs_exit
, *iter
);
5886 extern "C" void rados_read_op_omap_get_vals(rados_read_op_t read_op
,
5887 const char *start_after
,
5888 const char *filter_prefix
,
5889 uint64_t max_return
,
5890 rados_omap_iter_t
*iter
,
5893 tracepoint(librados
, rados_read_op_omap_get_vals_enter
, read_op
, start_after
, filter_prefix
, max_return
, prval
);
5894 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
5895 const char *start
= start_after
? start_after
: "";
5896 const char *filter
= filter_prefix
? filter_prefix
: "";
5897 ((::ObjectOperation
*)read_op
)->omap_get_vals(
5904 ((::ObjectOperation
*)read_op
)->add_handler(new C_OmapIter(omap_iter
));
5906 tracepoint(librados
, rados_read_op_omap_get_vals_exit
, *iter
);
5909 extern "C" void rados_read_op_omap_get_vals2(rados_read_op_t read_op
,
5910 const char *start_after
,
5911 const char *filter_prefix
,
5912 uint64_t max_return
,
5913 rados_omap_iter_t
*iter
,
5914 unsigned char *pmore
,
5917 tracepoint(librados
, rados_read_op_omap_get_vals_enter
, read_op
, start_after
, filter_prefix
, max_return
, prval
);
5918 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
5919 const char *start
= start_after
? start_after
: "";
5920 const char *filter
= filter_prefix
? filter_prefix
: "";
5921 ((::ObjectOperation
*)read_op
)->omap_get_vals(
5928 ((::ObjectOperation
*)read_op
)->add_handler(new C_OmapIter(omap_iter
));
5930 tracepoint(librados
, rados_read_op_omap_get_vals_exit
, *iter
);
5933 struct C_OmapKeysIter
: public Context
{
5934 RadosOmapIter
*iter
;
5935 std::set
<std::string
> keys
;
5936 explicit C_OmapKeysIter(RadosOmapIter
*iter
) : iter(iter
) {}
5937 void finish(int r
) override
{
5938 // map each key to an empty bl
5939 for (std::set
<std::string
>::const_iterator i
= keys
.begin();
5940 i
!= keys
.end(); ++i
) {
5943 iter
->i
= iter
->values
.begin();
5947 extern "C" void rados_read_op_omap_get_keys(rados_read_op_t read_op
,
5948 const char *start_after
,
5949 uint64_t max_return
,
5950 rados_omap_iter_t
*iter
,
5953 tracepoint(librados
, rados_read_op_omap_get_keys_enter
, read_op
, start_after
, max_return
, prval
);
5954 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
5955 C_OmapKeysIter
*ctx
= new C_OmapKeysIter(omap_iter
);
5956 ((::ObjectOperation
*)read_op
)->omap_get_keys(
5957 start_after
? start_after
: "",
5958 max_return
, &ctx
->keys
, nullptr, prval
);
5959 ((::ObjectOperation
*)read_op
)->add_handler(ctx
);
5961 tracepoint(librados
, rados_read_op_omap_get_keys_exit
, *iter
);
5964 extern "C" void rados_read_op_omap_get_keys2(rados_read_op_t read_op
,
5965 const char *start_after
,
5966 uint64_t max_return
,
5967 rados_omap_iter_t
*iter
,
5968 unsigned char *pmore
,
5971 tracepoint(librados
, rados_read_op_omap_get_keys_enter
, read_op
, start_after
, max_return
, prval
);
5972 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
5973 C_OmapKeysIter
*ctx
= new C_OmapKeysIter(omap_iter
);
5974 ((::ObjectOperation
*)read_op
)->omap_get_keys(
5975 start_after
? start_after
: "",
5976 max_return
, &ctx
->keys
,
5977 (bool*)pmore
, prval
);
5978 ((::ObjectOperation
*)read_op
)->add_handler(ctx
);
5980 tracepoint(librados
, rados_read_op_omap_get_keys_exit
, *iter
);
5983 extern "C" void rados_read_op_omap_get_vals_by_keys(rados_read_op_t read_op
,
5984 char const* const* keys
,
5986 rados_omap_iter_t
*iter
,
5989 tracepoint(librados
, rados_read_op_omap_get_vals_by_keys_enter
, read_op
, keys
, keys_len
, iter
, prval
);
5990 std::set
<std::string
> to_get(keys
, keys
+ keys_len
);
5992 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
5993 ((::ObjectOperation
*)read_op
)->omap_get_vals_by_keys(to_get
,
5996 ((::ObjectOperation
*)read_op
)->add_handler(new C_OmapIter(omap_iter
));
5998 tracepoint(librados
, rados_read_op_omap_get_vals_by_keys_exit
, *iter
);
6001 extern "C" int rados_omap_get_next(rados_omap_iter_t iter
,
6006 tracepoint(librados
, rados_omap_get_next_enter
, iter
);
6007 RadosOmapIter
*it
= static_cast<RadosOmapIter
*>(iter
);
6008 if (it
->i
== it
->values
.end()) {
6012 tracepoint(librados
, rados_omap_get_next_exit
, 0, key
, val
, len
);
6016 *key
= (char*)it
->i
->first
.c_str();
6018 *val
= it
->i
->second
.c_str();
6020 *len
= it
->i
->second
.length();
6022 tracepoint(librados
, rados_omap_get_next_exit
, 0, key
, val
, len
);
6026 extern "C" void rados_omap_get_end(rados_omap_iter_t iter
)
6028 tracepoint(librados
, rados_omap_get_end_enter
, iter
);
6029 RadosOmapIter
*it
= static_cast<RadosOmapIter
*>(iter
);
6031 tracepoint(librados
, rados_omap_get_end_exit
);
6034 extern "C" int rados_read_op_operate(rados_read_op_t read_op
,
6039 tracepoint(librados
, rados_read_op_operate_enter
, read_op
, io
, oid
, flags
);
6041 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
6042 int retval
= ctx
->operate_read(obj
, (::ObjectOperation
*)read_op
, NULL
,
6043 translate_flags(flags
));
6044 tracepoint(librados
, rados_read_op_operate_exit
, retval
);
6048 extern "C" int rados_aio_read_op_operate(rados_read_op_t read_op
,
6050 rados_completion_t completion
,
6054 tracepoint(librados
, rados_aio_read_op_operate_enter
, read_op
, io
, completion
, oid
, flags
);
6056 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
6057 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
6058 int retval
= ctx
->aio_operate_read(obj
, (::ObjectOperation
*)read_op
,
6059 c
, translate_flags(flags
), NULL
);
6060 tracepoint(librados
, rados_aio_read_op_operate_exit
, retval
);
6064 extern "C" int rados_cache_pin(rados_ioctx_t io
, const char *o
)
6066 tracepoint(librados
, rados_cache_pin_enter
, io
, o
);
6067 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
6069 int retval
= ctx
->cache_pin(oid
);
6070 tracepoint(librados
, rados_cache_pin_exit
, retval
);
6074 extern "C" int rados_cache_unpin(rados_ioctx_t io
, const char *o
)
6076 tracepoint(librados
, rados_cache_unpin_enter
, io
, o
);
6077 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
6079 int retval
= ctx
->cache_unpin(oid
);
6080 tracepoint(librados
, rados_cache_unpin_exit
, retval
);
6085 ///////////////////////////// ListObject //////////////////////////////
6086 librados::ListObject::ListObject() : impl(NULL
)
6090 librados::ListObject::ListObject(librados::ListObjectImpl
*i
): impl(i
)
6094 librados::ListObject::ListObject(const ListObject
& rhs
)
6096 if (rhs
.impl
== NULL
) {
6100 impl
= new ListObjectImpl();
6101 *impl
= *(rhs
.impl
);
6104 librados::ListObject
& librados::ListObject::operator=(const ListObject
& rhs
)
6106 if (rhs
.impl
== NULL
) {
6112 impl
= new ListObjectImpl();
6113 *impl
= *(rhs
.impl
);
6117 librados::ListObject::~ListObject()
6124 const std::string
& librados::ListObject::get_nspace() const
6126 return impl
->get_nspace();
6129 const std::string
& librados::ListObject::get_oid() const
6131 return impl
->get_oid();
6134 const std::string
& librados::ListObject::get_locator() const
6136 return impl
->get_locator();
6139 std::ostream
& librados::operator<<(std::ostream
& out
, const librados::ListObject
& lop
)
6145 CEPH_RADOS_API
void rados_object_list_slice(
6147 const rados_object_list_cursor start
,
6148 const rados_object_list_cursor finish
,
6151 rados_object_list_cursor
*split_start
,
6152 rados_object_list_cursor
*split_finish
)
6154 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
6156 assert(split_start
);
6157 assert(split_finish
);
6158 hobject_t
*split_start_hobj
= (hobject_t
*)(*split_start
);
6159 hobject_t
*split_finish_hobj
= (hobject_t
*)(*split_finish
);
6160 assert(split_start_hobj
);
6161 assert(split_finish_hobj
);
6162 hobject_t
*start_hobj
= (hobject_t
*)(start
);
6163 hobject_t
*finish_hobj
= (hobject_t
*)(finish
);
6165 ctx
->object_list_slice(
6174 librados::ObjectCursor::ObjectCursor()
6176 c_cursor
= (rados_object_list_cursor
)new hobject_t();
6179 librados::ObjectCursor::~ObjectCursor()
6181 hobject_t
*h
= (hobject_t
*)c_cursor
;
6185 librados::ObjectCursor::ObjectCursor(rados_object_list_cursor c
)
6190 c_cursor
= (rados_object_list_cursor
)new hobject_t(*(hobject_t
*)c
);
6194 librados::ObjectCursor
& librados::ObjectCursor::operator=(const librados::ObjectCursor
& rhs
)
6196 if (rhs
.c_cursor
!= nullptr) {
6197 hobject_t
*h
= (hobject_t
*)rhs
.c_cursor
;
6198 c_cursor
= (rados_object_list_cursor
)(new hobject_t(*h
));
6205 bool librados::ObjectCursor::operator<(const librados::ObjectCursor
&rhs
) const
6207 const hobject_t lhs_hobj
= (c_cursor
== nullptr) ? hobject_t() : *((hobject_t
*)c_cursor
);
6208 const hobject_t rhs_hobj
= (rhs
.c_cursor
== nullptr) ? hobject_t() : *((hobject_t
*)(rhs
.c_cursor
));
6209 return lhs_hobj
< rhs_hobj
;
6212 bool librados::ObjectCursor::operator==(const librados::ObjectCursor
&rhs
) const
6214 const hobject_t lhs_hobj
= (c_cursor
== nullptr) ? hobject_t() : *((hobject_t
*)c_cursor
);
6215 const hobject_t rhs_hobj
= (rhs
.c_cursor
== nullptr) ? hobject_t() : *((hobject_t
*)(rhs
.c_cursor
));
6216 return cmp(lhs_hobj
, rhs_hobj
) == 0;
6218 librados::ObjectCursor::ObjectCursor(const librados::ObjectCursor
&rhs
)
6223 librados::ObjectCursor
librados::IoCtx::object_list_begin()
6225 hobject_t
*h
= new hobject_t(io_ctx_impl
->objecter
->enumerate_objects_begin());
6227 oc
.set((rados_object_list_cursor
)h
);
6232 librados::ObjectCursor
librados::IoCtx::object_list_end()
6234 hobject_t
*h
= new hobject_t(io_ctx_impl
->objecter
->enumerate_objects_end());
6235 librados::ObjectCursor oc
;
6236 oc
.set((rados_object_list_cursor
)h
);
6241 void librados::ObjectCursor::set(rados_object_list_cursor c
)
6243 delete (hobject_t
*)c_cursor
;
6247 string
librados::ObjectCursor::to_str() const
6250 ss
<< *(hobject_t
*)c_cursor
;
6254 bool librados::ObjectCursor::from_str(const string
& s
)
6257 *(hobject_t
*)c_cursor
= hobject_t();
6260 return ((hobject_t
*)c_cursor
)->parse(s
);
6263 CEPH_RADOS_API
std::ostream
& librados::operator<<(std::ostream
& os
, const librados::ObjectCursor
& oc
)
6266 os
<< *(hobject_t
*)oc
.c_cursor
;
6273 bool librados::IoCtx::object_list_is_end(const ObjectCursor
&oc
)
6275 hobject_t
*h
= (hobject_t
*)oc
.c_cursor
;
6279 int librados::IoCtx::object_list(const ObjectCursor
&start
,
6280 const ObjectCursor
&finish
,
6281 const size_t result_item_count
,
6282 const bufferlist
&filter
,
6283 std::vector
<ObjectItem
> *result
,
6286 assert(result
!= nullptr);
6287 assert(next
!= nullptr);
6291 hobject_t next_hash
;
6292 std::list
<librados::ListObjectImpl
> obj_result
;
6293 io_ctx_impl
->objecter
->enumerate_objects(
6294 io_ctx_impl
->poolid
,
6295 io_ctx_impl
->oloc
.nspace
,
6296 *((hobject_t
*)start
.c_cursor
),
6297 *((hobject_t
*)finish
.c_cursor
),
6304 int r
= cond
.wait();
6306 next
->set((rados_object_list_cursor
)(new hobject_t(hobject_t::get_max())));
6310 next
->set((rados_object_list_cursor
)(new hobject_t(next_hash
)));
6312 for (std::list
<librados::ListObjectImpl
>::iterator i
= obj_result
.begin();
6313 i
!= obj_result
.end(); ++i
) {
6316 oi
.nspace
= i
->nspace
;
6317 oi
.locator
= i
->locator
;
6318 result
->push_back(oi
);
6321 return obj_result
.size();
6324 void librados::IoCtx::object_list_slice(
6325 const ObjectCursor start
,
6326 const ObjectCursor finish
,
6329 ObjectCursor
*split_start
,
6330 ObjectCursor
*split_finish
)
6332 assert(split_start
!= nullptr);
6333 assert(split_finish
!= nullptr);
6335 io_ctx_impl
->object_list_slice(
6336 *((hobject_t
*)(start
.c_cursor
)),
6337 *((hobject_t
*)(finish
.c_cursor
)),
6340 (hobject_t
*)(split_start
->c_cursor
),
6341 (hobject_t
*)(split_finish
->c_cursor
));