From 5148164af836aeb74eaf605636a8cc344c6393e4 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 16 May 2018 09:26:32 -0400 Subject: [PATCH] librbd: create image should return unique error code on id collision 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 --- src/librbd/image/CloneRequest.cc | 6 +++++- src/librbd/image/CreateRequest.cc | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/librbd/image/CloneRequest.cc b/src/librbd/image/CloneRequest.cc index 97fd849f5d055..1b5470636dc0d 100644 --- a/src/librbd/image/CloneRequest.cc +++ b/src/librbd/image/CloneRequest.cc @@ -284,7 +284,11 @@ template void CloneRequest::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(); diff --git a/src/librbd/image/CreateRequest.cc b/src/librbd/image/CreateRequest.cc index fac1bb884b0c2..54896aa2b63c3 100644 --- a/src/librbd/image/CreateRequest.cc +++ b/src/librbd/image/CreateRequest.cc @@ -579,7 +579,11 @@ template void CreateRequest::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(); -- 2.39.5