From: Mykola Golub Date: Tue, 29 Nov 2016 09:40:14 +0000 (+0200) Subject: rbd-mirror: split-brain issues should be clearly visible in mirror status X-Git-Tag: v10.2.6~96^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e34a403df5e247b0937abee617758e0838fc0c8e;p=ceph.git rbd-mirror: split-brain issues should be clearly visible in mirror status Fixed: http://tracker.ceph.com/issues/16991 Signed-off-by: Mykola Golub (cherry picked from commit cccca67d5f898c43207a19a6e029a1abb86efbcb) --- diff --git a/qa/workunits/rbd/rbd_mirror.sh b/qa/workunits/rbd/rbd_mirror.sh index 396600baa6fb..983d25775f58 100755 --- a/qa/workunits/rbd/rbd_mirror.sh +++ b/qa/workunits/rbd/rbd_mirror.sh @@ -343,4 +343,16 @@ test -z "$(get_mirror_position ${CLUSTER2} ${POOL} ${image})" wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image} wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+error' 'disconnected' +testlog "TEST: split-brain" +image=split-brain +create_image ${CLUSTER2} ${POOL} ${image} +wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+replaying' 'master_position' +demote_image ${CLUSTER2} ${POOL} ${image} +wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+stopped' +promote_image ${CLUSTER1} ${POOL} ${image} +write_image ${CLUSTER1} ${POOL} ${image} 10 +demote_image ${CLUSTER1} ${POOL} ${image} +promote_image ${CLUSTER2} ${POOL} ${image} +wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+error' 'split-brain' + echo OK diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index f83eafb7c2a3..eaa40928ad66 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -428,6 +428,9 @@ void ImageReplayer::handle_bootstrap(int r) { dout(5) << "remote image is non-primary or local image is primary" << dendl; on_start_fail(0, "remote image is non-primary or local image is primary"); return; + } else if (r == -EEXIST) { + on_start_fail(r, "split-brain detected"); + return; } else if (r < 0) { on_start_fail(r, "error bootstrapping replay"); return;