Patchwork [REGRESSION] allocated N with only M reserved metadata blocks

login
register
mail settings
Submitter Lukas Czerner
Date March 12, 2013, 2:11 p.m.
Message ID <alpine.LFD.2.00.1303121502240.7128@dhcp-1-104.brq.redhat.com>
Download mbox | patch
Permalink /patch/227030/
State Superseded
Headers show

Comments

Lukas Czerner - March 12, 2013, 2:11 p.m.
On Tue, 12 Mar 2013, Lukáš Czerner wrote:

> Date: Tue, 12 Mar 2013 10:48:27 +0100 (CET)
> From: Lukáš Czerner <lczerner@redhat.com>
> To: Lukáš Czerner <lczerner@redhat.com>
> Cc: Theodore Ts'o <tytso@mit.edu>, Eric Whitney <enwlinux@gmail.com>,
>     linux-ext4@vger.kernel.org
> Subject: Re: [REGRESSION] allocated N with only M reserved metadata blocks
> 
> On Tue, 12 Mar 2013, Lukáš Czerner wrote:
> 
> > Date: Tue, 12 Mar 2013 08:58:53 +0100 (CET)
> > From: Lukáš Czerner <lczerner@redhat.com>
> > To: Theodore Ts'o <tytso@mit.edu>
> > Cc: Eric Whitney <enwlinux@gmail.com>, linux-ext4@vger.kernel.org
> > Subject: Re: [REGRESSION] allocated N with only M reserved metadata blocks
> > 
> > On Mon, 11 Mar 2013, Theodore Ts'o wrote:
> > 
> > > Date: Mon, 11 Mar 2013 17:22:39 -0400
> > > From: Theodore Ts'o <tytso@mit.edu>
> > > To: Eric Whitney <enwlinux@gmail.com>
> > > Cc: linux-ext4@vger.kernel.org
> > > Subject: Re: [REGRESSION] allocated N with only M reserved metadata blocks
> > > 
> > > On Mon, Mar 11, 2013 at 05:02:01PM -0400, Eric Whitney wrote:
> > > > 
> > > > FWIW, this might not be a regression.  I believe I've got this warning in my
> > > > testing logs from both 3.8 and 3.8-rc7 (commit 01a523eb51 in 3.9-rc1 affects
> > > > message format and line numbering) on both x86 and ARM.  I didn't run xfstest
> > > > 127 prior to 3.8-rc7, so I don't know how far back the warning may have
> > > > occurred for that particular test.
> > > > 
> > > > The 3.8-rc7 results are a little different with respect to number of warnings
> > > > and test cases, so I'm thinking this one isn't completely deterministic,
> > > > testing-wise.  Multiple test runs may be required to see it.
> > > 
> > > Thanks for the extra data; this saved be a whole bunch of time, since
> > > I probably would have started doing a series git bisects tonight.   :-)
> > > 
> > >   	   	      	      	      - Ted
> > 
> > I found that the problem is present even in 3.7.0, however it is not
> > present in 3.6.0. I guess we need to bisect now :)
> > 
> > -Lukas
> 
> Apparently the problem is caused by the commit:
> 
> 67a5da564f97f31c4054d358e00b34d7ee570da5 ext4: make the zero-out
> chunk size tunable
> 
> Reverting that commit on 3.7 makes the warning disappear. I'll try
> to see what's going on there, however from the nature of the change
> it seems to me that the problem might have always been there but the
> change just makes it easier/possible to hit. We'll see...
> 
> -Lukas

So there is indeed a problem with the mentioned commit

67a5da564f97f31c4054d358e00b34d7ee570da5

Due to the bug in that code is has exactly the opposite result -
with this commit we will _never_ zero out blocks instead of creating
uninitialized extents. In other words, we will always create
uninitialized extent.

This can be easily fixed by the following patch (which makes the
warning go away), but it brings up a question whether this "optimization"
was worth it in the first place since noone noticed that it had exactly
the opposite effect than it should have had :)

However it still does not resolve the issue completely, because even
without the zeroout we should have had reserved enough metadata
blocks to cover the extent split. I still need to investigate
a little bit further.

-Lukas

---
Theodore Ts'o - March 12, 2013, 4:19 p.m.
On Tue, Mar 12, 2013 at 03:11:23PM +0100, Lukáš Czerner wrote:
> So there is indeed a problem with the mentioned commit
> 
> 67a5da564f97f31c4054d358e00b34d7ee570da5
> 
> Due to the bug in that code is has exactly the opposite result -
> with this commit we will _never_ zero out blocks instead of creating
> uninitialized extents. In other words, we will always create
> uninitialized extent.

Whoops.  I even remember how this bug happened.  Originally
max_zeroout was in file system blocks, and it was suggested that we
change this to use units of kilobytes instead.  Unfortunately, this
change wasn't done completely.  :-(

> This can be easily fixed by the following patch (which makes the
> warning go away), but it brings up a question whether this "optimization"
> was worth it in the first place since noone noticed that it had exactly
> the opposite effect than it should have had :)

Well, I had noticed that random AIO workloads resulted in the extent
tree getting far more fragmented than I had expected.  (See previous
discusisons about how we really need to improve our ability to merge
empty leaf and index nodes in the extent tree.)

It will be worthwhile to fix this bug and then see how much remains of
extent tree fragmentation problem once this is fixed....

Thanks for the catch!  When you have a chance, could you resend with a
commit description?

> However it still does not resolve the issue completely, because even
> without the zeroout we should have had reserved enough metadata
> blocks to cover the extent split. I still need to investigate
> a little bit further.

Yep, agreed.  Sounds like there is more than one bug hiding here.

     	      	     	  	   	     - Ted
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Zheng Liu - March 13, 2013, 8:43 a.m.
On Tue, Mar 12, 2013 at 12:19:13PM -0400, Theodore Ts'o wrote:
> On Tue, Mar 12, 2013 at 03:11:23PM +0100, Lukáš Czerner wrote:
> > So there is indeed a problem with the mentioned commit
> > 
> > 67a5da564f97f31c4054d358e00b34d7ee570da5
> > 
> > Due to the bug in that code is has exactly the opposite result -
> > with this commit we will _never_ zero out blocks instead of creating
> > uninitialized extents. In other words, we will always create
> > uninitialized extent.
> 
> Whoops.  I even remember how this bug happened.  Originally
> max_zeroout was in file system blocks, and it was suggested that we
> change this to use units of kilobytes instead.  Unfortunately, this
> change wasn't done completely.  :-(
> 
> > This can be easily fixed by the following patch (which makes the
> > warning go away), but it brings up a question whether this "optimization"
> > was worth it in the first place since noone noticed that it had exactly
> > the opposite effect than it should have had :)
> 
> Well, I had noticed that random AIO workloads resulted in the extent
> tree getting far more fragmented than I had expected.  (See previous
> discusisons about how we really need to improve our ability to merge
> empty leaf and index nodes in the extent tree.)

Agree, we could do better in merging extent tree.  I will take a look at
it, but, sorry, my plate is too full recently.  So it has a low priority.

Regards,
                                                - Zheng
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index cac80120..aeb80bc 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3227,7 +3227,7 @@  static int ext4_ext_convert_to_initialized(handle_t *handle,
 
 	if (EXT4_EXT_MAY_ZEROOUT & split_flag)
 		max_zeroout = sbi->s_extent_max_zeroout_kb >>
-			inode->i_sb->s_blocksize_bits;
+			(inode->i_sb->s_blocksize_bits - 10);
 
 	/* If extent is less than s_max_zeroout_kb, zeroout directly */
 	if (max_zeroout && (ee_len <= max_zeroout)) {