int64_t librados::RadosClient::lookup_pool(const char *name)
{
- Mutex::Locker l(lock);
-
int r = wait_for_osdmap();
if (r < 0) {
return r;
bool librados::RadosClient::pool_requires_alignment(int64_t pool_id)
{
- Mutex::Locker l(lock);
-
int r = wait_for_osdmap();
if (r < 0) {
return r;
uint64_t librados::RadosClient::pool_required_alignment(int64_t pool_id)
{
- Mutex::Locker l(lock);
-
int r = wait_for_osdmap();
if (r < 0) {
return r;
int librados::RadosClient::pool_get_auid(uint64_t pool_id, unsigned long long *auid)
{
- Mutex::Locker l(lock);
int r = wait_for_osdmap();
if (r < 0)
return r;
int librados::RadosClient::pool_get_name(uint64_t pool_id, std::string *s)
{
- Mutex::Locker l(lock);
int r = wait_for_osdmap();
if (r < 0)
return r;
{
int64_t poolid = lookup_pool(name);
if (poolid < 0) {
- // hmm, first make sure we have *a* map
- {
- Mutex::Locker l(lock);
- int r = wait_for_osdmap();
- if (r < 0)
- return r;
- }
+ // Make sure we have the latest map
+ int r = wait_for_latest_osdmap();
+ if (r < 0)
+ return r;
poolid = lookup_pool(name);
if (poolid < 0) {
- // make sure we have the *latest* map
- int r = wait_for_latest_osdmap();
- if (r < 0)
- return r;
-
- poolid = lookup_pool(name);
- if (poolid < 0) {
- return (int)poolid;
- }
+ return (int)poolid;
}
}
return true;
}
+
int librados::RadosClient::wait_for_osdmap()
{
- assert(lock.is_locked());
+ assert(!lock.is_locked_by_me());
- utime_t timeout;
- if (cct->_conf->rados_mon_op_timeout > 0)
- timeout.set_from_double(cct->_conf->rados_mon_op_timeout);
+ if (objecter == NULL) {
+ return -ENOTCONN;
+ }
+ bool need_map = false;
const OSDMap *osdmap = objecter->get_osdmap_read();
if (osdmap->get_epoch() == 0) {
- ldout(cct, 10) << __func__ << " waiting" << dendl;
- utime_t start = ceph_clock_now(cct);
- while (osdmap->get_epoch() == 0) {
- objecter->put_osdmap_read();
- cond.WaitInterval(cct, lock, timeout);
- utime_t elapsed = ceph_clock_now(cct) - start;
- if (!timeout.is_zero() && elapsed > timeout) {
- lderr(cct) << "timed out waiting for first osdmap from monitors" << dendl;
- return -ETIMEDOUT;
+ need_map = true;
+ }
+ objecter->put_osdmap_read();
+
+ if (need_map) {
+ Mutex::Locker l(lock);
+
+ utime_t timeout;
+ if (cct->_conf->rados_mon_op_timeout > 0)
+ timeout.set_from_double(cct->_conf->rados_mon_op_timeout);
+
+ const OSDMap *osdmap = objecter->get_osdmap_read();
+ if (osdmap->get_epoch() == 0) {
+ ldout(cct, 10) << __func__ << " waiting" << dendl;
+ utime_t start = ceph_clock_now(cct);
+ while (osdmap->get_epoch() == 0) {
+ objecter->put_osdmap_read();
+ cond.WaitInterval(cct, lock, timeout);
+ utime_t elapsed = ceph_clock_now(cct) - start;
+ if (!timeout.is_zero() && elapsed > timeout) {
+ lderr(cct) << "timed out waiting for first osdmap from monitors" << dendl;
+ return -ETIMEDOUT;
+ }
+ osdmap = objecter->get_osdmap_read();
}
- osdmap = objecter->get_osdmap_read();
+ ldout(cct, 10) << __func__ << " done waiting" << dendl;
}
- ldout(cct, 10) << __func__ << " done waiting" << dendl;
+ objecter->put_osdmap_read();
+ return 0;
+ } else {
+ return 0;
}
- objecter->put_osdmap_read();
- return 0;
}
+
int librados::RadosClient::wait_for_latest_osdmap()
{
Mutex mylock("RadosClient::wait_for_latest_osdmap");
Cond cond;
bool done;
- lock.Lock();
objecter->wait_for_latest_osdmap(new C_SafeCond(&mylock, &cond, &done));
- lock.Unlock();
mylock.Lock();
while (!done)
int librados::RadosClient::pool_list(std::list<std::string>& v)
{
- Mutex::Locker l(lock);
int r = wait_for_osdmap();
if (r < 0)
return r;
bool done;
int ret = 0;
- lock.Lock();
objecter->get_pool_stats(pools, &result, new C_SafeCond(&mylock, &cond, &done,
&ret));
- lock.Unlock();
mylock.Lock();
while (!done)
int librados::RadosClient::pool_create(string& name, unsigned long long auid,
__u8 crush_rule)
{
- lock.Lock();
-
int r = wait_for_osdmap();
if (r < 0) {
- lock.Unlock();
return r;
}
bool done;
Context *onfinish = new C_SafeCond(&mylock, &cond, &done, &reply);
reply = objecter->create_pool(name, onfinish, auid, crush_rule);
- lock.Unlock();
if (reply < 0) {
delete onfinish;
unsigned long long auid,
__u8 crush_rule)
{
- Mutex::Locker l(lock);
-
int r = wait_for_osdmap();
if (r < 0)
return r;
int librados::RadosClient::pool_delete(const char *name)
{
- lock.Lock();
int r = wait_for_osdmap();
if (r < 0) {
- lock.Unlock();
return r;
}
int ret;
Context *onfinish = new C_SafeCond(&mylock, &cond, &done, &ret);
ret = objecter->delete_pool(name, onfinish);
- lock.Unlock();
if (ret < 0) {
delete onfinish;
int librados::RadosClient::pool_delete_async(const char *name, PoolAsyncCompletionImpl *c)
{
- Mutex::Locker l(lock);
int r = wait_for_osdmap();
if (r < 0)
return r;
void librados::RadosClient::register_watcher(WatchContext *wc, uint64_t *cookie)
{
- assert(lock.is_locked());
+ assert(lock.is_locked_by_me());
wc->cookie = *cookie = ++max_watch_cookie;
watchers[wc->cookie] = wc;
}
void librados::RadosClient::unregister_watcher(uint64_t cookie)
{
- assert(lock.is_locked());
+ assert(lock.is_locked_by_me());
map<uint64_t, WatchContext *>::iterator iter = watchers.find(cookie);
if (iter != watchers.end()) {
WatchContext *ctx = iter->second;