Commit cb9ee154 authored by Guoqing Jiang's avatar Guoqing Jiang Committed by Shaohua Li

md-cluster: send BITMAP_NEEDS_SYNC message if reshaping is interrupted

We need to continue the reshaping if it was interrupted in
original node. So original node should call resync_bitmap
in case reshaping is aborted.

Then BITMAP_NEEDS_SYNC message is broadcasted to other nodes,
node which continues the reshaping should restart reshape from
mddev->reshape_position instead of from the first beginning.
Reviewed-by: default avatarNeilBrown <neilb@suse.com>
Signed-off-by: default avatarGuoqing Jiang <gqjiang@suse.com>
Signed-off-by: default avatarShaohua Li <shli@fb.com>
parent cbce6863
...@@ -333,6 +333,12 @@ static void recover_bitmaps(struct md_thread *thread) ...@@ -333,6 +333,12 @@ static void recover_bitmaps(struct md_thread *thread)
} }
spin_unlock_irq(&cinfo->suspend_lock); spin_unlock_irq(&cinfo->suspend_lock);
/* Kick off a reshape if needed */
if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery) &&
test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
mddev->reshape_position != MaxSector)
md_wakeup_thread(mddev->sync_thread);
if (hi > 0) { if (hi > 0) {
if (lo < mddev->recovery_cp) if (lo < mddev->recovery_cp)
mddev->recovery_cp = lo; mddev->recovery_cp = lo;
...@@ -1020,10 +1026,17 @@ static int leave(struct mddev *mddev) ...@@ -1020,10 +1026,17 @@ static int leave(struct mddev *mddev)
if (!cinfo) if (!cinfo)
return 0; return 0;
/* BITMAP_NEEDS_SYNC message should be sent when node /*
* BITMAP_NEEDS_SYNC message should be sent when node
* is leaving the cluster with dirty bitmap, also we * is leaving the cluster with dirty bitmap, also we
* can only deliver it when dlm connection is available */ * can only deliver it when dlm connection is available.
if (cinfo->slot_number > 0 && mddev->recovery_cp != MaxSector) *
* Also, we should send BITMAP_NEEDS_SYNC message in
* case reshaping is interrupted.
*/
if ((cinfo->slot_number > 0 && mddev->recovery_cp != MaxSector) ||
(mddev->reshape_position != MaxSector &&
test_bit(MD_CLOSING, &mddev->flags)))
resync_bitmap(mddev); resync_bitmap(mddev);
set_bit(MD_CLUSTER_HOLDING_MUTEX_FOR_RECVD, &cinfo->state); set_bit(MD_CLUSTER_HOLDING_MUTEX_FOR_RECVD, &cinfo->state);
......
...@@ -8370,9 +8370,17 @@ void md_do_sync(struct md_thread *thread) ...@@ -8370,9 +8370,17 @@ void md_do_sync(struct md_thread *thread)
else if (!mddev->bitmap) else if (!mddev->bitmap)
j = mddev->recovery_cp; j = mddev->recovery_cp;
} else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) } else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) {
max_sectors = mddev->resync_max_sectors; max_sectors = mddev->resync_max_sectors;
else { /*
* If the original node aborts reshaping then we continue the
* reshaping, so set j again to avoid restart reshape from the
* first beginning
*/
if (mddev_is_clustered(mddev) &&
mddev->reshape_position != MaxSector)
j = mddev->reshape_position;
} else {
/* recovery follows the physical size of devices */ /* recovery follows the physical size of devices */
max_sectors = mddev->dev_sectors; max_sectors = mddev->dev_sectors;
j = MaxSector; j = MaxSector;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment