From: Radoslaw Zarzynski Date: Thu, 22 Jan 2015 16:46:50 +0000 (+0100) Subject: librados: rectify the pool name caching in IoCtxImpl. X-Git-Tag: v0.93~51^2~2^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F3515%2Fhead;p=ceph.git librados: rectify the pool name caching in IoCtxImpl. Fixes: #10458 Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/librados/IoCtxImpl.cc b/src/librados/IoCtxImpl.cc index d8642176eea3..5ef56c0ec7fc 100644 --- a/src/librados/IoCtxImpl.cc +++ b/src/librados/IoCtxImpl.cc @@ -28,19 +28,19 @@ librados::IoCtxImpl::IoCtxImpl() : ref_cnt(0), client(NULL), poolid(0), assert_ver(0), last_objver(0), notify_timeout(30), aio_write_list_lock("librados::IoCtxImpl::aio_write_list_lock"), - aio_write_seq(0), objecter(NULL) + aio_write_seq(0), cached_pool_names_lock("librados::IoCtxImpl::cached_pool_names_lock"), + objecter(NULL) { } librados::IoCtxImpl::IoCtxImpl(RadosClient *c, Objecter *objecter, - int64_t poolid, - const char *pool_name, snapid_t s) - : ref_cnt(0), client(c), poolid(poolid), pool_name(pool_name), snap_seq(s), + int64_t poolid, snapid_t s) + : ref_cnt(0), client(c), poolid(poolid), snap_seq(s), assert_ver(0), last_objver(0), notify_timeout(c->cct->_conf->client_notify_timeout), - oloc(poolid), - aio_write_list_lock("librados::IoCtxImpl::aio_write_list_lock"), - aio_write_seq(0), objecter(objecter) + oloc(poolid), aio_write_list_lock("librados::IoCtxImpl::aio_write_list_lock"), + aio_write_seq(0), cached_pool_names_lock("librados::IoCtxImpl::cached_pool_names_lock"), + objecter(objecter) { } @@ -146,6 +146,19 @@ void librados::IoCtxImpl::flush_aio_writes() aio_write_list_lock.Unlock(); } +const string& librados::IoCtxImpl::get_cached_pool_name() +{ + std::string pn; + client->pool_get_name(get_id(), &pn); + + Mutex::Locker l(cached_pool_names_lock); + + if (cached_pool_names.empty() || cached_pool_names.back() != pn) + cached_pool_names.push_back(pn); + + return cached_pool_names.back(); +} + // SNAPS int librados::IoCtxImpl::snap_create(const char *snapName) diff --git a/src/librados/IoCtxImpl.h b/src/librados/IoCtxImpl.h index ab73cfa390ff..df73b0326965 100644 --- a/src/librados/IoCtxImpl.h +++ b/src/librados/IoCtxImpl.h @@ -32,7 +32,6 @@ struct librados::IoCtxImpl { atomic_t ref_cnt; RadosClient *client; int64_t poolid; - string pool_name; snapid_t snap_seq; ::SnapContext snapc; uint64_t assert_ver; @@ -47,17 +46,19 @@ struct librados::IoCtxImpl { xlist aio_write_list; map > aio_write_waiters; + Mutex cached_pool_names_lock; + std::list cached_pool_names; + Objecter *objecter; IoCtxImpl(); IoCtxImpl(RadosClient *c, Objecter *objecter, - int64_t poolid, const char *pool_name, snapid_t s); + int64_t poolid, snapid_t s); void dup(const IoCtxImpl& rhs) { // Copy everything except the ref count client = rhs.client; poolid = rhs.poolid; - pool_name = rhs.pool_name; snap_seq = rhs.snap_seq; snapc = rhs.snapc; assert_ver = rhs.assert_ver; @@ -89,6 +90,8 @@ struct librados::IoCtxImpl { return poolid; } + const string& get_cached_pool_name(); + uint32_t get_object_hash_position(const std::string& oid); uint32_t get_object_pg_hash_position(const std::string& oid); diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index ad018325ed93..5440cfda86b8 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -348,20 +348,13 @@ int librados::RadosClient::create_ioctx(const char *name, IoCtxImpl **io) } } - *io = new librados::IoCtxImpl(this, objecter, poolid, name, CEPH_NOSNAP); + *io = new librados::IoCtxImpl(this, objecter, poolid, CEPH_NOSNAP); return 0; } int librados::RadosClient::create_ioctx(int64_t pool_id, IoCtxImpl **io) { - std::string pool_name; - int r = pool_get_name(pool_id, &pool_name); - if (r < 0) { - return r; - } - - *io = new librados::IoCtxImpl(this, objecter, pool_id, pool_name.c_str(), - CEPH_NOSNAP); + *io = new librados::IoCtxImpl(this, objecter, pool_id, CEPH_NOSNAP); return 0; } diff --git a/src/librados/librados.cc b/src/librados/librados.cc index decf175555ff..c012807d222a 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -1039,6 +1039,11 @@ std::string librados::IoCtx::get_pool_name() return s; } +const std::string& librados::IoCtx::get_pool_name() const +{ + return io_ctx_impl->get_cached_pool_name(); +} + uint64_t librados::IoCtx::get_instance_id() const { return io_ctx_impl->client->get_instance_id(); @@ -1787,11 +1792,6 @@ void librados::IoCtx::set_assert_src_version(const std::string& oid, uint64_t ve io_ctx_impl->set_assert_src_version(obj, ver); } -const std::string& librados::IoCtx::get_pool_name() const -{ - return io_ctx_impl->pool_name; -} - void librados::IoCtx::locator_set_key(const string& key) { io_ctx_impl->oloc.key = key; @@ -2759,16 +2759,23 @@ extern "C" int rados_ioctx_pool_stat(rados_ioctx_t io, struct rados_pool_stat_t tracepoint(librados, rados_ioctx_pool_stat_enter, io); librados::IoCtxImpl *io_ctx_impl = (librados::IoCtxImpl *)io; list ls; - ls.push_back(io_ctx_impl->pool_name); - map rawresult; + std::string pool_name; - int err = io_ctx_impl->client->get_pool_stats(ls, rawresult); + int err = io_ctx_impl->client->pool_get_name(io_ctx_impl->get_id(), &pool_name); if (err) { tracepoint(librados, rados_ioctx_pool_stat_exit, err, stats); return err; } + ls.push_back(pool_name); - ::pool_stat_t& r = rawresult[io_ctx_impl->pool_name]; + map rawresult; + err = io_ctx_impl->client->get_pool_stats(ls, rawresult); + if (err) { + tracepoint(librados, rados_ioctx_pool_stat_exit, err, stats); + return err; + } + + ::pool_stat_t& r = rawresult[pool_name]; stats->num_kb = SHIFT_ROUND_UP(r.stats.sum.num_bytes, 10); stats->num_bytes = r.stats.sum.num_bytes; stats->num_objects = r.stats.sum.num_objects; @@ -3068,12 +3075,19 @@ extern "C" int rados_ioctx_get_pool_name(rados_ioctx_t io, char *s, unsigned max { tracepoint(librados, rados_ioctx_get_pool_name_enter, io, maxlen); librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io; - if (ctx->pool_name.length() >= maxlen) { + std::string pool_name; + + int err = ctx->client->pool_get_name(ctx->get_id(), &pool_name); + if (err) { + tracepoint(librados, rados_ioctx_get_pool_name_exit, err, ""); + return err; + } + if (pool_name.length() >= maxlen) { tracepoint(librados, rados_ioctx_get_pool_name_exit, -ERANGE, ""); return -ERANGE; } - strcpy(s, ctx->pool_name.c_str()); - int retval = ctx->pool_name.length(); + strcpy(s, pool_name.c_str()); + int retval = pool_name.length(); tracepoint(librados, rados_ioctx_get_pool_name_exit, retval, s); return retval; }