Re: RAID56 discussion related to RST. (Was "Re: [RFC ONLY 0/8] btrfs: introduce raid-stripe-tree")

Johannes Thumshirn
2022-07-13T11:43:43Z

On 13.07.22 12:54, Qu Wenruo wrote:
>
>
> On 2022/5/16 22:31, Johannes Thumshirn wrote:
>> Introduce a raid-stripe-tree to record writes in a RAID environment.
>>
>> In essence this adds another address translation layer between the logical
>> and the physical addresses in btrfs and is designed to close two gaps. The
>> first is the ominous RAID-write-hole we suffer from with RAID5/6 and the
>> second one is the inability of doing RAID with zoned block devices due to the
>> constraints we have with REQ_OP_ZONE_APPEND writes.
>
> Here I want to discuss about something related to RAID56 and RST.
>
> One of my long existing concern is, P/Q stripes have a higher update
> frequency, thus with certain transaction commit/data writeback timing,
> wouldn't it cause the device storing P/Q stripes go out of space before
> the data stripe devices?

P/Q stripes on a dedicated drive would be RAID4, which we don't have.

>
> One example is like this, we have 3 disks RAID5, with RST and zoned
> allocator (allocated logical bytenr can only go forward):
>
> 0 32K 64K
> Disk 1 | | (data stripe)
> Disk 2 | | (data stripe)
> Disk 3 | | (parity stripe)
>
> And initially, all the zones in those disks are empty, and their write
> pointer are all at the beginning of the zone. (all data)
>
> Then we write 0~4K in the range, and write back happens immediate (can
> be DIO or sync).
>
> We need to write the 0~4K back to disk 1, and update P for that vertical
> stripe, right? So we got:
>
> 0 32K 64K
> Disk 1 |X | (data stripe)
> Disk 2 | | (data stripe)
> Disk 3 |X | (parity stripe)
>
> Then we write into 4~8K range, and sync immedately.
>
> If we go C0W for the P (we have to anyway), so what we got is:
>
> 0 32K 64K
> Disk 1 |X | (data stripe)
> Disk 2 |X | (data stripe)
> Disk 3 |XX | (parity stripe)
>
> So now, you can see disk3 (the zone handling parity) has its writer
> pointer moved 8K forward, but both data stripe zone only has its writer
> pointer moved 4K forward.
>
> If we go forward like this, always 4K write and sync, we will hit the
> following case eventually:
>
> 0 32K 64K
> Disk 1 |XXXXXXXXXXXXXXX | (data stripe)
> Disk 2 |XXXXXXXXXXXXXXX | (data stripe)
> Disk 3 |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| (parity stripe)
>
> The extent allocator should still think we have 64K free space to write,
> as we only really have written 64K.
>
> But the zone for parity stripe is already exhausted.
>
> How could we handle such case?
> As RAID0/1 shouldn't have such problem at all, the imbalance is purely
> caused by the fact that CoWing P/Q will cause higher write frequency.
>

Then the a new zone for the parity stripe has to be allocated, and the old one
gets reclaimed. That's nothing new. Of cause there's some gotchas in the extent
allocator and the active zone management we need to consider, but over all I do
not see where the blocker is here.