1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
7 #include "common/config.h"
8 #include "common/errno.h"
9 #include "common/ceph_argparse.h"
10 #include "common/ceph_json.h"
11 #include "common/common_init.h"
12 #include "common/TracepointProvider.h"
13 #include "common/hobject.h"
14 #include "common/async/waiter.h"
15 #include "include/rados/librados.h"
16 #include "include/types.h"
17 #include <include/stringify.h>
19 #include "librados/librados_c.h"
20 #include "librados/AioCompletionImpl.h"
21 #include "librados/IoCtxImpl.h"
22 #include "librados/PoolAsyncCompletionImpl.h"
23 #include "librados/RadosClient.h"
24 #include "librados/RadosXattrIter.h"
25 #include "librados/ListObjectImpl.h"
26 #include "librados/librados_util.h"
27 #include <cls/lock/cls_lock_client.h>
37 #define TRACEPOINT_DEFINE
38 #define TRACEPOINT_PROBE_DYNAMIC_LINKAGE
39 #include "tracing/librados.h"
40 #undef TRACEPOINT_PROBE_DYNAMIC_LINKAGE
41 #undef TRACEPOINT_DEFINE
43 #define tracepoint(...)
46 #if defined(HAVE_ASM_SYMVER) || defined(HAVE_ATTR_SYMVER)
47 // prefer __attribute__() over global asm(".symver"). because the latter
48 // is not parsed by the compiler and is partitioned away by GCC if
49 // lto-partitions is enabled, in other words, these asm() statements
50 // are dropped by the -flto option by default. the way to address it is
51 // to use __attribute__. so this information can be processed by the
52 // C compiler, and be preserved after LTO partitions the code
53 #ifdef HAVE_ATTR_SYMVER
54 #define LIBRADOS_C_API_BASE(fn) \
55 extern __typeof (_##fn##_base) _##fn##_base __attribute__((__symver__ (#fn "@")))
56 #define LIBRADOS_C_API_BASE_DEFAULT(fn) \
57 extern __typeof (_##fn) _##fn __attribute__((__symver__ (#fn "@@")))
58 #define LIBRADOS_C_API_DEFAULT(fn, ver) \
59 extern __typeof (_##fn) _##fn __attribute__((__symver__ (#fn "@@LIBRADOS_" #ver)))
61 #define LIBRADOS_C_API_BASE(fn) \
62 asm(".symver _" #fn "_base, " #fn "@")
63 #define LIBRADOS_C_API_BASE_DEFAULT(fn) \
64 asm(".symver _" #fn ", " #fn "@@")
65 #define LIBRADOS_C_API_DEFAULT(fn, ver) \
66 asm(".symver _" #fn ", " #fn "@@LIBRADOS_" #ver)
69 #define LIBRADOS_C_API_BASE_F(fn) _ ## fn ## _base
70 #define LIBRADOS_C_API_DEFAULT_F(fn) _ ## fn
73 #define LIBRADOS_C_API_BASE(fn)
74 #define LIBRADOS_C_API_BASE_DEFAULT(fn)
75 #define LIBRADOS_C_API_DEFAULT(fn, ver)
77 #define LIBRADOS_C_API_BASE_F(fn) _ ## fn ## _base
78 // There shouldn't be multiple default versions of the same
80 #define LIBRADOS_C_API_DEFAULT_F(fn) fn
83 using std::ostringstream
;
91 #define dout_subsys ceph_subsys_rados
93 #define dout_prefix *_dout << "librados: "
95 #define RADOS_LIST_MAX_ENTRIES 1024
97 static TracepointProvider::Traits
tracepoint_traits("librados_tp.so", "rados_tracing");
100 * Structure of this file
102 * RadosClient and the related classes are the internal implementation of librados.
103 * Above that layer sits the C API, found in include/rados/librados.h, and
104 * the C++ API, found in include/rados/librados.hpp
106 * The C++ API sometimes implements things in terms of the C API.
107 * Both the C++ and C API rely on RadosClient.
110 * +--------------------------------------+
112 * +--------------------+ |
114 * +--------------------+-----------------+
116 * +--------------------------------------+
119 ///////////////////////////// C API //////////////////////////////
121 static CephContext
*rados_create_cct(
122 const char * const clustername
,
123 CephInitParameters
*iparams
)
125 // missing things compared to global_init:
126 // g_ceph_context, g_conf, g_lockdep, signal handlers
127 CephContext
*cct
= common_preinit(*iparams
, CODE_ENVIRONMENT_LIBRARY
, 0);
129 cct
->_conf
->cluster
= clustername
;
130 cct
->_conf
.parse_env(cct
->get_module_type()); // environment variables override
131 cct
->_conf
.apply_changes(nullptr);
133 TracepointProvider::initialize
<tracepoint_traits
>(cct
);
137 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_create
)(
139 const char * const id
)
141 CephInitParameters
iparams(CEPH_ENTITY_TYPE_CLIENT
);
143 iparams
.name
.set(CEPH_ENTITY_TYPE_CLIENT
, id
);
145 CephContext
*cct
= rados_create_cct("", &iparams
);
147 tracepoint(librados
, rados_create_enter
, id
);
148 *pcluster
= reinterpret_cast<rados_t
>(new librados::RadosClient(cct
));
149 tracepoint(librados
, rados_create_exit
, 0, *pcluster
);
154 LIBRADOS_C_API_BASE_DEFAULT(rados_create
);
157 // 1) don't assume 'client.'; name is a full type.id namestr
158 // 2) allow setting clustername
159 // 3) flags is for future expansion (maybe some of the global_init()
160 // behavior is appropriate for some consumers of librados, for instance)
162 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_create2
)(
164 const char *const clustername
,
165 const char * const name
,
168 // client is assumed, but from_str will override
170 CephInitParameters
iparams(CEPH_ENTITY_TYPE_CLIENT
);
171 if (!name
|| !iparams
.name
.from_str(name
)) {
175 CephContext
*cct
= rados_create_cct(clustername
, &iparams
);
176 tracepoint(librados
, rados_create2_enter
, clustername
, name
, flags
);
178 *pcluster
= reinterpret_cast<rados_t
>(new librados::RadosClient(cct
));
180 tracepoint(librados
, rados_create2_exit
, retval
, *pcluster
);
185 LIBRADOS_C_API_BASE_DEFAULT(rados_create2
);
187 /* This function is intended for use by Ceph daemons. These daemons have
188 * already called global_init and want to use that particular configuration for
191 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_create_with_context
)(
195 CephContext
*cct
= (CephContext
*)cct_
;
196 TracepointProvider::initialize
<tracepoint_traits
>(cct
);
198 tracepoint(librados
, rados_create_with_context_enter
, cct_
);
199 librados::RadosClient
*radosp
= new librados::RadosClient(cct
);
200 *pcluster
= (void *)radosp
;
201 tracepoint(librados
, rados_create_with_context_exit
, 0, *pcluster
);
204 LIBRADOS_C_API_BASE_DEFAULT(rados_create_with_context
);
206 extern "C" rados_config_t
LIBRADOS_C_API_DEFAULT_F(rados_cct
)(rados_t cluster
)
208 tracepoint(librados
, rados_cct_enter
, cluster
);
209 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
210 rados_config_t retval
= (rados_config_t
)client
->cct
;
211 tracepoint(librados
, rados_cct_exit
, retval
);
214 LIBRADOS_C_API_BASE_DEFAULT(rados_cct
);
216 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_connect
)(rados_t cluster
)
218 tracepoint(librados
, rados_connect_enter
, cluster
);
219 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
220 int retval
= client
->connect();
221 tracepoint(librados
, rados_connect_exit
, retval
);
224 LIBRADOS_C_API_BASE_DEFAULT(rados_connect
);
226 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_shutdown
)(rados_t cluster
)
228 tracepoint(librados
, rados_shutdown_enter
, cluster
);
229 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
232 tracepoint(librados
, rados_shutdown_exit
);
234 LIBRADOS_C_API_BASE_DEFAULT(rados_shutdown
);
236 extern "C" uint64_t LIBRADOS_C_API_DEFAULT_F(rados_get_instance_id
)(
239 tracepoint(librados
, rados_get_instance_id_enter
, cluster
);
240 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
241 uint64_t retval
= client
->get_instance_id();
242 tracepoint(librados
, rados_get_instance_id_exit
, retval
);
245 LIBRADOS_C_API_BASE_DEFAULT(rados_get_instance_id
);
247 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_get_min_compatible_osd
)(
249 int8_t* require_osd_release
)
251 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
252 return client
->get_min_compatible_osd(require_osd_release
);
254 LIBRADOS_C_API_BASE_DEFAULT(rados_get_min_compatible_osd
);
256 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_get_min_compatible_client
)(
258 int8_t* min_compat_client
,
259 int8_t* require_min_compat_client
)
261 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
262 return client
->get_min_compatible_client(min_compat_client
,
263 require_min_compat_client
);
265 LIBRADOS_C_API_BASE_DEFAULT(rados_get_min_compatible_client
);
267 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_version
)(
268 int *major
, int *minor
, int *extra
)
270 tracepoint(librados
, rados_version_enter
, major
, minor
, extra
);
272 *major
= LIBRADOS_VER_MAJOR
;
274 *minor
= LIBRADOS_VER_MINOR
;
276 *extra
= LIBRADOS_VER_EXTRA
;
277 tracepoint(librados
, rados_version_exit
, LIBRADOS_VER_MAJOR
, LIBRADOS_VER_MINOR
, LIBRADOS_VER_EXTRA
);
279 LIBRADOS_C_API_BASE_DEFAULT(rados_version
);
283 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_conf_read_file
)(
285 const char *path_list
)
287 tracepoint(librados
, rados_conf_read_file_enter
, cluster
, path_list
);
288 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
289 auto& conf
= client
->cct
->_conf
;
290 ostringstream warnings
;
291 int ret
= conf
.parse_config_files(path_list
, &warnings
, 0);
293 if (warnings
.tellp() > 0)
294 lderr(client
->cct
) << warnings
.str() << dendl
;
295 client
->cct
->_conf
.complain_about_parse_error(client
->cct
);
296 tracepoint(librados
, rados_conf_read_file_exit
, ret
);
299 conf
.parse_env(client
->cct
->get_module_type()); // environment variables override
301 conf
.apply_changes(nullptr);
302 client
->cct
->_conf
.complain_about_parse_error(client
->cct
);
303 tracepoint(librados
, rados_conf_read_file_exit
, 0);
306 LIBRADOS_C_API_BASE_DEFAULT(rados_conf_read_file
);
308 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_conf_parse_argv
)(
313 tracepoint(librados
, rados_conf_parse_argv_enter
, cluster
, argc
);
315 for(i
= 0; i
< argc
; i
++) {
316 tracepoint(librados
, rados_conf_parse_argv_arg
, argv
[i
]);
318 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
319 auto& conf
= client
->cct
->_conf
;
320 auto args
= argv_to_vec(argc
, argv
);
321 int ret
= conf
.parse_argv(args
);
323 tracepoint(librados
, rados_conf_parse_argv_exit
, ret
);
326 conf
.apply_changes(nullptr);
327 tracepoint(librados
, rados_conf_parse_argv_exit
, 0);
330 LIBRADOS_C_API_BASE_DEFAULT(rados_conf_parse_argv
);
332 // like above, but return the remainder of argv to contain remaining
333 // unparsed args. Must be allocated to at least argc by caller.
334 // remargv will contain n <= argc pointers to original argv[], the end
335 // of which may be NULL
337 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_conf_parse_argv_remainder
)(
338 rados_t cluster
, int argc
,
340 const char **remargv
)
342 tracepoint(librados
, rados_conf_parse_argv_remainder_enter
, cluster
, argc
);
344 for(i
= 0; i
< (unsigned int) argc
; i
++) {
345 tracepoint(librados
, rados_conf_parse_argv_remainder_arg
, argv
[i
]);
347 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
348 auto& conf
= client
->cct
->_conf
;
349 vector
<const char*> args
;
350 for (int i
=0; i
<argc
; i
++)
351 args
.push_back(argv
[i
]);
352 int ret
= conf
.parse_argv(args
);
354 tracepoint(librados
, rados_conf_parse_argv_remainder_exit
, ret
);
357 conf
.apply_changes(NULL
);
358 ceph_assert(args
.size() <= (unsigned int)argc
);
359 for (i
= 0; i
< (unsigned int)argc
; ++i
) {
361 remargv
[i
] = args
[i
];
363 remargv
[i
] = (const char *)NULL
;
364 tracepoint(librados
, rados_conf_parse_argv_remainder_remarg
, remargv
[i
]);
366 tracepoint(librados
, rados_conf_parse_argv_remainder_exit
, 0);
369 LIBRADOS_C_API_BASE_DEFAULT(rados_conf_parse_argv_remainder
);
371 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_conf_parse_env
)(
372 rados_t cluster
, const char *env
)
374 tracepoint(librados
, rados_conf_parse_env_enter
, cluster
, env
);
375 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
376 auto& conf
= client
->cct
->_conf
;
377 conf
.parse_env(client
->cct
->get_module_type(), env
);
378 conf
.apply_changes(nullptr);
379 tracepoint(librados
, rados_conf_parse_env_exit
, 0);
382 LIBRADOS_C_API_BASE_DEFAULT(rados_conf_parse_env
);
384 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_conf_set
)(
389 tracepoint(librados
, rados_conf_set_enter
, cluster
, option
, value
);
390 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
391 auto& conf
= client
->cct
->_conf
;
392 int ret
= conf
.set_val(option
, value
);
394 tracepoint(librados
, rados_conf_set_exit
, ret
);
397 conf
.apply_changes(nullptr);
398 tracepoint(librados
, rados_conf_set_exit
, 0);
401 LIBRADOS_C_API_BASE_DEFAULT(rados_conf_set
);
404 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_cluster_stat
)(
406 rados_cluster_stat_t
*result
)
408 tracepoint(librados
, rados_cluster_stat_enter
, cluster
);
409 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
412 int r
= client
->get_fs_stats(stats
);
413 result
->kb
= stats
.kb
;
414 result
->kb_used
= stats
.kb_used
;
415 result
->kb_avail
= stats
.kb_avail
;
416 result
->num_objects
= stats
.num_objects
;
417 tracepoint(librados
, rados_cluster_stat_exit
, r
, result
->kb
, result
->kb_used
, result
->kb_avail
, result
->num_objects
);
420 LIBRADOS_C_API_BASE_DEFAULT(rados_cluster_stat
);
422 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_conf_get
)(
425 char *buf
, size_t len
)
427 tracepoint(librados
, rados_conf_get_enter
, cluster
, option
, len
);
429 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
430 const auto& conf
= client
->cct
->_conf
;
431 int retval
= conf
.get_val(option
, &tmp
, len
);
432 tracepoint(librados
, rados_conf_get_exit
, retval
, retval
? "" : option
);
435 LIBRADOS_C_API_BASE_DEFAULT(rados_conf_get
);
437 extern "C" int64_t LIBRADOS_C_API_DEFAULT_F(rados_pool_lookup
)(
441 tracepoint(librados
, rados_pool_lookup_enter
, cluster
, name
);
442 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
443 int64_t retval
= radosp
->lookup_pool(name
);
444 tracepoint(librados
, rados_pool_lookup_exit
, retval
);
447 LIBRADOS_C_API_BASE_DEFAULT(rados_pool_lookup
);
449 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_pool_reverse_lookup
)(
455 tracepoint(librados
, rados_pool_reverse_lookup_enter
, cluster
, id
, maxlen
);
456 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
458 int r
= radosp
->pool_get_name(id
, &name
);
460 tracepoint(librados
, rados_pool_reverse_lookup_exit
, r
, "");
463 if (name
.length() >= maxlen
) {
464 tracepoint(librados
, rados_pool_reverse_lookup_exit
, -ERANGE
, "");
467 strcpy(buf
, name
.c_str());
468 int retval
= name
.length();
469 tracepoint(librados
, rados_pool_reverse_lookup_exit
, retval
, buf
);
472 LIBRADOS_C_API_BASE_DEFAULT(rados_pool_reverse_lookup
);
474 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_cluster_fsid
)(
479 tracepoint(librados
, rados_cluster_fsid_enter
, cluster
, maxlen
);
480 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
482 radosp
->get_fsid(&fsid
);
483 if (fsid
.length() >= maxlen
) {
484 tracepoint(librados
, rados_cluster_fsid_exit
, -ERANGE
, "");
487 strcpy(buf
, fsid
.c_str());
488 int retval
= fsid
.length();
489 tracepoint(librados
, rados_cluster_fsid_exit
, retval
, buf
);
492 LIBRADOS_C_API_BASE_DEFAULT(rados_cluster_fsid
);
494 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_wait_for_latest_osdmap
)(
497 tracepoint(librados
, rados_wait_for_latest_osdmap_enter
, cluster
);
498 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
499 int retval
= radosp
->wait_for_latest_osdmap();
500 tracepoint(librados
, rados_wait_for_latest_osdmap_exit
, retval
);
503 LIBRADOS_C_API_BASE_DEFAULT(rados_wait_for_latest_osdmap
);
505 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_blocklist_add
)(
507 char *client_address
,
508 uint32_t expire_seconds
)
510 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
511 return radosp
->blocklist_add(client_address
, expire_seconds
);
513 LIBRADOS_C_API_BASE_DEFAULT(rados_blocklist_add
);
515 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_blacklist_add
)(
517 char *client_address
,
518 uint32_t expire_seconds
)
520 return LIBRADOS_C_API_DEFAULT_F(rados_blocklist_add
)(
521 cluster
, client_address
, expire_seconds
);
523 LIBRADOS_C_API_BASE_DEFAULT(rados_blacklist_add
);
525 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_getaddrs
)(
529 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
530 auto s
= radosp
->get_addrs();
531 *addrs
= strdup(s
.c_str());
534 LIBRADOS_C_API_BASE_DEFAULT(rados_getaddrs
);
536 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_set_osdmap_full_try
)(
539 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
540 ctx
->extra_op_flags
|= CEPH_OSD_FLAG_FULL_TRY
;
542 LIBRADOS_C_API_BASE_DEFAULT(rados_set_osdmap_full_try
);
544 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_unset_osdmap_full_try
)(
547 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
548 ctx
->extra_op_flags
&= ~CEPH_OSD_FLAG_FULL_TRY
;
550 LIBRADOS_C_API_BASE_DEFAULT(rados_unset_osdmap_full_try
);
552 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_set_pool_full_try
)(
555 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
556 ctx
->extra_op_flags
|= CEPH_OSD_FLAG_FULL_TRY
;
558 LIBRADOS_C_API_BASE_DEFAULT(rados_set_pool_full_try
);
560 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_unset_pool_full_try
)(
563 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
564 ctx
->extra_op_flags
&= ~CEPH_OSD_FLAG_FULL_TRY
;
566 LIBRADOS_C_API_BASE_DEFAULT(rados_unset_pool_full_try
);
568 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_application_enable
)(
570 const char *app_name
,
573 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
574 return ctx
->application_enable(app_name
, force
!= 0);
576 LIBRADOS_C_API_BASE_DEFAULT(rados_application_enable
);
578 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_application_list
)(
583 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
584 std::set
<std::string
> app_names
;
585 int r
= ctx
->application_list(&app_names
);
590 size_t total_len
= 0;
591 for (auto app_name
: app_names
) {
592 total_len
+= app_name
.size() + 1;
595 if (*values_len
< total_len
) {
596 *values_len
= total_len
;
600 char *values_p
= values
;
601 for (auto app_name
: app_names
) {
602 size_t len
= app_name
.size() + 1;
603 strncpy(values_p
, app_name
.c_str(), len
);
607 *values_len
= total_len
;
610 LIBRADOS_C_API_BASE_DEFAULT(rados_application_list
);
612 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_application_metadata_get
)(
614 const char *app_name
,
619 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
620 std::string value_str
;
621 int r
= ctx
->application_metadata_get(app_name
, key
, &value_str
);
626 size_t len
= value_str
.size() + 1;
627 if (*value_len
< len
) {
632 strncpy(value
, value_str
.c_str(), len
);
636 LIBRADOS_C_API_BASE_DEFAULT(rados_application_metadata_get
);
638 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_application_metadata_set
)(
640 const char *app_name
,
644 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
645 return ctx
->application_metadata_set(app_name
, key
, value
);
647 LIBRADOS_C_API_BASE_DEFAULT(rados_application_metadata_set
);
649 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_application_metadata_remove
)(
651 const char *app_name
,
654 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
655 return ctx
->application_metadata_remove(app_name
, key
);
657 LIBRADOS_C_API_BASE_DEFAULT(rados_application_metadata_remove
);
659 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_application_metadata_list
)(
661 const char *app_name
,
662 char *keys
, size_t *keys_len
,
663 char *values
, size_t *vals_len
)
665 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
666 std::map
<std::string
, std::string
> metadata
;
667 int r
= ctx
->application_metadata_list(app_name
, &metadata
);
672 size_t total_key_len
= 0;
673 size_t total_val_len
= 0;
674 for (auto pair
: metadata
) {
675 total_key_len
+= pair
.first
.size() + 1;
676 total_val_len
+= pair
.second
.size() + 1;
679 if (*keys_len
< total_key_len
|| *vals_len
< total_val_len
) {
680 *keys_len
= total_key_len
;
681 *vals_len
= total_val_len
;
686 char *vals_p
= values
;
687 for (auto pair
: metadata
) {
688 size_t key_len
= pair
.first
.size() + 1;
689 strncpy(keys_p
, pair
.first
.c_str(), key_len
);
692 size_t val_len
= pair
.second
.size() + 1;
693 strncpy(vals_p
, pair
.second
.c_str(), val_len
);
697 *keys_len
= total_key_len
;
700 *vals_len
= total_val_len
;
703 LIBRADOS_C_API_BASE_DEFAULT(rados_application_metadata_list
);
705 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_pool_list
)(
710 tracepoint(librados
, rados_pool_list_enter
, cluster
, len
);
711 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
712 std::list
<std::pair
<int64_t, std::string
> > pools
;
713 int r
= client
->pool_list(pools
);
715 tracepoint(librados
, rados_pool_list_exit
, r
);
719 if (len
> 0 && !buf
) {
720 tracepoint(librados
, rados_pool_list_exit
, -EINVAL
);
726 // FIPS zeroization audit 20191116: this memset is not security related.
730 std::list
<std::pair
<int64_t, std::string
> >::const_iterator i
= pools
.begin();
731 std::list
<std::pair
<int64_t, std::string
> >::const_iterator p_end
=
733 for (; i
!= p_end
; ++i
) {
734 int rl
= i
->second
.length() + 1;
735 if (len
< (unsigned)rl
)
737 const char* pool
= i
->second
.c_str();
738 tracepoint(librados
, rados_pool_list_pool
, pool
);
740 strncat(b
, pool
, rl
);
746 for (; i
!= p_end
; ++i
) {
747 int rl
= i
->second
.length() + 1;
750 int retval
= needed
+ 1;
751 tracepoint(librados
, rados_pool_list_exit
, retval
);
754 LIBRADOS_C_API_BASE_DEFAULT(rados_pool_list
);
756 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_inconsistent_pg_list
)(
762 tracepoint(librados
, rados_inconsistent_pg_list_enter
, cluster
, pool_id
, len
);
763 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
764 std::vector
<std::string
> pgs
;
765 if (int r
= client
->get_inconsistent_pgs(pool_id
, &pgs
); r
< 0) {
766 tracepoint(librados
, rados_inconsistent_pg_list_exit
, r
);
770 if (len
> 0 && !buf
) {
771 tracepoint(librados
, rados_inconsistent_pg_list_exit
, -EINVAL
);
777 // FIPS zeroization audit 20191116: this memset is not security related.
781 for (const auto& s
: pgs
) {
782 unsigned rl
= s
.length() + 1;
783 if (b
&& len
>= rl
) {
784 tracepoint(librados
, rados_inconsistent_pg_list_pg
, s
.c_str());
785 strncat(b
, s
.c_str(), rl
);
791 int retval
= needed
+ 1;
792 tracepoint(librados
, rados_inconsistent_pg_list_exit
, retval
);
795 LIBRADOS_C_API_BASE_DEFAULT(rados_inconsistent_pg_list
);
798 static void dict_to_map(const char *dict
,
799 std::map
<std::string
, std::string
>* dict_map
)
801 while (*dict
!= '\0') {
802 const char* key
= dict
;
803 dict
+= strlen(key
) + 1;
804 const char* value
= dict
;
805 dict
+= strlen(value
) + 1;
806 (*dict_map
)[key
] = value
;
810 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_service_register
)(
814 const char *metadata_dict
)
816 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
818 std::map
<std::string
, std::string
> metadata
;
819 dict_to_map(metadata_dict
, &metadata
);
821 return client
->service_daemon_register(service
, daemon
, metadata
);
823 LIBRADOS_C_API_BASE_DEFAULT(rados_service_register
);
825 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_service_update_status
)(
827 const char *status_dict
)
829 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
831 std::map
<std::string
, std::string
> status
;
832 dict_to_map(status_dict
, &status
);
834 return client
->service_daemon_update_status(std::move(status
));
836 LIBRADOS_C_API_BASE_DEFAULT(rados_service_update_status
);
838 static void do_out_buffer(bufferlist
& outbl
, char **outbuf
, size_t *outbuflen
)
841 if (outbl
.length() > 0) {
842 *outbuf
= (char *)malloc(outbl
.length());
843 memcpy(*outbuf
, outbl
.c_str(), outbl
.length());
849 *outbuflen
= outbl
.length();
852 static void do_out_buffer(string
& outbl
, char **outbuf
, size_t *outbuflen
)
855 if (outbl
.length() > 0) {
856 *outbuf
= (char *)malloc(outbl
.length());
857 memcpy(*outbuf
, outbl
.c_str(), outbl
.length());
863 *outbuflen
= outbl
.length();
866 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ping_monitor
)(
872 tracepoint(librados
, rados_ping_monitor_enter
, cluster
, mon_id
);
873 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
877 tracepoint(librados
, rados_ping_monitor_exit
, -EINVAL
, NULL
, NULL
);
881 int ret
= client
->ping_monitor(mon_id
, &str
);
883 do_out_buffer(str
, outstr
, outstrlen
);
885 tracepoint(librados
, rados_ping_monitor_exit
, ret
, ret
< 0 ? NULL
: outstr
, ret
< 0 ? NULL
: outstrlen
);
888 LIBRADOS_C_API_BASE_DEFAULT(rados_ping_monitor
);
890 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_mon_command
)(
892 const char **cmd
, size_t cmdlen
,
893 const char *inbuf
, size_t inbuflen
,
894 char **outbuf
, size_t *outbuflen
,
895 char **outs
, size_t *outslen
)
897 tracepoint(librados
, rados_mon_command_enter
, cluster
, cmdlen
, inbuf
, inbuflen
);
898 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
902 vector
<string
> cmdvec
;
904 for (size_t i
= 0; i
< cmdlen
; i
++) {
905 tracepoint(librados
, rados_mon_command_cmd
, cmd
[i
]);
906 cmdvec
.push_back(cmd
[i
]);
909 inbl
.append(inbuf
, inbuflen
);
910 int ret
= client
->mon_command(cmdvec
, inbl
, &outbl
, &outstring
);
912 do_out_buffer(outbl
, outbuf
, outbuflen
);
913 do_out_buffer(outstring
, outs
, outslen
);
914 tracepoint(librados
, rados_mon_command_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
917 LIBRADOS_C_API_BASE_DEFAULT(rados_mon_command
);
919 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_mon_command_target
)(
922 const char **cmd
, size_t cmdlen
,
923 const char *inbuf
, size_t inbuflen
,
924 char **outbuf
, size_t *outbuflen
,
925 char **outs
, size_t *outslen
)
927 tracepoint(librados
, rados_mon_command_target_enter
, cluster
, name
, cmdlen
, inbuf
, inbuflen
);
928 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
932 vector
<string
> cmdvec
;
934 // is this a numeric id?
937 long rank
= strtol(name
, &endptr
, 10);
938 if ((errno
== ERANGE
&& (rank
== LONG_MAX
|| rank
== LONG_MIN
)) ||
939 (errno
!= 0 && rank
== 0) ||
940 endptr
== name
|| // no digits
941 *endptr
!= '\0') { // extra characters
945 for (size_t i
= 0; i
< cmdlen
; i
++) {
946 tracepoint(librados
, rados_mon_command_target_cmd
, cmd
[i
]);
947 cmdvec
.push_back(cmd
[i
]);
950 inbl
.append(inbuf
, inbuflen
);
953 ret
= client
->mon_command(rank
, cmdvec
, inbl
, &outbl
, &outstring
);
955 ret
= client
->mon_command(name
, cmdvec
, inbl
, &outbl
, &outstring
);
957 do_out_buffer(outbl
, outbuf
, outbuflen
);
958 do_out_buffer(outstring
, outs
, outslen
);
959 tracepoint(librados
, rados_mon_command_target_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
962 LIBRADOS_C_API_BASE_DEFAULT(rados_mon_command_target
);
964 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_osd_command
)(
965 rados_t cluster
, int osdid
, const char **cmd
,
967 const char *inbuf
, size_t inbuflen
,
968 char **outbuf
, size_t *outbuflen
,
969 char **outs
, size_t *outslen
)
971 tracepoint(librados
, rados_osd_command_enter
, cluster
, osdid
, cmdlen
, inbuf
, inbuflen
);
972 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
976 vector
<string
> cmdvec
;
978 for (size_t i
= 0; i
< cmdlen
; i
++) {
979 tracepoint(librados
, rados_osd_command_cmd
, cmd
[i
]);
980 cmdvec
.push_back(cmd
[i
]);
983 inbl
.append(inbuf
, inbuflen
);
984 int ret
= client
->osd_command(osdid
, cmdvec
, inbl
, &outbl
, &outstring
);
986 do_out_buffer(outbl
, outbuf
, outbuflen
);
987 do_out_buffer(outstring
, outs
, outslen
);
988 tracepoint(librados
, rados_osd_command_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
991 LIBRADOS_C_API_BASE_DEFAULT(rados_osd_command
);
993 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_mgr_command
)(
994 rados_t cluster
, const char **cmd
,
996 const char *inbuf
, size_t inbuflen
,
997 char **outbuf
, size_t *outbuflen
,
998 char **outs
, size_t *outslen
)
1000 tracepoint(librados
, rados_mgr_command_enter
, cluster
, cmdlen
, inbuf
,
1003 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
1007 vector
<string
> cmdvec
;
1009 for (size_t i
= 0; i
< cmdlen
; i
++) {
1010 tracepoint(librados
, rados_mgr_command_cmd
, cmd
[i
]);
1011 cmdvec
.push_back(cmd
[i
]);
1014 inbl
.append(inbuf
, inbuflen
);
1015 int ret
= client
->mgr_command(cmdvec
, inbl
, &outbl
, &outstring
);
1017 do_out_buffer(outbl
, outbuf
, outbuflen
);
1018 do_out_buffer(outstring
, outs
, outslen
);
1019 tracepoint(librados
, rados_mgr_command_exit
, ret
, outbuf
, outbuflen
, outs
,
1023 LIBRADOS_C_API_BASE_DEFAULT(rados_mgr_command
);
1025 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_mgr_command_target
)(
1030 const char *inbuf
, size_t inbuflen
,
1031 char **outbuf
, size_t *outbuflen
,
1032 char **outs
, size_t *outslen
)
1034 tracepoint(librados
, rados_mgr_command_target_enter
, cluster
, name
, cmdlen
,
1037 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
1041 vector
<string
> cmdvec
;
1043 for (size_t i
= 0; i
< cmdlen
; i
++) {
1044 tracepoint(librados
, rados_mgr_command_target_cmd
, cmd
[i
]);
1045 cmdvec
.push_back(cmd
[i
]);
1048 inbl
.append(inbuf
, inbuflen
);
1049 int ret
= client
->mgr_command(name
, cmdvec
, inbl
, &outbl
, &outstring
);
1051 do_out_buffer(outbl
, outbuf
, outbuflen
);
1052 do_out_buffer(outstring
, outs
, outslen
);
1053 tracepoint(librados
, rados_mgr_command_target_exit
, ret
, outbuf
, outbuflen
,
1057 LIBRADOS_C_API_BASE_DEFAULT(rados_mgr_command_target
);
1059 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_pg_command
)(
1060 rados_t cluster
, const char *pgstr
,
1061 const char **cmd
, size_t cmdlen
,
1062 const char *inbuf
, size_t inbuflen
,
1063 char **outbuf
, size_t *outbuflen
,
1064 char **outs
, size_t *outslen
)
1066 tracepoint(librados
, rados_pg_command_enter
, cluster
, pgstr
, cmdlen
, inbuf
, inbuflen
);
1067 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
1072 vector
<string
> cmdvec
;
1074 for (size_t i
= 0; i
< cmdlen
; i
++) {
1075 tracepoint(librados
, rados_pg_command_cmd
, cmd
[i
]);
1076 cmdvec
.push_back(cmd
[i
]);
1079 inbl
.append(inbuf
, inbuflen
);
1080 if (!pgid
.parse(pgstr
))
1083 int ret
= client
->pg_command(pgid
, cmdvec
, inbl
, &outbl
, &outstring
);
1085 do_out_buffer(outbl
, outbuf
, outbuflen
);
1086 do_out_buffer(outstring
, outs
, outslen
);
1087 tracepoint(librados
, rados_pg_command_exit
, ret
, outbuf
, outbuflen
, outs
, outslen
);
1090 LIBRADOS_C_API_BASE_DEFAULT(rados_pg_command
);
1092 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_buffer_free
)(char *buf
)
1094 tracepoint(librados
, rados_buffer_free_enter
, buf
);
1097 tracepoint(librados
, rados_buffer_free_exit
);
1099 LIBRADOS_C_API_BASE_DEFAULT(rados_buffer_free
);
1101 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_monitor_log
)(
1104 rados_log_callback_t cb
,
1107 tracepoint(librados
, rados_monitor_log_enter
, cluster
, level
, cb
, arg
);
1108 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
1109 int retval
= client
->monitor_log(level
, cb
, nullptr, arg
);
1110 tracepoint(librados
, rados_monitor_log_exit
, retval
);
1113 LIBRADOS_C_API_BASE_DEFAULT(rados_monitor_log
);
1115 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_monitor_log2
)(
1118 rados_log_callback2_t cb
,
1121 tracepoint(librados
, rados_monitor_log2_enter
, cluster
, level
, cb
, arg
);
1122 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
1123 int retval
= client
->monitor_log(level
, nullptr, cb
, arg
);
1124 tracepoint(librados
, rados_monitor_log2_exit
, retval
);
1127 LIBRADOS_C_API_BASE_DEFAULT(rados_monitor_log2
);
1129 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_create
)(
1134 tracepoint(librados
, rados_ioctx_create_enter
, cluster
, name
);
1135 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
1136 librados::IoCtxImpl
*ctx
;
1138 int r
= client
->create_ioctx(name
, &ctx
);
1140 tracepoint(librados
, rados_ioctx_create_exit
, r
, NULL
);
1146 tracepoint(librados
, rados_ioctx_create_exit
, 0, ctx
);
1149 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_create
);
1151 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_create2
)(
1156 tracepoint(librados
, rados_ioctx_create2_enter
, cluster
, pool_id
);
1157 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
1158 librados::IoCtxImpl
*ctx
;
1160 int r
= client
->create_ioctx(pool_id
, &ctx
);
1162 tracepoint(librados
, rados_ioctx_create2_exit
, r
, NULL
);
1168 tracepoint(librados
, rados_ioctx_create2_exit
, 0, ctx
);
1171 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_create2
);
1173 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_ioctx_destroy
)(rados_ioctx_t io
)
1175 tracepoint(librados
, rados_ioctx_destroy_enter
, io
);
1176 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1178 tracepoint(librados
, rados_ioctx_destroy_exit
);
1180 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_destroy
);
1182 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_pool_stat
)(
1184 struct rados_pool_stat_t
*stats
)
1186 tracepoint(librados
, rados_ioctx_pool_stat_enter
, io
);
1187 librados::IoCtxImpl
*io_ctx_impl
= (librados::IoCtxImpl
*)io
;
1189 std::string pool_name
;
1191 int err
= io_ctx_impl
->client
->pool_get_name(io_ctx_impl
->get_id(), &pool_name
);
1193 tracepoint(librados
, rados_ioctx_pool_stat_exit
, err
, stats
);
1196 ls
.push_back(pool_name
);
1198 map
<string
, ::pool_stat_t
> rawresult
;
1199 bool per_pool
= false;
1200 err
= io_ctx_impl
->client
->get_pool_stats(ls
, &rawresult
, &per_pool
);
1202 tracepoint(librados
, rados_ioctx_pool_stat_exit
, err
, stats
);
1206 ::pool_stat_t
& r
= rawresult
[pool_name
];
1207 uint64_t allocated_bytes
= r
.get_allocated_data_bytes(per_pool
) +
1208 r
.get_allocated_omap_bytes(per_pool
);
1209 // FIXME: raw_used_rate is unknown hence use 1.0 here
1210 // meaning we keep net amount aggregated over all replicas
1211 // Not a big deal so far since this field isn't exposed
1212 uint64_t user_bytes
= r
.get_user_data_bytes(1.0, per_pool
) +
1213 r
.get_user_omap_bytes(1.0, per_pool
);
1215 stats
->num_kb
= shift_round_up(allocated_bytes
, 10);
1216 stats
->num_bytes
= allocated_bytes
;
1217 stats
->num_objects
= r
.stats
.sum
.num_objects
;
1218 stats
->num_object_clones
= r
.stats
.sum
.num_object_clones
;
1219 stats
->num_object_copies
= r
.stats
.sum
.num_object_copies
;
1220 stats
->num_objects_missing_on_primary
= r
.stats
.sum
.num_objects_missing_on_primary
;
1221 stats
->num_objects_unfound
= r
.stats
.sum
.num_objects_unfound
;
1222 stats
->num_objects_degraded
=
1223 r
.stats
.sum
.num_objects_degraded
+
1224 r
.stats
.sum
.num_objects_misplaced
; // FIXME: this is imprecise
1225 stats
->num_rd
= r
.stats
.sum
.num_rd
;
1226 stats
->num_rd_kb
= r
.stats
.sum
.num_rd_kb
;
1227 stats
->num_wr
= r
.stats
.sum
.num_wr
;
1228 stats
->num_wr_kb
= r
.stats
.sum
.num_wr_kb
;
1229 stats
->num_user_bytes
= user_bytes
;
1230 stats
->compressed_bytes_orig
= r
.store_stats
.data_compressed_original
;
1231 stats
->compressed_bytes
= r
.store_stats
.data_compressed
;
1232 stats
->compressed_bytes_alloc
= r
.store_stats
.data_compressed_allocated
;
1234 tracepoint(librados
, rados_ioctx_pool_stat_exit
, 0, stats
);
1237 LIBRADOS_C_API_DEFAULT(rados_ioctx_pool_stat
, 14.2.0);
1239 extern "C" int LIBRADOS_C_API_BASE_F(rados_ioctx_pool_stat
)(
1240 rados_ioctx_t io
, struct __librados_base::rados_pool_stat_t
*stats
)
1242 struct rados_pool_stat_t new_stats
;
1243 int r
= LIBRADOS_C_API_DEFAULT_F(rados_ioctx_pool_stat
)(io
, &new_stats
);
1248 stats
->num_bytes
= new_stats
.num_bytes
;
1249 stats
->num_kb
= new_stats
.num_kb
;
1250 stats
->num_objects
= new_stats
.num_objects
;
1251 stats
->num_object_clones
= new_stats
.num_object_clones
;
1252 stats
->num_object_copies
= new_stats
.num_object_copies
;
1253 stats
->num_objects_missing_on_primary
= new_stats
.num_objects_missing_on_primary
;
1254 stats
->num_objects_unfound
= new_stats
.num_objects_unfound
;
1255 stats
->num_objects_degraded
= new_stats
.num_objects_degraded
;
1256 stats
->num_rd
= new_stats
.num_rd
;
1257 stats
->num_rd_kb
= new_stats
.num_rd_kb
;
1258 stats
->num_wr
= new_stats
.num_wr
;
1259 stats
->num_wr_kb
= new_stats
.num_wr_kb
;
1262 LIBRADOS_C_API_BASE(rados_ioctx_pool_stat
);
1264 extern "C" rados_config_t
LIBRADOS_C_API_DEFAULT_F(rados_ioctx_cct
)(
1267 tracepoint(librados
, rados_ioctx_cct_enter
, io
);
1268 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1269 rados_config_t retval
= (rados_config_t
)ctx
->client
->cct
;
1270 tracepoint(librados
, rados_ioctx_cct_exit
, retval
);
1273 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_cct
);
1275 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_ioctx_snap_set_read
)(
1279 tracepoint(librados
, rados_ioctx_snap_set_read_enter
, io
, seq
);
1280 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1281 ctx
->set_snap_read((snapid_t
)seq
);
1282 tracepoint(librados
, rados_ioctx_snap_set_read_exit
);
1284 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_snap_set_read
);
1286 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_selfmanaged_snap_set_write_ctx
)(
1289 rados_snap_t
*snaps
,
1292 tracepoint(librados
, rados_ioctx_selfmanaged_snap_set_write_ctx_enter
, io
, seq
, snaps
, num_snaps
);
1293 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1294 vector
<snapid_t
> snv
;
1295 snv
.resize(num_snaps
);
1296 for (int i
=0; i
<num_snaps
; i
++) {
1297 snv
[i
] = (snapid_t
)snaps
[i
];
1299 int retval
= ctx
->set_snap_write_context((snapid_t
)seq
, snv
);
1300 tracepoint(librados
, rados_ioctx_selfmanaged_snap_set_write_ctx_exit
, retval
);
1303 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_selfmanaged_snap_set_write_ctx
);
1305 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_write
)(
1312 tracepoint(librados
, rados_write_enter
, io
, o
, buf
, len
, off
);
1313 if (len
> UINT_MAX
/2)
1315 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1318 bl
.append(buf
, len
);
1319 int retval
= ctx
->write(oid
, bl
, len
, off
);
1320 tracepoint(librados
, rados_write_exit
, retval
);
1323 LIBRADOS_C_API_BASE_DEFAULT(rados_write
);
1325 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_append
)(
1331 tracepoint(librados
, rados_append_enter
, io
, o
, buf
, len
);
1332 if (len
> UINT_MAX
/2)
1334 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1337 bl
.append(buf
, len
);
1338 int retval
= ctx
->append(oid
, bl
, len
);
1339 tracepoint(librados
, rados_append_exit
, retval
);
1342 LIBRADOS_C_API_BASE_DEFAULT(rados_append
);
1344 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_write_full
)(
1350 tracepoint(librados
, rados_write_full_enter
, io
, o
, buf
, len
);
1351 if (len
> UINT_MAX
/2)
1353 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1356 bl
.append(buf
, len
);
1357 int retval
= ctx
->write_full(oid
, bl
);
1358 tracepoint(librados
, rados_write_full_exit
, retval
);
1361 LIBRADOS_C_API_BASE_DEFAULT(rados_write_full
);
1363 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_writesame
)(
1371 tracepoint(librados
, rados_writesame_enter
, io
, o
, buf
, data_len
, write_len
, off
);
1372 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1375 bl
.append(buf
, data_len
);
1376 int retval
= ctx
->writesame(oid
, bl
, write_len
, off
);
1377 tracepoint(librados
, rados_writesame_exit
, retval
);
1380 LIBRADOS_C_API_BASE_DEFAULT(rados_writesame
);
1382 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_trunc
)(
1387 tracepoint(librados
, rados_trunc_enter
, io
, o
, size
);
1388 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1390 int retval
= ctx
->trunc(oid
, size
);
1391 tracepoint(librados
, rados_trunc_exit
, retval
);
1394 LIBRADOS_C_API_BASE_DEFAULT(rados_trunc
);
1396 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_remove
)(
1400 tracepoint(librados
, rados_remove_enter
, io
, o
);
1401 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1403 int retval
= ctx
->remove(oid
);
1404 tracepoint(librados
, rados_remove_exit
, retval
);
1407 LIBRADOS_C_API_BASE_DEFAULT(rados_remove
);
1409 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_read
)(
1416 tracepoint(librados
, rados_read_enter
, io
, o
, buf
, len
, off
);
1417 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1422 bufferptr bp
= buffer::create_static(len
, buf
);
1425 ret
= ctx
->read(oid
, bl
, len
, off
);
1427 if (bl
.length() > len
) {
1428 tracepoint(librados
, rados_read_exit
, -ERANGE
, NULL
);
1431 if (!bl
.is_provided_buffer(buf
))
1432 bl
.begin().copy(bl
.length(), buf
);
1433 ret
= bl
.length(); // hrm :/
1436 tracepoint(librados
, rados_read_exit
, ret
, buf
);
1439 LIBRADOS_C_API_BASE_DEFAULT(rados_read
);
1441 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_checksum
)(
1442 rados_ioctx_t io
, const char *o
,
1443 rados_checksum_type_t type
,
1444 const char *init_value
, size_t init_value_len
,
1445 size_t len
, uint64_t off
, size_t chunk_size
,
1446 char *pchecksum
, size_t checksum_len
)
1448 tracepoint(librados
, rados_checksum_enter
, io
, o
, type
, init_value
,
1449 init_value_len
, len
, off
, chunk_size
);
1450 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1453 bufferlist init_value_bl
;
1454 init_value_bl
.append(init_value
, init_value_len
);
1456 bufferlist checksum_bl
;
1458 int retval
= ctx
->checksum(oid
, get_checksum_op_type(type
), init_value_bl
,
1459 len
, off
, chunk_size
, &checksum_bl
);
1461 if (checksum_bl
.length() > checksum_len
) {
1462 tracepoint(librados
, rados_checksum_exit
, -ERANGE
, NULL
, 0);
1466 checksum_bl
.begin().copy(checksum_bl
.length(), pchecksum
);
1468 tracepoint(librados
, rados_checksum_exit
, retval
, pchecksum
, checksum_len
);
1471 LIBRADOS_C_API_BASE_DEFAULT(rados_checksum
);
1473 extern "C" uint64_t LIBRADOS_C_API_DEFAULT_F(rados_get_last_version
)(
1476 tracepoint(librados
, rados_get_last_version_enter
, io
);
1477 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1478 uint64_t retval
= ctx
->last_version();
1479 tracepoint(librados
, rados_get_last_version_exit
, retval
);
1482 LIBRADOS_C_API_BASE_DEFAULT(rados_get_last_version
);
1484 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_pool_create
)(
1488 tracepoint(librados
, rados_pool_create_enter
, cluster
, name
);
1489 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
1491 int retval
= radosp
->pool_create(sname
);
1492 tracepoint(librados
, rados_pool_create_exit
, retval
);
1495 LIBRADOS_C_API_BASE_DEFAULT(rados_pool_create
);
1497 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_pool_create_with_auid
)(
1502 tracepoint(librados
, rados_pool_create_with_auid_enter
, cluster
, name
, auid
);
1503 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
1506 if (auid
!= CEPH_AUTH_UID_DEFAULT
) {
1509 retval
= radosp
->pool_create(sname
);
1511 tracepoint(librados
, rados_pool_create_with_auid_exit
, retval
);
1514 LIBRADOS_C_API_BASE_DEFAULT(rados_pool_create_with_auid
);
1516 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_pool_create_with_crush_rule
)(
1519 __u8 crush_rule_num
)
1521 tracepoint(librados
, rados_pool_create_with_crush_rule_enter
, cluster
, name
, crush_rule_num
);
1522 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
1524 int retval
= radosp
->pool_create(sname
, crush_rule_num
);
1525 tracepoint(librados
, rados_pool_create_with_crush_rule_exit
, retval
);
1528 LIBRADOS_C_API_BASE_DEFAULT(rados_pool_create_with_crush_rule
);
1530 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_pool_create_with_all
)(
1534 __u8 crush_rule_num
)
1536 tracepoint(librados
, rados_pool_create_with_all_enter
, cluster
, name
, auid
, crush_rule_num
);
1537 librados::RadosClient
*radosp
= (librados::RadosClient
*)cluster
;
1540 if (auid
!= CEPH_AUTH_UID_DEFAULT
) {
1543 retval
= radosp
->pool_create(sname
, crush_rule_num
);
1545 tracepoint(librados
, rados_pool_create_with_all_exit
, retval
);
1548 LIBRADOS_C_API_BASE_DEFAULT(rados_pool_create_with_all
);
1550 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_pool_get_base_tier
)(
1555 tracepoint(librados
, rados_pool_get_base_tier_enter
, cluster
, pool_id
);
1556 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
1557 int retval
= client
->pool_get_base_tier(pool_id
, base_tier
);
1558 tracepoint(librados
, rados_pool_get_base_tier_exit
, retval
, *base_tier
);
1561 LIBRADOS_C_API_BASE_DEFAULT(rados_pool_get_base_tier
);
1563 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_pool_delete
)(
1565 const char *pool_name
)
1567 tracepoint(librados
, rados_pool_delete_enter
, cluster
, pool_name
);
1568 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
1569 int retval
= client
->pool_delete(pool_name
);
1570 tracepoint(librados
, rados_pool_delete_exit
, retval
);
1573 LIBRADOS_C_API_BASE_DEFAULT(rados_pool_delete
);
1575 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_pool_set_auid
)(
1579 tracepoint(librados
, rados_ioctx_pool_set_auid_enter
, io
, auid
);
1580 int retval
= -EOPNOTSUPP
;
1581 tracepoint(librados
, rados_ioctx_pool_set_auid_exit
, retval
);
1584 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_pool_set_auid
);
1586 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_pool_get_auid
)(
1590 tracepoint(librados
, rados_ioctx_pool_get_auid_enter
, io
);
1591 int retval
= -EOPNOTSUPP
;
1592 tracepoint(librados
, rados_ioctx_pool_get_auid_exit
, retval
, *auid
);
1595 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_pool_get_auid
);
1597 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_pool_requires_alignment
)(
1600 tracepoint(librados
, rados_ioctx_pool_requires_alignment_enter
, io
);
1601 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1602 int retval
= ctx
->client
->pool_requires_alignment(ctx
->get_id());
1603 tracepoint(librados
, rados_ioctx_pool_requires_alignment_exit
, retval
);
1606 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_pool_requires_alignment
);
1608 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_pool_requires_alignment2
)(
1612 tracepoint(librados
, rados_ioctx_pool_requires_alignment_enter2
, io
);
1613 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1614 bool requires_alignment
;
1615 int retval
= ctx
->client
->pool_requires_alignment2(ctx
->get_id(),
1616 &requires_alignment
);
1617 tracepoint(librados
, rados_ioctx_pool_requires_alignment_exit2
, retval
,
1618 requires_alignment
);
1620 *requires
= requires_alignment
;
1623 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_pool_requires_alignment2
);
1625 extern "C" uint64_t LIBRADOS_C_API_DEFAULT_F(rados_ioctx_pool_required_alignment
)(
1628 tracepoint(librados
, rados_ioctx_pool_required_alignment_enter
, io
);
1629 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1630 uint64_t retval
= ctx
->client
->pool_required_alignment(ctx
->get_id());
1631 tracepoint(librados
, rados_ioctx_pool_required_alignment_exit
, retval
);
1634 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_pool_required_alignment
);
1636 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_pool_required_alignment2
)(
1638 uint64_t *alignment
)
1640 tracepoint(librados
, rados_ioctx_pool_required_alignment_enter2
, io
);
1641 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1642 int retval
= ctx
->client
->pool_required_alignment2(ctx
->get_id(),
1644 tracepoint(librados
, rados_ioctx_pool_required_alignment_exit2
, retval
,
1648 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_pool_required_alignment2
);
1650 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_ioctx_locator_set_key
)(
1654 tracepoint(librados
, rados_ioctx_locator_set_key_enter
, io
, key
);
1655 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1657 ctx
->oloc
.key
= key
;
1660 tracepoint(librados
, rados_ioctx_locator_set_key_exit
);
1662 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_locator_set_key
);
1664 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_ioctx_set_namespace
)(
1668 tracepoint(librados
, rados_ioctx_set_namespace_enter
, io
, nspace
);
1669 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1671 ctx
->oloc
.nspace
= nspace
;
1673 ctx
->oloc
.nspace
= "";
1674 tracepoint(librados
, rados_ioctx_set_namespace_exit
);
1676 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_set_namespace
);
1678 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_get_namespace
)(
1683 tracepoint(librados
, rados_ioctx_get_namespace_enter
, io
, maxlen
);
1684 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1685 auto length
= ctx
->oloc
.nspace
.length();
1686 if (length
>= maxlen
) {
1687 tracepoint(librados
, rados_ioctx_get_namespace_exit
, -ERANGE
, "");
1690 strcpy(s
, ctx
->oloc
.nspace
.c_str());
1691 int retval
= (int)length
;
1692 tracepoint(librados
, rados_ioctx_get_namespace_exit
, retval
, s
);
1695 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_get_namespace
);
1697 extern "C" rados_t
LIBRADOS_C_API_DEFAULT_F(rados_ioctx_get_cluster
)(
1700 tracepoint(librados
, rados_ioctx_get_cluster_enter
, io
);
1701 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1702 rados_t retval
= (rados_t
)ctx
->client
;
1703 tracepoint(librados
, rados_ioctx_get_cluster_exit
, retval
);
1706 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_get_cluster
);
1708 extern "C" int64_t LIBRADOS_C_API_DEFAULT_F(rados_ioctx_get_id
)(
1711 tracepoint(librados
, rados_ioctx_get_id_enter
, io
);
1712 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1713 int64_t retval
= ctx
->get_id();
1714 tracepoint(librados
, rados_ioctx_get_id_exit
, retval
);
1717 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_get_id
);
1719 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_get_pool_name
)(
1724 tracepoint(librados
, rados_ioctx_get_pool_name_enter
, io
, maxlen
);
1725 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1726 std::string pool_name
;
1728 int err
= ctx
->client
->pool_get_name(ctx
->get_id(), &pool_name
);
1730 tracepoint(librados
, rados_ioctx_get_pool_name_exit
, err
, "");
1733 if (pool_name
.length() >= maxlen
) {
1734 tracepoint(librados
, rados_ioctx_get_pool_name_exit
, -ERANGE
, "");
1737 strcpy(s
, pool_name
.c_str());
1738 int retval
= pool_name
.length();
1739 tracepoint(librados
, rados_ioctx_get_pool_name_exit
, retval
, s
);
1742 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_get_pool_name
);
1746 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_snap_create
)(
1748 const char *snapname
)
1750 tracepoint(librados
, rados_ioctx_snap_create_enter
, io
, snapname
);
1751 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1752 int retval
= ctx
->snap_create(snapname
);
1753 tracepoint(librados
, rados_ioctx_snap_create_exit
, retval
);
1756 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_snap_create
);
1758 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_snap_remove
)(
1760 const char *snapname
)
1762 tracepoint(librados
, rados_ioctx_snap_remove_enter
, io
, snapname
);
1763 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1764 int retval
= ctx
->snap_remove(snapname
);
1765 tracepoint(librados
, rados_ioctx_snap_remove_exit
, retval
);
1768 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_snap_remove
);
1770 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_snap_rollback
)(
1773 const char *snapname
)
1775 tracepoint(librados
, rados_ioctx_snap_rollback_enter
, io
, oid
, snapname
);
1776 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1777 int retval
= ctx
->rollback(oid
, snapname
);
1778 tracepoint(librados
, rados_ioctx_snap_rollback_exit
, retval
);
1781 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_snap_rollback
);
1783 // Deprecated name kept for backward compatibility
1784 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_rollback
)(
1787 const char *snapname
)
1789 return LIBRADOS_C_API_DEFAULT_F(rados_ioctx_snap_rollback
)(io
, oid
, snapname
);
1791 LIBRADOS_C_API_BASE_DEFAULT(rados_rollback
);
1793 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_selfmanaged_snap_create
)(
1797 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_enter
, io
);
1798 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1799 int retval
= ctx
->selfmanaged_snap_create(snapid
);
1800 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_exit
, retval
, *snapid
);
1803 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_selfmanaged_snap_create
);
1805 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_aio_ioctx_selfmanaged_snap_create
)(
1807 rados_snap_t
*snapid
,
1808 rados_completion_t completion
)
1810 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_enter
, io
);
1811 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1812 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
1813 ctx
->aio_selfmanaged_snap_create(snapid
, c
);
1814 tracepoint(librados
, rados_ioctx_selfmanaged_snap_create_exit
, 0, 0);
1816 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_ioctx_selfmanaged_snap_create
);
1818 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_selfmanaged_snap_remove
)(
1822 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_enter
, io
, snapid
);
1823 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1824 int retval
= ctx
->selfmanaged_snap_remove(snapid
);
1825 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_exit
, retval
);
1828 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_selfmanaged_snap_remove
);
1830 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_aio_ioctx_selfmanaged_snap_remove
)(
1832 rados_snap_t snapid
,
1833 rados_completion_t completion
)
1835 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_enter
, io
, snapid
);
1836 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1837 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
1838 ctx
->aio_selfmanaged_snap_remove(snapid
, c
);
1839 tracepoint(librados
, rados_ioctx_selfmanaged_snap_remove_exit
, 0);
1841 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_ioctx_selfmanaged_snap_remove
);
1843 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_selfmanaged_snap_rollback
)(
1848 tracepoint(librados
, rados_ioctx_selfmanaged_snap_rollback_enter
, io
, oid
, snapid
);
1849 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1850 int retval
= ctx
->selfmanaged_snap_rollback_object(oid
, ctx
->snapc
, snapid
);
1851 tracepoint(librados
, rados_ioctx_selfmanaged_snap_rollback_exit
, retval
);
1854 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_selfmanaged_snap_rollback
);
1856 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_snap_list
)(
1858 rados_snap_t
*snaps
,
1861 tracepoint(librados
, rados_ioctx_snap_list_enter
, io
, maxlen
);
1862 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1863 vector
<uint64_t> snapvec
;
1864 int r
= ctx
->snap_list(&snapvec
);
1866 tracepoint(librados
, rados_ioctx_snap_list_exit
, r
, snaps
, 0);
1869 if ((int)snapvec
.size() <= maxlen
) {
1870 for (unsigned i
=0; i
<snapvec
.size(); i
++) {
1871 snaps
[i
] = snapvec
[i
];
1873 int retval
= snapvec
.size();
1874 tracepoint(librados
, rados_ioctx_snap_list_exit
, retval
, snaps
, retval
);
1877 int retval
= -ERANGE
;
1878 tracepoint(librados
, rados_ioctx_snap_list_exit
, retval
, snaps
, 0);
1881 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_snap_list
);
1883 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_snap_lookup
)(
1888 tracepoint(librados
, rados_ioctx_snap_lookup_enter
, io
, name
);
1889 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1890 int retval
= ctx
->snap_lookup(name
, (uint64_t *)id
);
1891 tracepoint(librados
, rados_ioctx_snap_lookup_exit
, retval
, *id
);
1894 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_snap_lookup
);
1896 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_snap_get_name
)(
1902 tracepoint(librados
, rados_ioctx_snap_get_name_enter
, io
, id
, maxlen
);
1903 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1905 int r
= ctx
->snap_get_name(id
, &sname
);
1907 tracepoint(librados
, rados_ioctx_snap_get_name_exit
, r
, "");
1910 if ((int)sname
.length() >= maxlen
) {
1911 int retval
= -ERANGE
;
1912 tracepoint(librados
, rados_ioctx_snap_get_name_exit
, retval
, "");
1915 strncpy(name
, sname
.c_str(), maxlen
);
1916 tracepoint(librados
, rados_ioctx_snap_get_name_exit
, 0, name
);
1919 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_snap_get_name
);
1921 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_ioctx_snap_get_stamp
)(
1926 tracepoint(librados
, rados_ioctx_snap_get_stamp_enter
, io
, id
);
1927 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1928 int retval
= ctx
->snap_get_stamp(id
, t
);
1929 tracepoint(librados
, rados_ioctx_snap_get_stamp_exit
, retval
, *t
);
1932 LIBRADOS_C_API_BASE_DEFAULT(rados_ioctx_snap_get_stamp
);
1934 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_cmpext
)(
1937 const char *cmp_buf
,
1941 tracepoint(librados
, rados_cmpext_enter
, io
, o
, cmp_buf
, cmp_len
, off
);
1942 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1947 cmp_bl
.append(cmp_buf
, cmp_len
);
1949 ret
= ctx
->cmpext(oid
, off
, cmp_bl
);
1950 tracepoint(librados
, rados_cmpext_exit
, ret
);
1954 LIBRADOS_C_API_BASE_DEFAULT(rados_cmpext
);
1956 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_getxattr
)(
1963 tracepoint(librados
, rados_getxattr_enter
, io
, o
, name
, len
);
1964 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1968 bl
.push_back(buffer::create_static(len
, buf
));
1969 ret
= ctx
->getxattr(oid
, name
, bl
);
1971 if (bl
.length() > len
) {
1972 tracepoint(librados
, rados_getxattr_exit
, -ERANGE
, buf
, 0);
1975 if (!bl
.is_provided_buffer(buf
))
1976 bl
.begin().copy(bl
.length(), buf
);
1980 tracepoint(librados
, rados_getxattr_exit
, ret
, buf
, ret
);
1983 LIBRADOS_C_API_BASE_DEFAULT(rados_getxattr
);
1985 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_getxattrs
)(
1988 rados_xattrs_iter_t
*iter
)
1990 tracepoint(librados
, rados_getxattrs_enter
, io
, oid
);
1991 librados::RadosXattrsIter
*it
= new librados::RadosXattrsIter();
1993 tracepoint(librados
, rados_getxattrs_exit
, -ENOMEM
, NULL
);
1996 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
1998 int ret
= ctx
->getxattrs(obj
, it
->attrset
);
2001 tracepoint(librados
, rados_getxattrs_exit
, ret
, NULL
);
2004 it
->i
= it
->attrset
.begin();
2007 tracepoint(librados
, rados_getxattrs_exit
, 0, *iter
);
2010 LIBRADOS_C_API_BASE_DEFAULT(rados_getxattrs
);
2012 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_getxattrs_next
)(
2013 rados_xattrs_iter_t iter
,
2018 tracepoint(librados
, rados_getxattrs_next_enter
, iter
);
2019 librados::RadosXattrsIter
*it
= static_cast<librados::RadosXattrsIter
*>(iter
);
2024 if (it
->i
== it
->attrset
.end()) {
2028 tracepoint(librados
, rados_getxattrs_next_exit
, 0, NULL
, NULL
, 0);
2031 const std::string
&s(it
->i
->first
);
2033 bufferlist
&bl(it
->i
->second
);
2034 size_t bl_len
= bl
.length();
2036 // malloc(0) is not guaranteed to return a valid pointer
2037 *val
= (char *)NULL
;
2039 it
->val
= (char*)malloc(bl_len
);
2041 tracepoint(librados
, rados_getxattrs_next_exit
, -ENOMEM
, *name
, NULL
, 0);
2044 memcpy(it
->val
, bl
.c_str(), bl_len
);
2049 tracepoint(librados
, rados_getxattrs_next_exit
, 0, *name
, *val
, *len
);
2052 LIBRADOS_C_API_BASE_DEFAULT(rados_getxattrs_next
);
2054 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_getxattrs_end
)(
2055 rados_xattrs_iter_t iter
)
2057 tracepoint(librados
, rados_getxattrs_end_enter
, iter
);
2058 librados::RadosXattrsIter
*it
= static_cast<librados::RadosXattrsIter
*>(iter
);
2060 tracepoint(librados
, rados_getxattrs_end_exit
);
2062 LIBRADOS_C_API_BASE_DEFAULT(rados_getxattrs_end
);
2064 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_setxattr
)(
2071 tracepoint(librados
, rados_setxattr_enter
, io
, o
, name
, buf
, len
);
2072 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2075 bl
.append(buf
, len
);
2076 int retval
= ctx
->setxattr(oid
, name
, bl
);
2077 tracepoint(librados
, rados_setxattr_exit
, retval
);
2080 LIBRADOS_C_API_BASE_DEFAULT(rados_setxattr
);
2082 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_rmxattr
)(
2087 tracepoint(librados
, rados_rmxattr_enter
, io
, o
, name
);
2088 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2090 int retval
= ctx
->rmxattr(oid
, name
);
2091 tracepoint(librados
, rados_rmxattr_exit
, retval
);
2094 LIBRADOS_C_API_BASE_DEFAULT(rados_rmxattr
);
2096 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_stat
)(
2102 tracepoint(librados
, rados_stat_enter
, io
, o
);
2103 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2105 int retval
= ctx
->stat(oid
, psize
, pmtime
);
2106 tracepoint(librados
, rados_stat_exit
, retval
, psize
, pmtime
);
2109 LIBRADOS_C_API_BASE_DEFAULT(rados_stat
);
2111 extern "C" int LIBRADOS_C_API_BASE_F(rados_tmap_update
)(
2117 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2120 cmdbl
.append(cmdbuf
, cmdbuflen
);
2121 return ctx
->tmap_update(oid
, cmdbl
);
2123 LIBRADOS_C_API_BASE(rados_tmap_update
);
2125 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_tmap_update
)(
2133 LIBRADOS_C_API_DEFAULT(rados_tmap_update
, 14.2.0);
2135 extern "C" int LIBRADOS_C_API_BASE_F(rados_tmap_put
)(
2142 bl
.append(buf
, buflen
);
2145 std::map
<std::string
, bufferlist
> m
;
2146 bufferlist::const_iterator bl_it
= bl
.begin();
2147 decode(header
, bl_it
);
2151 encode(header
, out_bl
);
2154 return LIBRADOS_C_API_DEFAULT_F(rados_write_full
)(
2155 io
, o
, out_bl
.c_str(), out_bl
.length());
2157 LIBRADOS_C_API_BASE(rados_tmap_put
);
2159 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_tmap_put
)(
2167 LIBRADOS_C_API_DEFAULT(rados_tmap_put
, 14.2.0);
2169 extern "C" int LIBRADOS_C_API_BASE_F(rados_tmap_get
)(
2175 return LIBRADOS_C_API_DEFAULT_F(rados_read
)(io
, o
, buf
, buflen
, 0);
2177 LIBRADOS_C_API_BASE(rados_tmap_get
);
2179 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_tmap_get
)(
2187 LIBRADOS_C_API_DEFAULT(rados_tmap_get
, 14.2.0);
2189 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_exec
)(
2199 tracepoint(librados
, rados_exec_enter
, io
, o
, cls
, method
, inbuf
, in_len
, out_len
);
2200 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2202 bufferlist inbl
, outbl
;
2204 inbl
.append(inbuf
, in_len
);
2205 ret
= ctx
->exec(oid
, cls
, method
, inbl
, outbl
);
2207 if (outbl
.length()) {
2208 if (outbl
.length() > out_len
) {
2209 tracepoint(librados
, rados_exec_exit
, -ERANGE
, buf
, 0);
2212 outbl
.begin().copy(outbl
.length(), buf
);
2213 ret
= outbl
.length(); // hrm :/
2216 tracepoint(librados
, rados_exec_exit
, ret
, buf
, ret
);
2219 LIBRADOS_C_API_BASE_DEFAULT(rados_exec
);
2221 extern "C" rados_object_list_cursor
LIBRADOS_C_API_DEFAULT_F(rados_object_list_begin
)(
2224 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2226 hobject_t
*result
= new hobject_t(ctx
->objecter
->enumerate_objects_begin());
2227 return (rados_object_list_cursor
)result
;
2229 LIBRADOS_C_API_BASE_DEFAULT(rados_object_list_begin
);
2231 extern "C" rados_object_list_cursor
LIBRADOS_C_API_DEFAULT_F(rados_object_list_end
)(
2234 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2236 hobject_t
*result
= new hobject_t(ctx
->objecter
->enumerate_objects_end());
2237 return (rados_object_list_cursor
)result
;
2239 LIBRADOS_C_API_BASE_DEFAULT(rados_object_list_end
);
2241 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_object_list_is_end
)(
2243 rados_object_list_cursor cur
)
2245 hobject_t
*hobj
= (hobject_t
*)cur
;
2246 return hobj
->is_max();
2248 LIBRADOS_C_API_BASE_DEFAULT(rados_object_list_is_end
);
2250 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_object_list_cursor_free
)(
2252 rados_object_list_cursor cur
)
2254 hobject_t
*hobj
= (hobject_t
*)cur
;
2257 LIBRADOS_C_API_BASE_DEFAULT(rados_object_list_cursor_free
);
2259 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_object_list_cursor_cmp
)(
2261 rados_object_list_cursor lhs_cur
,
2262 rados_object_list_cursor rhs_cur
)
2264 hobject_t
*lhs
= (hobject_t
*)lhs_cur
;
2265 hobject_t
*rhs
= (hobject_t
*)rhs_cur
;
2266 return cmp(*lhs
, *rhs
);
2268 LIBRADOS_C_API_BASE_DEFAULT(rados_object_list_cursor_cmp
);
2270 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_object_list
)(rados_ioctx_t io
,
2271 const rados_object_list_cursor start
,
2272 const rados_object_list_cursor finish
,
2273 const size_t result_item_count
,
2274 const char *filter_buf
,
2275 const size_t filter_buf_len
,
2276 rados_object_list_item
*result_items
,
2277 rados_object_list_cursor
*next
)
2281 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2283 // Zero out items so that they will be safe to free later
2284 // FIPS zeroization audit 20191116: this memset is not security related.
2285 memset(result_items
, 0, sizeof(rados_object_list_item
) * result_item_count
);
2287 bufferlist filter_bl
;
2288 if (filter_buf
!= nullptr) {
2289 filter_bl
.append(filter_buf
, filter_buf_len
);
2292 ceph::async::waiter
<boost::system::error_code
,
2293 std::vector
<librados::ListObjectImpl
>,
2295 ctx
->objecter
->enumerate_objects
<librados::ListObjectImpl
>(
2298 *((hobject_t
*)start
),
2299 *((hobject_t
*)finish
),
2304 hobject_t
*next_hobj
= (hobject_t
*)(*next
);
2305 ceph_assert(next_hobj
);
2307 auto [ec
, result
, next_hash
] = w
.wait();
2310 *next_hobj
= hobject_t::get_max();
2311 return ceph::from_error_code(ec
);
2314 ceph_assert(result
.size() <= result_item_count
); // Don't overflow!
2317 for (auto i
= result
.begin(); i
!= result
.end(); ++i
) {
2318 rados_object_list_item
&item
= result_items
[k
++];
2319 do_out_buffer(i
->oid
, &item
.oid
, &item
.oid_length
);
2320 do_out_buffer(i
->nspace
, &item
.nspace
, &item
.nspace_length
);
2321 do_out_buffer(i
->locator
, &item
.locator
, &item
.locator_length
);
2324 *next_hobj
= next_hash
;
2326 return result
.size();
2328 LIBRADOS_C_API_BASE_DEFAULT(rados_object_list
);
2330 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_object_list_free
)(
2331 const size_t result_size
,
2332 rados_object_list_item
*results
)
2334 ceph_assert(results
);
2336 for (unsigned int i
= 0; i
< result_size
; ++i
) {
2337 LIBRADOS_C_API_DEFAULT_F(rados_buffer_free
)(results
[i
].oid
);
2338 LIBRADOS_C_API_DEFAULT_F(rados_buffer_free
)(results
[i
].locator
);
2339 LIBRADOS_C_API_DEFAULT_F(rados_buffer_free
)(results
[i
].nspace
);
2342 LIBRADOS_C_API_BASE_DEFAULT(rados_object_list_free
);
2346 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_nobjects_list_open
)(
2348 rados_list_ctx_t
*listh
)
2350 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2352 tracepoint(librados
, rados_nobjects_list_open_enter
, io
);
2354 Objecter::NListContext
*h
= new Objecter::NListContext
;
2355 h
->pool_id
= ctx
->poolid
;
2356 h
->pool_snap_seq
= ctx
->snap_seq
;
2357 h
->nspace
= ctx
->oloc
.nspace
; // After dropping compatibility need nspace
2358 *listh
= (void *)new librados::ObjListCtx(ctx
, h
);
2359 tracepoint(librados
, rados_nobjects_list_open_exit
, 0, *listh
);
2362 LIBRADOS_C_API_BASE_DEFAULT(rados_nobjects_list_open
);
2364 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_nobjects_list_close
)(
2367 tracepoint(librados
, rados_nobjects_list_close_enter
, h
);
2368 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)h
;
2370 tracepoint(librados
, rados_nobjects_list_close_exit
);
2372 LIBRADOS_C_API_BASE_DEFAULT(rados_nobjects_list_close
);
2374 extern "C" uint32_t LIBRADOS_C_API_DEFAULT_F(rados_nobjects_list_seek
)(
2375 rados_list_ctx_t listctx
,
2378 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
2379 tracepoint(librados
, rados_nobjects_list_seek_enter
, listctx
, pos
);
2380 uint32_t r
= lh
->ctx
->nlist_seek(lh
->nlc
, pos
);
2381 tracepoint(librados
, rados_nobjects_list_seek_exit
, r
);
2384 LIBRADOS_C_API_BASE_DEFAULT(rados_nobjects_list_seek
);
2386 extern "C" uint32_t LIBRADOS_C_API_DEFAULT_F(rados_nobjects_list_seek_cursor
)(
2387 rados_list_ctx_t listctx
,
2388 rados_object_list_cursor cursor
)
2390 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
2392 tracepoint(librados
, rados_nobjects_list_seek_cursor_enter
, listctx
);
2393 uint32_t r
= lh
->ctx
->nlist_seek(lh
->nlc
, cursor
);
2394 tracepoint(librados
, rados_nobjects_list_seek_cursor_exit
, r
);
2397 LIBRADOS_C_API_BASE_DEFAULT(rados_nobjects_list_seek_cursor
);
2399 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_nobjects_list_get_cursor
)(
2400 rados_list_ctx_t listctx
,
2401 rados_object_list_cursor
*cursor
)
2403 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
2405 tracepoint(librados
, rados_nobjects_list_get_cursor_enter
, listctx
);
2406 *cursor
= lh
->ctx
->nlist_get_cursor(lh
->nlc
);
2407 tracepoint(librados
, rados_nobjects_list_get_cursor_exit
, 0);
2410 LIBRADOS_C_API_BASE_DEFAULT(rados_nobjects_list_get_cursor
);
2412 extern "C" uint32_t LIBRADOS_C_API_DEFAULT_F(rados_nobjects_list_get_pg_hash_position
)(
2413 rados_list_ctx_t listctx
)
2415 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
2416 tracepoint(librados
, rados_nobjects_list_get_pg_hash_position_enter
, listctx
);
2417 uint32_t retval
= lh
->nlc
->get_pg_hash_position();
2418 tracepoint(librados
, rados_nobjects_list_get_pg_hash_position_exit
, retval
);
2421 LIBRADOS_C_API_BASE_DEFAULT(rados_nobjects_list_get_pg_hash_position
);
2423 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_nobjects_list_next
)(
2424 rados_list_ctx_t listctx
,
2427 const char **nspace
)
2429 tracepoint(librados
, rados_nobjects_list_next_enter
, listctx
);
2430 uint32_t retval
= rados_nobjects_list_next2(listctx
, entry
, key
, nspace
, NULL
, NULL
, NULL
);
2431 tracepoint(librados
, rados_nobjects_list_next_exit
, 0, *entry
, key
, nspace
);
2434 LIBRADOS_C_API_BASE_DEFAULT(rados_nobjects_list_next
);
2436 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_nobjects_list_next2
)(
2437 rados_list_ctx_t listctx
,
2440 const char **nspace
,
2443 size_t *nspace_size
)
2445 tracepoint(librados
, rados_nobjects_list_next2_enter
, listctx
);
2446 librados::ObjListCtx
*lh
= (librados::ObjListCtx
*)listctx
;
2447 Objecter::NListContext
*h
= lh
->nlc
;
2449 // if the list is non-empty, this method has been called before
2450 if (!h
->list
.empty())
2451 // so let's kill the previously-returned object
2452 h
->list
.pop_front();
2454 if (h
->list
.empty()) {
2455 int ret
= lh
->ctx
->nlist(lh
->nlc
, RADOS_LIST_MAX_ENTRIES
);
2457 tracepoint(librados
, rados_nobjects_list_next2_exit
, ret
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
2460 if (h
->list
.empty()) {
2461 tracepoint(librados
, rados_nobjects_list_next2_exit
, -ENOENT
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
2466 *entry
= h
->list
.front().oid
.c_str();
2469 if (h
->list
.front().locator
.size())
2470 *key
= h
->list
.front().locator
.c_str();
2475 *nspace
= h
->list
.front().nspace
.c_str();
2478 *entry_size
= h
->list
.front().oid
.size();
2480 *key_size
= h
->list
.front().locator
.size();
2482 *nspace_size
= h
->list
.front().nspace
.size();
2484 tracepoint(librados
, rados_nobjects_list_next2_exit
, 0, entry
, key
, nspace
,
2485 entry_size
, key_size
, nspace_size
);
2488 LIBRADOS_C_API_BASE_DEFAULT(rados_nobjects_list_next2
);
2492 * removed legacy v2 list objects stubs
2494 * thse return -ENOTSUP where possible.
2496 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_objects_list_open
)(
2498 rados_list_ctx_t
*ctx
)
2502 LIBRADOS_C_API_BASE_DEFAULT(rados_objects_list_open
);
2504 extern "C" uint32_t LIBRADOS_C_API_DEFAULT_F(rados_objects_list_get_pg_hash_position
)(
2505 rados_list_ctx_t ctx
)
2509 LIBRADOS_C_API_BASE_DEFAULT(rados_objects_list_get_pg_hash_position
);
2511 extern "C" uint32_t LIBRADOS_C_API_DEFAULT_F(rados_objects_list_seek
)(
2512 rados_list_ctx_t ctx
,
2517 LIBRADOS_C_API_BASE_DEFAULT(rados_objects_list_seek
);
2519 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_objects_list_next
)(
2520 rados_list_ctx_t ctx
,
2526 LIBRADOS_C_API_BASE_DEFAULT(rados_objects_list_next
);
2528 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_objects_list_close
)(
2529 rados_list_ctx_t ctx
)
2532 LIBRADOS_C_API_BASE_DEFAULT(rados_objects_list_close
);
2535 // -------------------------
2538 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_create_completion
)(
2540 rados_callback_t cb_complete
,
2541 rados_callback_t cb_safe
,
2542 rados_completion_t
*pc
)
2544 tracepoint(librados
, rados_aio_create_completion_enter
, cb_arg
, cb_complete
, cb_safe
);
2545 librados::AioCompletionImpl
*c
= new librados::AioCompletionImpl
;
2547 c
->set_complete_callback(cb_arg
, cb_complete
);
2549 c
->set_safe_callback(cb_arg
, cb_safe
);
2551 tracepoint(librados
, rados_aio_create_completion_exit
, 0, *pc
);
2554 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_create_completion
);
2556 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_create_completion2
)(
2558 rados_callback_t cb_complete
,
2559 rados_completion_t
*pc
)
2561 tracepoint(librados
, rados_aio_create_completion2_enter
, cb_arg
, cb_complete
);
2562 librados::AioCompletionImpl
*c
= new librados::AioCompletionImpl
;
2564 c
->set_complete_callback(cb_arg
, cb_complete
);
2566 tracepoint(librados
, rados_aio_create_completion2_exit
, 0, *pc
);
2569 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_create_completion2
);
2571 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_wait_for_complete
)(
2572 rados_completion_t c
)
2574 tracepoint(librados
, rados_aio_wait_for_complete_enter
, c
);
2575 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_complete();
2576 tracepoint(librados
, rados_aio_wait_for_complete_exit
, retval
);
2579 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_wait_for_complete
);
2581 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_wait_for_safe
)(
2582 rados_completion_t c
)
2584 tracepoint(librados
, rados_aio_wait_for_safe_enter
, c
);
2585 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_complete();
2586 tracepoint(librados
, rados_aio_wait_for_safe_exit
, retval
);
2589 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_wait_for_safe
);
2591 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_is_complete
)(
2592 rados_completion_t c
)
2594 tracepoint(librados
, rados_aio_is_complete_enter
, c
);
2595 int retval
= ((librados::AioCompletionImpl
*)c
)->is_complete();
2596 tracepoint(librados
, rados_aio_is_complete_exit
, retval
);
2599 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_is_complete
);
2601 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_is_safe
)(
2602 rados_completion_t c
)
2604 tracepoint(librados
, rados_aio_is_safe_enter
, c
);
2605 int retval
= ((librados::AioCompletionImpl
*)c
)->is_safe();
2606 tracepoint(librados
, rados_aio_is_safe_exit
, retval
);
2609 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_is_safe
);
2611 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_wait_for_complete_and_cb
)(
2612 rados_completion_t c
)
2614 tracepoint(librados
, rados_aio_wait_for_complete_and_cb_enter
, c
);
2615 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_complete_and_cb();
2616 tracepoint(librados
, rados_aio_wait_for_complete_and_cb_exit
, retval
);
2619 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_wait_for_complete_and_cb
);
2621 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_wait_for_safe_and_cb
)(
2622 rados_completion_t c
)
2624 tracepoint(librados
, rados_aio_wait_for_safe_and_cb_enter
, c
);
2625 int retval
= ((librados::AioCompletionImpl
*)c
)->wait_for_safe_and_cb();
2626 tracepoint(librados
, rados_aio_wait_for_safe_and_cb_exit
, retval
);
2629 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_wait_for_safe_and_cb
);
2631 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_is_complete_and_cb
)(
2632 rados_completion_t c
)
2634 tracepoint(librados
, rados_aio_is_complete_and_cb_enter
, c
);
2635 int retval
= ((librados::AioCompletionImpl
*)c
)->is_complete_and_cb();
2636 tracepoint(librados
, rados_aio_is_complete_and_cb_exit
, retval
);
2639 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_is_complete_and_cb
);
2641 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_is_safe_and_cb
)(
2642 rados_completion_t c
)
2644 tracepoint(librados
, rados_aio_is_safe_and_cb_enter
, c
);
2645 int retval
= ((librados::AioCompletionImpl
*)c
)->is_safe_and_cb();
2646 tracepoint(librados
, rados_aio_is_safe_and_cb_exit
, retval
);
2649 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_is_safe_and_cb
);
2651 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_get_return_value
)(
2652 rados_completion_t c
)
2654 tracepoint(librados
, rados_aio_get_return_value_enter
, c
);
2655 int retval
= ((librados::AioCompletionImpl
*)c
)->get_return_value();
2656 tracepoint(librados
, rados_aio_get_return_value_exit
, retval
);
2659 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_get_return_value
);
2661 extern "C" uint64_t LIBRADOS_C_API_DEFAULT_F(rados_aio_get_version
)(
2662 rados_completion_t c
)
2664 tracepoint(librados
, rados_aio_get_version_enter
, c
);
2665 uint64_t retval
= ((librados::AioCompletionImpl
*)c
)->get_version();
2666 tracepoint(librados
, rados_aio_get_version_exit
, retval
);
2669 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_get_version
);
2671 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_aio_release
)(
2672 rados_completion_t c
)
2674 tracepoint(librados
, rados_aio_release_enter
, c
);
2675 ((librados::AioCompletionImpl
*)c
)->put();
2676 tracepoint(librados
, rados_aio_release_exit
);
2678 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_release
);
2680 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_read
)(
2681 rados_ioctx_t io
, const char *o
,
2682 rados_completion_t completion
,
2683 char *buf
, size_t len
, uint64_t off
)
2685 tracepoint(librados
, rados_aio_read_enter
, io
, o
, completion
, len
, off
);
2686 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2688 int retval
= ctx
->aio_read(oid
, (librados::AioCompletionImpl
*)completion
,
2689 buf
, len
, off
, ctx
->snap_seq
);
2690 tracepoint(librados
, rados_aio_read_exit
, retval
);
2693 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_read
);
2696 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_read_traced
)(
2697 rados_ioctx_t io
, const char *o
,
2698 rados_completion_t completion
,
2699 char *buf
, size_t len
, uint64_t off
,
2700 struct blkin_trace_info
*info
)
2702 tracepoint(librados
, rados_aio_read_enter
, io
, o
, completion
, len
, off
);
2703 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2705 int retval
= ctx
->aio_read(oid
, (librados::AioCompletionImpl
*)completion
,
2706 buf
, len
, off
, ctx
->snap_seq
, info
);
2707 tracepoint(librados
, rados_aio_read_exit
, retval
);
2710 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_read_traced
);
2713 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_write
)(
2714 rados_ioctx_t io
, const char *o
,
2715 rados_completion_t completion
,
2716 const char *buf
, size_t len
, uint64_t off
)
2718 tracepoint(librados
, rados_aio_write_enter
, io
, o
, completion
, buf
, len
, off
);
2719 if (len
> UINT_MAX
/2)
2721 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2724 bl
.append(buf
, len
);
2725 int retval
= ctx
->aio_write(oid
, (librados::AioCompletionImpl
*)completion
,
2727 tracepoint(librados
, rados_aio_write_exit
, retval
);
2730 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_write
);
2733 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_write_traced
)(
2734 rados_ioctx_t io
, const char *o
,
2735 rados_completion_t completion
,
2736 const char *buf
, size_t len
, uint64_t off
,
2737 struct blkin_trace_info
*info
)
2739 tracepoint(librados
, rados_aio_write_enter
, io
, o
, completion
, buf
, len
, off
);
2740 if (len
> UINT_MAX
/2)
2742 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2745 bl
.append(buf
, len
);
2746 int retval
= ctx
->aio_write(oid
, (librados::AioCompletionImpl
*)completion
,
2747 bl
, len
, off
, info
);
2748 tracepoint(librados
, rados_aio_write_exit
, retval
);
2751 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_write_traced
);
2754 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_append
)(
2755 rados_ioctx_t io
, const char *o
,
2756 rados_completion_t completion
,
2757 const char *buf
, size_t len
)
2759 tracepoint(librados
, rados_aio_append_enter
, io
, o
, completion
, buf
, len
);
2760 if (len
> UINT_MAX
/2)
2762 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2765 bl
.append(buf
, len
);
2766 int retval
= ctx
->aio_append(oid
, (librados::AioCompletionImpl
*)completion
,
2768 tracepoint(librados
, rados_aio_append_exit
, retval
);
2771 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_append
);
2773 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_write_full
)(
2774 rados_ioctx_t io
, const char *o
,
2775 rados_completion_t completion
,
2776 const char *buf
, size_t len
)
2778 tracepoint(librados
, rados_aio_write_full_enter
, io
, o
, completion
, buf
, len
);
2779 if (len
> UINT_MAX
/2)
2781 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2784 bl
.append(buf
, len
);
2785 int retval
= ctx
->aio_write_full(oid
, (librados::AioCompletionImpl
*)completion
, bl
);
2786 tracepoint(librados
, rados_aio_write_full_exit
, retval
);
2789 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_write_full
);
2791 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_writesame
)(
2792 rados_ioctx_t io
, const char *o
,
2793 rados_completion_t completion
,
2794 const char *buf
, size_t data_len
,
2795 size_t write_len
, uint64_t off
)
2797 tracepoint(librados
, rados_aio_writesame_enter
, io
, o
, completion
, buf
,
2798 data_len
, write_len
, off
);
2799 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2802 bl
.append(buf
, data_len
);
2803 int retval
= ctx
->aio_writesame(o
, (librados::AioCompletionImpl
*)completion
,
2804 bl
, write_len
, off
);
2805 tracepoint(librados
, rados_aio_writesame_exit
, retval
);
2808 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_writesame
);
2810 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_remove
)(
2811 rados_ioctx_t io
, const char *o
,
2812 rados_completion_t completion
)
2814 tracepoint(librados
, rados_aio_remove_enter
, io
, o
, completion
);
2815 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2817 int retval
= ctx
->aio_remove(oid
, (librados::AioCompletionImpl
*)completion
);
2818 tracepoint(librados
, rados_aio_remove_exit
, retval
);
2821 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_remove
);
2823 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_flush_async
)(
2825 rados_completion_t completion
)
2827 tracepoint(librados
, rados_aio_flush_async_enter
, io
, completion
);
2828 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2829 ctx
->flush_aio_writes_async((librados::AioCompletionImpl
*)completion
);
2830 tracepoint(librados
, rados_aio_flush_async_exit
, 0);
2833 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_flush_async
);
2835 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_flush
)(rados_ioctx_t io
)
2837 tracepoint(librados
, rados_aio_flush_enter
, io
);
2838 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2839 ctx
->flush_aio_writes();
2840 tracepoint(librados
, rados_aio_flush_exit
, 0);
2843 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_flush
);
2845 struct AioGetxattrData
{
2846 AioGetxattrData(char* buf
, rados_completion_t c
, size_t l
) :
2847 user_buf(buf
), len(l
), user_completion((librados::AioCompletionImpl
*)c
) {}
2851 struct librados::CB_AioCompleteAndSafe user_completion
;
2854 static void rados_aio_getxattr_complete(rados_completion_t c
, void *arg
) {
2855 AioGetxattrData
*cdata
= reinterpret_cast<AioGetxattrData
*>(arg
);
2856 int rc
= LIBRADOS_C_API_DEFAULT_F(rados_aio_get_return_value
)(c
);
2858 if (cdata
->bl
.length() > cdata
->len
) {
2861 if (!cdata
->bl
.is_provided_buffer(cdata
->user_buf
))
2862 cdata
->bl
.begin().copy(cdata
->bl
.length(), cdata
->user_buf
);
2863 rc
= cdata
->bl
.length();
2866 cdata
->user_completion(rc
);
2867 reinterpret_cast<librados::AioCompletionImpl
*>(c
)->put();
2871 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_getxattr
)(
2872 rados_ioctx_t io
, const char *o
,
2873 rados_completion_t completion
,
2874 const char *name
, char *buf
, size_t len
)
2876 tracepoint(librados
, rados_aio_getxattr_enter
, io
, o
, completion
, name
, len
);
2877 // create data object to be passed to async callback
2878 AioGetxattrData
*cdata
= new AioGetxattrData(buf
, completion
, len
);
2880 tracepoint(librados
, rados_aio_getxattr_exit
, -ENOMEM
, NULL
, 0);
2883 cdata
->bl
.push_back(buffer::create_static(len
, buf
));
2884 // create completion callback
2885 librados::AioCompletionImpl
*c
= new librados::AioCompletionImpl
;
2886 c
->set_complete_callback(cdata
, rados_aio_getxattr_complete
);
2887 // call async getxattr of IoCtx
2888 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2890 int ret
= ctx
->aio_getxattr(oid
, c
, name
, cdata
->bl
);
2891 tracepoint(librados
, rados_aio_getxattr_exit
, ret
, buf
, ret
);
2894 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_getxattr
);
2897 struct AioGetxattrsData
{
2898 AioGetxattrsData(rados_completion_t c
, rados_xattrs_iter_t
*_iter
) :
2899 iter(_iter
), user_completion((librados::AioCompletionImpl
*)c
) {
2900 it
= new librados::RadosXattrsIter();
2902 ~AioGetxattrsData() {
2905 librados::RadosXattrsIter
*it
;
2906 rados_xattrs_iter_t
*iter
;
2907 struct librados::CB_AioCompleteAndSafe user_completion
;
2911 static void rados_aio_getxattrs_complete(rados_completion_t c
, void *arg
) {
2912 AioGetxattrsData
*cdata
= reinterpret_cast<AioGetxattrsData
*>(arg
);
2913 int rc
= LIBRADOS_C_API_DEFAULT_F(rados_aio_get_return_value
)(c
);
2915 cdata
->user_completion(rc
);
2917 cdata
->it
->i
= cdata
->it
->attrset
.begin();
2918 *cdata
->iter
= cdata
->it
;
2920 cdata
->user_completion(0);
2922 reinterpret_cast<librados::AioCompletionImpl
*>(c
)->put();
2926 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_getxattrs
)(
2927 rados_ioctx_t io
, const char *oid
,
2928 rados_completion_t completion
,
2929 rados_xattrs_iter_t
*iter
)
2931 tracepoint(librados
, rados_aio_getxattrs_enter
, io
, oid
, completion
);
2932 // create data object to be passed to async callback
2933 AioGetxattrsData
*cdata
= new AioGetxattrsData(completion
, iter
);
2935 tracepoint(librados
, rados_getxattrs_exit
, -ENOMEM
, NULL
);
2938 // create completion callback
2939 librados::AioCompletionImpl
*c
= new librados::AioCompletionImpl
;
2940 c
->set_complete_callback(cdata
, rados_aio_getxattrs_complete
);
2941 // call async getxattrs of IoCtx
2942 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2944 int ret
= ctx
->aio_getxattrs(obj
, c
, cdata
->it
->attrset
);
2945 tracepoint(librados
, rados_aio_getxattrs_exit
, ret
, cdata
->it
);
2948 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_getxattrs
);
2950 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_setxattr
)(
2951 rados_ioctx_t io
, const char *o
,
2952 rados_completion_t completion
,
2953 const char *name
, const char *buf
, size_t len
)
2955 tracepoint(librados
, rados_aio_setxattr_enter
, io
, o
, completion
, name
, buf
, len
);
2956 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2959 bl
.append(buf
, len
);
2960 int retval
= ctx
->aio_setxattr(oid
, (librados::AioCompletionImpl
*)completion
, name
, bl
);
2961 tracepoint(librados
, rados_aio_setxattr_exit
, retval
);
2964 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_setxattr
);
2966 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_rmxattr
)(
2967 rados_ioctx_t io
, const char *o
,
2968 rados_completion_t completion
,
2971 tracepoint(librados
, rados_aio_rmxattr_enter
, io
, o
, completion
, name
);
2972 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2974 int retval
= ctx
->aio_rmxattr(oid
, (librados::AioCompletionImpl
*)completion
, name
);
2975 tracepoint(librados
, rados_aio_rmxattr_exit
, retval
);
2978 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_rmxattr
);
2980 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_stat
)(
2981 rados_ioctx_t io
, const char *o
,
2982 rados_completion_t completion
,
2983 uint64_t *psize
, time_t *pmtime
)
2985 tracepoint(librados
, rados_aio_stat_enter
, io
, o
, completion
);
2986 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
2988 int retval
= ctx
->aio_stat(oid
, (librados::AioCompletionImpl
*)completion
,
2990 tracepoint(librados
, rados_aio_stat_exit
, retval
);
2993 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_stat
);
2995 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_cmpext
)(
2996 rados_ioctx_t io
, const char *o
,
2997 rados_completion_t completion
, const char *cmp_buf
,
2998 size_t cmp_len
, uint64_t off
)
3000 tracepoint(librados
, rados_aio_cmpext_enter
, io
, o
, completion
, cmp_buf
,
3002 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3004 int retval
= ctx
->aio_cmpext(oid
, (librados::AioCompletionImpl
*)completion
,
3005 cmp_buf
, cmp_len
, off
);
3006 tracepoint(librados
, rados_aio_cmpext_exit
, retval
);
3009 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_cmpext
);
3011 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_cancel
)(
3013 rados_completion_t completion
)
3015 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3016 return ctx
->aio_cancel((librados::AioCompletionImpl
*)completion
);
3018 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_cancel
);
3020 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_exec
)(
3021 rados_ioctx_t io
, const char *o
,
3022 rados_completion_t completion
,
3023 const char *cls
, const char *method
,
3024 const char *inbuf
, size_t in_len
,
3025 char *buf
, size_t out_len
)
3027 tracepoint(librados
, rados_aio_exec_enter
, io
, o
, completion
);
3028 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3031 inbl
.append(inbuf
, in_len
);
3032 int retval
= ctx
->aio_exec(oid
, (librados::AioCompletionImpl
*)completion
,
3033 cls
, method
, inbl
, buf
, out_len
);
3034 tracepoint(librados
, rados_aio_exec_exit
, retval
);
3037 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_exec
);
3039 struct C_WatchCB
: public librados::WatchCtx
{
3040 rados_watchcb_t wcb
;
3042 C_WatchCB(rados_watchcb_t _wcb
, void *_arg
) : wcb(_wcb
), arg(_arg
) {}
3043 void notify(uint8_t opcode
, uint64_t ver
, bufferlist
& bl
) override
{
3044 wcb(opcode
, ver
, arg
);
3048 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_watch
)(
3049 rados_ioctx_t io
, const char *o
, uint64_t ver
,
3051 rados_watchcb_t watchcb
, void *arg
)
3053 tracepoint(librados
, rados_watch_enter
, io
, o
, ver
, watchcb
, arg
);
3054 uint64_t *cookie
= handle
;
3055 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3057 C_WatchCB
*wc
= new C_WatchCB(watchcb
, arg
);
3058 int retval
= ctx
->watch(oid
, cookie
, wc
, NULL
, true);
3059 tracepoint(librados
, rados_watch_exit
, retval
, *handle
);
3062 LIBRADOS_C_API_BASE_DEFAULT(rados_watch
);
3064 struct C_WatchCB2
: public librados::WatchCtx2
{
3065 rados_watchcb2_t wcb
;
3066 rados_watcherrcb_t errcb
;
3068 C_WatchCB2(rados_watchcb2_t _wcb
,
3069 rados_watcherrcb_t _errcb
,
3070 void *_arg
) : wcb(_wcb
), errcb(_errcb
), arg(_arg
) {}
3071 void handle_notify(uint64_t notify_id
,
3073 uint64_t notifier_gid
,
3074 bufferlist
& bl
) override
{
3075 wcb(arg
, notify_id
, cookie
, notifier_gid
, bl
.c_str(), bl
.length());
3077 void handle_error(uint64_t cookie
, int err
) override
{
3079 errcb(arg
, cookie
, err
);
3083 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_watch3
)(
3084 rados_ioctx_t io
, const char *o
, uint64_t *handle
,
3085 rados_watchcb2_t watchcb
,
3086 rados_watcherrcb_t watcherrcb
,
3090 tracepoint(librados
, rados_watch3_enter
, io
, o
, handle
, watchcb
, timeout
, arg
);
3092 if (!watchcb
|| !o
|| !handle
) {
3095 uint64_t *cookie
= handle
;
3096 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3098 C_WatchCB2
*wc
= new C_WatchCB2(watchcb
, watcherrcb
, arg
);
3099 ret
= ctx
->watch(oid
, cookie
, NULL
, wc
, timeout
, true);
3101 tracepoint(librados
, rados_watch3_exit
, ret
, handle
? *handle
: 0);
3104 LIBRADOS_C_API_BASE_DEFAULT(rados_watch3
);
3106 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_watch2
)(
3107 rados_ioctx_t io
, const char *o
, uint64_t *handle
,
3108 rados_watchcb2_t watchcb
,
3109 rados_watcherrcb_t watcherrcb
,
3112 return LIBRADOS_C_API_DEFAULT_F(rados_watch3
)(
3113 io
, o
, handle
, watchcb
, watcherrcb
, 0, arg
);
3115 LIBRADOS_C_API_BASE_DEFAULT(rados_watch2
);
3117 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_watch2
)(
3118 rados_ioctx_t io
, const char *o
,
3119 rados_completion_t completion
,
3121 rados_watchcb2_t watchcb
,
3122 rados_watcherrcb_t watcherrcb
,
3123 uint32_t timeout
, void *arg
)
3125 tracepoint(librados
, rados_aio_watch2_enter
, io
, o
, completion
, handle
, watchcb
, timeout
, arg
);
3127 if (!completion
|| !watchcb
|| !o
|| !handle
) {
3130 uint64_t *cookie
= handle
;
3131 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3133 librados::AioCompletionImpl
*c
=
3134 reinterpret_cast<librados::AioCompletionImpl
*>(completion
);
3135 C_WatchCB2
*wc
= new C_WatchCB2(watchcb
, watcherrcb
, arg
);
3136 ret
= ctx
->aio_watch(oid
, c
, cookie
, NULL
, wc
, timeout
, true);
3138 tracepoint(librados
, rados_aio_watch2_exit
, ret
, handle
? *handle
: 0);
3141 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_watch2
);
3143 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_watch
)(
3144 rados_ioctx_t io
, const char *o
,
3145 rados_completion_t completion
,
3147 rados_watchcb2_t watchcb
,
3148 rados_watcherrcb_t watcherrcb
, void *arg
)
3150 return LIBRADOS_C_API_DEFAULT_F(rados_aio_watch2
)(
3151 io
, o
, completion
, handle
, watchcb
, watcherrcb
, 0, arg
);
3153 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_watch
);
3155 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_unwatch
)(
3160 tracepoint(librados
, rados_unwatch_enter
, io
, o
, handle
);
3161 uint64_t cookie
= handle
;
3162 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3163 int retval
= ctx
->unwatch(cookie
);
3164 tracepoint(librados
, rados_unwatch_exit
, retval
);
3167 LIBRADOS_C_API_BASE_DEFAULT(rados_unwatch
);
3169 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_unwatch2
)(
3173 tracepoint(librados
, rados_unwatch2_enter
, io
, handle
);
3174 uint64_t cookie
= handle
;
3175 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3176 int retval
= ctx
->unwatch(cookie
);
3177 tracepoint(librados
, rados_unwatch2_exit
, retval
);
3180 LIBRADOS_C_API_BASE_DEFAULT(rados_unwatch2
);
3182 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_unwatch
)(
3183 rados_ioctx_t io
, uint64_t handle
,
3184 rados_completion_t completion
)
3186 tracepoint(librados
, rados_aio_unwatch_enter
, io
, handle
, completion
);
3187 uint64_t cookie
= handle
;
3188 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3189 librados::AioCompletionImpl
*c
=
3190 reinterpret_cast<librados::AioCompletionImpl
*>(completion
);
3191 int retval
= ctx
->aio_unwatch(cookie
, c
);
3192 tracepoint(librados
, rados_aio_unwatch_exit
, retval
);
3195 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_unwatch
);
3197 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_watch_check
)(
3201 tracepoint(librados
, rados_watch_check_enter
, io
, handle
);
3202 uint64_t cookie
= handle
;
3203 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3204 int retval
= ctx
->watch_check(cookie
);
3205 tracepoint(librados
, rados_watch_check_exit
, retval
);
3208 LIBRADOS_C_API_BASE_DEFAULT(rados_watch_check
);
3210 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_notify
)(
3211 rados_ioctx_t io
, const char *o
,
3212 uint64_t ver
, const char *buf
, int buf_len
)
3214 tracepoint(librados
, rados_notify_enter
, io
, o
, ver
, buf
, buf_len
);
3215 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3219 bufferptr p
= buffer::create(buf_len
);
3220 memcpy(p
.c_str(), buf
, buf_len
);
3223 int retval
= ctx
->notify(oid
, bl
, 0, NULL
, NULL
, NULL
);
3224 tracepoint(librados
, rados_notify_exit
, retval
);
3227 LIBRADOS_C_API_BASE_DEFAULT(rados_notify
);
3229 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_notify2
)(
3230 rados_ioctx_t io
, const char *o
,
3231 const char *buf
, int buf_len
,
3232 uint64_t timeout_ms
,
3233 char **reply_buffer
,
3234 size_t *reply_buffer_len
)
3236 tracepoint(librados
, rados_notify2_enter
, io
, o
, buf
, buf_len
, timeout_ms
);
3237 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3241 bufferptr p
= buffer::create(buf_len
);
3242 memcpy(p
.c_str(), buf
, buf_len
);
3245 int ret
= ctx
->notify(oid
, bl
, timeout_ms
, NULL
, reply_buffer
, reply_buffer_len
);
3246 tracepoint(librados
, rados_notify2_exit
, ret
);
3249 LIBRADOS_C_API_BASE_DEFAULT(rados_notify2
);
3251 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_decode_notify_response
)(
3252 char *reply_buffer
, size_t reply_buffer_len
,
3253 struct notify_ack_t
**acks
, size_t *nr_acks
,
3254 struct notify_timeout_t
**timeouts
, size_t *nr_timeouts
)
3256 if (!reply_buffer
|| !reply_buffer_len
) {
3261 bl
.append(reply_buffer
, reply_buffer_len
);
3263 map
<pair
<uint64_t,uint64_t>,bufferlist
> acked
;
3264 set
<pair
<uint64_t,uint64_t>> missed
;
3265 auto iter
= bl
.cbegin();
3266 decode(acked
, iter
);
3267 decode(missed
, iter
);
3270 *nr_acks
= acked
.size();
3272 *acks
= new notify_ack_t
[*nr_acks
];
3273 struct notify_ack_t
*ack
= *acks
;
3274 for (auto &[who
, payload
] : acked
) {
3275 ack
->notifier_id
= who
.first
;
3276 ack
->cookie
= who
.second
;
3277 ack
->payload
= nullptr;
3278 ack
->payload_len
= payload
.length();
3279 if (ack
->payload_len
) {
3280 ack
->payload
= (char *)malloc(ack
->payload_len
);
3281 memcpy(ack
->payload
, payload
.c_str(), ack
->payload_len
);
3288 *timeouts
= nullptr;
3289 *nr_timeouts
= missed
.size();
3291 *timeouts
= new notify_timeout_t
[*nr_timeouts
];
3292 struct notify_timeout_t
*timeout
= *timeouts
;
3293 for (auto &[notifier_id
, cookie
] : missed
) {
3294 timeout
->notifier_id
= notifier_id
;
3295 timeout
->cookie
= cookie
;
3302 LIBRADOS_C_API_BASE_DEFAULT(rados_decode_notify_response
);
3305 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_free_notify_response
)(
3306 struct notify_ack_t
*acks
, size_t nr_acks
,
3307 struct notify_timeout_t
*timeouts
)
3309 for (uint64_t n
= 0; n
< nr_acks
; ++n
) {
3311 if (acks
[n
].payload
) {
3312 free(acks
[n
].payload
);
3322 LIBRADOS_C_API_BASE_DEFAULT(rados_free_notify_response
);
3324 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_notify
)(
3325 rados_ioctx_t io
, const char *o
,
3326 rados_completion_t completion
,
3327 const char *buf
, int buf_len
,
3328 uint64_t timeout_ms
, char **reply_buffer
,
3329 size_t *reply_buffer_len
)
3331 tracepoint(librados
, rados_aio_notify_enter
, io
, o
, completion
, buf
, buf_len
,
3333 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3337 bl
.push_back(buffer::copy(buf
, buf_len
));
3339 librados::AioCompletionImpl
*c
=
3340 reinterpret_cast<librados::AioCompletionImpl
*>(completion
);
3341 int ret
= ctx
->aio_notify(oid
, c
, bl
, timeout_ms
, NULL
, reply_buffer
,
3343 tracepoint(librados
, rados_aio_notify_exit
, ret
);
3346 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_notify
);
3348 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_notify_ack
)(
3349 rados_ioctx_t io
, const char *o
,
3350 uint64_t notify_id
, uint64_t handle
,
3351 const char *buf
, int buf_len
)
3353 tracepoint(librados
, rados_notify_ack_enter
, io
, o
, notify_id
, handle
, buf
, buf_len
);
3354 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3358 bufferptr p
= buffer::create(buf_len
);
3359 memcpy(p
.c_str(), buf
, buf_len
);
3362 ctx
->notify_ack(oid
, notify_id
, handle
, bl
);
3363 tracepoint(librados
, rados_notify_ack_exit
, 0);
3366 LIBRADOS_C_API_BASE_DEFAULT(rados_notify_ack
);
3368 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_watch_flush
)(rados_t cluster
)
3370 tracepoint(librados
, rados_watch_flush_enter
, cluster
);
3371 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3372 int retval
= client
->watch_flush();
3373 tracepoint(librados
, rados_watch_flush_exit
, retval
);
3376 LIBRADOS_C_API_BASE_DEFAULT(rados_watch_flush
);
3378 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_watch_flush
)(
3380 rados_completion_t completion
)
3382 tracepoint(librados
, rados_aio_watch_flush_enter
, cluster
, completion
);
3383 librados::RadosClient
*client
= (librados::RadosClient
*)cluster
;
3384 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
3385 int retval
= client
->async_watch_flush(c
);
3386 tracepoint(librados
, rados_aio_watch_flush_exit
, retval
);
3389 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_watch_flush
);
3391 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_set_alloc_hint
)(
3392 rados_ioctx_t io
, const char *o
,
3393 uint64_t expected_object_size
,
3394 uint64_t expected_write_size
)
3396 tracepoint(librados
, rados_set_alloc_hint_enter
, io
, o
, expected_object_size
, expected_write_size
);
3397 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3399 int retval
= ctx
->set_alloc_hint(oid
, expected_object_size
,
3400 expected_write_size
, 0);
3401 tracepoint(librados
, rados_set_alloc_hint_exit
, retval
);
3404 LIBRADOS_C_API_BASE_DEFAULT(rados_set_alloc_hint
);
3406 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_set_alloc_hint2
)(
3407 rados_ioctx_t io
, const char *o
,
3408 uint64_t expected_object_size
,
3409 uint64_t expected_write_size
,
3412 tracepoint(librados
, rados_set_alloc_hint2_enter
, io
, o
, expected_object_size
, expected_write_size
, flags
);
3413 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3415 int retval
= ctx
->set_alloc_hint(oid
, expected_object_size
,
3416 expected_write_size
, flags
);
3417 tracepoint(librados
, rados_set_alloc_hint2_exit
, retval
);
3420 LIBRADOS_C_API_BASE_DEFAULT(rados_set_alloc_hint2
);
3422 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_lock_exclusive
)(
3423 rados_ioctx_t io
, const char * o
,
3424 const char * name
, const char * cookie
,
3426 struct timeval
* duration
, uint8_t flags
)
3428 tracepoint(librados
, rados_lock_exclusive_enter
, io
, o
, name
, cookie
, desc
, duration
, flags
);
3429 librados::IoCtx ctx
;
3430 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
3432 int retval
= ctx
.lock_exclusive(o
, name
, cookie
, desc
, duration
, flags
);
3433 tracepoint(librados
, rados_lock_exclusive_exit
, retval
);
3436 LIBRADOS_C_API_BASE_DEFAULT(rados_lock_exclusive
);
3438 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_lock_shared
)(
3439 rados_ioctx_t io
, const char * o
,
3440 const char * name
, const char * cookie
,
3441 const char * tag
, const char * desc
,
3442 struct timeval
* duration
, uint8_t flags
)
3444 tracepoint(librados
, rados_lock_shared_enter
, io
, o
, name
, cookie
, tag
, desc
, duration
, flags
);
3445 librados::IoCtx ctx
;
3446 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
3448 int retval
= ctx
.lock_shared(o
, name
, cookie
, tag
, desc
, duration
, flags
);
3449 tracepoint(librados
, rados_lock_shared_exit
, retval
);
3452 LIBRADOS_C_API_BASE_DEFAULT(rados_lock_shared
);
3454 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_unlock
)(
3455 rados_ioctx_t io
, const char *o
, const char *name
,
3458 tracepoint(librados
, rados_unlock_enter
, io
, o
, name
, cookie
);
3459 librados::IoCtx ctx
;
3460 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
3462 int retval
= ctx
.unlock(o
, name
, cookie
);
3463 tracepoint(librados
, rados_unlock_exit
, retval
);
3466 LIBRADOS_C_API_BASE_DEFAULT(rados_unlock
);
3468 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_unlock
)(
3469 rados_ioctx_t io
, const char *o
, const char *name
,
3470 const char *cookie
, rados_completion_t completion
)
3472 tracepoint(librados
, rados_aio_unlock_enter
, io
, o
, name
, cookie
, completion
);
3473 librados::IoCtx ctx
;
3474 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
3475 librados::AioCompletionImpl
*comp
= (librados::AioCompletionImpl
*)completion
;
3477 librados::AioCompletion
c(comp
);
3478 int retval
= ctx
.aio_unlock(o
, name
, cookie
, &c
);
3479 tracepoint(librados
, rados_aio_unlock_exit
, retval
);
3482 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_unlock
);
3484 extern "C" ssize_t
LIBRADOS_C_API_DEFAULT_F(rados_list_lockers
)(
3485 rados_ioctx_t io
, const char *o
,
3486 const char *name
, int *exclusive
,
3487 char *tag
, size_t *tag_len
,
3488 char *clients
, size_t *clients_len
,
3489 char *cookies
, size_t *cookies_len
,
3490 char *addrs
, size_t *addrs_len
)
3492 tracepoint(librados
, rados_list_lockers_enter
, io
, o
, name
, *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
3493 librados::IoCtx ctx
;
3494 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
3495 std::string name_str
= name
;
3496 std::string oid
= o
;
3497 std::string tag_str
;
3499 std::list
<librados::locker_t
> lockers
;
3500 int r
= ctx
.list_lockers(oid
, name_str
, &tmp_exclusive
, &tag_str
, &lockers
);
3502 tracepoint(librados
, rados_list_lockers_exit
, r
, *exclusive
, "", *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
3506 size_t clients_total
= 0;
3507 size_t cookies_total
= 0;
3508 size_t addrs_total
= 0;
3509 list
<librados::locker_t
>::const_iterator it
;
3510 for (it
= lockers
.begin(); it
!= lockers
.end(); ++it
) {
3511 clients_total
+= it
->client
.length() + 1;
3512 cookies_total
+= it
->cookie
.length() + 1;
3513 addrs_total
+= it
->address
.length() + 1;
3516 bool too_short
= ((clients_total
> *clients_len
) ||
3517 (cookies_total
> *cookies_len
) ||
3518 (addrs_total
> *addrs_len
) ||
3519 (tag_str
.length() + 1 > *tag_len
));
3520 *clients_len
= clients_total
;
3521 *cookies_len
= cookies_total
;
3522 *addrs_len
= addrs_total
;
3523 *tag_len
= tag_str
.length() + 1;
3525 tracepoint(librados
, rados_list_lockers_exit
, -ERANGE
, *exclusive
, "", *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
3529 strcpy(tag
, tag_str
.c_str());
3530 char *clients_p
= clients
;
3531 char *cookies_p
= cookies
;
3532 char *addrs_p
= addrs
;
3533 for (it
= lockers
.begin(); it
!= lockers
.end(); ++it
) {
3534 strcpy(clients_p
, it
->client
.c_str());
3535 strcpy(cookies_p
, it
->cookie
.c_str());
3536 strcpy(addrs_p
, it
->address
.c_str());
3537 tracepoint(librados
, rados_list_lockers_locker
, clients_p
, cookies_p
, addrs_p
);
3538 clients_p
+= it
->client
.length() + 1;
3539 cookies_p
+= it
->cookie
.length() + 1;
3540 addrs_p
+= it
->address
.length() + 1;
3547 int retval
= lockers
.size();
3548 tracepoint(librados
, rados_list_lockers_exit
, retval
, *exclusive
, tag
, *tag_len
, *clients_len
, *cookies_len
, *addrs_len
);
3551 LIBRADOS_C_API_BASE_DEFAULT(rados_list_lockers
);
3553 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_break_lock
)(
3554 rados_ioctx_t io
, const char *o
,
3555 const char *name
, const char *client
,
3558 tracepoint(librados
, rados_break_lock_enter
, io
, o
, name
, client
, cookie
);
3559 librados::IoCtx ctx
;
3560 librados::IoCtx::from_rados_ioctx_t(io
, ctx
);
3562 int retval
= ctx
.break_lock(o
, name
, client
, cookie
);
3563 tracepoint(librados
, rados_break_lock_exit
, retval
);
3566 LIBRADOS_C_API_BASE_DEFAULT(rados_break_lock
);
3568 extern "C" rados_write_op_t
LIBRADOS_C_API_DEFAULT_F(rados_create_write_op
)()
3570 tracepoint(librados
, rados_create_write_op_enter
);
3571 rados_write_op_t retval
= new (std::nothrow
)::ObjectOperation
;
3572 tracepoint(librados
, rados_create_write_op_exit
, retval
);
3575 LIBRADOS_C_API_BASE_DEFAULT(rados_create_write_op
);
3577 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_release_write_op
)(
3578 rados_write_op_t write_op
)
3580 tracepoint(librados
, rados_release_write_op_enter
, write_op
);
3581 delete (::ObjectOperation
*)write_op
;
3582 tracepoint(librados
, rados_release_write_op_exit
);
3584 LIBRADOS_C_API_BASE_DEFAULT(rados_release_write_op
);
3586 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_set_flags
)(
3587 rados_write_op_t write_op
,
3590 tracepoint(librados
, rados_write_op_set_flags_enter
, write_op
, flags
);
3591 ((::ObjectOperation
*)write_op
)->set_last_op_flags(get_op_flags(flags
));
3592 tracepoint(librados
, rados_write_op_set_flags_exit
);
3594 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_set_flags
);
3596 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_assert_version
)(
3597 rados_write_op_t write_op
,
3600 tracepoint(librados
, rados_write_op_assert_version_enter
, write_op
, ver
);
3601 ((::ObjectOperation
*)write_op
)->assert_version(ver
);
3602 tracepoint(librados
, rados_write_op_assert_version_exit
);
3604 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_assert_version
);
3606 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_assert_exists
)(
3607 rados_write_op_t write_op
)
3609 tracepoint(librados
, rados_write_op_assert_exists_enter
, write_op
);
3610 ((::ObjectOperation
*)write_op
)->stat(nullptr, nullptr, nullptr);
3611 tracepoint(librados
, rados_write_op_assert_exists_exit
);
3613 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_assert_exists
);
3615 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_cmpext
)(
3616 rados_write_op_t write_op
,
3617 const char *cmp_buf
,
3622 tracepoint(librados
, rados_write_op_cmpext_enter
, write_op
, cmp_buf
,
3623 cmp_len
, off
, prval
);
3624 ((::ObjectOperation
*)write_op
)->cmpext(off
, cmp_len
, cmp_buf
, prval
);
3625 tracepoint(librados
, rados_write_op_cmpext_exit
);
3627 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_cmpext
);
3629 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_cmpxattr
)(
3630 rados_write_op_t write_op
,
3632 uint8_t comparison_operator
,
3636 tracepoint(librados
, rados_write_op_cmpxattr_enter
, write_op
, name
, comparison_operator
, value
, value_len
);
3638 bl
.append(value
, value_len
);
3639 ((::ObjectOperation
*)write_op
)->cmpxattr(name
,
3640 comparison_operator
,
3641 CEPH_OSD_CMPXATTR_MODE_STRING
,
3643 tracepoint(librados
, rados_write_op_cmpxattr_exit
);
3645 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_cmpxattr
);
3647 static void rados_c_omap_cmp(ObjectOperation
*op
,
3649 uint8_t comparison_operator
,
3656 bl
.append(val
, val_len
);
3657 std::map
<std::string
, pair
<bufferlist
, int> > assertions
;
3658 string lkey
= string(key
, key_len
);
3660 assertions
[lkey
] = std::make_pair(bl
, comparison_operator
);
3661 op
->omap_cmp(assertions
, prval
);
3664 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_cmp
)(
3665 rados_write_op_t write_op
,
3667 uint8_t comparison_operator
,
3672 tracepoint(librados
, rados_write_op_omap_cmp_enter
, write_op
, key
, comparison_operator
, val
, val_len
, prval
);
3673 rados_c_omap_cmp((::ObjectOperation
*)write_op
, key
, comparison_operator
,
3674 val
, strlen(key
), val_len
, prval
);
3675 tracepoint(librados
, rados_write_op_omap_cmp_exit
);
3677 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_cmp
);
3679 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_cmp2
)(
3680 rados_write_op_t write_op
,
3682 uint8_t comparison_operator
,
3688 tracepoint(librados
, rados_write_op_omap_cmp_enter
, write_op
, key
, comparison_operator
, val
, val_len
, prval
);
3689 rados_c_omap_cmp((::ObjectOperation
*)write_op
, key
, comparison_operator
,
3690 val
, key_len
, val_len
, prval
);
3691 tracepoint(librados
, rados_write_op_omap_cmp_exit
);
3693 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_cmp2
);
3695 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_setxattr
)(
3696 rados_write_op_t write_op
,
3701 tracepoint(librados
, rados_write_op_setxattr_enter
, write_op
, name
, value
, value_len
);
3703 bl
.append(value
, value_len
);
3704 ((::ObjectOperation
*)write_op
)->setxattr(name
, bl
);
3705 tracepoint(librados
, rados_write_op_setxattr_exit
);
3707 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_setxattr
);
3709 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_rmxattr
)(
3710 rados_write_op_t write_op
,
3713 tracepoint(librados
, rados_write_op_rmxattr_enter
, write_op
, name
);
3714 ((::ObjectOperation
*)write_op
)->rmxattr(name
);
3715 tracepoint(librados
, rados_write_op_rmxattr_exit
);
3717 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_rmxattr
);
3719 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_create
)(
3720 rados_write_op_t write_op
,
3722 const char* category
) // unused
3724 tracepoint(librados
, rados_write_op_create_enter
, write_op
, exclusive
);
3725 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
3726 oo
->create(!!exclusive
);
3727 tracepoint(librados
, rados_write_op_create_exit
);
3729 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_create
);
3731 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_write
)(
3732 rados_write_op_t write_op
,
3737 tracepoint(librados
, rados_write_op_write_enter
, write_op
, buffer
, len
, offset
);
3739 bl
.append(buffer
,len
);
3740 ((::ObjectOperation
*)write_op
)->write(offset
, bl
);
3741 tracepoint(librados
, rados_write_op_write_exit
);
3743 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_write
);
3745 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_write_full
)(
3746 rados_write_op_t write_op
,
3750 tracepoint(librados
, rados_write_op_write_full_enter
, write_op
, buffer
, len
);
3752 bl
.append(buffer
,len
);
3753 ((::ObjectOperation
*)write_op
)->write_full(bl
);
3754 tracepoint(librados
, rados_write_op_write_full_exit
);
3756 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_write_full
);
3758 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_writesame
)(
3759 rados_write_op_t write_op
,
3765 tracepoint(librados
, rados_write_op_writesame_enter
, write_op
, buffer
, data_len
, write_len
, offset
);
3767 bl
.append(buffer
, data_len
);
3768 ((::ObjectOperation
*)write_op
)->writesame(offset
, write_len
, bl
);
3769 tracepoint(librados
, rados_write_op_writesame_exit
);
3771 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_writesame
);
3773 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_append
)(
3774 rados_write_op_t write_op
,
3778 tracepoint(librados
, rados_write_op_append_enter
, write_op
, buffer
, len
);
3780 bl
.append(buffer
,len
);
3781 ((::ObjectOperation
*)write_op
)->append(bl
);
3782 tracepoint(librados
, rados_write_op_append_exit
);
3784 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_append
);
3786 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_remove
)(
3787 rados_write_op_t write_op
)
3789 tracepoint(librados
, rados_write_op_remove_enter
, write_op
);
3790 ((::ObjectOperation
*)write_op
)->remove();
3791 tracepoint(librados
, rados_write_op_remove_exit
);
3793 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_remove
);
3795 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_truncate
)(
3796 rados_write_op_t write_op
,
3799 tracepoint(librados
, rados_write_op_truncate_enter
, write_op
, offset
);
3800 ((::ObjectOperation
*)write_op
)->truncate(offset
);
3801 tracepoint(librados
, rados_write_op_truncate_exit
);
3803 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_truncate
);
3805 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_zero
)(
3806 rados_write_op_t write_op
,
3810 tracepoint(librados
, rados_write_op_zero_enter
, write_op
, offset
, len
);
3811 ((::ObjectOperation
*)write_op
)->zero(offset
, len
);
3812 tracepoint(librados
, rados_write_op_zero_exit
);
3814 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_zero
);
3816 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_exec
)(
3817 rados_write_op_t write_op
,
3824 tracepoint(librados
, rados_write_op_exec_enter
, write_op
, cls
, method
, in_buf
, in_len
, prval
);
3826 inbl
.append(in_buf
, in_len
);
3827 ((::ObjectOperation
*)write_op
)->call(cls
, method
, inbl
, NULL
, NULL
, prval
);
3828 tracepoint(librados
, rados_write_op_exec_exit
);
3830 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_exec
);
3832 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_set
)(
3833 rados_write_op_t write_op
,
3834 char const* const* keys
,
3835 char const* const* vals
,
3839 tracepoint(librados
, rados_write_op_omap_set_enter
, write_op
, num
);
3840 std::map
<std::string
, bufferlist
> entries
;
3841 for (size_t i
= 0; i
< num
; ++i
) {
3842 tracepoint(librados
, rados_write_op_omap_set_entry
, keys
[i
], vals
[i
], lens
[i
]);
3843 bufferlist
bl(lens
[i
]);
3844 bl
.append(vals
[i
], lens
[i
]);
3845 entries
[keys
[i
]] = bl
;
3847 ((::ObjectOperation
*)write_op
)->omap_set(entries
);
3848 tracepoint(librados
, rados_write_op_omap_set_exit
);
3850 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_set
);
3852 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_set2
)(
3853 rados_write_op_t write_op
,
3854 char const* const* keys
,
3855 char const* const* vals
,
3856 const size_t *key_lens
,
3857 const size_t *val_lens
,
3860 tracepoint(librados
, rados_write_op_omap_set_enter
, write_op
, num
);
3861 std::map
<std::string
, bufferlist
> entries
;
3862 for (size_t i
= 0; i
< num
; ++i
) {
3863 bufferlist
bl(val_lens
[i
]);
3864 bl
.append(vals
[i
], val_lens
[i
]);
3865 string
key(keys
[i
], key_lens
[i
]);
3868 ((::ObjectOperation
*)write_op
)->omap_set(entries
);
3869 tracepoint(librados
, rados_write_op_omap_set_exit
);
3871 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_set2
);
3873 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_rm_keys
)(
3874 rados_write_op_t write_op
,
3875 char const* const* keys
,
3878 tracepoint(librados
, rados_write_op_omap_rm_keys_enter
, write_op
, keys_len
);
3879 for(size_t i
= 0; i
< keys_len
; i
++) {
3880 tracepoint(librados
, rados_write_op_omap_rm_keys_entry
, keys
[i
]);
3882 std::set
<std::string
> to_remove(keys
, keys
+ keys_len
);
3883 ((::ObjectOperation
*)write_op
)->omap_rm_keys(to_remove
);
3884 tracepoint(librados
, rados_write_op_omap_rm_keys_exit
);
3886 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_rm_keys
);
3888 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_rm_keys2
)(
3889 rados_write_op_t write_op
,
3890 char const* const* keys
,
3891 const size_t* key_lens
,
3894 tracepoint(librados
, rados_write_op_omap_rm_keys_enter
, write_op
, keys_len
);
3895 std::set
<std::string
> to_remove
;
3896 for(size_t i
= 0; i
< keys_len
; i
++) {
3897 to_remove
.emplace(keys
[i
], key_lens
[i
]);
3899 ((::ObjectOperation
*)write_op
)->omap_rm_keys(to_remove
);
3900 tracepoint(librados
, rados_write_op_omap_rm_keys_exit
);
3902 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_rm_keys2
);
3904 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_rm_range2
)(
3905 rados_write_op_t write_op
,
3906 const char *key_begin
,
3907 size_t key_begin_len
,
3908 const char *key_end
,
3911 tracepoint(librados
, rados_write_op_omap_rm_range_enter
,
3912 write_op
, key_begin
, key_end
);
3913 ((::ObjectOperation
*)write_op
)->omap_rm_range({key_begin
, key_begin_len
},
3914 {key_end
, key_end_len
});
3915 tracepoint(librados
, rados_write_op_omap_rm_range_exit
);
3917 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_rm_range2
);
3919 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_clear
)(
3920 rados_write_op_t write_op
)
3922 tracepoint(librados
, rados_write_op_omap_clear_enter
, write_op
);
3923 ((::ObjectOperation
*)write_op
)->omap_clear();
3924 tracepoint(librados
, rados_write_op_omap_clear_exit
);
3926 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_clear
);
3928 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_set_alloc_hint
)(
3929 rados_write_op_t write_op
,
3930 uint64_t expected_object_size
,
3931 uint64_t expected_write_size
)
3933 tracepoint(librados
, rados_write_op_set_alloc_hint_enter
, write_op
, expected_object_size
, expected_write_size
);
3934 ((::ObjectOperation
*)write_op
)->set_alloc_hint(expected_object_size
,
3935 expected_write_size
, 0);
3936 tracepoint(librados
, rados_write_op_set_alloc_hint_exit
);
3938 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_set_alloc_hint
);
3940 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_set_alloc_hint2
)(
3941 rados_write_op_t write_op
,
3942 uint64_t expected_object_size
,
3943 uint64_t expected_write_size
,
3946 tracepoint(librados
, rados_write_op_set_alloc_hint2_enter
, write_op
, expected_object_size
, expected_write_size
, flags
);
3947 ((::ObjectOperation
*)write_op
)->set_alloc_hint(expected_object_size
,
3948 expected_write_size
,
3950 tracepoint(librados
, rados_write_op_set_alloc_hint2_exit
);
3952 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_set_alloc_hint2
);
3954 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_write_op_operate
)(
3955 rados_write_op_t write_op
,
3961 tracepoint(librados
, rados_write_op_operate_enter
, write_op
, io
, oid
, mtime
, flags
);
3963 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
3964 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3966 ceph::real_time
*prt
= NULL
;
3970 rt
= ceph::real_clock::from_time_t(*mtime
);
3974 int retval
= ctx
->operate(obj
, oo
, prt
, translate_flags(flags
));
3975 tracepoint(librados
, rados_write_op_operate_exit
, retval
);
3978 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_operate
);
3980 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_write_op_operate2
)(
3981 rados_write_op_t write_op
,
3984 struct timespec
*ts
,
3987 tracepoint(librados
, rados_write_op_operate2_enter
, write_op
, io
, oid
, ts
, flags
);
3989 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
3990 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
3992 ceph::real_time
*prt
= NULL
;
3996 rt
= ceph::real_clock::from_timespec(*ts
);
4000 int retval
= ctx
->operate(obj
, oo
, prt
, translate_flags(flags
));
4001 tracepoint(librados
, rados_write_op_operate_exit
, retval
);
4004 LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_operate2
);
4006 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_write_op_operate
)(
4007 rados_write_op_t write_op
,
4009 rados_completion_t completion
,
4014 tracepoint(librados
, rados_aio_write_op_operate_enter
, write_op
, io
, completion
, oid
, mtime
, flags
);
4016 ::ObjectOperation
*oo
= (::ObjectOperation
*) write_op
;
4017 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4018 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
4019 int retval
= ctx
->aio_operate(obj
, oo
, c
, ctx
->snapc
, translate_flags(flags
));
4020 tracepoint(librados
, rados_aio_write_op_operate_exit
, retval
);
4023 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_write_op_operate
);
4025 extern "C" rados_read_op_t
LIBRADOS_C_API_DEFAULT_F(rados_create_read_op
)()
4027 tracepoint(librados
, rados_create_read_op_enter
);
4028 rados_read_op_t retval
= new (std::nothrow
)::ObjectOperation
;
4029 tracepoint(librados
, rados_create_read_op_exit
, retval
);
4032 LIBRADOS_C_API_BASE_DEFAULT(rados_create_read_op
);
4034 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_release_read_op
)(
4035 rados_read_op_t read_op
)
4037 tracepoint(librados
, rados_release_read_op_enter
, read_op
);
4038 delete (::ObjectOperation
*)read_op
;
4039 tracepoint(librados
, rados_release_read_op_exit
);
4041 LIBRADOS_C_API_BASE_DEFAULT(rados_release_read_op
);
4043 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_set_flags
)(
4044 rados_read_op_t read_op
,
4047 tracepoint(librados
, rados_read_op_set_flags_enter
, read_op
, flags
);
4048 ((::ObjectOperation
*)read_op
)->set_last_op_flags(get_op_flags(flags
));
4049 tracepoint(librados
, rados_read_op_set_flags_exit
);
4051 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_set_flags
);
4053 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_assert_version
)(
4054 rados_read_op_t read_op
,
4057 tracepoint(librados
, rados_read_op_assert_version_enter
, read_op
, ver
);
4058 ((::ObjectOperation
*)read_op
)->assert_version(ver
);
4059 tracepoint(librados
, rados_read_op_assert_version_exit
);
4061 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_assert_version
);
4063 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_assert_exists
)(
4064 rados_read_op_t read_op
)
4066 tracepoint(librados
, rados_read_op_assert_exists_enter
, read_op
);
4067 ((::ObjectOperation
*)read_op
)->stat(nullptr, nullptr, nullptr);
4068 tracepoint(librados
, rados_read_op_assert_exists_exit
);
4070 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_assert_exists
);
4072 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_cmpext
)(
4073 rados_read_op_t read_op
,
4074 const char *cmp_buf
,
4079 tracepoint(librados
, rados_read_op_cmpext_enter
, read_op
, cmp_buf
,
4080 cmp_len
, off
, prval
);
4081 ((::ObjectOperation
*)read_op
)->cmpext(off
, cmp_len
, cmp_buf
, prval
);
4082 tracepoint(librados
, rados_read_op_cmpext_exit
);
4084 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_cmpext
);
4086 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_cmpxattr
)(
4087 rados_read_op_t read_op
,
4089 uint8_t comparison_operator
,
4093 tracepoint(librados
, rados_read_op_cmpxattr_enter
, read_op
, name
, comparison_operator
, value
, value_len
);
4095 bl
.append(value
, value_len
);
4096 ((::ObjectOperation
*)read_op
)->cmpxattr(name
,
4097 comparison_operator
,
4098 CEPH_OSD_CMPXATTR_MODE_STRING
,
4100 tracepoint(librados
, rados_read_op_cmpxattr_exit
);
4102 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_cmpxattr
);
4104 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_omap_cmp
)(
4105 rados_read_op_t read_op
,
4107 uint8_t comparison_operator
,
4112 tracepoint(librados
, rados_read_op_omap_cmp_enter
, read_op
, key
, comparison_operator
, val
, val_len
, prval
);
4113 rados_c_omap_cmp((::ObjectOperation
*)read_op
, key
, comparison_operator
,
4114 val
, strlen(key
), val_len
, prval
);
4115 tracepoint(librados
, rados_read_op_omap_cmp_exit
);
4117 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_omap_cmp
);
4119 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_omap_cmp2
)(
4120 rados_read_op_t read_op
,
4122 uint8_t comparison_operator
,
4128 tracepoint(librados
, rados_read_op_omap_cmp_enter
, read_op
, key
, comparison_operator
, val
, val_len
, prval
);
4129 rados_c_omap_cmp((::ObjectOperation
*)read_op
, key
, comparison_operator
,
4130 val
, key_len
, val_len
, prval
);
4131 tracepoint(librados
, rados_read_op_omap_cmp_exit
);
4133 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_omap_cmp2
);
4135 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_stat
)(
4136 rados_read_op_t read_op
,
4141 tracepoint(librados
, rados_read_op_stat_enter
, read_op
, psize
, pmtime
, prval
);
4142 ((::ObjectOperation
*)read_op
)->stat(psize
, pmtime
, prval
);
4143 tracepoint(librados
, rados_read_op_stat_exit
);
4145 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_stat
);
4147 class C_bl_to_buf
: public Context
{
4154 C_bl_to_buf(char *out_buf
,
4157 int *prval
) : out_buf(out_buf
), out_len(out_len
),
4158 bytes_read(bytes_read
), prval(prval
) {}
4159 void finish(int r
) override
{
4160 if (out_bl
.length() > out_len
) {
4168 *bytes_read
= out_bl
.length();
4169 if (out_buf
&& !out_bl
.is_provided_buffer(out_buf
))
4170 out_bl
.begin().copy(out_bl
.length(), out_buf
);
4174 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_read
)(
4175 rados_read_op_t read_op
,
4182 tracepoint(librados
, rados_read_op_read_enter
, read_op
, offset
, len
, buf
, bytes_read
, prval
);
4183 C_bl_to_buf
*ctx
= new C_bl_to_buf(buf
, len
, bytes_read
, prval
);
4184 ctx
->out_bl
.push_back(buffer::create_static(len
, buf
));
4185 ((::ObjectOperation
*)read_op
)->read(offset
, len
, &ctx
->out_bl
, prval
, ctx
);
4186 tracepoint(librados
, rados_read_op_read_exit
);
4188 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_read
);
4190 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_checksum
)(
4191 rados_read_op_t read_op
,
4192 rados_checksum_type_t type
,
4193 const char *init_value
,
4194 size_t init_value_len
,
4195 uint64_t offset
, size_t len
,
4196 size_t chunk_size
, char *pchecksum
,
4197 size_t checksum_len
, int *prval
)
4199 tracepoint(librados
, rados_read_op_checksum_enter
, read_op
, type
, init_value
,
4200 init_value_len
, offset
, len
, chunk_size
);
4201 bufferlist init_value_bl
;
4202 init_value_bl
.append(init_value
, init_value_len
);
4204 C_bl_to_buf
*ctx
= nullptr;
4205 if (pchecksum
!= nullptr) {
4206 ctx
= new C_bl_to_buf(pchecksum
, checksum_len
, nullptr, prval
);
4208 ((::ObjectOperation
*)read_op
)->checksum(get_checksum_op_type(type
),
4209 init_value_bl
, offset
, len
,
4211 (ctx
? &ctx
->out_bl
: nullptr),
4213 tracepoint(librados
, rados_read_op_checksum_exit
);
4215 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_checksum
);
4217 class C_out_buffer
: public Context
{
4222 C_out_buffer(char **out_buf
, size_t *out_len
) : out_buf(out_buf
),
4224 void finish(int r
) override
{
4225 // ignore r since we don't know the meaning of return values
4226 // from custom class methods
4227 do_out_buffer(out_bl
, out_buf
, out_len
);
4231 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_exec
)(
4232 rados_read_op_t read_op
,
4241 tracepoint(librados
, rados_read_op_exec_enter
, read_op
, cls
, method
, in_buf
, in_len
, out_buf
, out_len
, prval
);
4243 inbl
.append(in_buf
, in_len
);
4244 C_out_buffer
*ctx
= new C_out_buffer(out_buf
, out_len
);
4245 ((::ObjectOperation
*)read_op
)->call(cls
, method
, inbl
, &ctx
->out_bl
, ctx
,
4247 tracepoint(librados
, rados_read_op_exec_exit
);
4249 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_exec
);
4251 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_exec_user_buf
)(
4252 rados_read_op_t read_op
,
4262 tracepoint(librados
, rados_read_op_exec_user_buf_enter
, read_op
, cls
, method
, in_buf
, in_len
, out_buf
, out_len
, used_len
, prval
);
4263 C_bl_to_buf
*ctx
= new C_bl_to_buf(out_buf
, out_len
, used_len
, prval
);
4265 inbl
.append(in_buf
, in_len
);
4266 ((::ObjectOperation
*)read_op
)->call(cls
, method
, inbl
, &ctx
->out_bl
, ctx
,
4268 tracepoint(librados
, rados_read_op_exec_user_buf_exit
);
4270 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_exec_user_buf
);
4272 struct RadosOmapIter
{
4273 std::map
<std::string
, bufferlist
> values
;
4274 std::map
<std::string
, bufferlist
>::iterator i
;
4277 class C_OmapIter
: public Context
{
4278 RadosOmapIter
*iter
;
4280 explicit C_OmapIter(RadosOmapIter
*iter
) : iter(iter
) {}
4281 void finish(int r
) override
{
4282 iter
->i
= iter
->values
.begin();
4286 class C_XattrsIter
: public Context
{
4287 librados::RadosXattrsIter
*iter
;
4289 explicit C_XattrsIter(librados::RadosXattrsIter
*iter
) : iter(iter
) {}
4290 void finish(int r
) override
{
4291 iter
->i
= iter
->attrset
.begin();
4295 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_getxattrs
)(
4296 rados_read_op_t read_op
,
4297 rados_xattrs_iter_t
*iter
,
4300 tracepoint(librados
, rados_read_op_getxattrs_enter
, read_op
, prval
);
4301 librados::RadosXattrsIter
*xattrs_iter
= new librados::RadosXattrsIter
;
4302 ((::ObjectOperation
*)read_op
)->getxattrs(&xattrs_iter
->attrset
, prval
);
4303 ((::ObjectOperation
*)read_op
)->set_handler(new C_XattrsIter(xattrs_iter
));
4304 *iter
= xattrs_iter
;
4305 tracepoint(librados
, rados_read_op_getxattrs_exit
, *iter
);
4307 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_getxattrs
);
4309 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_omap_get_vals
)(
4310 rados_read_op_t read_op
,
4311 const char *start_after
,
4312 const char *filter_prefix
,
4313 uint64_t max_return
,
4314 rados_omap_iter_t
*iter
,
4317 tracepoint(librados
, rados_read_op_omap_get_vals_enter
, read_op
, start_after
, filter_prefix
, max_return
, prval
);
4318 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
4319 const char *start
= start_after
? start_after
: "";
4320 const char *filter
= filter_prefix
? filter_prefix
: "";
4321 ((::ObjectOperation
*)read_op
)->omap_get_vals(
4328 ((::ObjectOperation
*)read_op
)->set_handler(new C_OmapIter(omap_iter
));
4330 tracepoint(librados
, rados_read_op_omap_get_vals_exit
, *iter
);
4332 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_omap_get_vals
);
4334 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_omap_get_vals2
)(
4335 rados_read_op_t read_op
,
4336 const char *start_after
,
4337 const char *filter_prefix
,
4338 uint64_t max_return
,
4339 rados_omap_iter_t
*iter
,
4340 unsigned char *pmore
,
4343 tracepoint(librados
, rados_read_op_omap_get_vals_enter
, read_op
, start_after
, filter_prefix
, max_return
, prval
);
4344 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
4345 const char *start
= start_after
? start_after
: "";
4346 const char *filter
= filter_prefix
? filter_prefix
: "";
4347 ((::ObjectOperation
*)read_op
)->omap_get_vals(
4354 ((::ObjectOperation
*)read_op
)->set_handler(new C_OmapIter(omap_iter
));
4356 tracepoint(librados
, rados_read_op_omap_get_vals_exit
, *iter
);
4358 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_omap_get_vals2
);
4360 struct C_OmapKeysIter
: public Context
{
4361 RadosOmapIter
*iter
;
4362 std::set
<std::string
> keys
;
4363 explicit C_OmapKeysIter(RadosOmapIter
*iter
) : iter(iter
) {}
4364 void finish(int r
) override
{
4365 // map each key to an empty bl
4366 for (std::set
<std::string
>::const_iterator i
= keys
.begin();
4367 i
!= keys
.end(); ++i
) {
4370 iter
->i
= iter
->values
.begin();
4374 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_omap_get_keys
)(
4375 rados_read_op_t read_op
,
4376 const char *start_after
,
4377 uint64_t max_return
,
4378 rados_omap_iter_t
*iter
,
4381 tracepoint(librados
, rados_read_op_omap_get_keys_enter
, read_op
, start_after
, max_return
, prval
);
4382 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
4383 C_OmapKeysIter
*ctx
= new C_OmapKeysIter(omap_iter
);
4384 ((::ObjectOperation
*)read_op
)->omap_get_keys(
4385 start_after
? start_after
: "",
4386 max_return
, &ctx
->keys
, nullptr, prval
);
4387 ((::ObjectOperation
*)read_op
)->set_handler(ctx
);
4389 tracepoint(librados
, rados_read_op_omap_get_keys_exit
, *iter
);
4391 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_omap_get_keys
);
4393 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_omap_get_keys2
)(
4394 rados_read_op_t read_op
,
4395 const char *start_after
,
4396 uint64_t max_return
,
4397 rados_omap_iter_t
*iter
,
4398 unsigned char *pmore
,
4401 tracepoint(librados
, rados_read_op_omap_get_keys_enter
, read_op
, start_after
, max_return
, prval
);
4402 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
4403 C_OmapKeysIter
*ctx
= new C_OmapKeysIter(omap_iter
);
4404 ((::ObjectOperation
*)read_op
)->omap_get_keys(
4405 start_after
? start_after
: "",
4406 max_return
, &ctx
->keys
,
4407 (bool*)pmore
, prval
);
4408 ((::ObjectOperation
*)read_op
)->set_handler(ctx
);
4410 tracepoint(librados
, rados_read_op_omap_get_keys_exit
, *iter
);
4412 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_omap_get_keys2
);
4414 static void internal_rados_read_op_omap_get_vals_by_keys(rados_read_op_t read_op
,
4415 set
<string
>& to_get
,
4416 rados_omap_iter_t
*iter
,
4419 RadosOmapIter
*omap_iter
= new RadosOmapIter
;
4420 ((::ObjectOperation
*)read_op
)->omap_get_vals_by_keys(to_get
,
4423 ((::ObjectOperation
*)read_op
)->set_handler(new C_OmapIter(omap_iter
));
4427 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_omap_get_vals_by_keys
)(
4428 rados_read_op_t read_op
,
4429 char const* const* keys
,
4431 rados_omap_iter_t
*iter
,
4434 tracepoint(librados
, rados_read_op_omap_get_vals_by_keys_enter
, read_op
, keys
, keys_len
, iter
, prval
);
4435 std::set
<std::string
> to_get(keys
, keys
+ keys_len
);
4436 internal_rados_read_op_omap_get_vals_by_keys(read_op
, to_get
, iter
, prval
);
4437 tracepoint(librados
, rados_read_op_omap_get_vals_by_keys_exit
, *iter
);
4439 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_omap_get_vals_by_keys
);
4441 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_omap_get_vals_by_keys2
)(
4442 rados_read_op_t read_op
,
4443 char const* const* keys
,
4445 const size_t* key_lens
,
4446 rados_omap_iter_t
*iter
,
4449 tracepoint(librados
, rados_read_op_omap_get_vals_by_keys_enter
, read_op
, keys
, num_keys
, iter
, prval
);
4450 std::set
<std::string
> to_get
;
4451 for (size_t i
= 0; i
< num_keys
; i
++) {
4452 to_get
.emplace(keys
[i
], key_lens
[i
]);
4454 internal_rados_read_op_omap_get_vals_by_keys(read_op
, to_get
, iter
, prval
);
4455 tracepoint(librados
, rados_read_op_omap_get_vals_by_keys_exit
, *iter
);
4457 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_omap_get_vals_by_keys2
);
4459 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_omap_get_next2
)(
4460 rados_omap_iter_t iter
,
4466 tracepoint(librados
, rados_omap_get_next_enter
, iter
);
4467 RadosOmapIter
*it
= static_cast<RadosOmapIter
*>(iter
);
4468 if (it
->i
== it
->values
.end()) {
4477 tracepoint(librados
, rados_omap_get_next_exit
, 0, key
, val
, val_len
);
4481 *key
= (char*)it
->i
->first
.c_str();
4483 *val
= it
->i
->second
.c_str();
4485 *key_len
= it
->i
->first
.length();
4487 *val_len
= it
->i
->second
.length();
4489 tracepoint(librados
, rados_omap_get_next_exit
, 0, key
, val
, val_len
);
4492 LIBRADOS_C_API_BASE_DEFAULT(rados_omap_get_next2
);
4494 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_omap_get_next
)(
4495 rados_omap_iter_t iter
,
4500 return LIBRADOS_C_API_DEFAULT_F(rados_omap_get_next2
)(iter
, key
, val
, nullptr, len
);
4502 LIBRADOS_C_API_BASE_DEFAULT(rados_omap_get_next
);
4504 extern "C" unsigned int LIBRADOS_C_API_DEFAULT_F(rados_omap_iter_size
)(
4505 rados_omap_iter_t iter
)
4507 RadosOmapIter
*it
= static_cast<RadosOmapIter
*>(iter
);
4508 return it
->values
.size();
4510 LIBRADOS_C_API_BASE_DEFAULT(rados_omap_iter_size
);
4512 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_omap_get_end
)(
4513 rados_omap_iter_t iter
)
4515 tracepoint(librados
, rados_omap_get_end_enter
, iter
);
4516 RadosOmapIter
*it
= static_cast<RadosOmapIter
*>(iter
);
4518 tracepoint(librados
, rados_omap_get_end_exit
);
4520 LIBRADOS_C_API_BASE_DEFAULT(rados_omap_get_end
);
4522 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_read_op_operate
)(
4523 rados_read_op_t read_op
,
4528 tracepoint(librados
, rados_read_op_operate_enter
, read_op
, io
, oid
, flags
);
4530 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4531 int retval
= ctx
->operate_read(obj
, (::ObjectOperation
*)read_op
, NULL
,
4532 translate_flags(flags
));
4533 tracepoint(librados
, rados_read_op_operate_exit
, retval
);
4536 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_operate
);
4538 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_read_op_operate
)(
4539 rados_read_op_t read_op
,
4541 rados_completion_t completion
,
4545 tracepoint(librados
, rados_aio_read_op_operate_enter
, read_op
, io
, completion
, oid
, flags
);
4547 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4548 librados::AioCompletionImpl
*c
= (librados::AioCompletionImpl
*)completion
;
4549 int retval
= ctx
->aio_operate_read(obj
, (::ObjectOperation
*)read_op
,
4550 c
, translate_flags(flags
), NULL
);
4551 tracepoint(librados
, rados_aio_read_op_operate_exit
, retval
);
4554 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_read_op_operate
);
4556 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_cache_pin
)(
4560 tracepoint(librados
, rados_cache_pin_enter
, io
, o
);
4561 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4563 int retval
= ctx
->cache_pin(oid
);
4564 tracepoint(librados
, rados_cache_pin_exit
, retval
);
4567 LIBRADOS_C_API_BASE_DEFAULT(rados_cache_pin
);
4569 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_cache_unpin
)(
4573 tracepoint(librados
, rados_cache_unpin_enter
, io
, o
);
4574 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4576 int retval
= ctx
->cache_unpin(oid
);
4577 tracepoint(librados
, rados_cache_unpin_exit
, retval
);
4580 LIBRADOS_C_API_BASE_DEFAULT(rados_cache_unpin
);
4582 extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_object_list_slice
)(
4584 const rados_object_list_cursor start
,
4585 const rados_object_list_cursor finish
,
4588 rados_object_list_cursor
*split_start
,
4589 rados_object_list_cursor
*split_finish
)
4591 librados::IoCtxImpl
*ctx
= (librados::IoCtxImpl
*)io
;
4593 ceph_assert(split_start
);
4594 ceph_assert(split_finish
);
4595 hobject_t
*split_start_hobj
= (hobject_t
*)(*split_start
);
4596 hobject_t
*split_finish_hobj
= (hobject_t
*)(*split_finish
);
4597 ceph_assert(split_start_hobj
);
4598 ceph_assert(split_finish_hobj
);
4599 hobject_t
*start_hobj
= (hobject_t
*)(start
);
4600 hobject_t
*finish_hobj
= (hobject_t
*)(finish
);
4602 ctx
->object_list_slice(
4610 LIBRADOS_C_API_BASE_DEFAULT(rados_object_list_slice
);