On Mon, Jul 27, 2009 at 1:44 PM, Drew Wilson <span dir="ltr">&lt;<a href="mailto:atwilson@google.com">atwilson@google.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br><br><div class="gmail_quote"><div><div></div><div class="h5">On Mon, Jul 27, 2009 at 1:36 PM, Alexey Proskuryakov <span dir="ltr">&lt;<a href="mailto:ap@webkit.org" target="_blank">ap@webkit.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
27.07.2009, в 13:20, Jeremy Orlow написал(а):<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I agree that this will help if the application sends data in burst mode, but what if it just constantly sends more than the network can transmit? It will never learn that it&#39;s misbehaving, and will just take more and more memory.<br>


<br>
An example where adapting to network bandwidth is needed is of course file uploading, but even if we dismiss it as a special case that can be served with custom code, there&#39;s also e.g. captured video or audio that can be downgraded in quality for slow connections.<br>


<br>
Maybe the right behavior is to buffer in user-space (like Maciej explained) up until a limit (left up to the UA) and then anything beyond that results in an exception.  This seems like it&#39;d handle bursty communication and would keep the failure model simple.<br>


</blockquote>
<br>
<br></div>
This sounds like the best approach to me.<br>
<br>
<br>
27.07.2009, в 13:27, Drew Wilson написал(а):<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I would suggest that the solution to this situation is an appropriate application-level protocol (i.e. acks) to allow the application to have no more than (say) 1MB of data outstanding.<br>
<br>
I&#39;m just afraid that we&#39;re burdening the API to handle degenerative cases that the vast majority of users won&#39;t encounter. Specifying in the API that any arbitrary send() invocation could throw some kind of &quot;retry exception&quot; or return some kind of error code is really really cumbersome.<br>


</blockquote>
<br></div>
Having a send() that doesn&#39;t return anything and doesn&#39;t raise exceptions would be a clear signal that send() just blocks until it&#39;s possible to send data to me, and I&#39;m sure to many others, as well. There is no reason to silently drop data sent over a TCP connection - after all, we could as well base the protocol on UDP if we did, and lose nothing.<br>


</blockquote><div><br></div></div></div><div>There&#39;s another option besides blocking, raising an exception, and dropping data: unlimited buffering in user space. So I&#39;m saying we should not put any limits on the amount of user-space buffering we&#39;re willing to do, any more than we put any limits on the amount of other types of user-space memory allocation a page can perform.</div>
</div></blockquote><div><br></div><div>I agree with Alexey that applications need feedback when they&#39;re consistentiently exceeding what your net connection can handle.  I think an application getting an exception rather than filling up its buffer until it OOMs is a much better experience for the user and the web developer.</div>
<div><br></div><div>If you have application level ACKs (which you probably should--especially in high-throughput uses), you really shouldn&#39;t even hit the buffer limits that a UA might have in place.  I don&#39;t really think that having a limit on the buffer size is a problem and that, if anything, it&#39;ll promote better application level flow control.</div>
<div><br></div><div>J </div></div>