From 4e1f0e9f7c6af6dab6d076d1b157ede10c1bb9d4 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Tue, 23 May 2023 12:31:54 -0400 Subject: [PATCH] librados: use ObjectOperationImpl for rados_write_op_t the c++ api uses ObjectOperationImpl to wrap ObjectOperation with additional storage for an optional mtime. the c api now reuses ObjectOperationImpl for its write operations only - the mtime isn't needed for read ops Signed-off-by: Casey Bodley (cherry picked from commit 4c8f694741b5d4ba38e934f90e91ff269da96e2a) --- src/librados/ObjectOperationImpl.h | 27 ++++++++++ src/librados/librados_c.cc | 83 ++++++++++++++++-------------- src/librados/librados_cxx.cc | 13 +---- 3 files changed, 72 insertions(+), 51 deletions(-) create mode 100644 src/librados/ObjectOperationImpl.h diff --git a/src/librados/ObjectOperationImpl.h b/src/librados/ObjectOperationImpl.h new file mode 100644 index 0000000000000..1b5dd0ebba5de --- /dev/null +++ b/src/librados/ObjectOperationImpl.h @@ -0,0 +1,27 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#pragma once + +#include "common/ceph_time.h" +#include "osdc/Objecter.h" + +namespace librados { + +// Wraps Objecter's ObjectOperation with storage for an optional mtime argument. +struct ObjectOperationImpl { + ::ObjectOperation o; + ceph::real_time rt; + ceph::real_time *prt = nullptr; +}; + +} // namespace librados diff --git a/src/librados/librados_c.cc b/src/librados/librados_c.cc index 991f7a22cbb6e..efae351447b20 100644 --- a/src/librados/librados_c.cc +++ b/src/librados/librados_c.cc @@ -19,6 +19,7 @@ #include "librados/librados_c.h" #include "librados/AioCompletionImpl.h" #include "librados/IoCtxImpl.h" +#include "librados/ObjectOperationImpl.h" #include "librados/PoolAsyncCompletionImpl.h" #include "librados/RadosClient.h" #include "librados/RadosXattrIter.h" @@ -3600,7 +3601,7 @@ LIBRADOS_C_API_BASE_DEFAULT(rados_break_lock); extern "C" rados_write_op_t LIBRADOS_C_API_DEFAULT_F(rados_create_write_op)() { tracepoint(librados, rados_create_write_op_enter); - rados_write_op_t retval = new (std::nothrow)::ObjectOperation; + rados_write_op_t retval = new (std::nothrow) librados::ObjectOperationImpl; tracepoint(librados, rados_create_write_op_exit, retval); return retval; } @@ -3610,17 +3611,22 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_release_write_op)( rados_write_op_t write_op) { tracepoint(librados, rados_release_write_op_enter, write_op); - delete (::ObjectOperation*)write_op; + delete static_cast(write_op); tracepoint(librados, rados_release_write_op_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_release_write_op); +static ::ObjectOperation* to_object_operation(rados_write_op_t write_op) +{ + return &static_cast(write_op)->o; +} + extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_set_flags)( rados_write_op_t write_op, int flags) { tracepoint(librados, rados_write_op_set_flags_enter, write_op, flags); - ((::ObjectOperation *)write_op)->set_last_op_flags(get_op_flags(flags)); + to_object_operation(write_op)->set_last_op_flags(get_op_flags(flags)); tracepoint(librados, rados_write_op_set_flags_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_set_flags); @@ -3630,7 +3636,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_assert_version)( uint64_t ver) { tracepoint(librados, rados_write_op_assert_version_enter, write_op, ver); - ((::ObjectOperation *)write_op)->assert_version(ver); + to_object_operation(write_op)->assert_version(ver); tracepoint(librados, rados_write_op_assert_version_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_assert_version); @@ -3639,7 +3645,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_assert_exists)( rados_write_op_t write_op) { tracepoint(librados, rados_write_op_assert_exists_enter, write_op); - ((::ObjectOperation *)write_op)->stat(nullptr, nullptr, nullptr); + to_object_operation(write_op)->stat(nullptr, nullptr, nullptr); tracepoint(librados, rados_write_op_assert_exists_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_assert_exists); @@ -3653,7 +3659,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_cmpext)( { tracepoint(librados, rados_write_op_cmpext_enter, write_op, cmp_buf, cmp_len, off, prval); - ((::ObjectOperation *)write_op)->cmpext(off, cmp_len, cmp_buf, prval); + to_object_operation(write_op)->cmpext(off, cmp_len, cmp_buf, prval); tracepoint(librados, rados_write_op_cmpext_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_cmpext); @@ -3668,10 +3674,10 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_cmpxattr)( tracepoint(librados, rados_write_op_cmpxattr_enter, write_op, name, comparison_operator, value, value_len); bufferlist bl; bl.append(value, value_len); - ((::ObjectOperation *)write_op)->cmpxattr(name, - comparison_operator, - CEPH_OSD_CMPXATTR_MODE_STRING, - bl); + to_object_operation(write_op)->cmpxattr(name, + comparison_operator, + CEPH_OSD_CMPXATTR_MODE_STRING, + bl); tracepoint(librados, rados_write_op_cmpxattr_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_cmpxattr); @@ -3702,7 +3708,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_cmp)( int *prval) { tracepoint(librados, rados_write_op_omap_cmp_enter, write_op, key, comparison_operator, val, val_len, prval); - rados_c_omap_cmp((::ObjectOperation *)write_op, key, comparison_operator, + rados_c_omap_cmp(to_object_operation(write_op), key, comparison_operator, val, strlen(key), val_len, prval); tracepoint(librados, rados_write_op_omap_cmp_exit); } @@ -3718,7 +3724,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_cmp2)( int *prval) { tracepoint(librados, rados_write_op_omap_cmp_enter, write_op, key, comparison_operator, val, val_len, prval); - rados_c_omap_cmp((::ObjectOperation *)write_op, key, comparison_operator, + rados_c_omap_cmp(to_object_operation(write_op), key, comparison_operator, val, key_len, val_len, prval); tracepoint(librados, rados_write_op_omap_cmp_exit); } @@ -3733,7 +3739,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_setxattr)( tracepoint(librados, rados_write_op_setxattr_enter, write_op, name, value, value_len); bufferlist bl; bl.append(value, value_len); - ((::ObjectOperation *)write_op)->setxattr(name, bl); + to_object_operation(write_op)->setxattr(name, bl); tracepoint(librados, rados_write_op_setxattr_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_setxattr); @@ -3743,7 +3749,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_rmxattr)( const char *name) { tracepoint(librados, rados_write_op_rmxattr_enter, write_op, name); - ((::ObjectOperation *)write_op)->rmxattr(name); + to_object_operation(write_op)->rmxattr(name); tracepoint(librados, rados_write_op_rmxattr_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_rmxattr); @@ -3754,8 +3760,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_create)( const char* category) // unused { tracepoint(librados, rados_write_op_create_enter, write_op, exclusive); - ::ObjectOperation *oo = (::ObjectOperation *) write_op; - oo->create(!!exclusive); + to_object_operation(write_op)->create(!!exclusive); tracepoint(librados, rados_write_op_create_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_create); @@ -3769,7 +3774,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_write)( tracepoint(librados, rados_write_op_write_enter, write_op, buffer, len, offset); bufferlist bl; bl.append(buffer,len); - ((::ObjectOperation *)write_op)->write(offset, bl); + to_object_operation(write_op)->write(offset, bl); tracepoint(librados, rados_write_op_write_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_write); @@ -3782,7 +3787,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_write_full)( tracepoint(librados, rados_write_op_write_full_enter, write_op, buffer, len); bufferlist bl; bl.append(buffer,len); - ((::ObjectOperation *)write_op)->write_full(bl); + to_object_operation(write_op)->write_full(bl); tracepoint(librados, rados_write_op_write_full_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_write_full); @@ -3797,7 +3802,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_writesame)( tracepoint(librados, rados_write_op_writesame_enter, write_op, buffer, data_len, write_len, offset); bufferlist bl; bl.append(buffer, data_len); - ((::ObjectOperation *)write_op)->writesame(offset, write_len, bl); + to_object_operation(write_op)->writesame(offset, write_len, bl); tracepoint(librados, rados_write_op_writesame_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_writesame); @@ -3810,7 +3815,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_append)( tracepoint(librados, rados_write_op_append_enter, write_op, buffer, len); bufferlist bl; bl.append(buffer,len); - ((::ObjectOperation *)write_op)->append(bl); + to_object_operation(write_op)->append(bl); tracepoint(librados, rados_write_op_append_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_append); @@ -3819,7 +3824,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_remove)( rados_write_op_t write_op) { tracepoint(librados, rados_write_op_remove_enter, write_op); - ((::ObjectOperation *)write_op)->remove(); + to_object_operation(write_op)->remove(); tracepoint(librados, rados_write_op_remove_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_remove); @@ -3829,7 +3834,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_truncate)( uint64_t offset) { tracepoint(librados, rados_write_op_truncate_enter, write_op, offset); - ((::ObjectOperation *)write_op)->truncate(offset); + to_object_operation(write_op)->truncate(offset); tracepoint(librados, rados_write_op_truncate_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_truncate); @@ -3840,7 +3845,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_zero)( uint64_t len) { tracepoint(librados, rados_write_op_zero_enter, write_op, offset, len); - ((::ObjectOperation *)write_op)->zero(offset, len); + to_object_operation(write_op)->zero(offset, len); tracepoint(librados, rados_write_op_zero_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_zero); @@ -3856,7 +3861,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_exec)( tracepoint(librados, rados_write_op_exec_enter, write_op, cls, method, in_buf, in_len, prval); bufferlist inbl; inbl.append(in_buf, in_len); - ((::ObjectOperation *)write_op)->call(cls, method, inbl, NULL, NULL, prval); + to_object_operation(write_op)->call(cls, method, inbl, NULL, NULL, prval); tracepoint(librados, rados_write_op_exec_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_exec); @@ -3876,7 +3881,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_set)( bl.append(vals[i], lens[i]); entries[keys[i]] = bl; } - ((::ObjectOperation *)write_op)->omap_set(entries); + to_object_operation(write_op)->omap_set(entries); tracepoint(librados, rados_write_op_omap_set_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_set); @@ -3897,7 +3902,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_set2)( string key(keys[i], key_lens[i]); entries[key] = bl; } - ((::ObjectOperation *)write_op)->omap_set(entries); + to_object_operation(write_op)->omap_set(entries); tracepoint(librados, rados_write_op_omap_set_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_set2); @@ -3912,7 +3917,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_rm_keys)( tracepoint(librados, rados_write_op_omap_rm_keys_entry, keys[i]); } std::set to_remove(keys, keys + keys_len); - ((::ObjectOperation *)write_op)->omap_rm_keys(to_remove); + to_object_operation(write_op)->omap_rm_keys(to_remove); tracepoint(librados, rados_write_op_omap_rm_keys_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_rm_keys); @@ -3928,7 +3933,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_rm_keys2)( for(size_t i = 0; i < keys_len; i++) { to_remove.emplace(keys[i], key_lens[i]); } - ((::ObjectOperation *)write_op)->omap_rm_keys(to_remove); + to_object_operation(write_op)->omap_rm_keys(to_remove); tracepoint(librados, rados_write_op_omap_rm_keys_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_rm_keys2); @@ -3942,8 +3947,8 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_rm_range2)( { tracepoint(librados, rados_write_op_omap_rm_range_enter, write_op, key_begin, key_end); - ((::ObjectOperation *)write_op)->omap_rm_range({key_begin, key_begin_len}, - {key_end, key_end_len}); + to_object_operation(write_op)->omap_rm_range({key_begin, key_begin_len}, + {key_end, key_end_len}); tracepoint(librados, rados_write_op_omap_rm_range_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_rm_range2); @@ -3952,7 +3957,7 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_omap_clear)( rados_write_op_t write_op) { tracepoint(librados, rados_write_op_omap_clear_enter, write_op); - ((::ObjectOperation *)write_op)->omap_clear(); + to_object_operation(write_op)->omap_clear(); tracepoint(librados, rados_write_op_omap_clear_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_omap_clear); @@ -3963,8 +3968,8 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_set_alloc_hint)( uint64_t expected_write_size) { tracepoint(librados, rados_write_op_set_alloc_hint_enter, write_op, expected_object_size, expected_write_size); - ((::ObjectOperation *)write_op)->set_alloc_hint(expected_object_size, - expected_write_size, 0); + to_object_operation(write_op)->set_alloc_hint(expected_object_size, + expected_write_size, 0); tracepoint(librados, rados_write_op_set_alloc_hint_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_set_alloc_hint); @@ -3976,9 +3981,9 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_write_op_set_alloc_hint2)( uint32_t flags) { tracepoint(librados, rados_write_op_set_alloc_hint2_enter, write_op, expected_object_size, expected_write_size, flags); - ((::ObjectOperation *)write_op)->set_alloc_hint(expected_object_size, - expected_write_size, - flags); + to_object_operation(write_op)->set_alloc_hint(expected_object_size, + expected_write_size, + flags); tracepoint(librados, rados_write_op_set_alloc_hint2_exit); } LIBRADOS_C_API_BASE_DEFAULT(rados_write_op_set_alloc_hint2); @@ -3992,7 +3997,7 @@ extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_write_op_operate)( { tracepoint(librados, rados_write_op_operate_enter, write_op, io, oid, mtime, flags); object_t obj(oid); - ::ObjectOperation *oo = (::ObjectOperation *) write_op; + ::ObjectOperation *oo = to_object_operation(write_op); librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io; ceph::real_time *prt = NULL; @@ -4018,7 +4023,7 @@ extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_write_op_operate2)( { tracepoint(librados, rados_write_op_operate2_enter, write_op, io, oid, ts, flags); object_t obj(oid); - ::ObjectOperation *oo = (::ObjectOperation *) write_op; + ::ObjectOperation *oo = to_object_operation(write_op); librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io; ceph::real_time *prt = NULL; @@ -4045,7 +4050,7 @@ extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_write_op_operate)( { tracepoint(librados, rados_aio_write_op_operate_enter, write_op, io, completion, oid, mtime, flags); object_t obj(oid); - ::ObjectOperation *oo = (::ObjectOperation *) write_op; + ::ObjectOperation *oo = to_object_operation(write_op); librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io; librados::AioCompletionImpl *c = (librados::AioCompletionImpl*)completion; int retval = ctx->aio_operate(obj, oo, c, ctx->snapc, nullptr, translate_flags(flags)); diff --git a/src/librados/librados_cxx.cc b/src/librados/librados_cxx.cc index f081800777124..d20c67556c03e 100644 --- a/src/librados/librados_cxx.cc +++ b/src/librados/librados_cxx.cc @@ -29,6 +29,7 @@ #include "librados/AioCompletionImpl.h" #include "librados/IoCtxImpl.h" +#include "librados/ObjectOperationImpl.h" #include "librados/PoolAsyncCompletionImpl.h" #include "librados/RadosClient.h" #include "librados/RadosXattrIter.h" @@ -88,18 +89,6 @@ static TracepointProvider::Traits tracepoint_traits("librados_tp.so", "rados_tra * +--------------------------------------+ */ -namespace librados { - -struct ObjectOperationImpl { - ::ObjectOperation o; - real_time rt; - real_time *prt; - - ObjectOperationImpl() : prt(NULL) {} -}; - -} - size_t librados::ObjectOperation::size() { ::ObjectOperation *o = &impl->o; -- 2.39.5