plan for a feature: fsync for assuring file size
jpeach at samba.org
Wed Oct 24 19:01:18 GMT 2007
On Oct 24, 2007, at 11:21 AM, SER.RI-TIC - David Losada wrote:
> some time ago we had a problem that was causing silent data loss in
> users' files. It was a problem related to Linux behavior of deferring
> NFS quota errors until the file is closed or fsync'ed.
> With Jeremy's patch and configuring Samba to fsync after _every_
> the data loss problem was stopped. That came with the price of a big
> performance hit, of course. We need to decrease this hit, and here I'm
> sharing with you my thoughts of how to do it.
> I'd like to gain some insight from you about (a) how I can implement
> correctly in Samba's architecture and (b) if this feature could be
> into the standard Samba distribution.
> Our aim is to be able to send an NT_STATUS_DISK_FULL message to a
> Windows client *before* it asks to close the file. I have thought of
> this in the context of non-sparse files (strict allocate = yes), maybe
> some ideas can be applied to the case of sparse files. The feature
> would be user-enabled, at share level.
> There's a straightforward idea, and a slightly smarter one.
> 1) *straightforward*: performing fsync() after allocating file size
> [maybe at vfs level in smbd/vfs-wrap.c:strict_allocate_ftruncate?]
> way fsync is just called once per file. Should help performance a
> little, even if it means some dumb effort by forcing writing zeros to
> 2) *bit smarter*: performing fsync() when writing the end of the file.
> The fsync() call could be deferred until the moment when the client
> to write the _last byte_ of the file. My impression is that this
> be done above VFS level (smbd/fileio.c maybe?), because it would
> it to work together with write caches.
If you care about your data, you don't want to use the write cache
feature. Not that it's a bad feature, but it can really open the
window for data loss in the event of a power failure.
Take a look at the commit module. It does a fsync at file close time
and at configurable strides through the file.
For example, to fsync after every 10K worth of data is writen, do this:
vfs modules = commit
commit:dthresh = 10K
James Peach | jpeach at samba.org
More information about the samba-technical