md-cluster: Use a small window for raid10 resync
authorGuoqing Jiang <gqjiang@suse.com>
Tue, 24 Oct 2017 07:11:52 +0000 (15:11 +0800)
committerShaohua Li <shli@fb.com>
Thu, 2 Nov 2017 04:32:23 +0000 (21:32 -0700)
commit8db87912c9a8771c53b98845cd5516ea63b22e1e
treeea7749f6fbd11a75218e9710f8298c3fe5766d31
parentcb8a7a7e1098e74d36378b992a6d012668ec10d9
md-cluster: Use a small window for raid10 resync

Suspending the entire device for resync could take
too long. Resync in small chunks.

cluster's resync window is maintained in r10conf as
cluster_sync_low and cluster_sync_high, and processed
in raid10's sync_request(). If the current resync is
outside the cluster resync window:

1. Set the cluster_sync_low to curr_resync_completed.
2. Set cluster_sync_high to cluster_sync_low + stripe
   size.
3. Send a message to all nodes so they may add it in
   their suspension list.

Note:
We only support "near" raid10 so far, resync a far or
offset raid10 array could have trouble. So raid10_run
checks the layout of clustered raid10, it will refuse
to run if the layout is not correct.

With the "near" layout we process one stripe at a time
progressing monotonically through the address space.
So we can have a sliding window of whole-stripes which
moves through the array suspending IO on other nodes,
and both resync which uses array addresses and recovery
which uses device addresses can stay within this window.

Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/raid10.c
drivers/md/raid10.h