*/
CEPH_RADOS_API int rados_stat(rados_ioctx_t io, const char *o, uint64_t *psize,
time_t *pmtime);
+
+CEPH_RADOS_API int rados_stat2(rados_ioctx_t io, const char *o, uint64_t *psize,
+ struct timespec *pmtime);
+
/**
* Execute an OSD class method on an object
*
rados_completion_t completion,
uint64_t *psize, time_t *pmtime);
+CEPH_RADOS_API int rados_aio_stat2(rados_ioctx_t io, const char *o,
+ rados_completion_t completion,
+ uint64_t *psize, struct timespec *pmtime);
+
/**
* Asynchronously compare an on-disk object range with a buffer
*
time_t *pmtime,
int *prval);
+CEPH_RADOS_API void rados_read_op_stat2(rados_read_op_t read_op,
+ uint64_t *psize,
+ struct timespec *pmtime,
+ int *prval);
/**
* Read bytes from offset into buffer.
*
uint64_t *psize,
time_t *pmtime);
+int rados_striper_stat2(rados_striper_t striper,
+ const char* soid,
+ uint64_t *psize,
+ struct timespec *pmtime);
+
/**
* @defgroup libradosstriper_h_asynch_io Asynchronous I/O
* Read and write to objects without blocking.
uint64_t *psize,
time_t *pmtime);
+int rados_striper_aio_stat2(rados_striper_t striper,
+ const char* soid,
+ rados_completion_t completion,
+ uint64_t *psize,
+ struct timespec *pmtime);
/** @} Asynchronous I/O */
#ifdef __cplusplus
}
LIBRADOS_C_API_BASE_DEFAULT(rados_stat);
+extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_stat2)(
+ rados_ioctx_t io,
+ const char *o,
+ uint64_t *psize,
+ struct timespec *pmtime)
+{
+ tracepoint(librados, rados_stat2_enter, io, o);
+ librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
+ object_t oid(o);
+ int retval = ctx->stat2(oid, psize, pmtime);
+ tracepoint(librados, rados_stat2_exit, retval, psize, pmtime);
+ return retval;
+}
+LIBRADOS_C_API_BASE_DEFAULT(rados_stat2);
+
extern "C" int LIBRADOS_C_API_BASE_F(rados_tmap_update)(
rados_ioctx_t io,
const char *o,
}
LIBRADOS_C_API_BASE_DEFAULT(rados_aio_stat);
+extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_stat2)(
+ rados_ioctx_t io, const char *o,
+ rados_completion_t completion,
+ uint64_t *psize, struct timespec *pmtime)
+{
+ tracepoint(librados, rados_aio_stat2_enter, io, o, completion);
+ librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
+ object_t oid(o);
+ int retval = ctx->aio_stat2(oid, (librados::AioCompletionImpl*)completion,
+ psize, pmtime);
+ tracepoint(librados, rados_aio_stat2_exit, retval);
+ return retval;
+}
+LIBRADOS_C_API_BASE_DEFAULT(rados_aio_stat2);
+
extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_cmpext)(
rados_ioctx_t io, const char *o,
rados_completion_t completion, const char *cmp_buf,
}
LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_stat);
+extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_stat2)(
+ rados_read_op_t read_op,
+ uint64_t *psize,
+ struct timespec *pmtime,
+ int *prval)
+{
+ tracepoint(librados, rados_read_op_stat2_enter, read_op, psize, pmtime, prval);
+ ((::ObjectOperation *)read_op)->stat(psize, pmtime, prval);
+ tracepoint(librados, rados_read_op_stat2_exit);
+}
+LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_stat2);
+
class C_bl_to_buf : public Context {
char *out_buf;
size_t out_len;
return impl->stat(soid, psize, pmtime);
}
+extern "C" int rados_striper_stat2(rados_striper_t striper,
+ const char* soid,
+ uint64_t *psize,
+ struct timespec *pmtime)
+{
+ libradosstriper::RadosStriperImpl *impl = (libradosstriper::RadosStriperImpl *)striper;
+ return impl->stat2(soid, psize, pmtime);
+}
+
extern "C" int rados_striper_multi_aio_create_completion(void *cb_arg,
rados_callback_t cb_complete,
rados_callback_t cb_safe,
libradosstriper::RadosStriperImpl *impl = (libradosstriper::RadosStriperImpl *)striper;
return impl->aio_stat(soid, (librados::AioCompletionImpl*)completion, psize, pmtime);
}
+
+extern "C" int rados_striper_aio_stat2(rados_striper_t striper,
+ const char* soid,
+ rados_completion_t completion,
+ uint64_t *psize,
+ struct timespec *pmtime)
+{
+ libradosstriper::RadosStriperImpl *impl = (libradosstriper::RadosStriperImpl *)striper;
+ return impl->aio_stat2(soid, (librados::AioCompletionImpl*)completion, psize, pmtime);
+}
rados_release_read_op(op);
}
+TEST_F(CReadOpsTest, Stat2) {
+ rados_read_op_t op = rados_create_read_op();
+ uint64_t size = 1;
+ int rval;
+ rados_read_op_stat2(op, &size, NULL, &rval);
+ EXPECT_EQ(-ENOENT, rados_read_op_operate(op, ioctx, obj, 0));
+ EXPECT_EQ(-EIO, rval);
+ EXPECT_EQ(1u, size);
+ rados_release_read_op(op);
+
+ write_object();
+
+ op = rados_create_read_op();
+ rados_read_op_stat2(op, &size, NULL, &rval);
+ EXPECT_EQ(0, rados_read_op_operate(op, ioctx, obj, 0));
+ EXPECT_EQ(0, rval);
+ EXPECT_EQ(len, size);
+ rados_release_read_op(op);
+
+ op = rados_create_read_op();
+ rados_read_op_stat2(op, NULL, NULL, NULL);
+ EXPECT_EQ(0, rados_read_op_operate(op, ioctx, obj, 0));
+ rados_release_read_op(op);
+
+ remove_object();
+
+ op = rados_create_read_op();
+ rados_read_op_stat2(op, NULL, NULL, NULL);
+ EXPECT_EQ(-ENOENT, rados_read_op_operate(op, ioctx, obj, 0));
+ rados_release_read_op(op);
+}
+
TEST_F(CReadOpsTest, Omap) {
char *keys[] = {(char*)"bar",
(char*)"foo",
ASSERT_EQ(-ENOENT, rados_striper_stat(striper, "nonexistent", &psize, &pmtime));
}
+TEST_F(StriperTest, Stat2) {
+ uint64_t psize;
+ struct timespec pmtime;
+ char buf[128];
+ memset(buf, 0xcc, sizeof(buf));
+ ASSERT_EQ(0, rados_striper_write(striper, "Stat2", buf, sizeof(buf), 0));
+ ASSERT_EQ(0, rados_striper_stat2(striper, "Stat2", &psize, &pmtime));
+ ASSERT_EQ(psize, sizeof(buf));
+ ASSERT_EQ(-ENOENT, rados_striper_stat2(striper, "nonexistent", &psize, &pmtime));
+}
+
TEST_F(StriperTestPP, StatPP) {
char buf[128];
memset(buf, 0xcc, sizeof(buf));
ASSERT_EQ(-ENOENT, striper.stat("nonexistent", &psize, &pmtime));
}
+TEST_F(StriperTestPP, Stat2PP) {
+ char buf[128];
+ memset(buf, 0xcc, sizeof(buf));
+ bufferlist bl;
+ bl.append(buf, sizeof(buf));
+ ASSERT_EQ(0, striper.write("Stat2pp", bl, sizeof(buf), 0));
+ uint64_t psize;
+ struct timespec pmtime;
+ ASSERT_EQ(0, striper.stat2("Stat2pp", &psize, &pmtime));
+ ASSERT_EQ(psize, sizeof(buf));
+ ASSERT_EQ(-ENOENT, striper.stat2("nonexistent", &psize, &pmtime));
+}
+
TEST_F(StriperTest, RoundTrip) {
char buf[128];
char buf2[sizeof(buf)];
)
)
+TRACEPOINT_EVENT(librados, rados_stat2_enter,
+ TP_ARGS(
+ rados_ioctx_t, ioctx,
+ const char*, oid),
+ TP_FIELDS(
+ ctf_integer_hex(rados_ioctx_t, ioctx, ioctx)
+ ctf_string(oid, oid)
+ )
+)
+
+TRACEPOINT_EVENT(librados, rados_stat2_exit,
+ TP_ARGS(
+ int, retval,
+ uint64_t*, size,
+ struct timespec*, mtime),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ ceph_ctf_integerp(uint64_t, size, size)
+ ceph_ctf_timespecp(mtime, mtime)
+ )
+)
+
TRACEPOINT_EVENT(librados, rados_exec_enter,
TP_ARGS(
rados_ioctx_t, ioctx,
)
)
+TRACEPOINT_EVENT(librados, rados_aio_stat2_enter,
+ TP_ARGS(
+ rados_ioctx_t, ioctx,
+ const char*, oid,
+ rados_completion_t, completion),
+ TP_FIELDS(
+ ctf_integer_hex(rados_ioctx_t, ioctx, ioctx)
+ ctf_string(oid, oid)
+ ctf_integer_hex(rados_completion_t, completion, completion)
+ )
+)
+
+TRACEPOINT_EVENT(librados, rados_aio_stat2_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
TRACEPOINT_EVENT(librados, rados_aio_exec_enter,
TP_ARGS(
rados_ioctx_t, ioctx,
TP_FIELDS()
)
+TRACEPOINT_EVENT(librados, rados_read_op_stat2_enter,
+ TP_ARGS(
+ rados_read_op_t, read_op,
+ void*, psize,
+ void*, pmtime,
+ void*, prval),
+ TP_FIELDS(
+ ctf_integer_hex(rados_read_op_t, read_op, read_op)
+ ctf_integer_hex(void*, psize, psize)
+ ctf_integer_hex(void*, pmtime, pmtime)
+ ctf_integer_hex(void*, prval, prval)
+ )
+)
+
+TRACEPOINT_EVENT(librados, rados_read_op_stat2_exit,
+ TP_ARGS(),
+ TP_FIELDS()
+)
+
TRACEPOINT_EVENT(librados, rados_read_op_read_enter,
TP_ARGS(
rados_read_op_t, read_op,