]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: create image should return unique error code on id collision
authorJason Dillaman <dillaman@redhat.com>
Wed, 16 May 2018 13:26:32 +0000 (09:26 -0400)
committerJason Dillaman <dillaman@redhat.com>
Mon, 24 Sep 2018 19:11:02 +0000 (15:11 -0400)
The image id is composed of the librados global instance id and a random
number. For long-lived clients that create multiple images (basically
only rbd-mirror daemon), it's more likely to hit a collision.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/image/CloneRequest.cc
src/librbd/image/CreateRequest.cc

index 97fd849f5d05592c1b1f1ad128a6cf2b072b3c00..1b5470636dc0d7d87348175ebcf6bde0a5bb9c3c 100644 (file)
@@ -284,7 +284,11 @@ template <typename I>
 void CloneRequest<I>::handle_create_child(int r) {
   ldout(m_cct, 20) << "r=" << r << dendl;
 
-  if (r < 0) {
+  if (r == -EBADF) {
+    ldout(m_cct, 5) << "image id already in-use" << dendl;
+    complete(r);
+    return;
+  } else if (r < 0) {
     lderr(m_cct) << "error creating child: " << cpp_strerror(r) << dendl;
     m_r_saved = r;
     close_parent();
index fac1bb884b0c2a78203a7e436711f90155dde673..54896aa2b63c3aae9b8abd54ec0a570f4bca6f07 100644 (file)
@@ -579,7 +579,11 @@ template<typename I>
 void CreateRequest<I>::handle_create_image(int r) {
   ldout(m_cct, 20) << "r=" << r << dendl;
 
-  if (r < 0) {
+  if (r == -EEXIST) {
+    ldout(m_cct, 5) << "image id already in-use" << dendl;
+    complete(-EBADF);
+    return;
+  } else if (r < 0) {
     lderr(m_cct) << "error writing header: " << cpp_strerror(r) << dendl;
     m_r_saved = r;
     remove_id_object();