Linux RAID subsystem development
 help / color / mirror / Atom feed
From: Abd-Alrhman Masalkhi <abd.masalkhi@gmail.com>
To: "G.W. Kant - Hunenet B.V." <g.w.kant@hunenet.nl>,
	"linux-raid@vger.kernel.org" <linux-raid@vger.kernel.org>
Subject: Re: Subject: RFC: Read repair for md RAID1 after mirror read failures
Date: Wed, 15 Jul 2026 07:27:01 +0200	[thread overview]
Message-ID: <m2y0fcesbe.fsf@gmail.com> (raw)
In-Reply-To: <8dcbfa43-c687-49bb-81b5-e6b8e8848c77@hunenet.nl>


Hi Dion,

On Wed, Jul 15, 2026 at 02:52 +0000, G. W. Kant wrote:
> Hello list,
>
> Recently I encountered an interesting failure mode while migrating data 
> from an aging backup system.
>
> The source Btrfs filesystem spanned several LVM logical volumes, each 
> backed by an md RAID1 array. One of these logical volumes resided on a 
> degraded RAID1 array, so I added a new logical volume on a new RAID1 
> array and started migrating the data using:
>
> btrfs device remove
>
> During the migration, many read requests encountered unrecoverable read 
> errors (UNC) on the remaining member of the degraded RAID1 array. The 
> migration continued, which is exactly what I had hoped for, since only a 
> small fraction of the media appeared to be affected.
>
> This made me wonder whether md RAID1 has, or has ever considered, a read 
> repair mechanism.
>
> Consider the following situation:
>
> mirror A:
> read -> UNC
>
> mirror B:
> read -> OK
>
> During a RAID1 read request, if md can satisfy the read from the 
> alternate mirror, no data is lost. However, this also represents an 
> opportunity to repair the degraded copy. Once a read has failed on one 
> mirror, the array has effectively lost its ability to tolerate a second 
> read failure for that logical block. This window persists until the 
> affected block is rewritten by normal filesystem activity, which may 
> never happen on cold archival data. Repairing the degraded copy 
> immediately may restore full redundancy while a valid copy is still 
> available. Writing the recovered block back to the the corresponding 
> block on the failed mirror would give the drive an opportunity to 
> recover that location, for example by successfully rewriting the sector 
> or remapping it if the write cannot be verified.
>
> In other words, the first successfully recovered read request could 
> automatically become a repair opportunity. The repair could even be 
> scheduled asynchronously, so the successful read is returned immediately 
> while the rewrite is performed in the background. Unlike a periodic 
> resync, this repair would be driven by an actual read failure, making it 
> targeted rather than rewriting the entire mirror.
>
Yes, md has had this for a long time. Look at fix_read_error() in
raid1.c. It is called from handle_read_error() on any failed read. It
reads from a healthy mirror and rewrites the bad region on the failing
device, giving the drive a chance to rewrite or remap the sector. If the
rewrite fails, it records a bad block. md does this synchronously under
a frozen array, so it is not a missing feature.

The likely reason you didn't see it is that your array was already
degraded, so there was no healthy in-array copy for fix_read_error() to
recover from. In your case, you were likely able to retrieve the data
due to btrfs level redundancy, and md can't repair across arrays.

> With today's 18–24 TB HDDs and backup/archive workloads, where data may 
> remain unchanged for years, latent media degradation seems increasingly 
> relevant. A successful read from the alternate mirror may be one of the 
> last opportunities to refresh such a sector before it becomes 
> permanently unreadable.
>
And Check/Repair is the right defense for cold archival data on large
drives.

> One advantage of such an approach is that it does not require md to 
> decide between two conflicting copies. One mirror has already reported 
> an unrecoverable read error, while the other has successfully 
> reconstructed the requested block. The proposal only applies to this 
> specific case.
>
> Has this idea been discussed before, or is there a reason why md 
> deliberately avoids this type of read repair?
>
> Regards,
>
> Dion Kant

-- 
Best Regards,
Abd-Alrhman

  reply	other threads:[~2026-07-15  5:27 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-15  2:52 Subject: RFC: Read repair for md RAID1 after mirror read failures G.W. Kant - Hunenet B.V.
2026-07-15  5:27 ` Abd-Alrhman Masalkhi [this message]
2026-07-15  7:10   ` G.W. Kant - Hunenet B.V.
2026-07-15  7:27     ` Yu Kuai
2026-07-15 11:24       ` G.W. Kant - Hunenet B.V.
2026-07-15 17:53       ` Abd-Alrhman Masalkhi
2026-07-15 14:13   ` G.W. Kant - Hunenet B.V.
2026-07-15 16:27     ` John Stoffel
2026-07-15 17:01       ` Dragan Milivojević
2026-07-15 17:41     ` Abd-Alrhman Masalkhi
2026-07-15 18:04       ` Abd-Alrhman Masalkhi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2y0fcesbe.fsf@gmail.com \
    --to=abd.masalkhi@gmail.com \
    --cc=g.w.kant@hunenet.nl \
    --cc=linux-raid@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox