messenger(NULL),
instance_id(0),
objecter(NULL),
+ osdmap_epoch(0),
+ pool_cache_epoch(0),
lock("librados::RadosClient::lock"),
+ pool_cache_rwl("librados::RadosClient::pool_cache_rwl"),
timer(cct, lock),
refcnt(1),
log_last_version(0), log_cb(NULL), log_cb_arg(NULL),
int64_t librados::RadosClient::lookup_pool(const char *name)
{
- Mutex::Locker l(lock);
+ pool_cache_rwl.get_read();
+ if (pool_cache_epoch && pool_cache_epoch == osdmap_epoch) {
+ map<string, int64_t>::iterator iter = pool_cache.find(name);
+ if (iter != pool_cache.end()) {
+ uint64_t val = iter->second;
+ pool_cache_rwl.unlock();
+ return val;
+ }
+ }
+
+ pool_cache_rwl.unlock();
+
+ lock.Lock();
+
wait_for_osdmap();
int64_t ret = osdmap.lookup_pg_pool_name(name);
- if (ret < 0)
+ pool_cache_rwl.get_write();
+ lock.Unlock();
+ if (ret < 0) {
+ pool_cache_rwl.unlock();
return -ENOENT;
+ }
+
+ if (pool_cache_epoch != osdmap_epoch) {
+ pool_cache.clear();
+ pool_cache_epoch = osdmap_epoch;
+ }
+ pool_cache[name] = ret;
+ pool_cache_rwl.unlock();
return ret;
}
break;
case CEPH_MSG_OSD_MAP:
objecter->handle_osd_map(static_cast<MOSDMap*>(m));
+ pool_cache_rwl.get_write();
+ osdmap_epoch = osdmap.get_epoch();
+ pool_cache_rwl.unlock();
cond.Signal();
break;
case MSG_GETPOOLSTATSREPLY:
#include "common/Cond.h"
#include "common/Mutex.h"
+#include "common/RWLock.h"
#include "common/Timer.h"
#include "include/rados/librados.h"
#include "include/rados/librados.hpp"
Objecter *objecter;
+ map<string, int64_t> pool_cache;
+
+ epoch_t osdmap_epoch;
+ epoch_t pool_cache_epoch;
+
Mutex lock;
+ RWLock pool_cache_rwl;
Cond cond;
SafeTimer timer;
int refcnt;