[Samba] stat between reads

Jeremy Allison jra at samba.org
Fri Mar 22 15:07:29 MDT 2013


On Fri, Mar 22, 2013 at 05:24:20PM +0100, Volker Lendecke wrote:
> On Fri, Mar 22, 2013 at 03:18:53PM +0100, Frank Kautz wrote:
> > Hello,
> > 
> > when re-exporting the parallel (network) file-system FhGFS, I noticed a
> > significantly reduced read performance. In the output of strace, I see a
> > stat call between the reads of the blocks of a file. In a network based
> > file system a stat could be expensive. I looked into the source code and
> > I think the stat is done in the method send_file_readX() (file:
> > source3/smbd/reply.c) which calls fsp_stat(). What is the reason for
> > this stat? Is it possible to disable this stat by a configuration option
> > or just avoid it in the code?
> 
> If I see it right, we could avoid most of those calls.
> First, they are only relevant to see whether we can do
> sendfile. That choice is racy, we first look and have to
> deal with the mess if we have a short read afterwards
> anyway.
> 
> Jeremy, what do you think? Only do that stat call in the
> sendfile if-branch, and there only if the read call in
> question would go beyond what we currently have in
> st.st_ex_size?

Yes.... we could certainly make that change. It's not
relevent in the non-sendfile read path but we'd have to be
careful about not doing it by checking the existing
fsp->fsp_name->st.st_ex_size, as I don't think we
update that on an ftruncate call.

My worry would be (to one single smbd):

open 1mb file
ftruncate to 10k
readX of 50k at offset 0.

Unless the ftruncate call updates fsp->fsp_name->st.st_ex_size
then we'll return 10k of real data + 40k of zeros if
sendfile is turned on, rather than a correct short read of
10k.

Let me look at the code some and revisit this.

Moving the fstat and ISREG check to the use_sendfile()
path is an obviously correct no brainer though.

Cheers,

	Jeremy.


More information about the samba mailing list