dm mpath: delay retry of bypassed pg
If I/O needs retrying and only bypassed priority groups are available, set the pg_init_delay_retry flag to wait before retrying. If, for example, the reason for the bypass is that the controller is getting reset or there is a firmware upgrade happening, retrying right away would cause a flood of log messages and retries for what could be a few seconds or even several minutes. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Acked-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
This commit is contained in:
committed by
Alasdair G Kergon
parent
1fbdd2b3a3
commit
f220fd4efb
@@ -329,14 +329,18 @@ static void __choose_pgpath(struct multipath *m, size_t nr_bytes)
|
|||||||
/*
|
/*
|
||||||
* Loop through priority groups until we find a valid path.
|
* Loop through priority groups until we find a valid path.
|
||||||
* First time we skip PGs marked 'bypassed'.
|
* First time we skip PGs marked 'bypassed'.
|
||||||
* Second time we only try the ones we skipped.
|
* Second time we only try the ones we skipped, but set
|
||||||
|
* pg_init_delay_retry so we do not hammer controllers.
|
||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
list_for_each_entry(pg, &m->priority_groups, list) {
|
list_for_each_entry(pg, &m->priority_groups, list) {
|
||||||
if (pg->bypassed == bypassed)
|
if (pg->bypassed == bypassed)
|
||||||
continue;
|
continue;
|
||||||
if (!__choose_path_in_pg(m, pg, nr_bytes))
|
if (!__choose_path_in_pg(m, pg, nr_bytes)) {
|
||||||
|
if (!bypassed)
|
||||||
|
m->pg_init_delay_retry = 1;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} while (bypassed--);
|
} while (bypassed--);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user