Date: Thu, 16 Jan 2014 12:26:54 +0000 (UTC) From: Andriy Gapon <avg@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r260705 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs Message-ID: <201401161226.s0GCQsKO084557@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: avg Date: Thu Jan 16 12:26:54 2014 New Revision: 260705 URL: http://svnweb.freebsd.org/changeset/base/260705 Log: 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 Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c ============================================================================== --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c Thu Jan 16 12:22:46 2014 (r260704) +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c Thu Jan 16 12:26:54 2014 (r260705) @@ -317,9 +317,13 @@ vdev_mirror_dva_select(zio_t *zio, int p { 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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201401161226.s0GCQsKO084557>