]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rados: we need to get the latest osdmap when pool does not exists 13289/head
authorsongbaisen <song.baisen@zte.com.cn>
Tue, 7 Feb 2017 07:34:16 +0000 (15:34 +0800)
committersongbaisen <song.baisen@zte.com.cn>
Tue, 14 Feb 2017 09:02:19 +0000 (17:02 +0800)
     sometimes when we rename a pool use the rados api,but the osdmap
     does not update when we use pool_exists api.so we need to get the
     latest osdmap when the pool does not exists, it may exists in the
     newer osdmap.

Signed-off-by:song baisen <song.baisen@zte.com.cn>

src/librados/RadosClient.cc

index 2300f62058bfbf3096692d378816b13779f9b0ea..e2f616ab51d134f8e5d704571798d5003ca512fa 100644 (file)
@@ -88,8 +88,18 @@ int64_t librados::RadosClient::lookup_pool(const char *name)
     return r;
   }
 
-  return objecter->with_osdmap(std::mem_fn(&OSDMap::lookup_pg_pool_name),
-                              name);
+  int64_t ret = objecter->with_osdmap(std::mem_fn(&OSDMap::lookup_pg_pool_name),
+                                 name);
+  if (-ENOENT == ret) {
+    // Make sure we have the latest map
+    int r = wait_for_latest_osdmap();
+    if (r < 0)
+      return r;
+    ret = objecter->with_osdmap(std::mem_fn(&OSDMap::lookup_pg_pool_name),
+                                 name);
+  }
+
+  return ret;
 }
 
 bool librados::RadosClient::pool_requires_alignment(int64_t pool_id)
@@ -439,15 +449,7 @@ int librados::RadosClient::create_ioctx(const char *name, IoCtxImpl **io)
 {
   int64_t 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;
   }
 
   *io = new librados::IoCtxImpl(this, objecter, poolid, CEPH_NOSNAP);