md-cluster: Avoid the resync ping-pong
authorGoldwyn Rodrigues <rgoldwyn@suse.com>
Sun, 20 Dec 2015 23:50:59 +0000 (10:50 +1100)
committerNeilBrown <neilb@suse.com>
Wed, 6 Jan 2016 00:38:27 +0000 (11:38 +1100)
If a RESYNCING message with (0,0) has been sent before, do not send it
again. This avoids a resync ping pong between the nodes. We read
the bitmap lockresource's LVB to figure out the previous value
of the RESYNCING message.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: NeilBrown <neilb@suse.com>
drivers/md/md-cluster.c

index d6a1126d85ce1b9f5f528214a89af7a090647a1b..e57bbfed16380d9bf4b159501b552782c46e4a9c 100644 (file)
@@ -882,8 +882,16 @@ static int resync_start(struct mddev *mddev)
 static int resync_info_update(struct mddev *mddev, sector_t lo, sector_t hi)
 {
        struct md_cluster_info *cinfo = mddev->cluster_info;
+       struct resync_info ri;
        struct cluster_msg cmsg = {0};
 
+       /* do not send zero again, if we have sent before */
+       if (hi == 0) {
+               memcpy(&ri, cinfo->bitmap_lockres->lksb.sb_lvbptr, sizeof(struct resync_info));
+               if (le64_to_cpu(ri.hi) == 0)
+                       return 0;
+       }
+
        add_resync_info(cinfo->bitmap_lockres, lo, hi);
        /* Re-acquire the lock to refresh LVB */
        dlm_lock_sync(cinfo->bitmap_lockres, DLM_LOCK_PW);