cygrunsrv + sshd + rsync = 20 times too slow -- throttled?

Takashi Yano takashi.yano@nifty.ne.jp
Fri Sep 3 12:22:05 GMT 2021


On Fri, 3 Sep 2021 13:41:45 +0200
Corinna Vinschen wrote:
> On Sep  3 13:31, Corinna Vinschen wrote:
> > On Sep  3 19:13, Takashi Yano wrote:
> > > On Fri, 3 Sep 2021 19:00:46 +0900
> > > Takashi Yano wrote:
> > > > On Thu, 2 Sep 2021 21:35:21 +0200
> > > > Corinna Vinschen wrote:
> > > > > On Sep  2 21:00, Corinna Vinschen wrote:
> > > > > It's getting too late again.  I drop off for tonight, but I attached
> > > > > my POC code I have so far.  It also adds the snippets from my previous
> > > > > patch which fixes stuff Takashi found during testing.  It also fixes
> > > > > something which looks like a bug in raw_write:
> > > > > 
> > > > > -	  ptr = ((char *) ptr) + chunk;
> > > > > +	  ptr = ((char *) ptr) + nbytes_now;
> > > > > 
> > > > > Incrementing ptr by chunk bytes while only nbytes_now have been written
> > > > > looks incorrect.
> > > > > 
> > > > > As for the reader, it makes the # of bytes to read dependent on the
> > > > > number of reader handles.  I don't know if that's such a bright idea,
> > > > > but this can be changed easily.
> > > > > 
> > > > > Anyway, this runs all my testcases successfully but they are anything
> > > > > but thorough.
> > > > > 
> > > > > Patch relativ to topic/pipe attached.  Would you both mind to take a
> > > > > scrutinizing look?
> > > > 
> > > > Thanks.
> > > > 
> > > > Your code seems that read() returns only the partial data even
> > > > if the pipe stil has more data. Is this by design?
> > > > 
> > > > This happes in both blocking and non-blocking case.
> > > 
> > > The patch attached seems to fix the issue.
> > 
> > I'm sorry, but I don't see what your patch is supposed to do in the
> > first place.  What I see is that it now calls NtQueryInformationFile
> > even in the non-blocking case, which is not supposed to happen.
> > 
> > I'm a bit puzzled what the actual bug is.
> > 
> > The code changing len is only called if there's no data in the pipe.
> > In that case we only request a partial buffer so as not to block
> > the writer on select.
> > 
> > If there *is* data in the pipe, it will just go straight to the
> > NtReadFile code without changing len.
> > 
> > Where's the mistake?
> 
> Oh, wait.  Do you mean, if we only request less than len bytes, but
> after NtReadFile there's still data in the buffer, we should try to
> deplete the buffer up to len bytes in a subsequent NtReadFile?

Yes. I am sorry, my intent was not clear because I did more than
necessary in the previous patch. Please see attached patch revised.

> I thought this is unnecessary, actually, because of POSIX:
> 
>    The standard developers considered adding atomicity requirements  to  a
>    pipe  or FIFO, but recognized that due to the nature of pipes and FIFOs
>    there could be no guarantee of atomicity of reads of {PIPE_BUF} or  any
>    other size that would be an aid to applications portability.

POSIX says:
    The value returned may be less than nbyte if the number of bytes left
    in the file is less than nbyte, if the read() request was interrupted
    by a signal, or if the file is a pipe or FIFO or special file and has
                                                                      ~~~
    fewer than nbyte bytes immediately available for reading.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

https://pubs.opengroup.org/onlinepubs/009604599/functions/read.html

If it is turned over, read() should read all data immediately available,
I think.

-- 
Takashi Yano <takashi.yano@nifty.ne.jp>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pipe-corinna4-fix.patch
Type: application/octet-stream
Size: 2301 bytes
Desc: not available
URL: <https://cygwin.com/pipermail/cygwin-developers/attachments/20210903/5ace1365/attachment.obj>


More information about the Cygwin-developers mailing list