<div dir="ltr">Hi,<div><br></div><div> Got this when using Undertow.Builder.setBufferSize, sorry for not being clear in my previous email. You mentioned that undertow won&#39;t split into two chunks of 5 bytes and overflows will use a pooled buffer... but now how/when undertow decided to send and flush data? Is there a config parameter? Thought it was Undertow.Builder.setBufferSize.</div><div><br></div><div>Thanks.</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 2, 2015 at 1:17 AM, Stuart Douglas <span dir="ltr">&lt;<a href="mailto:sdouglas@redhat.com" target="_blank">sdouglas@redhat.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I think you have misunderstood the point of the servlet output buffer.<br>
<br>
Basically the bufferSize parameter is the size of the servlets output buffer, it controls how much content can be written to the output stream before Undertow will start to send the data to the client. It does not provide any sort of maximum limit on the size, and it does not control the maximum write size (as in some situations we will write additional data using a gathering write).<br>
<br>
For example if you call setBufferSize(5), then write &quot;Hi&quot; to the output stream nothing will be sent to the client, as the response fits in the buffer, if you try and write &quot;Hello World&quot; then the response will be flushed, as the response is larger than 5 bytes and cannot be fully buffered. In this case though Undertow will not split the message into 5 byte chunks, instead anything that overflows will be copied into a pooled buffer and written out using a gathering write for maximum performance.<br>
<br>
Undertow does not allocate arbitrary large amounts of memory for large responses (although note that in order to send the larger response in one write() call your application has to have allocated a byte array of that size).<br>
<br>
In general the only parameter you should change is the size of Undertow&#39;s internal buffer pool, and you should never call setBufferSize() unless you have a very specific reason (namely you want to fully buffer a response that is larger than the default buffer size).<br>
<br>
Stuart<br>
<span class=""><br>
<br>
<br>
----- Original Message -----<br>
&gt; From: &quot;Edgar Espina&quot; &lt;<a href="mailto:espina.edgar@gmail.com">espina.edgar@gmail.com</a>&gt;<br>
&gt; To: <a href="mailto:undertow-dev@lists.jboss.org">undertow-dev@lists.jboss.org</a><br>
&gt; Sent: Monday, 2 March, 2015 11:45:27 AM<br>
&gt; Subject: [undertow-dev] setting a bufferSize<br>
&gt;<br>
&gt; Hi,<br>
&gt;<br>
&gt; I found some issues will setting the bufferSize:<br>
&gt;<br>
&gt; 1) bufferSize isn&#39;t exactly the max number of bytes of a response body. For<br>
&gt; example, bufferSize=5 with a &quot;hello&quot; response failed with a byte overflow<br>
&gt; error. That&#39;s bc undertow requires some extra bytes for response headers and<br>
&gt; others. This is not necessarily wrong but a response/buffer size is usually<br>
&gt; the max number of bytes for the HTTP body (jetty, netty, others). It is<br>
&gt; something minor, but will be nice to change this to represent the max size<br>
&gt; of the HTTP body.<br>
&gt;<br>
&gt; 2) bufferSize is ignored when Content-Length is set. Here are some logs from<br>
&gt; Apache HTTP client calling Undertow and Jetty with a buffer size of 20<br>
&gt; bytes.<br>
&gt;<br>
&gt; Undertow: output size is 40bytes, buffer size is 20 bytes<br>
&gt; 2015/03/01 21:30:32:053 ART [DEBUG] wire - http-outgoing-0 &gt;&gt; &quot;GET /?data=<br>
</span>&gt; ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN &amp;len=40 HTTP/1.1[\r][\n]&quot;<br>
<span class="">&gt; 2015/03/01 21:30:32:053 ART [DEBUG] wire - http-outgoing-0 &gt;&gt; &quot;Host:<br>
&gt; localhost:54697[\r][\n]&quot;<br>
&gt; 2015/03/01 21:30:32:053 ART [DEBUG] wire - http-outgoing-0 &gt;&gt; &quot;Connection:<br>
&gt; Keep-Alive[\r][\n]&quot;<br>
&gt; 2015/03/01 21:30:32:054 ART [DEBUG] wire - http-outgoing-0 &gt;&gt; &quot;User-Agent:<br>
&gt; Apache-HttpClient/4.4-beta1 (Java 1.5 minimum; Java/1.8.0)[\r][\n]&quot;<br>
&gt; 2015/03/01 21:30:32:054 ART [DEBUG] wire - http-outgoing-0 &gt;&gt;<br>
&gt; &quot;Accept-Encoding: gzip,deflate[\r][\n]&quot;<br>
&gt; 2015/03/01 21:30:32:054 ART [DEBUG] wire - http-outgoing-0 &gt;&gt; &quot;[\r][\n]&quot;<br>
&gt; 2015/03/01 21:30:32:120 ART [DEBUG] wire - http-outgoing-0 &lt;&lt; &quot;HTTP/1.1 200<br>
&gt; OK[\r][\n]&quot;<br>
&gt; 2015/03/01 21:30:32:122 ART [DEBUG] wire - http-outgoing-0 &lt;&lt; &quot;Content-Type:<br>
&gt; text/html;charset=UTF-8[\r][\n]&quot;<br>
&gt; 2015/03/01 21:30:32:122 ART [DEBUG] wire - http-outgoing-0 &lt;&lt;<br>
&gt; &quot;Content-Length: 40[\r][\n]&quot;<br>
&gt; 2015/03/01 21:30:32:122 ART [DEBUG] wire - http-outgoing-0 &lt;&lt; &quot;Date: Mon, 02<br>
&gt; Mar 2015 00:30:32 GMT[\r][\n]&quot;<br>
&gt; 2015/03/01 21:30:32:122 ART [DEBUG] wire - http-outgoing-0 &lt;&lt; &quot;[\r][\n]&quot;<br>
&gt; 2015/03/01 21:30:32:122 ART [DEBUG] wire - http-outgoing-0 &lt;&lt; &quot;<br>
&gt; ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN &quot;<br>
&gt;<br>
&gt; Jetty: output size is 40bytes, buffer size is 20 bytes<br>
&gt; 2015/03/01 21:33:07:956 ART [DEBUG] wire - http-outgoing-1 &gt;&gt; &quot;GET /?data=<br>
</span>&gt; ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN &amp;len=40 HTTP/1.1[\r][\n]&quot;<br>
<div><div class="h5">&gt; 2015/03/01 21:33:07:957 ART [DEBUG] wire - http-outgoing-1 &gt;&gt; &quot;Host:<br>
&gt; localhost:54732[\r][\n]&quot;<br>
&gt; 2015/03/01 21:33:07:957 ART [DEBUG] wire - http-outgoing-1 &gt;&gt; &quot;Connection:<br>
&gt; Keep-Alive[\r][\n]&quot;<br>
&gt; 2015/03/01 21:33:07:957 ART [DEBUG] wire - http-outgoing-1 &gt;&gt; &quot;User-Agent:<br>
&gt; Apache-HttpClient/4.4-beta1 (Java 1.5 minimum; Java/1.8.0)[\r][\n]&quot;<br>
&gt; 2015/03/01 21:33:07:957 ART [DEBUG] wire - http-outgoing-1 &gt;&gt;<br>
&gt; &quot;Accept-Encoding: gzip,deflate[\r][\n]&quot;<br>
&gt; 2015/03/01 21:33:07:957 ART [DEBUG] wire - http-outgoing-1 &gt;&gt; &quot;[\r][\n]&quot;<br>
&gt; 2015/03/01 21:33:07:959 ART [DEBUG] wire - http-outgoing-1 &lt;&lt; &quot;HTTP/1.1 200<br>
&gt; OK[\r][\n]&quot;<br>
&gt; 2015/03/01 21:33:07:959 ART [DEBUG] wire - http-outgoing-1 &lt;&lt; &quot;Content-Type:<br>
&gt; text/html;charset=UTF-8[\r][\n]&quot;<br>
&gt; 2015/03/01 21:33:07:959 ART [DEBUG] wire - http-outgoing-1 &lt;&lt;<br>
&gt; &quot;Content-Length: 40[\r][\n]&quot;<br>
&gt; 2015/03/01 21:33:07:959 ART [DEBUG] wire - http-outgoing-1 &lt;&lt; &quot;[\r][\n]&quot;<br>
&gt; 2015/03/01 21:33:07:959 ART [DEBUG] wire - http-outgoing-1 &lt;&lt; &quot;<br>
&gt; ABCDEFGHIJKLMNOPQRST &quot;<br>
&gt; 2015/03/01 21:33:07:959 ART [DEBUG] headers - http-outgoing-1 &lt;&lt; HTTP/1.1 200<br>
&gt; OK<br>
&gt; 2015/03/01 21:33:07:959 ART [DEBUG] headers - http-outgoing-1 &lt;&lt;<br>
&gt; Content-Type: text/html;charset=UTF-8<br>
&gt; 2015/03/01 21:33:07:959 ART [DEBUG] headers - http-outgoing-1 &lt;&lt;<br>
&gt; Content-Length: 40<br>
&gt; 2015/03/01 21:33:07:960 ART [DEBUG] MainClientExec - Connection can be kept<br>
&gt; alive indefinitely<br>
&gt; 2015/03/01 21:33:07:960 ART [DEBUG] wire - http-outgoing-1 &lt;&lt; &quot;<br>
&gt; UVWXYZABCDEFGHIJKLMN &quot;<br>
&gt;<br>
&gt;<br>
&gt; As you can see, undertow seems to ignore the bufferSize option and it sends<br>
&gt; the whole output at once, while jetty sent two chunks of 20 bytes each.<br>
&gt;<br>
&gt; BufferSize work when Transfer-Encoding: Chunked is set, but ignored when<br>
&gt; Content-Length is set. I didn&#39;t try with larger files but this makes me<br>
&gt; worry bc I think sending a large file and setting Content-Length might<br>
&gt; result in an OOM error.<br>
&gt;<br>
&gt; Found this in latest beta release: 1.2.0beta8 using exchange.getOutputStream<br>
&gt; (blocking mode)<br>
&gt;<br>
&gt; Thanks<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; edgar<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; undertow-dev mailing list<br>
&gt; <a href="mailto:undertow-dev@lists.jboss.org">undertow-dev@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/undertow-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/undertow-dev</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">edgar</div>
</div>