fix a bug in ZFS mirror code for handling multiple DVAa
The bug was introduced in r256956 "Improve ZFS N-way mirror read performance". The code in vdev_mirror_dva_select erroneously considers already tried DVAs for the next attempt. Thus, it is possible that a failing DVA would be retried forever. As a secondary effect, if the attempts fail with checksum error, then checksum error reports are accumulated until the original request ultimately fails or succeeds. But because retrying is going on indefinitely the cheksum reports accumulation will effectively be a memory leak. Reviewed by: gibbs MFC after: 13 days Sponsored by: HybridCluster
This commit is contained in:
parent
b8ca4667ed
commit
2f9a31944f
@ -317,9 +317,13 @@ vdev_mirror_dva_select(zio_t *zio, int preferred)
|
||||
{
|
||||
dva_t *dva = zio->io_bp->blk_dva;
|
||||
mirror_map_t *mm = zio->io_vsd;
|
||||
mirror_child_t *mc;
|
||||
int c;
|
||||
|
||||
for (c = preferred - 1; c >= 0; c--) {
|
||||
mc = &mm->mm_child[c];
|
||||
if (mc->mc_tried || mc->mc_skipped)
|
||||
continue;
|
||||
if (DVA_GET_VDEV(&dva[c]) == DVA_GET_VDEV(&dva[preferred]))
|
||||
preferred = c;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user