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)
{
}
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)
atomic_t ref_cnt;
RadosClient *client;
int64_t poolid;
- string pool_name;
snapid_t snap_seq;
::SnapContext snapc;
uint64_t assert_ver;
xlist<AioCompletionImpl*> aio_write_list;
map<ceph_tid_t, std::list<AioCompletionImpl*> > aio_write_waiters;
+ Mutex cached_pool_names_lock;
+ std::list<std::string> 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;
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);
}
}
- *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;
}
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();
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;
tracepoint(librados, rados_ioctx_pool_stat_enter, io);
librados::IoCtxImpl *io_ctx_impl = (librados::IoCtxImpl *)io;
list<string> ls;
- ls.push_back(io_ctx_impl->pool_name);
- map<string, ::pool_stat_t> 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<string, ::pool_stat_t> 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;
{
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;
}