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
.mgr_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_application_enable(rados_ioctx_t io
, const char *app_name
,
3093 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3094 return ctx
->application_enable(app_name
, force
!= 0);
3097 extern "C" int rados_application_list(rados_ioctx_t io
, char *values
,
3100 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3101 std::set
<std::string
> app_names
;
3102 int r
= ctx
->application_list(&app_names
);
3107 size_t total_len
= 0;
3108 for (auto app_name
: app_names
) {
3109 total_len
+= app_name
.size() + 1;
3112 if (*values_len
< total_len
) {
3113 *values_len
= total_len
;
3117 char *values_p
= values
;
3118 for (auto app_name
: app_names
) {
3119 size_t len
= app_name
.size() + 1;
3120 strncpy(values_p
, app_name
.c_str(), len
);
3124 *values_len
= total_len
;
3128 extern "C" int rados_application_metadata_get(rados_ioctx_t io
,
3129 const char *app_name
,
3130 const char *key
, char *value
,
3133 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3134 std::string value_str
;
3135 int r
= ctx
->application_metadata_get(app_name
, key
, &value_str
);
3140 size_t len
= value_str
.size() + 1;
3141 if (*value_len
< len
) {
3146 strncpy(value
, value_str
.c_str(), len
);
3151 extern "C" int rados_application_metadata_set(rados_ioctx_t io
,
3152 const char *app_name
,
3156 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3157 return ctx
->application_metadata_set(app_name
, key
, value
);
3160 extern "C" int rados_application_metadata_remove(rados_ioctx_t io
,
3161 const char *app_name
,
3164 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3165 return ctx
->application_metadata_remove(app_name
, key
);
3168 extern "C" int rados_application_metadata_list(rados_ioctx_t io
,
3169 const char *app_name
,
3170 char *keys
, size_t *keys_len
,
3171 char *values
, size_t *vals_len
)
3173 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3174 std::map
<std::string
, std::string
> metadata
;
3175 int r
= ctx
->application_metadata_list(app_name
, &metadata
);
3180 size_t total_key_len
= 0;
3181 size_t total_val_len
= 0;
3182 for (auto pair
: metadata
) {
3183 total_key_len
+= pair
.first
.size() + 1;
3184 total_val_len
+= pair
.second
.size() + 1;
3187 if (*keys_len
< total_key_len
|| *vals_len
< total_val_len
) {
3188 *keys_len
= total_key_len
;
3189 *vals_len
= total_val_len
;
3193 char *keys_p
= keys
;
3194 char *vals_p
= values
;
3195 for (auto pair
: metadata
) {
3196 size_t key_len
= pair
.first
.size() + 1;
3197 strncpy(keys_p
, pair
.first
.c_str(), key_len
);
3200 size_t val_len
= pair
.second
.size() + 1;
3201 strncpy(vals_p
, pair
.second
.c_str(), val_len
);
3205 *keys_len
= total_key_len
;
3208 *vals_len
= total_val_len
;
3212 extern "C" int rados_pool_list(rados_t cluster
, char *buf
, size_t len
)
3214 tracepoint(librados
, rados_pool_list_enter
, cluster
, len
);
3215 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3216 std::list
<std::pair
<int64_t, std::string
> > pools
;
3217 int r
= client
->pool_list(pools
);
3219 tracepoint(librados
, rados_pool_list_exit
, r
);
3223 if (len
> 0 && !buf
) {
3224 tracepoint(librados
, rados_pool_list_exit
, -EINVAL
);
3232 std::list
<std::pair
<int64_t, std::string
> >::const_iterator i
= pools
.begin();
3233 std::list
<std::pair
<int64_t, std::string
> >::const_iterator p_end
=
3235 for (; i
!= p_end
; ++i
) {
3236 int rl
= i
->second
.length() + 1;
3237 if (len
< (unsigned)rl
)
3239 const char* pool
= i
->second
.c_str();
3240 tracepoint(librados
, rados_pool_list_pool
, pool
);
3242 strncat(b
, pool
, rl
);
3248 for (; i
!= p_end
; ++i
) {
3249 int rl
= i
->second
.length() + 1;
3252 int retval
= needed
+ 1;
3253 tracepoint(librados
, rados_pool_list_exit
, retval
);
3257 CEPH_RADOS_API
int rados_inconsistent_pg_list(rados_t cluster
, int64_t pool_id
,
3258 char *buf
, size_t len
)
3260 tracepoint(librados
, rados_inconsistent_pg_list_enter
, cluster
, pool_id
, len
);
3261 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3262 std::vector
<librados::PlacementGroup
> pgs
;
3263 int r
= ::get_inconsistent_pgs(*client
, pool_id
, &pgs
);
3265 tracepoint(librados
, rados_inconsistent_pg_list_exit
, r
);
3269 if (len
> 0 && !buf
) {
3270 tracepoint(librados
, rados_inconsistent_pg_list_exit
, -EINVAL
);
3278 for (const auto pg
: pgs
) {
3279 std::ostringstream ss
;
3282 unsigned rl
= s
.length() + 1;
3283 if (b
&& len
>= rl
) {
3284 tracepoint(librados
, rados_inconsistent_pg_list_pg
, s
.c_str());
3285 strncat(b
, s
.c_str(), rl
);
3291 int retval
= needed
+ 1;
3292 tracepoint(librados
, rados_inconsistent_pg_list_exit
, retval
);
3297 static void dict_to_map(const char *dict
,
3298 std::map
<std::string
, std::string
>* dict_map
)
3300 while (*dict
!= '\0') {
3301 const char* key
= dict
;
3302 dict
+= strlen(key
) + 1;
3303 const char* value
= dict
;
3304 dict
+= strlen(value
) + 1;
3305 (*dict_map
)[key
] = value
;
3309 CEPH_RADOS_API
int rados_service_register(rados_t cluster
, const char *service
,
3311 const char *metadata_dict
)
3313 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3315 std::map
<std::string
, std::string
> metadata
;
3316 dict_to_map(metadata_dict
, &metadata
);
3318 return client
->service_daemon_register(service
, daemon
, metadata
);
3321 CEPH_RADOS_API
int rados_service_update_status(rados_t cluster
,
3322 const char *status_dict
)
3324 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3326 std::map
<std::string
, std::string
> status
;
3327 dict_to_map(status_dict
, &status
);
3329 return client
->service_daemon_update_status(status
);
3332 static void do_out_buffer(bufferlist
& outbl
, char **outbuf
, size_t *outbuflen
)
3335 if (outbl
.length() > 0) {
3336 *outbuf
= (char *)malloc(outbl
.length());
3337 memcpy(*outbuf
, outbl
.c_str(), outbl
.length());
3343 *outbuflen
= outbl
.length();
3346 static void do_out_buffer(string
& outbl
, char **outbuf
, size_t *outbuflen
)
3349 if (outbl
.length() > 0) {
3350 *outbuf
= (char *)malloc(outbl
.length());
3351 memcpy(*outbuf
, outbl
.c_str(), outbl
.length());
3357 *outbuflen
= outbl
.length();
3360 extern "C" int rados_ping_monitor(rados_t cluster
, const char *mon_id
,
3361 char **outstr
, size_t *outstrlen
)
3363 tracepoint(librados
, rados_ping_monitor_enter
, cluster
, mon_id
);
3364 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3368 tracepoint(librados
, rados_ping_monitor_exit
, -EINVAL
, NULL
, NULL
);
3372 int ret
= client
->ping_monitor(mon_id
, &str
);
3374 do_out_buffer(str
, outstr
, outstrlen
);
3376 tracepoint(librados
, rados_ping_monitor_exit
, ret
, ret
< 0 ? NULL
: outstr
, ret
< 0 ? NULL
: outstrlen
);
3380 extern "C" int rados_mon_command(rados_t cluster
, const char **cmd
,
3382 const char *inbuf
, size_t inbuflen
,
3383 char **outbuf
, size_t *outbuflen
,
3384 char **outs
, size_t *outslen
)
3386 tracepoint(librados
, rados_mon_command_enter
, cluster
, cmdlen
, inbuf
, inbuflen
);
3387 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3391 vector
<string
> cmdvec
;
3393 for (size_t i
= 0; i
< cmdlen
; i
++) {
3394 tracepoint(librados
, rados_mon_command_cmd
, cmd
[i
]);
3395 cmdvec
.push_back(cmd
[i
]);
3398 inbl
.append(inbuf
, inbuflen
);
3399 int ret
= client
->mon_command(cmdvec
, inbl
, &outbl
, &outstring
);
3401 do_out_buffer(outbl
, outbuf
, outbuflen
);
3402 do_out_buffer(outstring
, outs
, outslen
);
3403 tracepoint(librados
, rados_mon_command_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
3407 extern "C" int rados_mon_command_target(rados_t cluster
, const char *name
,
3410 const char *inbuf
, size_t inbuflen
,
3411 char **outbuf
, size_t *outbuflen
,
3412 char **outs
, size_t *outslen
)
3414 tracepoint(librados
, rados_mon_command_target_enter
, cluster
, name
, cmdlen
, inbuf
, inbuflen
);
3415 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3419 vector
<string
> cmdvec
;
3421 // is this a numeric id?
3424 long rank
= strtol(name
, &endptr
, 10);
3425 if ((errno
== ERANGE
&& (rank
== LONG_MAX
|| rank
== LONG_MIN
)) ||
3426 (errno
!= 0 && rank
== 0) ||
3427 endptr
== name
|| // no digits
3428 *endptr
!= '\0') { // extra characters
3432 for (size_t i
= 0; i
< cmdlen
; i
++) {
3433 tracepoint(librados
, rados_mon_command_target_cmd
, cmd
[i
]);
3434 cmdvec
.push_back(cmd
[i
]);
3437 inbl
.append(inbuf
, inbuflen
);
3440 ret
= client
->mon_command(rank
, cmdvec
, inbl
, &outbl
, &outstring
);
3442 ret
= client
->mon_command(name
, cmdvec
, inbl
, &outbl
, &outstring
);
3444 do_out_buffer(outbl
, outbuf
, outbuflen
);
3445 do_out_buffer(outstring
, outs
, outslen
);
3446 tracepoint(librados
, rados_mon_command_target_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
3450 extern "C" int rados_osd_command(rados_t cluster
, int osdid
, const char **cmd
,
3452 const char *inbuf
, size_t inbuflen
,
3453 char **outbuf
, size_t *outbuflen
,
3454 char **outs
, size_t *outslen
)
3456 tracepoint(librados
, rados_osd_command_enter
, cluster
, osdid
, cmdlen
, inbuf
, inbuflen
);
3457 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3461 vector
<string
> cmdvec
;
3463 for (size_t i
= 0; i
< cmdlen
; i
++) {
3464 tracepoint(librados
, rados_osd_command_cmd
, cmd
[i
]);
3465 cmdvec
.push_back(cmd
[i
]);
3468 inbl
.append(inbuf
, inbuflen
);
3469 int ret
= client
->osd_command(osdid
, cmdvec
, inbl
, &outbl
, &outstring
);
3471 do_out_buffer(outbl
, outbuf
, outbuflen
);
3472 do_out_buffer(outstring
, outs
, outslen
);
3473 tracepoint(librados
, rados_osd_command_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
3477 extern "C" int rados_mgr_command(rados_t cluster
, const char **cmd
,
3479 const char *inbuf
, size_t inbuflen
,
3480 char **outbuf
, size_t *outbuflen
,
3481 char **outs
, size_t *outslen
)
3483 tracepoint(librados
, rados_mgr_command_enter
, cluster
, cmdlen
, inbuf
,
3486 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3490 vector
<string
> cmdvec
;
3492 for (size_t i
= 0; i
< cmdlen
; i
++) {
3493 tracepoint(librados
, rados_mgr_command_cmd
, cmd
[i
]);
3494 cmdvec
.push_back(cmd
[i
]);
3497 inbl
.append(inbuf
, inbuflen
);
3498 int ret
= client
->mgr_command(cmdvec
, inbl
, &outbl
, &outstring
);
3500 do_out_buffer(outbl
, outbuf
, outbuflen
);
3501 do_out_buffer(outstring
, outs
, outslen
);
3502 tracepoint(librados
, rados_mgr_command_exit
, ret
, outbuf
, outbuflen
, outs
,
3507 extern "C" int rados_pg_command(rados_t cluster
, const char *pgstr
,
3508 const char **cmd
, size_t cmdlen
,
3509 const char *inbuf
, size_t inbuflen
,
3510 char **outbuf
, size_t *outbuflen
,
3511 char **outs
, size_t *outslen
)
3513 tracepoint(librados
, rados_pg_command_enter
, cluster
, pgstr
, cmdlen
, inbuf
, inbuflen
);
3514 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3519 vector
<string
> cmdvec
;
3521 for (size_t i
= 0; i
< cmdlen
; i
++) {
3522 tracepoint(librados
, rados_pg_command_cmd
, cmd
[i
]);
3523 cmdvec
.push_back(cmd
[i
]);
3526 inbl
.append(inbuf
, inbuflen
);
3527 if (!pgid
.parse(pgstr
))
3530 int ret
= client
->pg_command(pgid
, cmdvec
, inbl
, &outbl
, &outstring
);
3532 do_out_buffer(outbl
, outbuf
, outbuflen
);
3533 do_out_buffer(outstring
, outs
, outslen
);
3534 tracepoint(librados
, rados_pg_command_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
3538 extern "C" void rados_buffer_free(char *buf
)
3540 tracepoint(librados
, rados_buffer_free_enter
, buf
);
3543 tracepoint(librados
, rados_buffer_free_exit
);
3546 extern "C" int rados_monitor_log(rados_t cluster
, const char *level
, rados_log_callback_t cb
, void *arg
)
3548 tracepoint(librados
, rados_monitor_log_enter
, cluster
, level
, cb
, arg
);
3549 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3550 int retval
= client
->monitor_log(level
, cb
, nullptr, arg
);
3551 tracepoint(librados
, rados_monitor_log_exit
, retval
);
3555 extern "C" int rados_monitor_log2(rados_t cluster
, const char *level
,
3556 rados_log_callback2_t cb
, void *arg
)
3558 tracepoint(librados
, rados_monitor_log2_enter
, cluster
, level
, cb
, arg
);
3559 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3560 int retval
= client
->monitor_log(level
, nullptr, cb
, arg
);
3561 tracepoint(librados
, rados_monitor_log2_exit
, retval
);
3565 extern "C" int rados_ioctx_create(rados_t cluster
, const char *name
, rados_ioctx_t
*io
)
3567 tracepoint(librados
, rados_ioctx_create_enter
, cluster
, name
);
3568 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3569 librados::IoCtxImpl
*ctx
;
3571 int r
= client
->create_ioctx(name
, &ctx
);
3573 tracepoint(librados
, rados_ioctx_create_exit
, r
, NULL
);
3579 tracepoint(librados
, rados_ioctx_create_exit
, 0, ctx
);
3583 extern "C" int rados_ioctx_create2(rados_t cluster
, int64_t pool_id
,
3586 tracepoint(librados
, rados_ioctx_create2_enter
, cluster
, pool_id
);
3587 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3588 librados::IoCtxImpl
*ctx
;
3590 int r
= client
->create_ioctx(pool_id
, &ctx
);
3592 tracepoint(librados
, rados_ioctx_create2_exit
, r
, NULL
);
3598 tracepoint(librados
, rados_ioctx_create2_exit
, 0, ctx
);
3602 extern "C" void rados_ioctx_destroy(rados_ioctx_t io
)
3604 tracepoint(librados
, rados_ioctx_destroy_enter
, io
);
3605 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3607 tracepoint(librados
, rados_ioctx_destroy_exit
);
3610 extern "C" int rados_ioctx_pool_stat(rados_ioctx_t io
, struct rados_pool_stat_t
*stats
)
3612 tracepoint(librados
, rados_ioctx_pool_stat_enter
, io
);
3613 librados::IoCtxImpl
*io_ctx_impl
= (librados::IoCtxImpl
*)io
;
3615 std::string pool_name
;
3617 int err
= io_ctx_impl
->client
->pool_get_name(io_ctx_impl
->get_id(), &pool_name
);
3619 tracepoint(librados
, rados_ioctx_pool_stat_exit
, err
, stats
);
3622 ls
.push_back(pool_name
);
3624 map
<string
, ::pool_stat_t
> rawresult
;
3625 err
= io_ctx_impl
->client
->get_pool_stats(ls
, rawresult
);
3627 tracepoint(librados
, rados_ioctx_pool_stat_exit
, err
, stats
);
3631 ::pool_stat_t
& r
= rawresult
[pool_name
];
3632 stats
->num_kb
= SHIFT_ROUND_UP(r
.stats
.sum
.num_bytes
, 10);
3633 stats
->num_bytes
= r
.stats
.sum
.num_bytes
;
3634 stats
->num_objects
= r
.stats
.sum
.num_objects
;
3635 stats
->num_object_clones
= r
.stats
.sum
.num_object_clones
;
3636 stats
->num_object_copies
= r
.stats
.sum
.num_object_copies
;
3637 stats
->num_objects_missing_on_primary
= r
.stats
.sum
.num_objects_missing_on_primary
;
3638 stats
->num_objects_unfound
= r
.stats
.sum
.num_objects_unfound
;
3639 stats
->num_objects_degraded
=
3640 r
.stats
.sum
.num_objects_degraded
+
3641 r
.stats
.sum
.num_objects_misplaced
; // FIXME: this is imprecise
3642 stats
->num_rd
= r
.stats
.sum
.num_rd
;
3643 stats
->num_rd_kb
= r
.stats
.sum
.num_rd_kb
;
3644 stats
->num_wr
= r
.stats
.sum
.num_wr
;
3645 stats
->num_wr_kb
= r
.stats
.sum
.num_wr_kb
;
3646 tracepoint(librados
, rados_ioctx_pool_stat_exit
, 0, stats
);
3650 extern "C" rados_config_t
rados_ioctx_cct(rados_ioctx_t io
)
3652 tracepoint(librados
, rados_ioctx_cct_enter
, io
);
3653 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3654 rados_config_t retval
= (rados_config_t
)ctx
->client
->cct
;
3655 tracepoint(librados
, rados_ioctx_cct_exit
, retval
);
3659 extern "C" void rados_ioctx_snap_set_read(rados_ioctx_t io
, rados_snap_t seq
)
3661 tracepoint(librados
, rados_ioctx_snap_set_read_enter
, io
, seq
);
3662 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3663 ctx
->set_snap_read((snapid_t
)seq
);
3664 tracepoint(librados
, rados_ioctx_snap_set_read_exit
);
3667 extern "C" int rados_ioctx_selfmanaged_snap_set_write_ctx(rados_ioctx_t io
,
3668 rados_snap_t seq
, rados_snap_t
*snaps
, int num_snaps
)
3670 tracepoint(librados
, rados_ioctx_selfmanaged_snap_set_write_ctx_enter
, io
, seq
, snaps
, num_snaps
);
3671 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3672 vector
<snapid_t
> snv
;
3673 snv
.resize(num_snaps
);
3674 for (int i
=0; i
<num_snaps
; i
++) {
3675 snv
[i
] = (snapid_t
)snaps
[i
];
3677 int retval
= ctx
->set_snap_write_context((snapid_t
)seq
, snv
);
3678 tracepoint(librados
, rados_ioctx_selfmanaged_snap_set_write_ctx_exit
, retval
);
3682 extern "C" int rados_write(rados_ioctx_t io
, const char *o
, const char *buf
, size_t len
, uint64_t off
)
3684 tracepoint(librados
, rados_write_enter
, io
, o
, buf
, len
, off
);
3685 if (len
> UINT_MAX
/2)
3687 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3690 bl
.append(buf
, len
);
3691 int retval
= ctx
->write(oid
, bl
, len
, off
);
3692 tracepoint(librados
, rados_write_exit
, retval
);
3696 extern "C" int rados_append(rados_ioctx_t io
, const char *o
, const char *buf
, size_t len
)
3698 tracepoint(librados
, rados_append_enter
, io
, o
, buf
, len
);
3699 if (len
> UINT_MAX
/2)
3701 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3704 bl
.append(buf
, len
);
3705 int retval
= ctx
->append(oid
, bl
, len
);
3706 tracepoint(librados
, rados_append_exit
, retval
);
3710 extern "C" int rados_write_full(rados_ioctx_t io
, const char *o
, const char *buf
, size_t len
)
3712 tracepoint(librados
, rados_write_full_enter
, io
, o
, buf
, len
);
3713 if (len
> UINT_MAX
/2)
3715 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3718 bl
.append(buf
, len
);
3719 int retval
= ctx
->write_full(oid
, bl
);
3720 tracepoint(librados
, rados_write_full_exit
, retval
);
3724 extern "C" int rados_writesame(rados_ioctx_t io
,
3731 tracepoint(librados
, rados_writesame_enter
, io
, o
, buf
, data_len
, write_len
, off
);
3732 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3735 bl
.append(buf
, data_len
);
3736 int retval
= ctx
->writesame(oid
, bl
, write_len
, off
);
3737 tracepoint(librados
, rados_writesame_exit
, retval
);
3741 extern "C" int rados_trunc(rados_ioctx_t io
, const char *o
, uint64_t size
)
3743 tracepoint(librados
, rados_trunc_enter
, io
, o
, size
);
3744 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3746 int retval
= ctx
->trunc(oid
, size
);
3747 tracepoint(librados
, rados_trunc_exit
, retval
);
3751 extern "C" int rados_remove(rados_ioctx_t io
, const char *o
)
3753 tracepoint(librados
, rados_remove_enter
, io
, o
);
3754 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3756 int retval
= ctx
->remove(oid
);
3757 tracepoint(librados
, rados_remove_exit
, retval
);
3761 extern "C" int rados_read(rados_ioctx_t io
, const char *o
, char *buf
, size_t len
, uint64_t off
)
3763 tracepoint(librados
, rados_read_enter
, io
, o
, buf
, len
, off
);
3764 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3769 bufferptr bp
= buffer::create_static(len
, buf
);
3772 ret
= ctx
->read(oid
, bl
, len
, off
);
3774 if (bl
.length() > len
) {
3775 tracepoint(librados
, rados_read_exit
, -ERANGE
, NULL
);
3778 if (!bl
.is_provided_buffer(buf
))
3779 bl
.copy(0, bl
.length(), buf
);
3780 ret
= bl
.length(); // hrm :/
3783 tracepoint(librados
, rados_read_exit
, ret
, buf
);
3787 extern "C" int rados_checksum(rados_ioctx_t io
, const char *o
,
3788 rados_checksum_type_t type
,
3789 const char *init_value
, size_t init_value_len
,
3790 size_t len
, uint64_t off
, size_t chunk_size
,
3791 char *pchecksum
, size_t checksum_len
)
3793 tracepoint(librados
, rados_checksum_enter
, io
, o
, type
, init_value
,
3794 init_value_len
, len
, off
, chunk_size
);
3795 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3798 bufferlist init_value_bl
;
3799 init_value_bl
.append(init_value
, init_value_len
);
3801 bufferlist checksum_bl
;
3803 int retval
= ctx
->checksum(oid
, get_checksum_op_type(type
), init_value_bl
,
3804 len
, off
, chunk_size
, &checksum_bl
);
3806 if (checksum_bl
.length() > checksum_len
) {
3807 tracepoint(librados
, rados_checksum_exit
, -ERANGE
, NULL
, 0);
3811 checksum_bl
.copy(0, checksum_bl
.length(), pchecksum
);
3813 tracepoint(librados
, rados_checksum_exit
, retval
, pchecksum
, checksum_len
);
3817 extern "C" uint64_t rados_get_last_version(rados_ioctx_t io
)
3819 tracepoint(librados
, rados_get_last_version_enter
, io
);
3820 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3821 uint64_t retval
= ctx
->last_version();
3822 tracepoint(librados
, rados_get_last_version_exit
, retval
);
3826 extern "C" int rados_pool_create(rados_t cluster
, const char *name
)
3828 tracepoint(librados
, rados_pool_create_enter
, cluster
, name
);
3829 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3831 int retval
= radosp
->pool_create(sname
);
3832 tracepoint(librados
, rados_pool_create_exit
, retval
);
3836 extern "C" int rados_pool_create_with_auid(rados_t cluster
, const char *name
,
3839 tracepoint(librados
, rados_pool_create_with_auid_enter
, cluster
, name
, auid
);
3840 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3842 int retval
= radosp
->pool_create(sname
, auid
);
3843 tracepoint(librados
, rados_pool_create_with_auid_exit
, retval
);
3847 extern "C" int rados_pool_create_with_crush_rule(rados_t cluster
, const char *name
,
3848 __u8 crush_rule_num
)
3850 tracepoint(librados
, rados_pool_create_with_crush_rule_enter
, cluster
, name
, crush_rule_num
);
3851 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3853 int retval
= radosp
->pool_create(sname
, 0, crush_rule_num
);
3854 tracepoint(librados
, rados_pool_create_with_crush_rule_exit
, retval
);
3858 extern "C" int rados_pool_create_with_all(rados_t cluster
, const char *name
,
3859 uint64_t auid
, __u8 crush_rule_num
)
3861 tracepoint(librados
, rados_pool_create_with_all_enter
, cluster
, name
, auid
, crush_rule_num
);
3862 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
3864 int retval
= radosp
->pool_create(sname
, auid
, crush_rule_num
);
3865 tracepoint(librados
, rados_pool_create_with_all_exit
, retval
);
3869 extern "C" int rados_pool_get_base_tier(rados_t cluster
, int64_t pool_id
, int64_t* base_tier
)
3871 tracepoint(librados
, rados_pool_get_base_tier_enter
, cluster
, pool_id
);
3872 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3873 int retval
= client
->pool_get_base_tier(pool_id
, base_tier
);
3874 tracepoint(librados
, rados_pool_get_base_tier_exit
, retval
, *base_tier
);
3878 extern "C" int rados_pool_delete(rados_t cluster
, const char *pool_name
)
3880 tracepoint(librados
, rados_pool_delete_enter
, cluster
, pool_name
);
3881 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3882 int retval
= client
->pool_delete(pool_name
);
3883 tracepoint(librados
, rados_pool_delete_exit
, retval
);
3887 extern "C" int rados_ioctx_pool_set_auid(rados_ioctx_t io
, uint64_t auid
)
3889 tracepoint(librados
, rados_ioctx_pool_set_auid_enter
, io
, auid
);
3890 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3891 int retval
= ctx
->pool_change_auid(auid
);
3892 tracepoint(librados
, rados_ioctx_pool_set_auid_exit
, retval
);
3896 extern "C" int rados_ioctx_pool_get_auid(rados_ioctx_t io
, uint64_t *auid
)
3898 tracepoint(librados
, rados_ioctx_pool_get_auid_enter
, io
);
3899 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3900 int retval
= ctx
->client
->pool_get_auid(ctx
->get_id(), (unsigned long long *)auid
);
3901 tracepoint(librados
, rados_ioctx_pool_get_auid_exit
, retval
, *auid
);
3905 extern "C" int rados_ioctx_pool_requires_alignment(rados_ioctx_t io
)
3907 tracepoint(librados
, rados_ioctx_pool_requires_alignment_enter
, io
);
3908 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3909 int retval
= ctx
->client
->pool_requires_alignment(ctx
->get_id());
3910 tracepoint(librados
, rados_ioctx_pool_requires_alignment_exit
, retval
);
3914 extern "C" int rados_ioctx_pool_requires_alignment2(rados_ioctx_t io
,
3917 tracepoint(librados
, rados_ioctx_pool_requires_alignment_enter2
, io
);
3918 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3919 bool requires_alignment
;
3920 int retval
= ctx
->client
->pool_requires_alignment2(ctx
->get_id(),
3921 &requires_alignment
);
3922 tracepoint(librados
, rados_ioctx_pool_requires_alignment_exit2
, retval
,
3923 requires_alignment
);
3925 *requires
= requires_alignment
;
3929 extern "C" uint64_t rados_ioctx_pool_required_alignment(rados_ioctx_t io
)
3931 tracepoint(librados
, rados_ioctx_pool_required_alignment_enter
, io
);
3932 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3933 uint64_t retval
= ctx
->client
->pool_required_alignment(ctx
->get_id());
3934 tracepoint(librados
, rados_ioctx_pool_required_alignment_exit
, retval
);
3938 extern "C" int rados_ioctx_pool_required_alignment2(rados_ioctx_t io
,
3939 uint64_t *alignment
)
3941 tracepoint(librados
, rados_ioctx_pool_required_alignment_enter2
, io
);
3942 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3943 int retval
= ctx
->client
->pool_required_alignment2(ctx
->get_id(),
3945 tracepoint(librados
, rados_ioctx_pool_required_alignment_exit2
, retval
,
3950 extern "C" void rados_ioctx_locator_set_key(rados_ioctx_t io
, const char *key
)
3952 tracepoint(librados
, rados_ioctx_locator_set_key_enter
, io
, key
);
3953 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3955 ctx
->oloc
.key
= key
;
3958 tracepoint(librados
, rados_ioctx_locator_set_key_exit
);
3961 extern "C" void rados_ioctx_set_namespace(rados_ioctx_t io
, const char *nspace
)
3963 tracepoint(librados
, rados_ioctx_set_namespace_enter
, io
, nspace
);
3964 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3966 ctx
->oloc
.nspace
= nspace
;
3968 ctx
->oloc
.nspace
= "";
3969 tracepoint(librados
, rados_ioctx_set_namespace_exit
);
3972 extern "C" rados_t
rados_ioctx_get_cluster(rados_ioctx_t io
)
3974 tracepoint(librados
, rados_ioctx_get_cluster_enter
, io
);
3975 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3976 rados_t retval
= (rados_t
)ctx
->client
;
3977 tracepoint(librados
, rados_ioctx_get_cluster_exit
, retval
);
3981 extern "C" int64_t rados_ioctx_get_id(rados_ioctx_t io
)
3983 tracepoint(librados
, rados_ioctx_get_id_enter
, io
);
3984 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3985 int64_t retval
= ctx
->get_id();
3986 tracepoint(librados
, rados_ioctx_get_id_exit
, retval
);
3990 extern "C" int rados_ioctx_get_pool_name(rados_ioctx_t io
, char *s
, unsigned maxlen
)
3992 tracepoint(librados
, rados_ioctx_get_pool_name_enter
, io
, maxlen
);
3993 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3994 std::string pool_name
;
3996 int err
= ctx
->client
->pool_get_name(ctx
->get_id(), &pool_name
);
3998 tracepoint(librados
, rados_ioctx_get_pool_name_exit
, err
, "");
4001 if (pool_name
.length() >= maxlen
) {
4002 tracepoint(librados
, rados_ioctx_get_pool_name_exit
, -ERANGE
, "");
4005 strcpy(s
, pool_name
.c_str());
4006 int retval
= pool_name
.length();
4007 tracepoint(librados
, rados_ioctx_get_pool_name_exit
, retval
, s
);
4013 extern "C" int rados_ioctx_snap_create(rados_ioctx_t io
, const char *snapname
)
4015 tracepoint(librados
, rados_ioctx_snap_create_enter
, io
, snapname
);
4016 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4017 int retval
= ctx
->snap_create(snapname
);
4018 tracepoint(librados
, rados_ioctx_snap_create_exit
, retval
);
4022 extern "C" int rados_ioctx_snap_remove(rados_ioctx_t io
, const char *snapname
)
4024 tracepoint(librados
, rados_ioctx_snap_remove_enter
, io
, snapname
);
4025 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4026 int retval
= ctx
->snap_remove(snapname
);
4027 tracepoint(librados
, rados_ioctx_snap_remove_exit
, retval
);
4031 extern "C" int rados_ioctx_snap_rollback(rados_ioctx_t io
, const char *oid
,
4032 const char *snapname
)
4034 tracepoint(librados
, rados_ioctx_snap_rollback_enter
, io
, oid
, snapname
);
4035 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4036 int retval
= ctx
->rollback(oid
, snapname
);
4037 tracepoint(librados
, rados_ioctx_snap_rollback_exit
, retval
);
4041 // Deprecated name kept for backward compatibility
4042 extern "C" int rados_rollback(rados_ioctx_t io
, const char *oid
,
4043 const char *snapname
)
4045 return rados_ioctx_snap_rollback(io
, oid
, snapname
);
4048 extern "C" int rados_ioctx_selfmanaged_snap_create(rados_ioctx_t io
,
4051 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_enter
, io
);
4052 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4053 int retval
= ctx
->selfmanaged_snap_create(snapid
);
4054 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_exit
, retval
, *snapid
);
4059 rados_aio_ioctx_selfmanaged_snap_create(rados_ioctx_t io
,
4060 rados_snap_t
*snapid
,
4061 rados_completion_t completion
)
4063 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_enter
, io
);
4064 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4065 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
4066 ctx
->aio_selfmanaged_snap_create(snapid
, c
);
4067 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_exit
, 0, 0);
4070 extern "C" int rados_ioctx_selfmanaged_snap_remove(rados_ioctx_t io
,
4073 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_enter
, io
, snapid
);
4074 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4075 int retval
= ctx
->selfmanaged_snap_remove(snapid
);
4076 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_exit
, retval
);
4081 rados_aio_ioctx_selfmanaged_snap_remove(rados_ioctx_t io
,
4082 rados_snap_t snapid
,
4083 rados_completion_t completion
)
4085 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_enter
, io
, snapid
);
4086 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4087 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
4088 ctx
->aio_selfmanaged_snap_remove(snapid
, c
);
4089 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_exit
, 0);
4092 extern "C" int rados_ioctx_selfmanaged_snap_rollback(rados_ioctx_t io
,
4096 tracepoint(librados
, rados_ioctx_selfmanaged_snap_rollback_enter
, io
, oid
, snapid
);
4097 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4098 int retval
= ctx
->selfmanaged_snap_rollback_object(oid
, ctx
->snapc
, snapid
);
4099 tracepoint(librados
, rados_ioctx_selfmanaged_snap_rollback_exit
, retval
);
4103 extern "C" int rados_ioctx_snap_list(rados_ioctx_t io
, rados_snap_t
*snaps
,
4106 tracepoint(librados
, rados_ioctx_snap_list_enter
, io
, maxlen
);
4107 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4108 vector
<uint64_t> snapvec
;
4109 int r
= ctx
->snap_list(&snapvec
);
4111 tracepoint(librados
, rados_ioctx_snap_list_exit
, r
, snaps
, 0);
4114 if ((int)snapvec
.size() <= maxlen
) {
4115 for (unsigned i
=0; i
<snapvec
.size(); i
++) {
4116 snaps
[i
] = snapvec
[i
];
4118 int retval
= snapvec
.size();
4119 tracepoint(librados
, rados_ioctx_snap_list_exit
, retval
, snaps
, retval
);
4122 int retval
= -ERANGE
;
4123 tracepoint(librados
, rados_ioctx_snap_list_exit
, retval
, snaps
, 0);
4127 extern "C" int rados_ioctx_snap_lookup(rados_ioctx_t io
, const char *name
,
4130 tracepoint(librados
, rados_ioctx_snap_lookup_enter
, io
, name
);
4131 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4132 int retval
= ctx
->snap_lookup(name
, (uint64_t *)id
);
4133 tracepoint(librados
, rados_ioctx_snap_lookup_exit
, retval
, *id
);
4137 extern "C" int rados_ioctx_snap_get_name(rados_ioctx_t io
, rados_snap_t id
,
4138 char *name
, int maxlen
)
4140 tracepoint(librados
, rados_ioctx_snap_get_name_enter
, io
, id
, maxlen
);
4141 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4143 int r
= ctx
->snap_get_name(id
, &sname
);
4145 tracepoint(librados
, rados_ioctx_snap_get_name_exit
, r
, "");
4148 if ((int)sname
.length() >= maxlen
) {
4149 int retval
= -ERANGE
;
4150 tracepoint(librados
, rados_ioctx_snap_get_name_exit
, retval
, "");
4153 strncpy(name
, sname
.c_str(), maxlen
);
4154 tracepoint(librados
, rados_ioctx_snap_get_name_exit
, 0, name
);
4158 extern "C" int rados_ioctx_snap_get_stamp(rados_ioctx_t io
, rados_snap_t id
, time_t *t
)
4160 tracepoint(librados
, rados_ioctx_snap_get_stamp_enter
, io
, id
);
4161 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4162 int retval
= ctx
->snap_get_stamp(id
, t
);
4163 tracepoint(librados
, rados_ioctx_snap_get_stamp_exit
, retval
, *t
);
4167 extern "C" int rados_cmpext(rados_ioctx_t io
, const char *o
,
4168 const char *cmp_buf
, size_t cmp_len
, uint64_t off
)
4170 tracepoint(librados
, rados_cmpext_enter
, io
, o
, cmp_buf
, cmp_len
, off
);
4171 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4176 cmp_bl
.append(cmp_buf
, cmp_len
);
4178 ret
= ctx
->cmpext(oid
, off
, cmp_bl
);
4179 tracepoint(librados
, rados_cmpext_exit
, ret
);
4184 extern "C" int rados_getxattr(rados_ioctx_t io
, const char *o
, const char *name
,
4185 char *buf
, size_t len
)
4187 tracepoint(librados
, rados_getxattr_enter
, io
, o
, name
, len
);
4188 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4192 bl
.push_back(buffer::create_static(len
, buf
));
4193 ret
= ctx
->getxattr(oid
, name
, bl
);
4195 if (bl
.length() > len
) {
4196 tracepoint(librados
, rados_getxattr_exit
, -ERANGE
, buf
, 0);
4199 if (!bl
.is_provided_buffer(buf
))
4200 bl
.copy(0, bl
.length(), buf
);
4204 tracepoint(librados
, rados_getxattr_exit
, ret
, buf
, ret
);
4208 extern "C" int rados_getxattrs(rados_ioctx_t io
, const char *oid
,
4209 rados_xattrs_iter_t
*iter
)
4211 tracepoint(librados
, rados_getxattrs_enter
, io
, oid
);
4212 librados::RadosXattrsIter
*it
= new librados::RadosXattrsIter();
4214 tracepoint(librados
, rados_getxattrs_exit
, -ENOMEM
, NULL
);
4217 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4219 int ret
= ctx
->getxattrs(obj
, it
->attrset
);
4222 tracepoint(librados
, rados_getxattrs_exit
, ret
, NULL
);
4225 it
->i
= it
->attrset
.begin();
4227 librados::RadosXattrsIter
**iret
= (librados::RadosXattrsIter
**)iter
;
4230 tracepoint(librados
, rados_getxattrs_exit
, 0, *iter
);
4234 extern "C" int rados_getxattrs_next(rados_xattrs_iter_t iter
,
4235 const char **name
, const char **val
, size_t *len
)
4237 tracepoint(librados
, rados_getxattrs_next_enter
, iter
);
4238 librados::RadosXattrsIter
*it
= static_cast<librados::RadosXattrsIter
*>(iter
);
4243 if (it
->i
== it
->attrset
.end()) {
4247 tracepoint(librados
, rados_getxattrs_next_exit
, 0, NULL
, NULL
, 0);
4250 const std::string
&s(it
->i
->first
);
4252 bufferlist
&bl(it
->i
->second
);
4253 size_t bl_len
= bl
.length();
4255 // malloc(0) is not guaranteed to return a valid pointer
4256 *val
= (char *)NULL
;
4258 it
->val
= (char*)malloc(bl_len
);
4260 tracepoint(librados
, rados_getxattrs_next_exit
, -ENOMEM
, *name
, NULL
, 0);
4263 memcpy(it
->val
, bl
.c_str(), bl_len
);
4268 tracepoint(librados
, rados_getxattrs_next_exit
, 0, *name
, *val
, *len
);
4272 extern "C" void rados_getxattrs_end(rados_xattrs_iter_t iter
)
4274 tracepoint(librados
, rados_getxattrs_end_enter
, iter
);
4275 librados::RadosXattrsIter
*it
= static_cast<librados::RadosXattrsIter
*>(iter
);
4277 tracepoint(librados
, rados_getxattrs_end_exit
);
4280 extern "C" int rados_setxattr(rados_ioctx_t io
, const char *o
, const char *name
, const char *buf
, size_t len
)
4282 tracepoint(librados
, rados_setxattr_enter
, io
, o
, name
, buf
, len
);
4283 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4286 bl
.append(buf
, len
);
4287 int retval
= ctx
->setxattr(oid
, name
, bl
);
4288 tracepoint(librados
, rados_setxattr_exit
, retval
);
4292 extern "C" int rados_rmxattr(rados_ioctx_t io
, const char *o
, const char *name
)
4294 tracepoint(librados
, rados_rmxattr_enter
, io
, o
, name
);
4295 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4297 int retval
= ctx
->rmxattr(oid
, name
);
4298 tracepoint(librados
, rados_rmxattr_exit
, retval
);
4302 extern "C" int rados_stat(rados_ioctx_t io
, const char *o
, uint64_t *psize
, time_t *pmtime
)
4304 tracepoint(librados
, rados_stat_enter
, io
, o
);
4305 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4307 int retval
= ctx
->stat(oid
, psize
, pmtime
);
4308 tracepoint(librados
, rados_stat_exit
, retval
, psize
, pmtime
);
4312 extern "C" int rados_tmap_update(rados_ioctx_t io
, const char *o
, const char *cmdbuf
, size_t cmdbuflen
)
4314 tracepoint(librados
, rados_tmap_update_enter
, io
, o
, cmdbuf
, cmdbuflen
);
4315 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4318 cmdbl
.append(cmdbuf
, cmdbuflen
);
4319 int retval
= ctx
->tmap_update(oid
, cmdbl
);
4320 tracepoint(librados
, rados_tmap_update_exit
, retval
);
4324 extern "C" int rados_tmap_put(rados_ioctx_t io
, const char *o
, const char *buf
, size_t buflen
)
4326 tracepoint(librados
, rados_tmap_put_enter
, io
, o
, buf
, buflen
);
4327 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4330 bl
.append(buf
, buflen
);
4331 int retval
= ctx
->tmap_put(oid
, bl
);
4332 tracepoint(librados
, rados_tmap_put_exit
, retval
);
4336 extern "C" int rados_tmap_get(rados_ioctx_t io
, const char *o
, char *buf
, size_t buflen
)
4338 tracepoint(librados
, rados_tmap_get_enter
, io
, o
, buflen
);
4339 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4342 int r
= ctx
->tmap_get(oid
, bl
);
4344 tracepoint(librados
, rados_tmap_get_exit
, r
, buf
, 0);
4347 if (bl
.length() > buflen
) {
4348 tracepoint(librados
, rados_tmap_get_exit
, -ERANGE
, buf
, 0);
4351 bl
.copy(0, bl
.length(), buf
);
4352 int retval
= bl
.length();
4353 tracepoint(librados
, rados_tmap_get_exit
, retval
, buf
, retval
);
4357 extern "C" int rados_tmap_to_omap(rados_ioctx_t io
, const char *o
, bool nullok
)
4359 tracepoint(librados
, rados_tmap_to_omap_enter
, io
, o
, nullok
);
4360 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4362 int retval
= ctx
->tmap_to_omap(oid
, nullok
);
4363 tracepoint(librados
, rados_tmap_to_omap_exit
, retval
);
4367 extern "C" int rados_exec(rados_ioctx_t io
, const char *o
, const char *cls
, const char *method
,
4368 const char *inbuf
, size_t in_len
, char *buf
, size_t out_len
)
4370 tracepoint(librados
, rados_exec_enter
, io
, o
, cls
, method
, inbuf
, in_len
, out_len
);
4371 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4373 bufferlist inbl
, outbl
;
4375 inbl
.append(inbuf
, in_len
);
4376 ret
= ctx
->exec(oid
, cls
, method
, inbl
, outbl
);
4378 if (outbl
.length()) {
4379 if (outbl
.length() > out_len
) {
4380 tracepoint(librados
, rados_exec_exit
, -ERANGE
, buf
, 0);
4383 outbl
.copy(0, outbl
.length(), buf
);
4384 ret
= outbl
.length(); // hrm :/
4387 tracepoint(librados
, rados_exec_exit
, ret
, buf
, ret
);
4391 extern "C" rados_object_list_cursor
rados_object_list_begin(rados_ioctx_t io
)
4393 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4395 hobject_t
*result
= new hobject_t(ctx
->objecter
->enumerate_objects_begin());
4396 return (rados_object_list_cursor
)result
;
4399 extern "C" rados_object_list_cursor
rados_object_list_end(rados_ioctx_t io
)
4401 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4403 hobject_t
*result
= new hobject_t(ctx
->objecter
->enumerate_objects_end());
4404 return (rados_object_list_cursor
)result
;
4407 extern "C" int rados_object_list_is_end(
4408 rados_ioctx_t io
, rados_object_list_cursor cur
)
4410 hobject_t
*hobj
= (hobject_t
*)cur
;
4411 return hobj
->is_max();
4414 extern "C" void rados_object_list_cursor_free(
4415 rados_ioctx_t io
, rados_object_list_cursor cur
)
4417 hobject_t
*hobj
= (hobject_t
*)cur
;
4421 extern "C" int rados_object_list_cursor_cmp(
4423 rados_object_list_cursor lhs_cur
,
4424 rados_object_list_cursor rhs_cur
)
4426 hobject_t
*lhs
= (hobject_t
*)lhs_cur
;
4427 hobject_t
*rhs
= (hobject_t
*)rhs_cur
;
4428 return cmp(*lhs
, *rhs
);
4431 extern "C" int rados_object_list(rados_ioctx_t io
,
4432 const rados_object_list_cursor start
,
4433 const rados_object_list_cursor finish
,
4434 const size_t result_item_count
,
4435 const char *filter_buf
,
4436 const size_t filter_buf_len
,
4437 rados_object_list_item
*result_items
,
4438 rados_object_list_cursor
*next
)
4442 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4444 // Zero out items so that they will be safe to free later
4445 memset(result_items
, 0, sizeof(rados_object_list_item
) * result_item_count
);
4447 std::list
<librados::ListObjectImpl
> result
;
4448 hobject_t next_hash
;
4450 bufferlist filter_bl
;
4451 if (filter_buf
!= nullptr) {
4452 filter_bl
.append(filter_buf
, filter_buf_len
);
4456 ctx
->objecter
->enumerate_objects(
4459 *((hobject_t
*)start
),
4460 *((hobject_t
*)finish
),
4467 hobject_t
*next_hobj
= (hobject_t
*)(*next
);
4470 int r
= cond
.wait();
4472 *next_hobj
= hobject_t::get_max();
4476 assert(result
.size() <= result_item_count
); // Don't overflow!
4479 for (std::list
<librados::ListObjectImpl
>::iterator i
= result
.begin();
4480 i
!= result
.end(); ++i
) {
4481 rados_object_list_item
&item
= result_items
[k
++];
4482 do_out_buffer(i
->oid
, &item
.oid
, &item
.oid_length
);
4483 do_out_buffer(i
->nspace
, &item
.nspace
, &item
.nspace_length
);
4484 do_out_buffer(i
->locator
, &item
.locator
, &item
.locator_length
);
4487 *next_hobj
= next_hash
;
4489 return result
.size();
4492 extern "C" void rados_object_list_free(
4493 const size_t result_size
,
4494 rados_object_list_item
*results
)
4498 for (unsigned int i
= 0; i
< result_size
; ++i
) {
4499 rados_buffer_free(results
[i
].oid
);
4500 rados_buffer_free(results
[i
].locator
);
4501 rados_buffer_free(results
[i
].nspace
);
4507 extern "C" int rados_nobjects_list_open(rados_ioctx_t io
, rados_list_ctx_t
*listh
)
4509 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4511 tracepoint(librados
, rados_nobjects_list_open_enter
, io
);
4513 Objecter::NListContext
*h
= new Objecter::NListContext
;
4514 h
->pool_id
= ctx
->poolid
;
4515 h
->pool_snap_seq
= ctx
->snap_seq
;
4516 h
->nspace
= ctx
->oloc
.nspace
; // After dropping compatibility need nspace
4517 *listh
= (void *)new librados::ObjListCtx(ctx
, h
);
4518 tracepoint(librados
, rados_nobjects_list_open_exit
, 0, *listh
);
4522 extern "C" void rados_nobjects_list_close(rados_list_ctx_t h
)
4524 tracepoint(librados
, rados_nobjects_list_close_enter
, h
);
4525 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)h
;
4527 tracepoint(librados
, rados_nobjects_list_close_exit
);
4530 extern "C" uint32_t rados_nobjects_list_seek(rados_list_ctx_t listctx
,
4533 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
4534 tracepoint(librados
, rados_nobjects_list_seek_enter
, listctx
, pos
);
4535 uint32_t r
= lh
->ctx
->nlist_seek(lh
->nlc
, pos
);
4536 tracepoint(librados
, rados_nobjects_list_seek_exit
, r
);
4540 extern "C" uint32_t rados_nobjects_list_seek_cursor(rados_list_ctx_t listctx
,
4541 rados_object_list_cursor cursor
)
4543 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
4545 tracepoint(librados
, rados_nobjects_list_seek_cursor_enter
, listctx
);
4546 uint32_t r
= lh
->ctx
->nlist_seek(lh
->nlc
, cursor
);
4547 tracepoint(librados
, rados_nobjects_list_seek_cursor_exit
, r
);
4551 extern "C" int rados_nobjects_list_get_cursor(rados_list_ctx_t listctx
,
4552 rados_object_list_cursor
*cursor
)
4554 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
4556 tracepoint(librados
, rados_nobjects_list_get_cursor_enter
, listctx
);
4557 *cursor
= lh
->ctx
->nlist_get_cursor(lh
->nlc
);
4558 tracepoint(librados
, rados_nobjects_list_get_cursor_exit
, 0);
4562 extern "C" uint32_t rados_nobjects_list_get_pg_hash_position(
4563 rados_list_ctx_t listctx
)
4565 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
4566 tracepoint(librados
, rados_nobjects_list_get_pg_hash_position_enter
, listctx
);
4567 uint32_t retval
= lh
->nlc
->get_pg_hash_position();
4568 tracepoint(librados
, rados_nobjects_list_get_pg_hash_position_exit
, retval
);
4572 extern "C" int rados_nobjects_list_next(rados_list_ctx_t listctx
, const char **entry
, const char **key
, const char **nspace
)
4574 tracepoint(librados
, rados_nobjects_list_next_enter
, listctx
);
4575 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
4576 Objecter::NListContext
*h
= lh
->nlc
;
4578 // if the list is non-empty, this method has been called before
4579 if (!h
->list
.empty())
4580 // so let's kill the previously-returned object
4581 h
->list
.pop_front();
4583 if (h
->list
.empty()) {
4584 int ret
= lh
->ctx
->nlist(lh
->nlc
, RADOS_LIST_MAX_ENTRIES
);
4586 tracepoint(librados
, rados_nobjects_list_next_exit
, ret
, NULL
, NULL
, NULL
);
4589 if (h
->list
.empty()) {
4590 tracepoint(librados
, rados_nobjects_list_next_exit
, -ENOENT
, NULL
, NULL
, NULL
);
4595 *entry
= h
->list
.front().oid
.c_str();
4598 if (h
->list
.front().locator
.size())
4599 *key
= h
->list
.front().locator
.c_str();
4604 *nspace
= h
->list
.front().nspace
.c_str();
4605 tracepoint(librados
, rados_nobjects_list_next_exit
, 0, *entry
, key
, nspace
);
4611 * removed legacy v2 list objects stubs
4613 * thse return -ENOTSUP where possible.
4615 extern "C" int rados_objects_list_open(
4617 rados_list_ctx_t
*ctx
)
4622 extern "C" uint32_t rados_objects_list_get_pg_hash_position(
4623 rados_list_ctx_t ctx
)
4628 extern "C" uint32_t rados_objects_list_seek(
4629 rados_list_ctx_t ctx
,
4635 extern "C" int rados_objects_list_next(
4636 rados_list_ctx_t ctx
,
4643 extern "C" void rados_objects_list_close(
4644 rados_list_ctx_t ctx
)
4649 // -------------------------
4652 extern "C" int rados_aio_create_completion(void *cb_arg
,
4653 rados_callback_t cb_complete
,
4654 rados_callback_t cb_safe
,
4655 rados_completion_t
*pc
)
4657 tracepoint(librados
, rados_aio_create_completion_enter
, cb_arg
, cb_complete
, cb_safe
);
4658 librados::AioCompletionImpl
*c
= new librados::AioCompletionImpl
;
4660 c
->set_complete_callback(cb_arg
, cb_complete
);
4662 c
->set_safe_callback(cb_arg
, cb_safe
);
4664 tracepoint(librados
, rados_aio_create_completion_exit
, 0, *pc
);
4668 extern "C" int rados_aio_wait_for_complete(rados_completion_t c
)
4670 tracepoint(librados
, rados_aio_wait_for_complete_enter
, c
);
4671 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_complete();
4672 tracepoint(librados
, rados_aio_wait_for_complete_exit
, retval
);
4676 extern "C" int rados_aio_wait_for_safe(rados_completion_t c
)
4678 tracepoint(librados
, rados_aio_wait_for_safe_enter
, c
);
4679 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_safe();
4680 tracepoint(librados
, rados_aio_wait_for_safe_exit
, retval
);
4684 extern "C" int rados_aio_is_complete(rados_completion_t c
)
4686 tracepoint(librados
, rados_aio_is_complete_enter
, c
);
4687 int retval
= ((librados::AioCompletionImpl
*)c
)->is_complete();
4688 tracepoint(librados
, rados_aio_is_complete_exit
, retval
);
4692 extern "C" int rados_aio_is_safe(rados_completion_t c
)
4694 tracepoint(librados
, rados_aio_is_safe_enter
, c
);
4695 int retval
= ((librados::AioCompletionImpl
*)c
)->is_safe();
4696 tracepoint(librados
, rados_aio_is_safe_exit
, retval
);
4700 extern "C" int rados_aio_wait_for_complete_and_cb(rados_completion_t c
)
4702 tracepoint(librados
, rados_aio_wait_for_complete_and_cb_enter
, c
);
4703 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_complete_and_cb();
4704 tracepoint(librados
, rados_aio_wait_for_complete_and_cb_exit
, retval
);
4708 extern "C" int rados_aio_wait_for_safe_and_cb(rados_completion_t c
)
4710 tracepoint(librados
, rados_aio_wait_for_safe_and_cb_enter
, c
);
4711 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_safe_and_cb();
4712 tracepoint(librados
, rados_aio_wait_for_safe_and_cb_exit
, retval
);
4716 extern "C" int rados_aio_is_complete_and_cb(rados_completion_t c
)
4718 tracepoint(librados
, rados_aio_is_complete_and_cb_enter
, c
);
4719 int retval
= ((librados::AioCompletionImpl
*)c
)->is_complete_and_cb();
4720 tracepoint(librados
, rados_aio_is_complete_and_cb_exit
, retval
);
4724 extern "C" int rados_aio_is_safe_and_cb(rados_completion_t c
)
4726 tracepoint(librados
, rados_aio_is_safe_and_cb_enter
, c
);
4727 int retval
= ((librados::AioCompletionImpl
*)c
)->is_safe_and_cb();
4728 tracepoint(librados
, rados_aio_is_safe_and_cb_exit
, retval
);
4732 extern "C" int rados_aio_get_return_value(rados_completion_t c
)
4734 tracepoint(librados
, rados_aio_get_return_value_enter
, c
);
4735 int retval
= ((librados::AioCompletionImpl
*)c
)->get_return_value();
4736 tracepoint(librados
, rados_aio_get_return_value_exit
, retval
);
4740 extern "C" uint64_t rados_aio_get_version(rados_completion_t c
)
4742 tracepoint(librados
, rados_aio_get_version_enter
, c
);
4743 uint64_t retval
= ((librados::AioCompletionImpl
*)c
)->get_version();
4744 tracepoint(librados
, rados_aio_get_version_exit
, retval
);
4748 extern "C" void rados_aio_release(rados_completion_t c
)
4750 tracepoint(librados
, rados_aio_release_enter
, c
);
4751 ((librados::AioCompletionImpl
*)c
)->put();
4752 tracepoint(librados
, rados_aio_release_exit
);
4755 extern "C" int rados_aio_read(rados_ioctx_t io
, const char *o
,
4756 rados_completion_t completion
,
4757 char *buf
, size_t len
, uint64_t off
)
4759 tracepoint(librados
, rados_aio_read_enter
, io
, o
, completion
, len
, off
);
4760 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4762 int retval
= ctx
->aio_read(oid
, (librados::AioCompletionImpl
*)completion
,
4763 buf
, len
, off
, ctx
->snap_seq
);
4764 tracepoint(librados
, rados_aio_read_exit
, retval
);
4769 extern "C" int rados_aio_read_traced(rados_ioctx_t io
, const char *o
,
4770 rados_completion_t completion
,
4771 char *buf
, size_t len
, uint64_t off
,
4772 struct blkin_trace_info
*info
)
4774 tracepoint(librados
, rados_aio_read_enter
, io
, o
, completion
, len
, off
);
4775 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4777 int retval
= ctx
->aio_read(oid
, (librados::AioCompletionImpl
*)completion
,
4778 buf
, len
, off
, ctx
->snap_seq
, info
);
4779 tracepoint(librados
, rados_aio_read_exit
, retval
);
4784 extern "C" int rados_aio_write(rados_ioctx_t io
, const char *o
,
4785 rados_completion_t completion
,
4786 const char *buf
, size_t len
, uint64_t off
)
4788 tracepoint(librados
, rados_aio_write_enter
, io
, o
, completion
, buf
, len
, off
);
4789 if (len
> UINT_MAX
/2)
4791 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4794 bl
.append(buf
, len
);
4795 int retval
= ctx
->aio_write(oid
, (librados::AioCompletionImpl
*)completion
,
4797 tracepoint(librados
, rados_aio_write_exit
, retval
);
4802 extern "C" int rados_aio_write_traced(rados_ioctx_t io
, const char *o
,
4803 rados_completion_t completion
,
4804 const char *buf
, size_t len
, uint64_t off
,
4805 struct blkin_trace_info
*info
)
4807 tracepoint(librados
, rados_aio_write_enter
, io
, o
, completion
, buf
, len
, off
);
4808 if (len
> UINT_MAX
/2)
4810 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4813 bl
.append(buf
, len
);
4814 int retval
= ctx
->aio_write(oid
, (librados::AioCompletionImpl
*)completion
,
4815 bl
, len
, off
, info
);
4816 tracepoint(librados
, rados_aio_write_exit
, retval
);
4821 extern "C" int rados_aio_append(rados_ioctx_t io
, const char *o
,
4822 rados_completion_t completion
,
4823 const char *buf
, size_t len
)
4825 tracepoint(librados
, rados_aio_append_enter
, io
, o
, completion
, buf
, len
);
4826 if (len
> UINT_MAX
/2)
4828 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4831 bl
.append(buf
, len
);
4832 int retval
= ctx
->aio_append(oid
, (librados::AioCompletionImpl
*)completion
,
4834 tracepoint(librados
, rados_aio_append_exit
, retval
);
4838 extern "C" int rados_aio_write_full(rados_ioctx_t io
, const char *o
,
4839 rados_completion_t completion
,
4840 const char *buf
, size_t len
)
4842 tracepoint(librados
, rados_aio_write_full_enter
, io
, o
, completion
, buf
, len
);
4843 if (len
> UINT_MAX
/2)
4845 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4848 bl
.append(buf
, len
);
4849 int retval
= ctx
->aio_write_full(oid
, (librados::AioCompletionImpl
*)completion
, bl
);
4850 tracepoint(librados
, rados_aio_write_full_exit
, retval
);
4854 extern "C" int rados_aio_writesame(rados_ioctx_t io
, const char *o
,
4855 rados_completion_t completion
,
4856 const char *buf
, size_t data_len
,
4857 size_t write_len
, uint64_t off
)
4859 tracepoint(librados
, rados_aio_writesame_enter
, io
, o
, completion
, buf
,
4860 data_len
, write_len
, off
);
4861 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4864 bl
.append(buf
, data_len
);
4865 int retval
= ctx
->aio_writesame(o
, (librados::AioCompletionImpl
*)completion
,
4866 bl
, write_len
, off
);
4867 tracepoint(librados
, rados_aio_writesame_exit
, retval
);
4871 extern "C" int rados_aio_remove(rados_ioctx_t io
, const char *o
,
4872 rados_completion_t completion
)
4874 tracepoint(librados
, rados_aio_remove_enter
, io
, o
, completion
);
4875 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4877 int retval
= ctx
->aio_remove(oid
, (librados::AioCompletionImpl
*)completion
);
4878 tracepoint(librados
, rados_aio_remove_exit
, retval
);
4882 extern "C" int rados_aio_flush_async(rados_ioctx_t io
,
4883 rados_completion_t completion
)
4885 tracepoint(librados
, rados_aio_flush_async_enter
, io
, completion
);
4886 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4887 ctx
->flush_aio_writes_async((librados::AioCompletionImpl
*)completion
);
4888 tracepoint(librados
, rados_aio_flush_async_exit
, 0);
4892 extern "C" int rados_aio_flush(rados_ioctx_t io
)
4894 tracepoint(librados
, rados_aio_flush_enter
, io
);
4895 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4896 ctx
->flush_aio_writes();
4897 tracepoint(librados
, rados_aio_flush_exit
, 0);
4901 struct AioGetxattrData
{
4902 AioGetxattrData(char* buf
, rados_completion_t c
, size_t l
) :
4903 user_buf(buf
), len(l
), user_completion((librados::AioCompletionImpl
*)c
) {}
4907 struct librados::C_AioCompleteAndSafe user_completion
;
4910 static void rados_aio_getxattr_complete(rados_completion_t c
, void *arg
) {
4911 AioGetxattrData
*cdata
= reinterpret_cast<AioGetxattrData
*>(arg
);
4912 int rc
= rados_aio_get_return_value(c
);
4914 if (cdata
->bl
.length() > cdata
->len
) {
4917 if (!cdata
->bl
.is_provided_buffer(cdata
->user_buf
))
4918 cdata
->bl
.copy(0, cdata
->bl
.length(), cdata
->user_buf
);
4919 rc
= cdata
->bl
.length();
4922 cdata
->user_completion
.finish(rc
);
4926 extern "C" int rados_aio_getxattr(rados_ioctx_t io
, const char *o
,
4927 rados_completion_t completion
,
4928 const char *name
, char *buf
, size_t len
)
4930 tracepoint(librados
, rados_aio_getxattr_enter
, io
, o
, completion
, name
, len
);
4931 // create data object to be passed to async callback
4932 AioGetxattrData
*cdata
= new AioGetxattrData(buf
, completion
, len
);
4934 tracepoint(librados
, rados_aio_getxattr_exit
, -ENOMEM
, NULL
, 0);
4937 cdata
->bl
.push_back(buffer::create_static(len
, buf
));
4938 // create completion callback
4939 librados::AioCompletionImpl
*c
= new librados::AioCompletionImpl
;
4940 c
->set_complete_callback(cdata
, rados_aio_getxattr_complete
);
4941 // call async getxattr of IoCtx
4942 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4944 int ret
= ctx
->aio_getxattr(oid
, c
, name
, cdata
->bl
);
4945 tracepoint(librados
, rados_aio_getxattr_exit
, ret
, buf
, ret
);
4950 struct AioGetxattrsData
{
4951 AioGetxattrsData(rados_completion_t c
, rados_xattrs_iter_t
*_iter
) :
4952 iter(_iter
), user_completion((librados::AioCompletionImpl
*)c
) {
4953 it
= new librados::RadosXattrsIter();
4955 ~AioGetxattrsData() {
4958 librados::RadosXattrsIter
*it
;
4959 rados_xattrs_iter_t
*iter
;
4960 struct librados::C_AioCompleteAndSafe user_completion
;
4964 static void rados_aio_getxattrs_complete(rados_completion_t c
, void *arg
) {
4965 AioGetxattrsData
*cdata
= reinterpret_cast<AioGetxattrsData
*>(arg
);
4966 int rc
= rados_aio_get_return_value(c
);
4968 cdata
->user_completion
.finish(rc
);
4970 cdata
->it
->i
= cdata
->it
->attrset
.begin();
4971 *cdata
->iter
= cdata
->it
;
4973 cdata
->user_completion
.finish(0);
4978 extern "C" int rados_aio_getxattrs(rados_ioctx_t io
, const char *oid
,
4979 rados_completion_t completion
,
4980 rados_xattrs_iter_t
*iter
)
4982 tracepoint(librados
, rados_aio_getxattrs_enter
, io
, oid
, completion
);
4983 // create data object to be passed to async callback
4984 AioGetxattrsData
*cdata
= new AioGetxattrsData(completion
, iter
);
4986 tracepoint(librados
, rados_getxattrs_exit
, -ENOMEM
, NULL
);
4989 // create completion callback
4990 librados::AioCompletionImpl
*c
= new librados::AioCompletionImpl
;
4991 c
->set_complete_callback(cdata
, rados_aio_getxattrs_complete
);
4992 // call async getxattrs of IoCtx
4993 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4995 int ret
= ctx
->aio_getxattrs(obj
, c
, cdata
->it
->attrset
);
4996 tracepoint(librados
, rados_aio_getxattrs_exit
, ret
, cdata
->it
);
5000 extern "C" int rados_aio_setxattr(rados_ioctx_t io
, const char *o
,
5001 rados_completion_t completion
,
5002 const char *name
, const char *buf
, size_t len
)
5004 tracepoint(librados
, rados_aio_setxattr_enter
, io
, o
, completion
, name
, buf
, len
);
5005 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5008 bl
.append(buf
, len
);
5009 int retval
= ctx
->aio_setxattr(oid
, (librados::AioCompletionImpl
*)completion
, name
, bl
);
5010 tracepoint(librados
, rados_aio_setxattr_exit
, retval
);
5014 extern "C" int rados_aio_rmxattr(rados_ioctx_t io
, const char *o
,
5015 rados_completion_t completion
,
5018 tracepoint(librados
, rados_aio_rmxattr_enter
, io
, o
, completion
, name
);
5019 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5021 int retval
= ctx
->aio_rmxattr(oid
, (librados::AioCompletionImpl
*)completion
, name
);
5022 tracepoint(librados
, rados_aio_rmxattr_exit
, retval
);
5026 extern "C" int rados_aio_stat(rados_ioctx_t io
, const char *o
,
5027 rados_completion_t completion
,
5028 uint64_t *psize
, time_t *pmtime
)
5030 tracepoint(librados
, rados_aio_stat_enter
, io
, o
, completion
);
5031 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5033 int retval
= ctx
->aio_stat(oid
, (librados::AioCompletionImpl
*)completion
,
5035 tracepoint(librados
, rados_aio_stat_exit
, retval
);
5039 extern "C" int rados_aio_cmpext(rados_ioctx_t io
, const char *o
,
5040 rados_completion_t completion
, const char *cmp_buf
,
5041 size_t cmp_len
, uint64_t off
)
5043 tracepoint(librados
, rados_aio_cmpext_enter
, io
, o
, completion
, cmp_buf
,
5045 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5047 int retval
= ctx
->aio_cmpext(oid
, (librados::AioCompletionImpl
*)completion
,
5048 cmp_buf
, cmp_len
, off
);
5049 tracepoint(librados
, rados_aio_cmpext_exit
, retval
);
5053 extern "C" int rados_aio_cancel(rados_ioctx_t io
, rados_completion_t completion
)
5055 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5056 return ctx
->aio_cancel((librados::AioCompletionImpl
*)completion
);
5059 extern "C" int rados_aio_exec(rados_ioctx_t io
, const char *o
,
5060 rados_completion_t completion
,
5061 const char *cls
, const char *method
,
5062 const char *inbuf
, size_t in_len
,
5063 char *buf
, size_t out_len
)
5065 tracepoint(librados
, rados_aio_exec_enter
, io
, o
, completion
);
5066 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5069 inbl
.append(inbuf
, in_len
);
5070 int retval
= ctx
->aio_exec(oid
, (librados::AioCompletionImpl
*)completion
,
5071 cls
, method
, inbl
, buf
, out_len
);
5072 tracepoint(librados
, rados_aio_exec_exit
, retval
);
5076 struct C_WatchCB
: public librados::WatchCtx
{
5077 rados_watchcb_t wcb
;
5079 C_WatchCB(rados_watchcb_t _wcb
, void *_arg
) : wcb(_wcb
), arg(_arg
) {}
5080 void notify(uint8_t opcode
, uint64_t ver
, bufferlist
& bl
) override
{
5081 wcb(opcode
, ver
, arg
);
5085 extern "C" int rados_watch(rados_ioctx_t io
, const char *o
, uint64_t ver
,
5087 rados_watchcb_t watchcb
, void *arg
)
5089 tracepoint(librados
, rados_watch_enter
, io
, o
, ver
, watchcb
, arg
);
5090 uint64_t *cookie
= handle
;
5091 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5093 C_WatchCB
*wc
= new C_WatchCB(watchcb
, arg
);
5094 int retval
= ctx
->watch(oid
, cookie
, wc
, NULL
, true);
5095 tracepoint(librados
, rados_watch_exit
, retval
, *handle
);
5099 struct C_WatchCB2
: public librados::WatchCtx2
{
5100 rados_watchcb2_t wcb
;
5101 rados_watcherrcb_t errcb
;
5103 C_WatchCB2(rados_watchcb2_t _wcb
,
5104 rados_watcherrcb_t _errcb
,
5105 void *_arg
) : wcb(_wcb
), errcb(_errcb
), arg(_arg
) {}
5106 void handle_notify(uint64_t notify_id
,
5108 uint64_t notifier_gid
,
5109 bufferlist
& bl
) override
{
5110 wcb(arg
, notify_id
, cookie
, notifier_gid
, bl
.c_str(), bl
.length());
5112 void handle_error(uint64_t cookie
, int err
) override
{
5114 errcb(arg
, cookie
, err
);
5118 extern "C" int rados_watch2(rados_ioctx_t io
, const char *o
, uint64_t *handle
,
5119 rados_watchcb2_t watchcb
,
5120 rados_watcherrcb_t watcherrcb
,
5122 return rados_watch3(io
, o
, handle
, watchcb
, watcherrcb
, 0, arg
);
5125 extern "C" int rados_watch3(rados_ioctx_t io
, const char *o
, uint64_t *handle
,
5126 rados_watchcb2_t watchcb
,
5127 rados_watcherrcb_t watcherrcb
,
5131 tracepoint(librados
, rados_watch3_enter
, io
, o
, handle
, watchcb
, timeout
, arg
);
5133 if (!watchcb
|| !o
|| !handle
) {
5136 uint64_t *cookie
= handle
;
5137 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5139 C_WatchCB2
*wc
= new C_WatchCB2(watchcb
, watcherrcb
, arg
);
5140 ret
= ctx
->watch(oid
, cookie
, NULL
, wc
, timeout
, true);
5142 tracepoint(librados
, rados_watch3_exit
, ret
, handle
? *handle
: 0);
5146 extern "C" int rados_aio_watch(rados_ioctx_t io
, const char *o
,
5147 rados_completion_t completion
,
5149 rados_watchcb2_t watchcb
,
5150 rados_watcherrcb_t watcherrcb
, void *arg
) {
5151 return rados_aio_watch2(io
, o
, completion
, handle
, watchcb
, watcherrcb
, 0, arg
);
5154 extern "C" int rados_aio_watch2(rados_ioctx_t io
, const char *o
,
5155 rados_completion_t completion
,
5157 rados_watchcb2_t watchcb
,
5158 rados_watcherrcb_t watcherrcb
,
5159 uint32_t timeout
, void *arg
)
5161 tracepoint(librados
, rados_aio_watch2_enter
, io
, o
, completion
, handle
, watchcb
, timeout
, arg
);
5163 if (!completion
|| !watchcb
|| !o
|| !handle
) {
5166 uint64_t *cookie
= handle
;
5167 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5169 librados::AioCompletionImpl
*c
=
5170 reinterpret_cast<librados::AioCompletionImpl
*>(completion
);
5171 C_WatchCB2
*wc
= new C_WatchCB2(watchcb
, watcherrcb
, arg
);
5172 ret
= ctx
->aio_watch(oid
, c
, cookie
, NULL
, wc
, timeout
, true);
5174 tracepoint(librados
, rados_aio_watch2_exit
, ret
, handle
? *handle
: 0);
5179 extern "C" int rados_unwatch(rados_ioctx_t io
, const char *o
, uint64_t handle
)
5181 tracepoint(librados
, rados_unwatch_enter
, io
, o
, handle
);
5182 uint64_t cookie
= handle
;
5183 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5184 int retval
= ctx
->unwatch(cookie
);
5185 tracepoint(librados
, rados_unwatch_exit
, retval
);
5189 extern "C" int rados_unwatch2(rados_ioctx_t io
, uint64_t handle
)
5191 tracepoint(librados
, rados_unwatch2_enter
, io
, handle
);
5192 uint64_t cookie
= handle
;
5193 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5194 int retval
= ctx
->unwatch(cookie
);
5195 tracepoint(librados
, rados_unwatch2_exit
, retval
);
5199 extern "C" int rados_aio_unwatch(rados_ioctx_t io
, uint64_t handle
,
5200 rados_completion_t completion
)
5202 tracepoint(librados
, rados_aio_unwatch_enter
, io
, handle
, completion
);
5203 uint64_t cookie
= handle
;
5204 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5205 librados::AioCompletionImpl
*c
=
5206 reinterpret_cast<librados::AioCompletionImpl
*>(completion
);
5207 int retval
= ctx
->aio_unwatch(cookie
, c
);
5208 tracepoint(librados
, rados_aio_unwatch_exit
, retval
);
5212 extern "C" int rados_watch_check(rados_ioctx_t io
, uint64_t handle
)
5214 tracepoint(librados
, rados_watch_check_enter
, io
, handle
);
5215 uint64_t cookie
= handle
;
5216 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5217 int retval
= ctx
->watch_check(cookie
);
5218 tracepoint(librados
, rados_watch_check_exit
, retval
);
5222 extern "C" int rados_notify(rados_ioctx_t io
, const char *o
,
5223 uint64_t ver
, const char *buf
, int buf_len
)
5225 tracepoint(librados
, rados_notify_enter
, io
, o
, ver
, buf
, buf_len
);
5226 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5230 bufferptr p
= buffer::create(buf_len
);
5231 memcpy(p
.c_str(), buf
, buf_len
);
5234 int retval
= ctx
->notify(oid
, bl
, 0, NULL
, NULL
, NULL
);
5235 tracepoint(librados
, rados_notify_exit
, retval
);
5239 extern "C" int rados_notify2(rados_ioctx_t io
, const char *o
,
5240 const char *buf
, int buf_len
,
5241 uint64_t timeout_ms
,
5242 char **reply_buffer
,
5243 size_t *reply_buffer_len
)
5245 tracepoint(librados
, rados_notify2_enter
, io
, o
, buf
, buf_len
, timeout_ms
);
5246 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5250 bufferptr p
= buffer::create(buf_len
);
5251 memcpy(p
.c_str(), buf
, buf_len
);
5254 int ret
= ctx
->notify(oid
, bl
, timeout_ms
, NULL
, reply_buffer
, reply_buffer_len
);
5255 tracepoint(librados
, rados_notify2_exit
, ret
);
5259 extern "C" int rados_aio_notify(rados_ioctx_t io
, const char *o
,
5260 rados_completion_t completion
,
5261 const char *buf
, int buf_len
,
5262 uint64_t timeout_ms
, char **reply_buffer
,
5263 size_t *reply_buffer_len
)
5265 tracepoint(librados
, rados_aio_notify_enter
, io
, o
, completion
, buf
, buf_len
,
5267 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5271 bl
.push_back(buffer::copy(buf
, buf_len
));
5273 librados::AioCompletionImpl
*c
=
5274 reinterpret_cast<librados::AioCompletionImpl
*>(completion
);
5275 int ret
= ctx
->aio_notify(oid
, c
, bl
, timeout_ms
, NULL
, reply_buffer
,
5277 tracepoint(librados
, rados_aio_notify_exit
, ret
);
5281 extern "C" int rados_notify_ack(rados_ioctx_t io
, const char *o
,
5282 uint64_t notify_id
, uint64_t handle
,
5283 const char *buf
, int buf_len
)
5285 tracepoint(librados
, rados_notify_ack_enter
, io
, o
, notify_id
, handle
, buf
, buf_len
);
5286 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5290 bufferptr p
= buffer::create(buf_len
);
5291 memcpy(p
.c_str(), buf
, buf_len
);
5294 ctx
->notify_ack(oid
, notify_id
, handle
, bl
);
5295 tracepoint(librados
, rados_notify_ack_exit
, 0);
5299 extern "C" int rados_watch_flush(rados_t cluster
)
5301 tracepoint(librados
, rados_watch_flush_enter
, cluster
);
5302 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
5303 int retval
= client
->watch_flush();
5304 tracepoint(librados
, rados_watch_flush_exit
, retval
);
5308 extern "C" int rados_aio_watch_flush(rados_t cluster
, rados_completion_t completion
)
5310 tracepoint(librados
, rados_aio_watch_flush_enter
, cluster
, completion
);
5311 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
5312 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
5313 int retval
= client
->async_watch_flush(c
);
5314 tracepoint(librados
, rados_aio_watch_flush_exit
, retval
);
5318 extern "C" int rados_set_alloc_hint(rados_ioctx_t io
, const char *o
,
5319 uint64_t expected_object_size
,
5320 uint64_t expected_write_size
)
5322 tracepoint(librados
, rados_set_alloc_hint_enter
, io
, o
, expected_object_size
, expected_write_size
);
5323 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5325 int retval
= ctx
->set_alloc_hint(oid
, expected_object_size
,
5326 expected_write_size
, 0);
5327 tracepoint(librados
, rados_set_alloc_hint_exit
, retval
);
5331 extern "C" int rados_set_alloc_hint2(rados_ioctx_t io
, const char *o
,
5332 uint64_t expected_object_size
,
5333 uint64_t expected_write_size
,
5336 tracepoint(librados
, rados_set_alloc_hint2_enter
, io
, o
, expected_object_size
, expected_write_size
, flags
);
5337 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5339 int retval
= ctx
->set_alloc_hint(oid
, expected_object_size
,
5340 expected_write_size
, flags
);
5341 tracepoint(librados
, rados_set_alloc_hint2_exit
, retval
);
5345 extern "C" int rados_lock_exclusive(rados_ioctx_t io
, const char * o
,
5346 const char * name
, const char * cookie
,
5347 const char * desc
, struct timeval
* duration
,
5350 tracepoint(librados
, rados_lock_exclusive_enter
, io
, o
, name
, cookie
, desc
, duration
, flags
);
5351 librados::IoCtx ctx
;
5352 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5354 int retval
= ctx
.lock_exclusive(o
, name
, cookie
, desc
, duration
, flags
);
5355 tracepoint(librados
, rados_lock_exclusive_exit
, retval
);
5359 extern "C" int rados_lock_shared(rados_ioctx_t io
, const char * o
,
5360 const char * name
, const char * cookie
,
5361 const char * tag
, const char * desc
,
5362 struct timeval
* duration
, uint8_t flags
)
5364 tracepoint(librados
, rados_lock_shared_enter
, io
, o
, name
, cookie
, tag
, desc
, duration
, flags
);
5365 librados::IoCtx ctx
;
5366 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5368 int retval
= ctx
.lock_shared(o
, name
, cookie
, tag
, desc
, duration
, flags
);
5369 tracepoint(librados
, rados_lock_shared_exit
, retval
);
5372 extern "C" int rados_unlock(rados_ioctx_t io
, const char *o
, const char *name
,
5375 tracepoint(librados
, rados_unlock_enter
, io
, o
, name
, cookie
);
5376 librados::IoCtx ctx
;
5377 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5379 int retval
= ctx
.unlock(o
, name
, cookie
);
5380 tracepoint(librados
, rados_unlock_exit
, retval
);
5384 extern "C" int rados_aio_unlock(rados_ioctx_t io
, const char *o
, const char *name
,
5385 const char *cookie
, rados_completion_t completion
)
5387 tracepoint(librados
, rados_aio_unlock_enter
, io
, o
, name
, cookie
, completion
);
5388 librados::IoCtx ctx
;
5389 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5390 librados::AioCompletionImpl
*comp
= (librados::AioCompletionImpl
*)completion
;
5391 librados::AioCompletion
c(comp
);
5392 int retval
= ctx
.aio_unlock(o
, name
, cookie
, &c
);
5393 tracepoint(librados
, rados_aio_unlock_exit
, retval
);
5397 extern "C" ssize_t
rados_list_lockers(rados_ioctx_t io
, const char *o
,
5398 const char *name
, int *exclusive
,
5399 char *tag
, size_t *tag_len
,
5400 char *clients
, size_t *clients_len
,
5401 char *cookies
, size_t *cookies_len
,
5402 char *addrs
, size_t *addrs_len
)
5404 tracepoint(librados
, rados_list_lockers_enter
, io
, o
, name
, *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
5405 librados::IoCtx ctx
;
5406 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5407 std::string name_str
= name
;
5408 std::string oid
= o
;
5409 std::string tag_str
;
5411 std::list
<librados::locker_t
> lockers
;
5412 int r
= ctx
.list_lockers(oid
, name_str
, &tmp_exclusive
, &tag_str
, &lockers
);
5414 tracepoint(librados
, rados_list_lockers_exit
, r
, *exclusive
, "", *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
5418 size_t clients_total
= 0;
5419 size_t cookies_total
= 0;
5420 size_t addrs_total
= 0;
5421 list
<librados::locker_t
>::const_iterator it
;
5422 for (it
= lockers
.begin(); it
!= lockers
.end(); ++it
) {
5423 clients_total
+= it
->client
.length() + 1;
5424 cookies_total
+= it
->cookie
.length() + 1;
5425 addrs_total
+= it
->address
.length() + 1;
5428 bool too_short
= ((clients_total
> *clients_len
) ||
5429 (cookies_total
> *cookies_len
) ||
5430 (addrs_total
> *addrs_len
) ||
5431 (tag_str
.length() + 1 > *tag_len
));
5432 *clients_len
= clients_total
;
5433 *cookies_len
= cookies_total
;
5434 *addrs_len
= addrs_total
;
5435 *tag_len
= tag_str
.length() + 1;
5437 tracepoint(librados
, rados_list_lockers_exit
, -ERANGE
, *exclusive
, "", *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
5441 strcpy(tag
, tag_str
.c_str());
5442 char *clients_p
= clients
;
5443 char *cookies_p
= cookies
;
5444 char *addrs_p
= addrs
;
5445 for (it
= lockers
.begin(); it
!= lockers
.end(); ++it
) {
5446 strcpy(clients_p
, it
->client
.c_str());
5447 strcpy(cookies_p
, it
->cookie
.c_str());
5448 strcpy(addrs_p
, it
->address
.c_str());
5449 tracepoint(librados
, rados_list_lockers_locker
, clients_p
, cookies_p
, addrs_p
);
5450 clients_p
+= it
->client
.length() + 1;
5451 cookies_p
+= it
->cookie
.length() + 1;
5452 addrs_p
+= it
->address
.length() + 1;
5459 int retval
= lockers
.size();
5460 tracepoint(librados
, rados_list_lockers_exit
, retval
, *exclusive
, tag
, *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
5464 extern "C" int rados_break_lock(rados_ioctx_t io
, const char *o
,
5465 const char *name
, const char *client
,
5468 tracepoint(librados
, rados_break_lock_enter
, io
, o
, name
, client
, cookie
);
5469 librados::IoCtx ctx
;
5470 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
5472 int retval
= ctx
.break_lock(o
, name
, client
, cookie
);
5473 tracepoint(librados
, rados_break_lock_exit
, retval
);
5477 extern "C" rados_write_op_t
rados_create_write_op()
5479 tracepoint(librados
, rados_create_write_op_enter
);
5480 rados_write_op_t retval
= new (std::nothrow
)::ObjectOperation
;
5481 tracepoint(librados
, rados_create_write_op_exit
, retval
);
5485 extern "C" void rados_release_write_op(rados_write_op_t write_op
)
5487 tracepoint(librados
, rados_release_write_op_enter
, write_op
);
5488 delete (::ObjectOperation
*)write_op
;
5489 tracepoint(librados
, rados_release_write_op_exit
);
5492 extern "C" void rados_write_op_set_flags(rados_write_op_t write_op
, int flags
)
5494 tracepoint(librados
, rados_write_op_set_flags_enter
, write_op
, flags
);
5495 set_op_flags((::ObjectOperation
*)write_op
, flags
);
5496 tracepoint(librados
, rados_write_op_set_flags_exit
);
5499 extern "C" void rados_write_op_assert_version(rados_write_op_t write_op
, uint64_t ver
)
5501 tracepoint(librados
, rados_write_op_assert_version_enter
, write_op
, ver
);
5502 ((::ObjectOperation
*)write_op
)->assert_version(ver
);
5503 tracepoint(librados
, rados_write_op_assert_version_exit
);
5506 extern "C" void rados_write_op_assert_exists(rados_write_op_t write_op
)
5508 tracepoint(librados
, rados_write_op_assert_exists_enter
, write_op
);
5509 ((::ObjectOperation
*)write_op
)->stat(NULL
, (ceph::real_time
*)NULL
, NULL
);
5510 tracepoint(librados
, rados_write_op_assert_exists_exit
);
5513 extern "C" void rados_write_op_cmpext(rados_write_op_t write_op
,
5514 const char *cmp_buf
,
5519 tracepoint(librados
, rados_write_op_cmpext_enter
, write_op
, cmp_buf
,
5520 cmp_len
, off
, prval
);
5521 ((::ObjectOperation
*)write_op
)->cmpext(off
, cmp_len
, cmp_buf
, prval
);
5522 tracepoint(librados
, rados_write_op_cmpext_exit
);
5525 extern "C" void rados_write_op_cmpxattr(rados_write_op_t write_op
,
5527 uint8_t comparison_operator
,
5531 tracepoint(librados
, rados_write_op_cmpxattr_enter
, write_op
, name
, comparison_operator
, value
, value_len
);
5533 bl
.append(value
, value_len
);
5534 ((::ObjectOperation
*)write_op
)->cmpxattr(name
,
5535 comparison_operator
,
5536 CEPH_OSD_CMPXATTR_MODE_STRING
,
5538 tracepoint(librados
, rados_write_op_cmpxattr_exit
);
5541 static void rados_c_omap_cmp(ObjectOperation
*op
,
5543 uint8_t comparison_operator
,
5549 bl
.append(val
, val_len
);
5550 std::map
<std::string
, pair
<bufferlist
, int> > assertions
;
5551 assertions
[key
] = std::make_pair(bl
, comparison_operator
);
5552 op
->omap_cmp(assertions
, prval
);
5555 extern "C" void rados_write_op_omap_cmp(rados_write_op_t write_op
,
5557 uint8_t comparison_operator
,
5562 tracepoint(librados
, rados_write_op_omap_cmp_enter
, write_op
, key
, comparison_operator
, val
, val_len
, prval
);
5563 rados_c_omap_cmp((::ObjectOperation
*)write_op
, key
, comparison_operator
,
5564 val
, val_len
, prval
);
5565 tracepoint(librados
, rados_write_op_omap_cmp_exit
);
5568 extern "C" void rados_write_op_setxattr(rados_write_op_t write_op
,
5573 tracepoint(librados
, rados_write_op_setxattr_enter
, write_op
, name
, value
, value_len
);
5575 bl
.append(value
, value_len
);
5576 ((::ObjectOperation
*)write_op
)->setxattr(name
, bl
);
5577 tracepoint(librados
, rados_write_op_setxattr_exit
);
5580 extern "C" void rados_write_op_rmxattr(rados_write_op_t write_op
,
5583 tracepoint(librados
, rados_write_op_rmxattr_enter
, write_op
, name
);
5584 ((::ObjectOperation
*)write_op
)->rmxattr(name
);
5585 tracepoint(librados
, rados_write_op_rmxattr_exit
);
5588 extern "C" void rados_write_op_create(rados_write_op_t write_op
,
5590 const char* category
) // unused
5592 tracepoint(librados
, rados_write_op_create_enter
, write_op
, exclusive
);
5593 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
5594 oo
->create(!!exclusive
);
5595 tracepoint(librados
, rados_write_op_create_exit
);
5598 extern "C" void rados_write_op_write(rados_write_op_t write_op
,
5603 tracepoint(librados
, rados_write_op_write_enter
, write_op
, buffer
, len
, offset
);
5605 bl
.append(buffer
,len
);
5606 ((::ObjectOperation
*)write_op
)->write(offset
, bl
);
5607 tracepoint(librados
, rados_write_op_write_exit
);
5610 extern "C" void rados_write_op_write_full(rados_write_op_t write_op
,
5614 tracepoint(librados
, rados_write_op_write_full_enter
, write_op
, buffer
, len
);
5616 bl
.append(buffer
,len
);
5617 ((::ObjectOperation
*)write_op
)->write_full(bl
);
5618 tracepoint(librados
, rados_write_op_write_full_exit
);
5621 extern "C" void rados_write_op_writesame(rados_write_op_t write_op
,
5627 tracepoint(librados
, rados_write_op_writesame_enter
, write_op
, buffer
, data_len
, write_len
, offset
);
5629 bl
.append(buffer
, data_len
);
5630 ((::ObjectOperation
*)write_op
)->writesame(offset
, write_len
, bl
);
5631 tracepoint(librados
, rados_write_op_writesame_exit
);
5634 extern "C" void rados_write_op_append(rados_write_op_t write_op
,
5638 tracepoint(librados
, rados_write_op_append_enter
, write_op
, buffer
, len
);
5640 bl
.append(buffer
,len
);
5641 ((::ObjectOperation
*)write_op
)->append(bl
);
5642 tracepoint(librados
, rados_write_op_append_exit
);
5645 extern "C" void rados_write_op_remove(rados_write_op_t write_op
)
5647 tracepoint(librados
, rados_write_op_remove_enter
, write_op
);
5648 ((::ObjectOperation
*)write_op
)->remove();
5649 tracepoint(librados
, rados_write_op_remove_exit
);
5652 extern "C" void rados_write_op_truncate(rados_write_op_t write_op
,
5655 tracepoint(librados
, rados_write_op_truncate_enter
, write_op
, offset
);
5656 ((::ObjectOperation
*)write_op
)->truncate(offset
);
5657 tracepoint(librados
, rados_write_op_truncate_exit
);
5660 extern "C" void rados_write_op_zero(rados_write_op_t write_op
,
5664 tracepoint(librados
, rados_write_op_zero_enter
, write_op
, offset
, len
);
5665 ((::ObjectOperation
*)write_op
)->zero(offset
, len
);
5666 tracepoint(librados
, rados_write_op_zero_exit
);
5669 extern "C" void rados_write_op_exec(rados_write_op_t write_op
,
5676 tracepoint(librados
, rados_write_op_exec_enter
, write_op
, cls
, method
, in_buf
, in_len
, prval
);
5678 inbl
.append(in_buf
, in_len
);
5679 ((::ObjectOperation
*)write_op
)->call(cls
, method
, inbl
, NULL
, NULL
, prval
);
5680 tracepoint(librados
, rados_write_op_exec_exit
);
5683 extern "C" void rados_write_op_omap_set(rados_write_op_t write_op
,
5684 char const* const* keys
,
5685 char const* const* vals
,
5689 tracepoint(librados
, rados_write_op_omap_set_enter
, write_op
, num
);
5690 std::map
<std::string
, bufferlist
> entries
;
5691 for (size_t i
= 0; i
< num
; ++i
) {
5692 tracepoint(librados
, rados_write_op_omap_set_entry
, keys
[i
], vals
[i
], lens
[i
]);
5693 bufferlist
bl(lens
[i
]);
5694 bl
.append(vals
[i
], lens
[i
]);
5695 entries
[keys
[i
]] = bl
;
5697 ((::ObjectOperation
*)write_op
)->omap_set(entries
);
5698 tracepoint(librados
, rados_write_op_omap_set_exit
);
5701 extern "C" void rados_write_op_omap_rm_keys(rados_write_op_t write_op
,
5702 char const* const* keys
,
5705 tracepoint(librados
, rados_write_op_omap_rm_keys_enter
, write_op
, keys_len
);
5706 for(size_t i
= 0; i
< keys_len
; i
++) {
5707 tracepoint(librados
, rados_write_op_omap_rm_keys_entry
, keys
[i
]);
5709 std::set
<std::string
> to_remove(keys
, keys
+ keys_len
);
5710 ((::ObjectOperation
*)write_op
)->omap_rm_keys(to_remove
);
5711 tracepoint(librados
, rados_write_op_omap_rm_keys_exit
);
5714 extern "C" void rados_write_op_omap_clear(rados_write_op_t write_op
)
5716 tracepoint(librados
, rados_write_op_omap_clear_enter
, write_op
);
5717 ((::ObjectOperation
*)write_op
)->omap_clear();
5718 tracepoint(librados
, rados_write_op_omap_clear_exit
);
5721 extern "C" void rados_write_op_set_alloc_hint(rados_write_op_t write_op
,
5722 uint64_t expected_object_size
,
5723 uint64_t expected_write_size
)
5725 tracepoint(librados
, rados_write_op_set_alloc_hint_enter
, write_op
, expected_object_size
, expected_write_size
);
5726 ((::ObjectOperation
*)write_op
)->set_alloc_hint(expected_object_size
,
5727 expected_write_size
, 0);
5728 tracepoint(librados
, rados_write_op_set_alloc_hint_exit
);
5731 extern "C" void rados_write_op_set_alloc_hint2(rados_write_op_t write_op
,
5732 uint64_t expected_object_size
,
5733 uint64_t expected_write_size
,
5736 tracepoint(librados
, rados_write_op_set_alloc_hint2_enter
, write_op
, expected_object_size
, expected_write_size
, flags
);
5737 ((::ObjectOperation
*)write_op
)->set_alloc_hint(expected_object_size
,
5738 expected_write_size
,
5740 tracepoint(librados
, rados_write_op_set_alloc_hint2_exit
);
5743 extern "C" int rados_write_op_operate(rados_write_op_t write_op
,
5749 tracepoint(librados
, rados_write_op_operate_enter
, write_op
, io
, oid
, mtime
, flags
);
5751 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
5752 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5754 ceph::real_time
*prt
= NULL
;
5758 rt
= ceph::real_clock::from_time_t(*mtime
);
5762 int retval
= ctx
->operate(obj
, oo
, prt
, translate_flags(flags
));
5763 tracepoint(librados
, rados_write_op_operate_exit
, retval
);
5767 extern "C" int rados_write_op_operate2(rados_write_op_t write_op
,
5770 struct timespec
*ts
,
5773 tracepoint(librados
, rados_write_op_operate2_enter
, write_op
, io
, oid
, ts
, flags
);
5775 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
5776 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5778 ceph::real_time
*prt
= NULL
;
5782 rt
= ceph::real_clock::from_timespec(*ts
);
5786 int retval
= ctx
->operate(obj
, oo
, prt
, translate_flags(flags
));
5787 tracepoint(librados
, rados_write_op_operate_exit
, retval
);
5791 extern "C" int rados_aio_write_op_operate(rados_write_op_t write_op
,
5793 rados_completion_t completion
,
5798 tracepoint(librados
, rados_aio_write_op_operate_enter
, write_op
, io
, completion
, oid
, mtime
, flags
);
5800 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
5801 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
5802 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
5803 int retval
= ctx
->aio_operate(obj
, oo
, c
, ctx
->snapc
, translate_flags(flags
));
5804 tracepoint(librados
, rados_aio_write_op_operate_exit
, retval
);
5808 extern "C" rados_read_op_t
rados_create_read_op()
5810 tracepoint(librados
, rados_create_read_op_enter
);
5811 rados_read_op_t retval
= new (std::nothrow
)::ObjectOperation
;
5812 tracepoint(librados
, rados_create_read_op_exit
, retval
);
5816 extern "C" void rados_release_read_op(rados_read_op_t read_op
)
5818 tracepoint(librados
, rados_release_read_op_enter
, read_op
);
5819 delete (::ObjectOperation
*)read_op
;
5820 tracepoint(librados
, rados_release_read_op_exit
);
5823 extern "C" void rados_read_op_set_flags(rados_read_op_t read_op
, int flags
)
5825 tracepoint(librados
, rados_read_op_set_flags_enter
, read_op
, flags
);
5826 set_op_flags((::ObjectOperation
*)read_op
, flags
);
5827 tracepoint(librados
, rados_read_op_set_flags_exit
);
5830 extern "C" void rados_read_op_assert_version(rados_read_op_t read_op
, uint64_t ver
)
5832 tracepoint(librados
, rados_read_op_assert_version_enter
, read_op
, ver
);
5833 ((::ObjectOperation
*)read_op
)->assert_version(ver
);
5834 tracepoint(librados
, rados_read_op_assert_version_exit
);
5837 extern "C" void rados_read_op_assert_exists(rados_read_op_t read_op
)
5839 tracepoint(librados
, rados_read_op_assert_exists_enter
, read_op
);
5840 ((::ObjectOperation
*)read_op
)->stat(NULL
, (ceph::real_time
*)NULL
, NULL
);
5841 tracepoint(librados
, rados_read_op_assert_exists_exit
);
5844 extern "C" void rados_read_op_cmpext(rados_read_op_t read_op
,
5845 const char *cmp_buf
,
5850 tracepoint(librados
, rados_read_op_cmpext_enter
, read_op
, cmp_buf
,
5851 cmp_len
, off
, prval
);
5852 ((::ObjectOperation
*)read_op
)->cmpext(off
, cmp_len
, cmp_buf
, prval
);
5853 tracepoint(librados
, rados_read_op_cmpext_exit
);
5856 extern "C" void rados_read_op_cmpxattr(rados_read_op_t read_op
,
5858 uint8_t comparison_operator
,
5862 tracepoint(librados
, rados_read_op_cmpxattr_enter
, read_op
, name
, comparison_operator
, value
, value_len
);
5864 bl
.append(value
, value_len
);
5865 ((::ObjectOperation
*)read_op
)->cmpxattr(name
,
5866 comparison_operator
,
5867 CEPH_OSD_CMPXATTR_MODE_STRING
,
5869 tracepoint(librados
, rados_read_op_cmpxattr_exit
);
5872 extern "C" void rados_read_op_omap_cmp(rados_read_op_t read_op
,
5874 uint8_t comparison_operator
,
5879 tracepoint(librados
, rados_read_op_omap_cmp_enter
, read_op
, key
, comparison_operator
, val
, val_len
, prval
);
5880 rados_c_omap_cmp((::ObjectOperation
*)read_op
, key
, comparison_operator
,
5881 val
, val_len
, prval
);
5882 tracepoint(librados
, rados_read_op_omap_cmp_exit
);
5885 extern "C" void rados_read_op_stat(rados_read_op_t read_op
,
5890 tracepoint(librados
, rados_read_op_stat_enter
, read_op
, psize
, pmtime
, prval
);
5891 ((::ObjectOperation
*)read_op
)->stat(psize
, pmtime
, prval
);
5892 tracepoint(librados
, rados_read_op_stat_exit
);
5895 class C_bl_to_buf
: public Context
{
5902 C_bl_to_buf(char *out_buf
,
5905 int *prval
) : out_buf(out_buf
), out_len(out_len
),
5906 bytes_read(bytes_read
), prval(prval
) {}
5907 void finish(int r
) override
{
5908 if (out_bl
.length() > out_len
) {
5916 *bytes_read
= out_bl
.length();
5917 if (out_buf
&& !out_bl
.is_provided_buffer(out_buf
))
5918 out_bl
.copy(0, out_bl
.length(), out_buf
);
5922 extern "C" void rados_read_op_read(rados_read_op_t read_op
,
5929 tracepoint(librados
, rados_read_op_read_enter
, read_op
, offset
, len
, buf
, bytes_read
, prval
);
5930 C_bl_to_buf
*ctx
= new C_bl_to_buf(buf
, len
, bytes_read
, prval
);
5931 ctx
->out_bl
.push_back(buffer::create_static(len
, buf
));
5932 ((::ObjectOperation
*)read_op
)->read(offset
, len
, &ctx
->out_bl
, prval
, ctx
);
5933 tracepoint(librados
, rados_read_op_read_exit
);
5936 extern "C" void rados_read_op_checksum(rados_read_op_t read_op
,
5937 rados_checksum_type_t type
,
5938 const char *init_value
,
5939 size_t init_value_len
,
5940 uint64_t offset
, size_t len
,
5941 size_t chunk_size
, char *pchecksum
,
5942 size_t checksum_len
, int *prval
)
5944 tracepoint(librados
, rados_read_op_checksum_enter
, read_op
, type
, init_value
,
5945 init_value_len
, offset
, len
, chunk_size
);
5946 bufferlist init_value_bl
;
5947 init_value_bl
.append(init_value
, init_value_len
);
5949 C_bl_to_buf
*ctx
= nullptr;
5950 if (pchecksum
!= nullptr) {
5951 ctx
= new C_bl_to_buf(pchecksum
, checksum_len
, nullptr, prval
);
5953 ((::ObjectOperation
*)read_op
)->checksum(get_checksum_op_type(type
),
5954 init_value_bl
, offset
, len
,
5956 (ctx
? &ctx
->out_bl
: nullptr),
5958 tracepoint(librados
, rados_read_op_checksum_exit
);
5961 class C_out_buffer
: public Context
{
5966 C_out_buffer(char **out_buf
, size_t *out_len
) : out_buf(out_buf
),
5968 void finish(int r
) override
{
5969 // ignore r since we don't know the meaning of return values
5970 // from custom class methods
5971 do_out_buffer(out_bl
, out_buf
, out_len
);
5975 extern "C" void rados_read_op_exec(rados_read_op_t read_op
,
5984 tracepoint(librados
, rados_read_op_exec_enter
, read_op
, cls
, method
, in_buf
, in_len
, out_buf
, out_len
, prval
);
5986 inbl
.append(in_buf
, in_len
);
5987 C_out_buffer
*ctx
= new C_out_buffer(out_buf
, out_len
);
5988 ((::ObjectOperation
*)read_op
)->call(cls
, method
, inbl
, &ctx
->out_bl
, ctx
,
5990 tracepoint(librados
, rados_read_op_exec_exit
);
5993 extern "C" void rados_read_op_exec_user_buf(rados_read_op_t read_op
,
6003 tracepoint(librados
, rados_read_op_exec_user_buf_enter
, read_op
, cls
, method
, in_buf
, in_len
, out_buf
, out_len
, used_len
, prval
);
6004 C_bl_to_buf
*ctx
= new C_bl_to_buf(out_buf
, out_len
, used_len
, prval
);
6006 inbl
.append(in_buf
, in_len
);
6007 ((::ObjectOperation
*)read_op
)->call(cls
, method
, inbl
, &ctx
->out_bl
, ctx
,
6009 tracepoint(librados
, rados_read_op_exec_user_buf_exit
);
6012 struct RadosOmapIter
{
6013 std::map
<std::string
, bufferlist
> values
;
6014 std::map
<std::string
, bufferlist
>::iterator i
;
6017 class C_OmapIter
: public Context
{
6018 RadosOmapIter
*iter
;
6020 explicit C_OmapIter(RadosOmapIter
*iter
) : iter(iter
) {}
6021 void finish(int r
) override
{
6022 iter
->i
= iter
->values
.begin();
6026 class C_XattrsIter
: public Context
{
6027 librados::RadosXattrsIter
*iter
;
6029 explicit C_XattrsIter(librados::RadosXattrsIter
*iter
) : iter(iter
) {}
6030 void finish(int r
) override
{
6031 iter
->i
= iter
->attrset
.begin();
6035 extern "C" void rados_read_op_getxattrs(rados_read_op_t read_op
,
6036 rados_xattrs_iter_t
*iter
,
6039 tracepoint(librados
, rados_read_op_getxattrs_enter
, read_op
, prval
);
6040 librados::RadosXattrsIter
*xattrs_iter
= new librados::RadosXattrsIter
;
6041 ((::ObjectOperation
*)read_op
)->getxattrs(&xattrs_iter
->attrset
, prval
);
6042 ((::ObjectOperation
*)read_op
)->add_handler(new C_XattrsIter(xattrs_iter
));
6043 *iter
= xattrs_iter
;
6044 tracepoint(librados
, rados_read_op_getxattrs_exit
, *iter
);
6047 extern "C" void rados_read_op_omap_get_vals(rados_read_op_t read_op
,
6048 const char *start_after
,
6049 const char *filter_prefix
,
6050 uint64_t max_return
,
6051 rados_omap_iter_t
*iter
,
6054 tracepoint(librados
, rados_read_op_omap_get_vals_enter
, read_op
, start_after
, filter_prefix
, max_return
, prval
);
6055 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
6056 const char *start
= start_after
? start_after
: "";
6057 const char *filter
= filter_prefix
? filter_prefix
: "";
6058 ((::ObjectOperation
*)read_op
)->omap_get_vals(
6065 ((::ObjectOperation
*)read_op
)->add_handler(new C_OmapIter(omap_iter
));
6067 tracepoint(librados
, rados_read_op_omap_get_vals_exit
, *iter
);
6070 extern "C" void rados_read_op_omap_get_vals2(rados_read_op_t read_op
,
6071 const char *start_after
,
6072 const char *filter_prefix
,
6073 uint64_t max_return
,
6074 rados_omap_iter_t
*iter
,
6075 unsigned char *pmore
,
6078 tracepoint(librados
, rados_read_op_omap_get_vals_enter
, read_op
, start_after
, filter_prefix
, max_return
, prval
);
6079 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
6080 const char *start
= start_after
? start_after
: "";
6081 const char *filter
= filter_prefix
? filter_prefix
: "";
6082 ((::ObjectOperation
*)read_op
)->omap_get_vals(
6089 ((::ObjectOperation
*)read_op
)->add_handler(new C_OmapIter(omap_iter
));
6091 tracepoint(librados
, rados_read_op_omap_get_vals_exit
, *iter
);
6094 struct C_OmapKeysIter
: public Context
{
6095 RadosOmapIter
*iter
;
6096 std::set
<std::string
> keys
;
6097 explicit C_OmapKeysIter(RadosOmapIter
*iter
) : iter(iter
) {}
6098 void finish(int r
) override
{
6099 // map each key to an empty bl
6100 for (std::set
<std::string
>::const_iterator i
= keys
.begin();
6101 i
!= keys
.end(); ++i
) {
6104 iter
->i
= iter
->values
.begin();
6108 extern "C" void rados_read_op_omap_get_keys(rados_read_op_t read_op
,
6109 const char *start_after
,
6110 uint64_t max_return
,
6111 rados_omap_iter_t
*iter
,
6114 tracepoint(librados
, rados_read_op_omap_get_keys_enter
, read_op
, start_after
, max_return
, prval
);
6115 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
6116 C_OmapKeysIter
*ctx
= new C_OmapKeysIter(omap_iter
);
6117 ((::ObjectOperation
*)read_op
)->omap_get_keys(
6118 start_after
? start_after
: "",
6119 max_return
, &ctx
->keys
, nullptr, prval
);
6120 ((::ObjectOperation
*)read_op
)->add_handler(ctx
);
6122 tracepoint(librados
, rados_read_op_omap_get_keys_exit
, *iter
);
6125 extern "C" void rados_read_op_omap_get_keys2(rados_read_op_t read_op
,
6126 const char *start_after
,
6127 uint64_t max_return
,
6128 rados_omap_iter_t
*iter
,
6129 unsigned char *pmore
,
6132 tracepoint(librados
, rados_read_op_omap_get_keys_enter
, read_op
, start_after
, max_return
, prval
);
6133 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
6134 C_OmapKeysIter
*ctx
= new C_OmapKeysIter(omap_iter
);
6135 ((::ObjectOperation
*)read_op
)->omap_get_keys(
6136 start_after
? start_after
: "",
6137 max_return
, &ctx
->keys
,
6138 (bool*)pmore
, prval
);
6139 ((::ObjectOperation
*)read_op
)->add_handler(ctx
);
6141 tracepoint(librados
, rados_read_op_omap_get_keys_exit
, *iter
);
6144 extern "C" void rados_read_op_omap_get_vals_by_keys(rados_read_op_t read_op
,
6145 char const* const* keys
,
6147 rados_omap_iter_t
*iter
,
6150 tracepoint(librados
, rados_read_op_omap_get_vals_by_keys_enter
, read_op
, keys
, keys_len
, iter
, prval
);
6151 std::set
<std::string
> to_get(keys
, keys
+ keys_len
);
6153 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
6154 ((::ObjectOperation
*)read_op
)->omap_get_vals_by_keys(to_get
,
6157 ((::ObjectOperation
*)read_op
)->add_handler(new C_OmapIter(omap_iter
));
6159 tracepoint(librados
, rados_read_op_omap_get_vals_by_keys_exit
, *iter
);
6162 extern "C" int rados_omap_get_next(rados_omap_iter_t iter
,
6167 tracepoint(librados
, rados_omap_get_next_enter
, iter
);
6168 RadosOmapIter
*it
= static_cast<RadosOmapIter
*>(iter
);
6169 if (it
->i
== it
->values
.end()) {
6173 tracepoint(librados
, rados_omap_get_next_exit
, 0, key
, val
, len
);
6177 *key
= (char*)it
->i
->first
.c_str();
6179 *val
= it
->i
->second
.c_str();
6181 *len
= it
->i
->second
.length();
6183 tracepoint(librados
, rados_omap_get_next_exit
, 0, key
, val
, len
);
6187 extern "C" void rados_omap_get_end(rados_omap_iter_t iter
)
6189 tracepoint(librados
, rados_omap_get_end_enter
, iter
);
6190 RadosOmapIter
*it
= static_cast<RadosOmapIter
*>(iter
);
6192 tracepoint(librados
, rados_omap_get_end_exit
);
6195 extern "C" int rados_read_op_operate(rados_read_op_t read_op
,
6200 tracepoint(librados
, rados_read_op_operate_enter
, read_op
, io
, oid
, flags
);
6202 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
6203 int retval
= ctx
->operate_read(obj
, (::ObjectOperation
*)read_op
, NULL
,
6204 translate_flags(flags
));
6205 tracepoint(librados
, rados_read_op_operate_exit
, retval
);
6209 extern "C" int rados_aio_read_op_operate(rados_read_op_t read_op
,
6211 rados_completion_t completion
,
6215 tracepoint(librados
, rados_aio_read_op_operate_enter
, read_op
, io
, completion
, oid
, flags
);
6217 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
6218 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
6219 int retval
= ctx
->aio_operate_read(obj
, (::ObjectOperation
*)read_op
,
6220 c
, translate_flags(flags
), NULL
);
6221 tracepoint(librados
, rados_aio_read_op_operate_exit
, retval
);
6225 extern "C" int rados_cache_pin(rados_ioctx_t io
, const char *o
)
6227 tracepoint(librados
, rados_cache_pin_enter
, io
, o
);
6228 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
6230 int retval
= ctx
->cache_pin(oid
);
6231 tracepoint(librados
, rados_cache_pin_exit
, retval
);
6235 extern "C" int rados_cache_unpin(rados_ioctx_t io
, const char *o
)
6237 tracepoint(librados
, rados_cache_unpin_enter
, io
, o
);
6238 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
6240 int retval
= ctx
->cache_unpin(oid
);
6241 tracepoint(librados
, rados_cache_unpin_exit
, retval
);
6246 ///////////////////////////// ListObject //////////////////////////////
6247 librados::ListObject::ListObject() : impl(NULL
)
6251 librados::ListObject::ListObject(librados::ListObjectImpl
*i
): impl(i
)
6255 librados::ListObject::ListObject(const ListObject
& rhs
)
6257 if (rhs
.impl
== NULL
) {
6261 impl
= new ListObjectImpl();
6262 *impl
= *(rhs
.impl
);
6265 librados::ListObject
& librados::ListObject::operator=(const ListObject
& rhs
)
6267 if (rhs
.impl
== NULL
) {
6273 impl
= new ListObjectImpl();
6274 *impl
= *(rhs
.impl
);
6278 librados::ListObject::~ListObject()
6285 const std::string
& librados::ListObject::get_nspace() const
6287 return impl
->get_nspace();
6290 const std::string
& librados::ListObject::get_oid() const
6292 return impl
->get_oid();
6295 const std::string
& librados::ListObject::get_locator() const
6297 return impl
->get_locator();
6300 std::ostream
& librados::operator<<(std::ostream
& out
, const librados::ListObject
& lop
)
6306 CEPH_RADOS_API
void rados_object_list_slice(
6308 const rados_object_list_cursor start
,
6309 const rados_object_list_cursor finish
,
6312 rados_object_list_cursor
*split_start
,
6313 rados_object_list_cursor
*split_finish
)
6315 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
6317 assert(split_start
);
6318 assert(split_finish
);
6319 hobject_t
*split_start_hobj
= (hobject_t
*)(*split_start
);
6320 hobject_t
*split_finish_hobj
= (hobject_t
*)(*split_finish
);
6321 assert(split_start_hobj
);
6322 assert(split_finish_hobj
);
6323 hobject_t
*start_hobj
= (hobject_t
*)(start
);
6324 hobject_t
*finish_hobj
= (hobject_t
*)(finish
);
6326 ctx
->object_list_slice(
6335 librados::ObjectCursor::ObjectCursor()
6337 c_cursor
= (rados_object_list_cursor
)new hobject_t();
6340 librados::ObjectCursor::~ObjectCursor()
6342 hobject_t
*h
= (hobject_t
*)c_cursor
;
6346 librados::ObjectCursor::ObjectCursor(rados_object_list_cursor c
)
6351 c_cursor
= (rados_object_list_cursor
)new hobject_t(*(hobject_t
*)c
);
6355 librados::ObjectCursor
& librados::ObjectCursor::operator=(const librados::ObjectCursor
& rhs
)
6357 if (rhs
.c_cursor
!= nullptr) {
6358 hobject_t
*h
= (hobject_t
*)rhs
.c_cursor
;
6359 c_cursor
= (rados_object_list_cursor
)(new hobject_t(*h
));
6366 bool librados::ObjectCursor::operator<(const librados::ObjectCursor
&rhs
) const
6368 const hobject_t lhs_hobj
= (c_cursor
== nullptr) ? hobject_t() : *((hobject_t
*)c_cursor
);
6369 const hobject_t rhs_hobj
= (rhs
.c_cursor
== nullptr) ? hobject_t() : *((hobject_t
*)(rhs
.c_cursor
));
6370 return lhs_hobj
< rhs_hobj
;
6373 bool librados::ObjectCursor::operator==(const librados::ObjectCursor
&rhs
) const
6375 const hobject_t lhs_hobj
= (c_cursor
== nullptr) ? hobject_t() : *((hobject_t
*)c_cursor
);
6376 const hobject_t rhs_hobj
= (rhs
.c_cursor
== nullptr) ? hobject_t() : *((hobject_t
*)(rhs
.c_cursor
));
6377 return cmp(lhs_hobj
, rhs_hobj
) == 0;
6379 librados::ObjectCursor::ObjectCursor(const librados::ObjectCursor
&rhs
)
6384 librados::ObjectCursor
librados::IoCtx::object_list_begin()
6386 hobject_t
*h
= new hobject_t(io_ctx_impl
->objecter
->enumerate_objects_begin());
6388 oc
.set((rados_object_list_cursor
)h
);
6393 librados::ObjectCursor
librados::IoCtx::object_list_end()
6395 hobject_t
*h
= new hobject_t(io_ctx_impl
->objecter
->enumerate_objects_end());
6396 librados::ObjectCursor oc
;
6397 oc
.set((rados_object_list_cursor
)h
);
6402 void librados::ObjectCursor::set(rados_object_list_cursor c
)
6404 delete (hobject_t
*)c_cursor
;
6408 string
librados::ObjectCursor::to_str() const
6411 ss
<< *(hobject_t
*)c_cursor
;
6415 bool librados::ObjectCursor::from_str(const string
& s
)
6418 *(hobject_t
*)c_cursor
= hobject_t();
6421 return ((hobject_t
*)c_cursor
)->parse(s
);
6424 CEPH_RADOS_API
std::ostream
& librados::operator<<(std::ostream
& os
, const librados::ObjectCursor
& oc
)
6427 os
<< *(hobject_t
*)oc
.c_cursor
;
6434 bool librados::IoCtx::object_list_is_end(const ObjectCursor
&oc
)
6436 hobject_t
*h
= (hobject_t
*)oc
.c_cursor
;
6440 int librados::IoCtx::object_list(const ObjectCursor
&start
,
6441 const ObjectCursor
&finish
,
6442 const size_t result_item_count
,
6443 const bufferlist
&filter
,
6444 std::vector
<ObjectItem
> *result
,
6447 assert(result
!= nullptr);
6448 assert(next
!= nullptr);
6452 hobject_t next_hash
;
6453 std::list
<librados::ListObjectImpl
> obj_result
;
6454 io_ctx_impl
->objecter
->enumerate_objects(
6455 io_ctx_impl
->poolid
,
6456 io_ctx_impl
->oloc
.nspace
,
6457 *((hobject_t
*)start
.c_cursor
),
6458 *((hobject_t
*)finish
.c_cursor
),
6465 int r
= cond
.wait();
6467 next
->set((rados_object_list_cursor
)(new hobject_t(hobject_t::get_max())));
6471 next
->set((rados_object_list_cursor
)(new hobject_t(next_hash
)));
6473 for (std::list
<librados::ListObjectImpl
>::iterator i
= obj_result
.begin();
6474 i
!= obj_result
.end(); ++i
) {
6477 oi
.nspace
= i
->nspace
;
6478 oi
.locator
= i
->locator
;
6479 result
->push_back(oi
);
6482 return obj_result
.size();
6485 void librados::IoCtx::object_list_slice(
6486 const ObjectCursor start
,
6487 const ObjectCursor finish
,
6490 ObjectCursor
*split_start
,
6491 ObjectCursor
*split_finish
)
6493 assert(split_start
!= nullptr);
6494 assert(split_finish
!= nullptr);
6496 io_ctx_impl
->object_list_slice(
6497 *((hobject_t
*)(start
.c_cursor
)),
6498 *((hobject_t
*)(finish
.c_cursor
)),
6501 (hobject_t
*)(split_start
->c_cursor
),
6502 (hobject_t
*)(split_finish
->c_cursor
));
6505 int librados::IoCtx::application_enable(const std::string
& app_name
,
6508 return io_ctx_impl
->application_enable(app_name
, force
);
6511 int librados::IoCtx::application_enable_async(const std::string
& app_name
,
6513 PoolAsyncCompletion
*c
)
6515 io_ctx_impl
->application_enable_async(app_name
, force
, c
->pc
);
6519 int librados::IoCtx::application_list(std::set
<std::string
> *app_names
)
6521 return io_ctx_impl
->application_list(app_names
);
6524 int librados::IoCtx::application_metadata_get(const std::string
& app_name
,
6525 const std::string
&key
,
6528 return io_ctx_impl
->application_metadata_get(app_name
, key
, value
);
6531 int librados::IoCtx::application_metadata_set(const std::string
& app_name
,
6532 const std::string
&key
,
6533 const std::string
& value
)
6535 return io_ctx_impl
->application_metadata_set(app_name
, key
, value
);
6538 int librados::IoCtx::application_metadata_remove(const std::string
& app_name
,
6539 const std::string
&key
)
6541 return io_ctx_impl
->application_metadata_remove(app_name
, key
);
6544 int librados::IoCtx::application_metadata_list(const std::string
& app_name
,
6545 std::map
<std::string
, std::string
> *values
)
6547 return io_ctx_impl
->application_metadata_list(app_name
, values
);