]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: optionally validate RBD pool configuration (snapshot support) 7182/head
authorJason Dillaman <dillaman@redhat.com>
Mon, 14 Dec 2015 22:41:49 +0000 (17:41 -0500)
committerLoic Dachary <ldachary@redhat.com>
Fri, 15 Jan 2016 10:18:39 +0000 (11:18 +0100)
Fixes: #13633
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 1fea4dadc60e13518e9ee55d136fbc4e9d3a621e)

Conflicts:
src/common/config_opts.h: trivial resolution

src/common/config_opts.h
src/librbd/internal.cc

index f2b16c58bcb739d545bf04bf56d31c42b68541a9..91d822260fc4281bb95c4bc6ade63376ac5d5eec 100644 (file)
@@ -899,6 +899,7 @@ OPTION(rbd_blacklist_on_break_lock, OPT_BOOL, true) // whether to blacklist clie
 OPTION(rbd_blacklist_expire_seconds, OPT_INT, 0) // number of seconds to blacklist - set to 0 for OSD default
 OPTION(rbd_request_timed_out_seconds, OPT_INT, 30) // number of seconds before maint request times out
 OPTION(rbd_tracing, OPT_BOOL, false) // true if LTTng-UST tracepoints should be enabled
+OPTION(rbd_validate_pool, OPT_BOOL, true) // true if empty pools should be validated for RBD compatibility
 
 /*
  * The following options change the behavior for librbd's image creation methods that
index b8f0e59f2df0a6517ba3fbfe6155ff3427566eef..b4b4d9e48780d8986c9716da8730bb78092f8c18 100644 (file)
@@ -135,6 +135,41 @@ int invoke_async_request(ImageCtx *ictx, const std::string& request_type,
   return r;
 }
 
+int validate_pool(IoCtx &io_ctx, CephContext *cct) {
+  if (!cct->_conf->rbd_validate_pool) {
+    return 0;
+  }
+
+  int r = io_ctx.stat(RBD_DIRECTORY, NULL, NULL);
+  if (r == 0) {
+    return 0;
+  } else if (r < 0 && r != -ENOENT) {
+    lderr(cct) << "failed to stat RBD directory: " << cpp_strerror(r) << dendl;
+    return r;
+  }
+
+  // allocate a self-managed snapshot id if this a new pool to force
+  // self-managed snapshot mode
+  uint64_t snap_id;
+  r = io_ctx.selfmanaged_snap_create(&snap_id);
+  if (r == -EINVAL) {
+    lderr(cct) << "pool not configured for self-managed RBD snapshot support"
+               << dendl;
+    return r;
+  } else if (r < 0) {
+    lderr(cct) << "failed to allocate self-managed snapshot: "
+               << cpp_strerror(r) << dendl;
+    return r;
+  }
+
+  r = io_ctx.selfmanaged_snap_remove(snap_id);
+  if (r < 0) {
+    lderr(cct) << "failed to release self-managed snapshot " << snap_id
+               << ": " << cpp_strerror(r) << dendl;
+  }
+  return 0;
+}
+
 } // anonymous namespace
 
   const string id_obj_name(const string &name)
@@ -872,8 +907,14 @@ reprotect_and_return_err:
                uint64_t size, int order)
   {
     CephContext *cct = (CephContext *)io_ctx.cct();
+
+    int r = validate_pool(io_ctx, cct);
+    if (r < 0) {
+      return r;
+    }
+
     ldout(cct, 2) << "adding rbd image to directory..." << dendl;
-    int r = tmap_set(io_ctx, imgname);
+    r = tmap_set(io_ctx, imgname);
     if (r < 0) {
       lderr(cct) << "error adding image to directory: " << cpp_strerror(r)
                 << dendl;
@@ -918,9 +959,14 @@ reprotect_and_return_err:
 
     ceph_file_layout layout;
 
+    int r = validate_pool(io_ctx, cct);
+    if (r < 0) {
+      return r;
+    }
+
     id_obj = id_obj_name(imgname);
 
-    int r = io_ctx.create(id_obj, true);
+    r = io_ctx.create(id_obj, true);
     if (r < 0) {
       lderr(cct) << "error creating rbd id object: " << cpp_strerror(r)
                 << dendl;