lkml.org 
[lkml]   [2023]   [May]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v7 0/5] Introduce provisioning primitives
    On Tue, May 23, 2023 at 11:26:18AM -0400, Mike Snitzer wrote:
    > On Tue, May 23 2023 at 10:05P -0400, Brian Foster <bfoster@redhat.com> wrote:
    > > On Mon, May 22, 2023 at 02:27:57PM -0400, Mike Snitzer wrote:
    > > ... since I also happen to think there is a potentially interesting
    > > development path to make this sort of reserve pool configurable in terms
    > > of size and active/inactive state, which would allow the fs to use an
    > > emergency pool scheme for managing metadata provisioning and not have to
    > > track and provision individual metadata buffers at all (dealing with
    > > user data is much easier to provision explicitly). So the space
    > > inefficiency thing is potentially just a tradeoff for simplicity, and
    > > filesystems that want more granularity for better behavior could achieve
    > > that with more work. Filesystems that don't would be free to rely on the
    > > simple/basic mechanism provided by dm-thin and still have basic -ENOSPC
    > > protection with very minimal changes.
    > >
    > > That's getting too far into the weeds on the future bits, though. This
    > > is essentially 99% a dm-thin approach, so I'm mainly curious if there's
    > > sufficient interest in this sort of "reserve mode" approach to try and
    > > clean it up further and have dm guys look at it, or if you guys see any
    > > obvious issues in what it does that makes it potentially problematic, or
    > > if you would just prefer to go down the path described above...
    >
    > The model that Dave detailed, which builds on REQ_PROVISION and is
    > sticky (by provisioning same blocks for snapshot) seems more useful to
    > me because it is quite precise. That said, it doesn't account for
    > hard requirements that _all_ blocks will always succeed.

    Hmmm. Maybe I'm misunderstanding the "reserve pool" context here,
    but I don't think we'd ever need a hard guarantee from the block
    device that every write bio issued from the filesystem will succeed
    without ENOSPC.

    If the block device can provide a guarantee that a provisioned LBA
    range is always writable, then everything else is a filesystem level
    optimisation problem and we don't have to involve the block device
    in any way. All we need is a flag we can ready out of the bdev at
    mount time to determine if the filesystem should be operating with
    LBA provisioning enabled...

    e.g. If we need to "pre-provision" a chunk of the LBA space for
    filesystem metadata, we can do that ahead of time and track the
    pre-provisioned range(s) in the filesystem itself.

    In XFS, That could be as simple as having small chunks of each AG
    reserved to metadata (e.g. start with the first 100MB) and limiting
    all metadata allocation free space searches to that specific block
    range. When we run low on that space, we pre-provision another 100MB
    chunk and then allocate all metadata out of that new range. If we
    start getting ENOSPC to pre-provisioning, then we reduce the size of
    the regions and log low space warnings to userspace. If we can't
    pre-provision any space at all and we've completely run out, we
    simply declare ENOSPC for all incoming operations that require
    metadata allocation until pre-provisioning succeeds again.

    This is built entirely on the premise that once proactive backing
    device provisioning fails, the backing device is at ENOSPC and we
    have to wait for that situation to go away before allowing new data
    to be ingested. Hence the block device really doesn't need to know
    anything about what the filesystem is doing and vice versa - The
    block dev just says "yes" or "no" and the filesystem handles
    everything else.

    It's worth noting that XFS already has a coarse-grained
    implementation of preferred regions for metadata storage. It will
    currently not use those metadata-preferred regions for user data
    unless all the remaining user data space is full. Hence I'm pretty
    sure that a pre-provisioning enhancment like this can be done
    entirely in-memory without requiring any new on-disk state to be
    added.

    Sure, if we crash and remount, then we might chose a different LBA
    region for pre-provisioning. But that's not really a huge deal as we
    could also run an internal background post-mount fstrim operation to
    remove any unused pre-provisioning that was left over from when the
    system went down.

    Further, managing shared pool exhaustion doesn't require a
    reservation pool in the backing device and for the filesystems to
    request space from it. Filesystems already have their own reserve
    pools via pre-provisioning. If we want the filesystems to be able to
    release that space back to the shared pool (e.g. because the shared
    backing pool is critically short on space) then all we need is an
    extension to FITRIM to tell the filesystem to also release internal
    pre-provisioned reserves.

    Then the backing pool admin (person or automated daemon!) can simply
    issue a trim on all the filesystems in the pool and spce will be
    returned. Then filesystems will ask for new pre-provisioned space
    when they next need to ingest modifications, and the backing pool
    can manage the new pre-provisioning space requests directly....

    Hence I think if we get the basic REQ_PROVISION overwrite-in-place
    guarantees defined and implemented as previously outlined, then we
    don't need any special coordination between the fs and block devices
    to avoid fatal ENOSPC issues with sparse and/or snapshot capable
    block devices...

    As a bonus, if we can implement the guarantees in dm-thin/-snapshot
    and have a filesystem make use of it, then we also have a reference
    implementation to point at device vendors and standards
    associations....

    Cheers,

    Dave.
    --
    Dave Chinner
    david@fromorbit.com

    \
     
     \ /
      Last update: 2023-05-24 02:42    [W:4.124 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site