Re: [PATCH RFC] generic 223: Ensure xfs allocator will honor alignment requirements

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 27, 2019 at 09:38:16AM -0400, Brian Foster wrote:
> On Mon, Aug 26, 2019 at 04:47:12PM +0200, Carlos Maiolino wrote:
> > If the files being allocated during the test do not fit into a single
> > Allocation Group, XFS allocator may disable alignment requirements
> > causing the test to fail even though XFS was working as expected.
> > 
> > Fix this by fixing a min AG size, so all files created during the test
> > will fit into a single AG not disabling XFS alignment requirements.
> > 
> > Signed-off-by: Carlos Maiolino <cmaiolino@xxxxxxxxxx>
> > ---
> > 
> > Hi,
> > 
> > I am tagging this patch as a RFC mostly to start a discussion here, regarding
> > this issue found while running generic/223.
> > 
> > The generic/223 fails when running it with finobt disabled. Specifically, the
> > last file being fallocated are unaligned.
> > 
> > When the finobt is enabled, the allocator does not try to squeeze partial file
> > data into small available extents in AG 0, while it does when finobt is
> > disabled.
> > 
> > Here are the bmap of the same file after generic/223 finishes with and without
> > finobt:
> > 
> > finobt=0
> > 
> > /mnt/scratch/file-1073745920-falloc:
> >  EXT: FILE-OFFSET         BLOCK-RANGE      AG AG-OFFSET           TOTAL FLAGS
> >    0: [0..191]:           320..511          0 (320..511)            192 001011
> >    1: [192..375]:         64..247           0 (64..247)             184 001111
> >    2: [376..1287791]:     678400..1965815   0 (678400..1965815) 1287416 000111
> >    3: [1287792..2097159]: 1966080..2775447  1 (256..809623)      809368 000101
> > 
> > 
> > finobt=1
> > 
> > /mnt/scratch/file-1073745920-falloc:
> >  EXT: FILE-OFFSET         BLOCK-RANGE      AG AG-OFFSET           TOTAL FLAGS
> >    0: [0..1285831]:       678400..1964231   0 (678400..1964231) 1285832 000111
> >    1: [1285832..2097159]: 1966080..2777407  1 (256..811583)      811328 000101
> > 
> > 
> > I still don't know the details about why the allocator takes different decisions
> > depending on finobt being used or not, although I believe it's because the extra
> > space being used in each AG, and the default AG size when running the test, but
> > I'm still reading the code to try to understand this difference.
> > 
> 
> For reference, I think this behavior is related to a couple patches I
> posted a few months ago[1]. I reproduced similar behavior after some of
> extent allocation rework changes and ultimately determined that the
> changes I had at the time weren't really the root cause. The commit log
> for patch 1 in that series shows a straightforward example that IIRC
> doesn't have anything to do with finobt either.
> 
> > Even though I think there might be room for improvement in the XFS allocator
> > code to avoid this bypass of alignment requirements here, I still think the test
> > should be fixed to avoid forcing the filesystem to drop alignment constraints
> > during file allocation which basically invalidate the test, and that's why I
> > decided to start the discussion with a RFC patch for the test, but sending it to
> > xfs list instead of fstests.
> > 
> 
> The question I have is is this test doing anything a user wouldn't
> expect to honor alignment? I understand that alignment is not
> guaranteed, but I wouldn't expect to play that card unless the
> filesystem is low on free space or aligned space in general (IIRC that's
> something we check by adding the worst case alignment to the size of the
> allocation request).

Yeah, that's my question too. I don't know :P that's why I decide to start the
thread with a patch. I also wouldn't expect the alignment requirement to be
bypassed unless we are low in space, but I am not sure if that's correct or not.
> 
> The example I had was a 1GB fallocate on an empty ~15GB/16AG fs (i.e.
> allocation larger than a single AG). That is a corner case, but one I'd
> expect to work.

Hmm, is this the same case we spoke about?

> With regard to generic/223, what is it doing in this
> case to "force the filesystem to drop alignment?" I think you could make
> the argument that the test needs fixing if it's doing something that
> legitimately risks the ability to align allocations, but I also think
> you could argue that the test has done its job by finding this problem.
> :)

Yeah, I am a bit confused about it. I need to understand the alloc algorithm to
get a better idea on what's going on. I honestly don't know if the test did its
job or if we should really expect misaligned files if the allocation request
spans more than 1 AG, I should have started the thread with this question :P


> 
> Brian
> 
> [1] https://marc.info/?l=linux-xfs&m=155671950608062&w=2
> 
> > Comments?
> > 
> > Cheers
> > 
> > 
> >  tests/generic/223 | 9 ++++++++-
> >  1 file changed, 8 insertions(+), 1 deletion(-)
> > 
> > diff --git a/tests/generic/223 b/tests/generic/223
> > index dfd8c41b..782651e2 100755
> > --- a/tests/generic/223
> > +++ b/tests/generic/223
> > @@ -34,6 +34,13 @@ _require_xfs_io_command "falloc"
> >  
> >  rm -f $seqres.full
> >  
> > +# Ensure we won't trick xfs allocator to disable alignment requirements
> > +if [ "$FSTYP" == "xfs" ]; then
> > +	mkfs_opts="-d agsize=2g"
> > +else
> > +	mkfs_opts=""
> > +fi
> > +
> >  BLOCKSIZE=4096
> >  
> >  for SUNIT_K in 8 16 32 64 128; do
> > @@ -41,7 +48,7 @@ for SUNIT_K in 8 16 32 64 128; do
> >  	let SUNIT_BLOCKS=$SUNIT_BYTES/$BLOCKSIZE
> >  
> >  	echo "=== mkfs with su $SUNIT_BLOCKS blocks x 4 ==="
> > -	export MKFS_OPTIONS=""
> > +	export MKFS_OPTIONS=$mkfs_opts
> >  	_scratch_mkfs_geom $SUNIT_BYTES 4 $BLOCKSIZE >> $seqres.full 2>&1
> >  	_scratch_mount
> >  
> > -- 
> > 2.20.1
> > 

-- 
Carlos



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux