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>
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();
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();