On Tue, Feb 05, 2013 at 05:27:45PM +0200, Moshe Melnikov wrote:
> 
> Is it possible in step 1) to create few smaller extents instead of 1
> gig data extent?

DIO or O_SYNC can help to create extents whose size is your 'bs=xxx',
but you know, this is not expected as fast as buffered write.

thanks,
liubo

> 
> Moshe
> 
> -----Original Message----- From: Josef Bacik
> Sent: Tuesday, February 05, 2013 4:41 PM
> To: Moshe
> Cc: Josef Bacik ; linux-btrfs@vger.kernel.org
> Subject: Re: btrfs wastes disk space after snapshot deletetion.
> 
> On Tue, Feb 05, 2013 at 02:09:02AM -0700, Moshe wrote:
> >Thanks for your reply Josef.
> >I want to experiment with extents size, to see how it influence size of
> >extent tree. Can you point me to code that I can change to limit size of
> >data extents?
> 
> 
> So it's not the size of the data extents, it's how we deal with
> references to
> them.  Let me map out what happens now
> 
> 1) we do a write and create a 1 gig data extent.
> 2) create a file extent item in the fs tree pointing to the extent
> 3) create an reference with a count of 1 for the entire extent
> 4) create a snapshot of the data extent
> 5) write 4k to the middle of the extent
> 6a) we cow down to the file extent item we need to split and add a
> ref to the
> original 1 gig extent because of the snapshot.
> 6b) split the file extent item in the fs tree into 3 extents.
> - one from 0 to the random offset
> - one from random offset to random offset + 4k
> - one from random offset + 4k to the end of the original extent
> this points to an offset within the original 1 gig extent
> 6c) in the split we increase the refcount of the original 1 gig extent by 1
> 7) add an extent reference for the 4k extent we wrote.
> 
> So at the end of this our original 1 gig extent has 3 references, 1 for the
> original snapshot with it's unmodified extent, 2 for the snapshot
> which includes
> a reference for each chunk of the split extent.  In order to free up
> this space
> you would either have to overwrite the entirety of the remaining
> chunks of the
> original extent in the snapshot and free up the extent in the original fs by
> some means.
> 
> So say you delete the file in the original file system, and then do
> something
> horrible like overwrite every other 4k block in the file you'd end up with
> around 1.5gig of data in use for logically 1 gig of actual space.
> The way to
> fix this is in 6c.
> 
> In file.c you have __btrfs_drop_extents which does this
> btrfs_inc_extent_ref on
> an extent it has to split on two sides.  Instead of doing this we
> would probably
> add another delayed extent operation for splitting the extent reference.  So
> instead of having file extents that span large areas and stick
> around forever,
> we just fix the extent references to account for the actual file extents, so
> when you drop a part you actually recover the space.  There is no
> code for this
> yet because this is kind of an overhaul of how things are done, and
> I'm still
> getting "if I do blah it panics the box" emails so I want to spend time
> stabilizing.  If this is something you want to tackle go for it, but
> be prepared
> to spend a few months on it.  Thanks,
> 
> Josef
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to