users@grizzly.java.net

Re: Upload a large file without oom with Grizzly

From: Ryan Lubke <ryan.lubke_at_oracle.com>
Date: Fri, 20 Sep 2013 08:59:02 -0700

Just following up for closure here. Pool issue has been confirmed as
resolved.

Sébastien Lorber wrote:
> Ok thanks :)
>
> Take your time
> We'll keep using no connection pool (as we used to do until now
> anyway, and we could probably continue with this setting for a while
> because it passed our load test goals)
>
>
> 2013/9/19 Ryan Lubke <ryan.lubke_at_oracle.com
> <mailto:ryan.lubke_at_oracle.com>>
>
> Sorry, been under the weather. I'll be investigating this issue
> this morning.
>
> Stay tuned.
>
> Sébastien Lorber wrote:
>> So what I've found is that:
>>
>>
>> private final Connection.CloseListener listener = new
>> Connection.CloseListener() {
>> @Override
>> public void onClosed(Connection connection,
>> Connection.CloseType closeType) throws IOException {
>> if (closeType == Connection.CloseType.REMOTELY) {
>> if (LOG.isInfoEnabled()) {
>> LOG.info("Remote closed connection
>> ({}). Removing from cache", connection.toString());
>> }
>> }
>>
>> GrizzlyConnectionsPool.this.removeAll(connection);
>> }
>> };
>>
>>
>> public boolean removeAll(Connection connection) {
>>
>> if (connection == null || closed.get()) {
>> return false;
>> }
>> connection.removeCloseListener(listener);
>> boolean isRemoved = false;
>> for (Map.Entry<String,
>> DelayedExecutor.IdleConnectionQueue> entry :
>> connectionsPool.entrySet()) {
>> boolean removed = entry.getValue().remove(connection);
>> isRemoved |= removed;
>> }
>> return isRemoved;
>>
>> }
>>
>>
>>
>> When the connection is closed remotely, the connection that we
>> try to remove is never in the cache, thus isRemoved = false
>>
>> I guess it has something to do with the "connection
>> discrimination" you previously fixed and I didn't really
>> understand :)
>>
>> Do you have an idea on this problem?
>>
>>
>>
>>
>>
>> By the way, I just tested again WITHOUT the FeedableBodyGenerator.
>> I run batches of 10 concurrent uploads with a max 20 connection pool.
>> I run these 10 concurrent uploads multiple times.
>> It works fine, but if just after the request I add a
>> Thread.sleep(15000) then it seems to lead to the same problem:
>>
>> @Test
>> public void do_test_without_ahc_streaming() throws Exception {
>> List<Response> responses =
>> runConcurrently(CONCURRENT_UPLOADS,new Callable<Response>() {
>> @Override
>> public Response call() throws Exception {
>> return uploadSingleDocumentWithoutStreaming();
>> }
>> });
>> runConcurrently(CONCURRENT_UPLOADS,new Callable<Response>() {
>> @Override
>> public Response call() throws Exception {
>> return uploadSingleDocumentWithoutStreaming();
>> }
>> });
>> Thread.sleep(15000);
>> runConcurrently(CONCURRENT_UPLOADS,new Callable<Response>() {
>> @Override
>> public Response call() throws Exception {
>> return uploadSingleDocumentWithoutStreaming();
>> }
>> });
>> Thread.sleep(15000);
>> runConcurrently(CONCURRENT_UPLOADS,new Callable<Response>() {
>> @Override
>> public Response call() throws Exception {
>> return uploadSingleDocumentWithoutStreaming();
>> }
>> });
>> Thread.sleep(15000);
>> runConcurrently(CONCURRENT_UPLOADS,new Callable<Response>() {
>> @Override
>> public Response call() throws Exception {
>> return uploadSingleDocumentWithoutStreaming();
>> }
>> });
>> Thread.sleep(15000);
>> ......................................;
>> }
>>
>> This permits to give some time for the remote host to close the
>> connection
>>
>>
>>
>> So in the end it seems that we have troubles in any case when the
>> remote host closes the connection
>>
>>
>>
>>
>> Btw I just saw this issue:
>> https://github.com/AsyncHttpClient/async-http-client/pull/311
>> I checked the code that used AHC 1.7.7 and what I can see is that
>> the connection pool is bypassed even with the property=true
>> I have in my logs:
>> [main] DEBUG
>> com.ning.http.client.providers.grizzly.GrizzlyConnectionsPool:162
>> - [poll] No existing queue for uri [https://digiposte.orsid.com:443].
>>
>>
>> So, by updating to 1.7.20-SNAPSHOT, the connection pool has been
>> magically enabled, and it doesn't seem to work well for me.
>>
>>
>> I'll keep that pool disabled because it's the behavior of our
>> previous applicative version that is near to production and works
>> pretty fine, but will open a Github issue because i'm quitting my
>> job next month and they want to track when they'll be able to use
>> a connection pool :)
>>
>>
>>
>> 2013/9/19 Sébastien Lorber <lorber.sebastien_at_gmail.com
>> <mailto:lorber.sebastien_at_gmail.com>>
>>
>> So it seems I can reproduce this in local.
>>
>> Disabling the ssl connection pooling solve the problem.
>>
>>
>> We didn't have this problems with v1.7.7 we previously used.
>>
>> I just tested with the last commits of 1.7.20-SNAPSHOT, the
>> problem is still here.
>> The problem doesn't appear on normal AHC requests, neither on
>> multipart file upload when I do not use the
>> FeedableBodyGenerator so it seems this is the new behavior of
>> FeedableBodyGenerator that has a problem with the ssl
>> connection pooling. Will try to investigate this.
>>
>> By the way, your last commits about selector/worker threads
>> seems ok (didn't notice any problem with the ssl pool disabled)
>>
>>
>>
>> 2013/9/18 Sébastien Lorber <lorber.sebastien_at_gmail.com
>> <mailto:lorber.sebastien_at_gmail.com>>
>>
>> Hi
>>
>> Unfortunatly it seems there's another problem.
>> On our test environment I often get in the logs:
>>
>> Caught internal server errorjava.io.IOException: Maximum
>> pooled connections exceeded
>> at
>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$AsyncHttpClientEventFilter.cleanup(GrizzlyAsyncHttpProvider.java:1415)
>> ~[async-http-client-1.7.20-2846817.jar:na]
>> at
>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$AsyncHttpClientEventFilter.onHttpPacketParsed(GrizzlyAsyncHttpProvider.java:1366)
>> ~[async-http-client-1.7.20-2846817.jar:na]
>> at
>> org.glassfish.grizzly.http.HttpCodecFilter.decodeWithTransferEncoding(HttpCodecFilter.java:1176)
>> ~[grizzly-http-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.http.HttpCodecFilter.handleRead(HttpCodecFilter.java:516)
>> ~[grizzly-http-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.http.HttpClientFilter.handleRead(HttpClientFilter.java:161)
>> ~[grizzly-http-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:546)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> Wrapped by: java.util.concurrent.ExecutionException:
>> java.io.IOException: Maximum pooled connections exceeded
>> at
>> org.glassfish.grizzly.impl.SafeFutureImpl$Sync.innerGet(SafeFutureImpl.java:359)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> org.glassfish.grizzly.impl.SafeFutureImpl.get(SafeFutureImpl.java:265)
>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>> at
>> com.ning.http.client.providers.grizzly.GrizzlyResponseFuture.get(GrizzlyResponseFuture.java:165)
>> ~[async-http-client-1.7.20-2846817.jar:na]
>>
>>
>>
>>
>> boolean canReturnConnection(final Connection c) {
>>
>> return (DO_NOT_CACHE.get(c) != null ||
>> pool.canCacheConnection());
>>
>> }
>>
>>
>> private static HttpTransactionContext
>> cleanup(final FilterChainContext ctx,
>>
>> final GrizzlyAsyncHttpProvider provider) {
>>
>> final Connection c = ctx.getConnection();
>> final HttpTransactionContext context =
>> provider.getHttpTransactionContext(c);
>> context.provider.setHttpTransactionContext(c,
>> null);
>> if
>> (!context.provider.connectionManager.canReturnConnection(c))
>> {
>> context.abort(new IOException("Maximum
>> pooled connections exceeded"));
>> } else {
>> if
>> (!context.provider.connectionManager.returnConnection(context.request,
>> c)) {
>> ctx.getConnection().close();
>> }
>> }
>>
>> return context;
>>
>> }
>>
>>
>>
>> We use:
>>
>> Key=[properties.httpclient.allowSslConnectionPool]
>> Value=[true]
>> Key=[properties.httpclient.maximumConnectionsPerHost]
>> Value=[20]
>> Key=[properties.httpclient.maximumConnectionsTotal]
>> Value=[30]
>> Key=[properties.httpclient.timeout.connection] Value=[10000]
>> Key=[properties.httpclient.timeout.request] Value=[30000]
>>
>>
>> In our logs, I can see there are 30 times this log:
>>
>> Remote closed connection
>> (TCPNIOConnection{localSocketAddress={/172.16.104.160:55488
>> <http://172.16.104.160:55488>},
>> peerSocketAddress={host/172.16.4.100:443}}). Removing
>> from cache
>>
>> and then it seems no connection is never available and
>> the app is blocked.
>>
>> I'll try tomorrow to disable or increase the pool size,
>> but if you have any idea of the problem please let me know.
>> We do not run load tests, these are simple functional
>> tests with nearly no concurrency.
>>
>>
>>
>> Thanks
>>
>>
>>
>>
>> 2013/9/17 Ryan Lubke <ryan.lubke_at_oracle.com
>> <mailto:ryan.lubke_at_oracle.com>>
>>
>> This is good to hear. Thanks for all the feedback
>> and working with us to nail this down.
>>
>>
>> Sébastien Lorber wrote:
>>> Thanks,
>>>
>>> We already installed the previous snapshot in our
>>> nexus because it works fine and I'm working on
>>> something else now but I'll give you a feedback soon
>>> to see if this still works fine.
>>> For us it doesn't really mater which thread is using
>>> since we do not use Future in our applications for
>>> this case.
>>>
>>>
>>> Btw I've been able deploy a main with my code
>>> running concurrent uploads on a server which has a
>>> better connectivity with the remote API and it seems
>>> I can upload up to 150 concurrent files of 10mb with
>>> a heap of 250mo in 30 seconds and a throughput near
>>> 50mb/s
>>>
>>> I don't really know the infrastructure on which my
>>> code was deployed but I suspect Grizzly is not the
>>> bottleneck anymore :)
>>> When I have more than 150 concurrent uploads the
>>> remote endpoint seems to timeout under the load.
>>>
>>>
>>>
>>>
>>> 2013/9/16 Ryan Lubke <ryan.lubke_at_oracle.com
>>> <mailto:ryan.lubke_at_oracle.com>>
>>>
>>>
>>>
>>> Ryan Lubke wrote:
>>>>
>>>>
>>>> Sébastien Lorber wrote:
>>>>>
>>>>>
>>>>>
>>>>> I noticed something strange.
>>>>> On the FileInputStream I have, I've added a
>>>>> log on the close() of the stream which is
>>>>> called once the whole file has been read to be
>>>>> sent to the feeder.
>>>>>
>>>>> 1) If I perform a request (ie my session init
>>>>> request in the previous discussions) before
>>>>> doing my multipart upload, the thread that
>>>>> does execute the feeding is the thread that
>>>>> fires the request, and not a Grizzly worker.
>>>>> [Thread-30] INFO Will close file stream
>>>>> java.io.FileInputStream_at_27fe4315 after having
>>>>> read 1440304 bytes
>>>>>
>>>>>
>>>>> 2) If I don't do any request before firing the
>>>>> multipart upload, the thread that does the
>>>>> feeding is a Grizzly threadpool worker thread:
>>>>> [Grizzly(22)] INFO Will close file stream
>>>>> java.io.FileInputStream_at_59ac4002 after having
>>>>> read 1440304 bytes
>>>>>
>>>>>
>>>>> Is this normal? I would expect a worker thread
>>>>> to always be used, and the main applicative
>>>>> thread that performs the request to never be
>>>>> blocking. (but it's not such an issue for me,
>>>>> we don't have a reactive non-blocking app anyway)
>>>> It's currently expected behavior. Will need
>>>> to re-evaluate this based on the new semantics
>>>> of the FeedableBodyGenerator.
>>> I've committed a change for this. If, upon
>>> testing, you find there is still an issue,
>>> please let us know.
>>>
>>>>>
>>>>>
>>>>> On the 1st case, here's the stacktrace when
>>>>> the feed method is called:
>>>>>
>>>>> *at
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.initializeAsynchronousTransfer(FeedableBodyGenerator.java:178)*
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$BodyGeneratorBodyHandler.doHandle(GrizzlyAsyncHttpProvider.java:2210)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider.sendRequest(GrizzlyAsyncHttpProvider.java:564)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$AsyncHttpClientFilter.sendAsGrizzlyRequest(GrizzlyAsyncHttpProvider.java:913)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$AsyncHttpClientFilter.handleWrite(GrizzlyAsyncHttpProvider.java:795)
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.ExecutorResolver$8.execute(ExecutorResolver.java:111)
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
>>>>> at
>>>>> org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.write(DefaultFilterChain.java:437)
>>>>> at
>>>>> org.glassfish.grizzly.nio.NIOConnection.write(NIOConnection.java:387)
>>>>> at
>>>>> org.glassfish.grizzly.nio.NIOConnection.write(NIOConnection.java:361)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider.execute(GrizzlyAsyncHttpProvider.java:307)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$1.completed(GrizzlyAsyncHttpProvider.java:224)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$1.completed(GrizzlyAsyncHttpProvider.java:210)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$ConnectionManager.doAsyncTrackedConnection(GrizzlyAsyncHttpProvider.java:2289)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider.execute(GrizzlyAsyncHttpProvider.java:244)
>>>>> *at
>>>>> com.ning.http.client.AsyncHttpClient.executeRequest(AsyncHttpClient.java:534)*
>>>>>
>>>>> So it seems this happen when the handshake has
>>>>> already been done when
>>>>> *initializeAsynchronousTransfer* is called, so
>>>>> that we do not go through the HandshakeListener
>>>>>
>>>>>
>>>>> Notice that this case seems to also happen in
>>>>> a few threads on the 2nd case, but most of the
>>>>> threads are Grizzly workers.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> 2013/9/12 Sébastien Lorber
>>>>> <lorber.sebastien_at_gmail.com
>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>
>>>>>
>>>>>
>>>>> Hi.
>>>>>
>>>>>
>>>>> Thanks, it seems to work.
>>>>>
>>>>> I would suggest to throw IOException on
>>>>> the flush method since the feed method is
>>>>> supposed to be called here
>>>>>
>>>>>
>>>>> My implementation of flush is:
>>>>>
>>>>> @Override
>>>>> public void flush() {
>>>>> Part[] partsArray =
>>>>> parts.toArray(new Part[parts.size()]);
>>>>> try ( OutputStream outputStream =
>>>>> createFeedingOutputStream() ) {
>>>>>
>>>>> Part.sendParts(outputStream,partsArray,multipartBoundary);
>>>>> } catch (Exception e) {
>>>>> throw new
>>>>> IllegalStateException("Unable to feed the
>>>>> FeedableBodyGenerator",e);
>>>>> }
>>>>> }
>>>>>
>>>>> Is this correct? The OutputStream
>>>>> redirects the bytes written to the
>>>>> feed(Buffer) method
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> There seems to be some concurrency issue.
>>>>> Because the upload of 1 file seems fine,
>>>>> but when using multiple threads, I often
>>>>> get the following stack:
>>>>> Caused by: java.io.IOException: Stream Closed
>>>>> at
>>>>> java.io.FileInputStream.readBytes(Native
>>>>> Method)
>>>>> at
>>>>> java.io.FileInputStream.read(FileInputStream.java:242)
>>>>> at
>>>>> com.google.common.io.CountingInputStream.read(CountingInputStream.java:62)
>>>>> at
>>>>> java.io.FilterInputStream.read(FilterInputStream.java:133)
>>>>> at
>>>>> java.io.FilterInputStream.read(FilterInputStream.java:107)
>>>>> at
>>>>> com.ning.http.multipart.FilePart.sendData(FilePart.java:178)
>>>>> at
>>>>> com.ning.http.multipart.Part.send(Part.java:331)
>>>>> at
>>>>> com.ning.http.multipart.Part.sendParts(Part.java:397)
>>>>>
>>>>>
>>>>> This is because the flush() method is
>>>>> called multiple times for the same request
>>>>> on some cases.
>>>>> I guess this is not supposed to happen.
>>>>> What I understand is that the flush()
>>>>> method is supposed to be called only once.
>>>>>
>>>>>
>>>>> Using debug logging breakpoints I get the
>>>>> following:
>>>>>
>>>>> myapp--api-test 12/09/2013-12:20:46.042 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 0 started
>>>>> myapp--api-test 12/09/2013-12:20:46.042 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 1 started
>>>>> myapp--api-test 12/09/2013-12:20:46.043 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 2 started
>>>>> myapp--api-test 12/09/2013-12:20:46.043 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 3 started
>>>>> myapp--api-test 12/09/2013-12:20:46.043 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 4 started
>>>>> myapp--api-test 12/09/2013-12:20:46.044 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 5 started
>>>>> myapp--api-test 12/09/2013-12:20:46.044 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 6 started
>>>>> myapp--api-test 12/09/2013-12:20:46.044 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 7 started
>>>>> myapp--api-test 12/09/2013-12:20:46.045 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 8 started
>>>>> myapp--api-test 12/09/2013-12:20:46.045 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 9 started
>>>>> myapp--api-test 12/09/2013-12:20:46.045 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 10 started
>>>>> myapp--api-test 12/09/2013-12:20:46.046 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 11 started
>>>>> myapp--api-test 12/09/2013-12:20:46.047 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 12 started
>>>>> myapp--api-test 12/09/2013-12:20:46.048 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 13 started
>>>>> myapp--api-test 12/09/2013-12:20:46.049 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 14 started
>>>>> myapp--api-test 12/09/2013-12:20:46.049 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 15 started
>>>>> myapp--api-test 12/09/2013-12:20:46.050 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 16 started
>>>>> myapp--api-test 12/09/2013-12:20:46.050 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 17 started
>>>>> myapp--api-test 12/09/2013-12:20:46.051 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 18 started
>>>>> myapp--api-test 12/09/2013-12:20:46.051 []
>>>>> [] [main] INFO
>>>>> com.myapp.perf.DocumentUploadPerfIntegrationTest:77
>>>>> - Thread 19 started
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_417de6ff
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_6c0d6ef7
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_7799b411
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_1c940409
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_480f9510
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_3e888183
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_17840db8
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_2cbad94b
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_64c0a4ae
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_102873a6
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_3d5d9ee8
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_51557949
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_6f95de2f
>>>>> Adding handshake listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_346d784c
>>>>> Completing and removing handshake listener
>>>>> for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_7799b411
>>>>> *Completing and removing handshake
>>>>> listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_5befaa07*
>>>>> *Completing and removing handshake
>>>>> listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_5befaa07*
>>>>> *Completing and removing handshake
>>>>> listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_5befaa07*
>>>>> *Completing and removing handshake
>>>>> listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_102873a6*
>>>>> *Completing and removing handshake
>>>>> listener for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_102873a6*
>>>>> Completing and removing handshake listener
>>>>> for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_346d784c
>>>>> Completing and removing handshake listener
>>>>> for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_64c0a4ae
>>>>> Completing and removing handshake listener
>>>>> for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_674735a8
>>>>> Completing and removing handshake listener
>>>>> for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_64c0a4ae
>>>>> Completing and removing handshake listener
>>>>> for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_480f9510
>>>>> Completing and removing handshake listener
>>>>> for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_6c0d6ef7
>>>>> Completing and removing handshake listener
>>>>> for
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator_at_1daf8fd8
>>>>>
>>>>>
>>>>> As you can see the same HandshakeListener
>>>>> seems to be called multiple times for the
>>>>> same FeedableBodyGenerator
>>>>>
>>>>> When this happens, the stack is:
>>>>>
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator$1.onComplete(FeedableBodyGenerator.java:198)
>>>>> ~[async-http-client-1.7.20-SNAPSHOT.jar:na]
>>>>> at
>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter.notifyHandshakeComplete(SSLBaseFilter.java:880)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.ssl.SSLFilter.notifyHandshakeComplete(SSLFilter.java:282)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter.handleRead(SSLBaseFilter.java:275)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$SwitchingSSLFilter.handleRead(GrizzlyAsyncHttpProvider.java:2490)
>>>>> ~[async-http-client-1.7.20-SNAPSHOT.jar:na]
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:546)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>> at
>>>>> org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> So I tried with the following code:
>>>>>
>>>>> private boolean alreadyFlushed = false;
>>>>> @Override
>>>>> public synchronized void flush() {
>>>>> if ( alreadyFlushed ) {
>>>>> return;
>>>>> }
>>>>> startFeeding();
>>>>> alreadyFlushed = true;
>>>>> }
>>>>>
>>>>> It works fine when upload small files.
>>>>>
>>>>> But with larger files, I often get
>>>>> TimeoutException stacks for some of the
>>>>> threads:
>>>>>
>>>>> Caused by:
>>>>> java.util.concurrent.TimeoutException
>>>>> at
>>>>> org.glassfish.grizzly.impl.SafeFutureImpl$Sync.innerGet(SafeFutureImpl.java:367)
>>>>> at
>>>>> org.glassfish.grizzly.impl.SafeFutureImpl.get(SafeFutureImpl.java:274)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator$BaseFeeder.block(FeedableBodyGenerator.java:349)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator$BaseFeeder.blockUntilQueueFree(FeedableBodyGenerator.java:339)
>>>>> at
>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator$BaseFeeder.feed(FeedableBodyGenerator.java:306)
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Did I miss something?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> 2013/9/12 Ryan Lubke
>>>>> <ryan.lubke_at_oracle.com
>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>
>>>>> Committed another small change.
>>>>> Please make sure you're at the latest
>>>>> when you build.
>>>>>
>>>>> -rl
>>>>>
>>>>>
>>>>> Ryan Lubke wrote:
>>>>>> Okay, I've committed another set of
>>>>>> refactorings to the
>>>>>> FeedableBodyGenerator.
>>>>>>
>>>>>> For your use case, you should extend
>>>>>> FeedableBodyGenerator.SimpleFeeder.
>>>>>>
>>>>>> Let me know if you run into issues.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Sébastien Lorber wrote:
>>>>>>> Yes I think it would, so that I can
>>>>>>> feed the queue at once
>>>>>>>
>>>>>>> One thread will be locked during the
>>>>>>> feeding for nothing but it's not a
>>>>>>> real problem in my usecase.
>>>>>>>
>>>>>>>
>>>>>>> 2013/9/10 Ryan Lubke
>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>
>>>>>>> Would having a different
>>>>>>> listener that will be notified
>>>>>>> once async transferring has been
>>>>>>> started work better for you?
>>>>>>>
>>>>>>> Something like:
>>>>>>>
>>>>>>> onAsyncTransferInitiated() {
>>>>>>> // invoke your feed method
>>>>>>> }
>>>>>>>
>>>>>>> ?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Sébastien Lorber wrote:
>>>>>>>> Unfortunatly I won't be able to
>>>>>>>> use the Feeder non-blocking
>>>>>>>> stuff for now, because of how
>>>>>>>> the multipart request in
>>>>>>>> handled in AHC
>>>>>>>>
>>>>>>>>
>>>>>>>> Here's my feeding method:
>>>>>>>>
>>>>>>>> public void feed() throws
>>>>>>>> IOException {
>>>>>>>> Part[] partsArray =
>>>>>>>> parts.toArray(new
>>>>>>>> Part[parts.size()]);
>>>>>>>> try ( OutputStream
>>>>>>>> outputStream =
>>>>>>>> createFeedingOutputStream() ) {
>>>>>>>>
>>>>>>>> Part.sendParts(outputStream,partsArray,multipartBoundary);
>>>>>>>> } catch (Exception e) {
>>>>>>>> throw new
>>>>>>>> IllegalStateException("Unable
>>>>>>>> to feed the
>>>>>>>> FeedableBodyGenerator",e);
>>>>>>>> }
>>>>>>>> }
>>>>>>>>
>>>>>>>>
>>>>>>>> As you can see, the multipart
>>>>>>>> Parts array can only be pushed
>>>>>>>> to the OutputStream, I don't
>>>>>>>> have any way to "pull" the data
>>>>>>>> when the canFeed() method is
>>>>>>>> triggered.
>>>>>>>>
>>>>>>>>
>>>>>>>> But I've seen that there's
>>>>>>>> a com.ning.http.multipart.MultipartBody#read
>>>>>>>> that seems to provide a memory
>>>>>>>> efficient way to pull data from
>>>>>>>> a Multipart body...
>>>>>>>>
>>>>>>>> Should see what I come up with this
>>>>>>>>
>>>>>>>>
>>>>>>>> 2013/9/10 Sébastien Lorber
>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>
>>>>>>>> It seems the Feeder is
>>>>>>>> highly recommended but not
>>>>>>>> mandatory so I tried without.
>>>>>>>>
>>>>>>>> With my existing code it
>>>>>>>> seems there is a
>>>>>>>> synchronization problem.
>>>>>>>>
>>>>>>>>
>>>>>>>> The feeding threads get
>>>>>>>> locked to
>>>>>>>> the prematureFeed.get();
>>>>>>>>
>>>>>>>> So the Grizzly kernel
>>>>>>>> threads are unable to
>>>>>>>> acquire the lock required
>>>>>>>> to enter
>>>>>>>> the initializeAsynchronousTransfer
>>>>>>>> method
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Will try with an
>>>>>>>> implementation of Feeder
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> 2013/9/10 Sébastien Lorber
>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>
>>>>>>>> Hmmm it seems I have a
>>>>>>>> problem with one of
>>>>>>>> your maven plugins.
>>>>>>>> I'll try to bypass it,
>>>>>>>> but for info:
>>>>>>>>
>>>>>>>> ➜ ahc2 git:(ahc-1.7.x)
>>>>>>>> mvn clean install
>>>>>>>> [WARNING]
>>>>>>>> [WARNING] Some problems
>>>>>>>> were encountered while
>>>>>>>> building the effective
>>>>>>>> settings
>>>>>>>> [WARNING]
>>>>>>>> 'profiles.profile[default].repositories.repository.id
>>>>>>>> <http://repositories.repository.id>'
>>>>>>>> must be unique but
>>>>>>>> found duplicate
>>>>>>>> repository with id
>>>>>>>> fullsix-maven-repository @
>>>>>>>> /home/slorber/.m2/settings.xml
>>>>>>>> [WARNING]
>>>>>>>> [INFO] Scanning for
>>>>>>>> projects...
>>>>>>>> [INFO]
>>>>>>>> [INFO]
>>>>>>>> ------------------------------------------------------------------------
>>>>>>>> [INFO] Building
>>>>>>>> Asynchronous Http
>>>>>>>> Client 1.7.20-SNAPSHOT
>>>>>>>> [INFO]
>>>>>>>> ------------------------------------------------------------------------
>>>>>>>> [INFO]
>>>>>>>> [INFO] ---
>>>>>>>> maven-clean-plugin:2.4.1:clean
>>>>>>>> (default-clean) @
>>>>>>>> async-http-client ---
>>>>>>>> [INFO]
>>>>>>>> [INFO] ---
>>>>>>>> maven-enforcer-plugin:1.0-beta-1:enforce
>>>>>>>> (enforce-maven) @
>>>>>>>> async-http-client ---
>>>>>>>> [INFO]
>>>>>>>> [INFO] ---
>>>>>>>> maven-enforcer-plugin:1.0-beta-1:enforce
>>>>>>>> (enforce-versions) @
>>>>>>>> async-http-client ---
>>>>>>>> [INFO]
>>>>>>>> [INFO] ---
>>>>>>>> maven-resources-plugin:2.4.3:resources
>>>>>>>> (default-resources) @
>>>>>>>> async-http-client ---
>>>>>>>> [INFO] Using 'UTF-8'
>>>>>>>> encoding to copy
>>>>>>>> filtered resources.
>>>>>>>> [INFO] skip non
>>>>>>>> existing
>>>>>>>> resourceDirectory
>>>>>>>> /home/slorber/Bureau/ahc2/src/main/resources
>>>>>>>> [INFO]
>>>>>>>> [INFO] ---
>>>>>>>> maven-compiler-plugin:2.3.2:compile
>>>>>>>> (default-compile) @
>>>>>>>> async-http-client ---
>>>>>>>> [INFO] Compiling 158
>>>>>>>> source files to
>>>>>>>> /home/slorber/Bureau/ahc2/target/classes
>>>>>>>> [INFO]
>>>>>>>> *[INFO] ---
>>>>>>>> animal-sniffer-maven-plugin:1.6:check
>>>>>>>> (check-java-1.5-compat)
>>>>>>>> @ async-http-client ---*
>>>>>>>> *[INFO] Checking
>>>>>>>> unresolved references
>>>>>>>> to
>>>>>>>> org.codehaus.mojo.signature:java15:1.0*
>>>>>>>> *[ERROR] Undefined
>>>>>>>> reference:
>>>>>>>> java/io/IOException.<init>(Ljava/lang/Throwable;)V
>>>>>>>> in
>>>>>>>> /home/slorber/Bureau/ahc2/target/classes/com/ning/http/client/providers/grizzly/FeedableBodyGenerator.class*
>>>>>>>> [INFO]
>>>>>>>> ------------------------------------------------------------------------
>>>>>>>> [INFO] BUILD FAILURE
>>>>>>>> [INFO]
>>>>>>>> ------------------------------------------------------------------------
>>>>>>>> [INFO] Total time: 8.747s
>>>>>>>> [INFO] Finished at: Tue
>>>>>>>> Sep 10 11:25:41 CEST 2013
>>>>>>>> [INFO] Final Memory:
>>>>>>>> 30M/453M
>>>>>>>> [INFO]
>>>>>>>> ------------------------------------------------------------------------
>>>>>>>> *[ERROR] Failed to
>>>>>>>> execute goal
>>>>>>>> org.codehaus.mojo:animal-sniffer-maven-plugin:1.6:check
>>>>>>>> (check-java-1.5-compat)
>>>>>>>> on project
>>>>>>>> async-http-client:
>>>>>>>> Signature errors found.
>>>>>>>> Verify them and put
>>>>>>>> @IgnoreJRERequirement
>>>>>>>> on them. -> [Help 1]*
>>>>>>>> [ERROR]
>>>>>>>> [ERROR] To see the full
>>>>>>>> stack trace of the
>>>>>>>> errors, re-run Maven
>>>>>>>> with the -e switch.
>>>>>>>> [ERROR] Re-run Maven
>>>>>>>> using the -X switch to
>>>>>>>> enable full debug logging.
>>>>>>>> [ERROR]
>>>>>>>> [ERROR] For more
>>>>>>>> information about the
>>>>>>>> errors and possible
>>>>>>>> solutions, please read
>>>>>>>> the following articles:
>>>>>>>> [ERROR] [Help 1]
>>>>>>>> http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> 2013/9/10 Sébastien
>>>>>>>> Lorber
>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>
>>>>>>>> Ok thank you, I'll
>>>>>>>> try to implement
>>>>>>>> that today and will
>>>>>>>> give you my feedback :)
>>>>>>>>
>>>>>>>>
>>>>>>>> 2013/9/10 Ryan
>>>>>>>> Lubke
>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>
>>>>>>>> Okay,
>>>>>>>>
>>>>>>>> I've committed
>>>>>>>> my initial
>>>>>>>> changes to the
>>>>>>>> AHC
>>>>>>>> repository.
>>>>>>>> Here's a
>>>>>>>> summary of the
>>>>>>>> changes:
>>>>>>>>
>>>>>>>>
>>>>>>>> *Improvements
>>>>>>>> to the
>>>>>>>> FeedableBodyGenerator
>>>>>>>> (Grizzly's).
>>>>>>>> - Don't allow
>>>>>>>> queueing of
>>>>>>>> data before
>>>>>>>> initiateAsyncTransfer
>>>>>>>> has been
>>>>>>>> invoked. In low
>>>>>>>> memory
>>>>>>>> heaps, this
>>>>>>>> could lead to
>>>>>>>> an OOM if the
>>>>>>>> source is
>>>>>>>> feeding too
>>>>>>>> fast. The new
>>>>>>>> behavior is to
>>>>>>>> block until
>>>>>>>> initiateAsyncTransfer
>>>>>>>> is called, at
>>>>>>>> which time the
>>>>>>>> blocked thread
>>>>>>>> may proceed with
>>>>>>>> the feed operation.
>>>>>>>> - Introduce the
>>>>>>>> concept of a
>>>>>>>> Feeder.
>>>>>>>> Implementations
>>>>>>>> are
>>>>>>>> responsible, at
>>>>>>>> a high level, for:
>>>>>>>> + letting the
>>>>>>>> provider know
>>>>>>>> that data is
>>>>>>>> available to be
>>>>>>>> fed without
>>>>>>>> blocking
>>>>>>>> + allowing the
>>>>>>>> registration of
>>>>>>>> a callback that
>>>>>>>> the Feeder
>>>>>>>> implementation
>>>>>>>> may invoke
>>>>>>>> to signal that
>>>>>>>> more data is
>>>>>>>> available, if
>>>>>>>> it wasn't
>>>>>>>> available at a
>>>>>>>> previous point
>>>>>>>> in time.
>>>>>>>> - When using a
>>>>>>>> Feeder with a
>>>>>>>> secure request,
>>>>>>>> the SSL
>>>>>>>> handshake will
>>>>>>>> be kicked off
>>>>>>>> by the
>>>>>>>> initiateAsyncTransfer
>>>>>>>> call, but
>>>>>>>> feeding of data
>>>>>>>> will not occur
>>>>>>>> until the
>>>>>>>> handshake is
>>>>>>>> complete.
>>>>>>>> This is
>>>>>>>> necessary as
>>>>>>>> the SSLFilter
>>>>>>>> will queue up
>>>>>>>> all writes
>>>>>>>> until the
>>>>>>>> handshake is
>>>>>>>> complete,
>>>>>>>> and currently,
>>>>>>>> the buffer
>>>>>>>> isn't tied in
>>>>>>>> with the
>>>>>>>> transport flow
>>>>>>>> control mechanism.
>>>>>>>> NOTE: This new
>>>>>>>> SSL behavior is
>>>>>>>> not currently
>>>>>>>> applied when
>>>>>>>> invoking the
>>>>>>>> feed() method
>>>>>>>> outside the
>>>>>>>> context of a
>>>>>>>> Feeder. Still
>>>>>>>> need to address
>>>>>>>> that.
>>>>>>>> - Exposed
>>>>>>>> configuration
>>>>>>>> of the async
>>>>>>>> write queue
>>>>>>>> limit through
>>>>>>>> the
>>>>>>>> FeedableBodyGenerator.
>>>>>>>> This is an
>>>>>>>> improvement on
>>>>>>>> using a
>>>>>>>> TransportCustomizer
>>>>>>>> as any
>>>>>>>> configuration
>>>>>>>> there is
>>>>>>>> transport-wide,
>>>>>>>> and therefor
>>>>>>>> applied to all
>>>>>>>> Connections. By
>>>>>>>> exposing it
>>>>>>>> here, each feeder
>>>>>>>> may have a
>>>>>>>> different byte
>>>>>>>> limit.
>>>>>>>> - Improved
>>>>>>>> documentation
>>>>>>>> for this class*
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> I recommend
>>>>>>>> reading through
>>>>>>>> the javadoc
>>>>>>>> comments in the
>>>>>>>> source [1] for
>>>>>>>> FeedableBodyGenerator
>>>>>>>> (comments welcome).
>>>>>>>> Additionally, I
>>>>>>>> would re-work
>>>>>>>> your code to
>>>>>>>> leverage the
>>>>>>>> Feeder instead
>>>>>>>> of calling
>>>>>>>> feed() directly.
>>>>>>>>
>>>>>>>> If you have
>>>>>>>> issues
>>>>>>>> implementing
>>>>>>>> Feeder, do let
>>>>>>>> us know.
>>>>>>>>
>>>>>>>> If you have
>>>>>>>> additional
>>>>>>>> questions,
>>>>>>>> again, let us know.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> -rl
>>>>>>>>
>>>>>>>> [1]
>>>>>>>> https://github.com/AsyncHttpClient/async-http-client/blob/ahc-1.7.x/src/main/java/com/ning/http/client/providers/grizzly/FeedableBodyGenerator.java
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Ryan Lubke wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Sébastien
>>>>>>>>> Lorber wrote:
>>>>>>>>>> So in the end
>>>>>>>>>> I've end up
>>>>>>>>>> with an
>>>>>>>>>> implementation that's
>>>>>>>>>> working for me.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> I think there
>>>>>>>>>> are 2 bugs:
>>>>>>>>>>
>>>>>>>>>> 1) The bytes
>>>>>>>>>> can
>>>>>>>>>> accumulate in
>>>>>>>>>> the
>>>>>>>>>> FeedableBodyGenerator
>>>>>>>>>> queue if the
>>>>>>>>>> initialize(ctx)
>>>>>>>>>> method is not
>>>>>>>>>> called fast
>>>>>>>>>> enough.
>>>>>>>>>> This can be
>>>>>>>>>> solved by
>>>>>>>>>> using a
>>>>>>>>>> BlockingQueue
>>>>>>>>>> of size 1 and
>>>>>>>>>> the put() method.
>>>>>>>>>>
>>>>>>>>>> 2) Once the
>>>>>>>>>> context is
>>>>>>>>>> injected, the
>>>>>>>>>> FeedableBodyGenerator
>>>>>>>>>> flushes the
>>>>>>>>>> queue.
>>>>>>>>>> The matter is
>>>>>>>>>> that if the
>>>>>>>>>> connection is
>>>>>>>>>> new, not
>>>>>>>>>> warmed up by
>>>>>>>>>> a previous
>>>>>>>>>> request, then
>>>>>>>>>> the SSL
>>>>>>>>>> handshake is
>>>>>>>>>> not done yet,
>>>>>>>>>> and it seems
>>>>>>>>>> that the
>>>>>>>>>> bytes are
>>>>>>>>>> accumulated
>>>>>>>>>> in some part
>>>>>>>>>> of the SSL
>>>>>>>>>> filter which
>>>>>>>>>> doesn't
>>>>>>>>>> deliver them
>>>>>>>>>> to the
>>>>>>>>>> connection
>>>>>>>>>> until the
>>>>>>>>>> handshake has
>>>>>>>>>> completed,
>>>>>>>>>> so c.canWrite()
>>>>>>>>>> continues to
>>>>>>>>>> return true.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> I have
>>>>>>>>>> replaced some
>>>>>>>>>> part of the
>>>>>>>>>> FeedableBodyGenerator
>>>>>>>>>> to test this
>>>>>>>>>> and it works
>>>>>>>>>> pretty fine.
>>>>>>>>>> See what I
>>>>>>>>>> have changed:
>>>>>>>>>>
>>>>>>>>>> 1)
>>>>>>>>>> private
>>>>>>>>>> final
>>>>>>>>>> BlockingQueue<BodyPart>
>>>>>>>>>> queue = new
>>>>>>>>>> LinkedBlockingQueue<BodyPart>(1);
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> 2)
>>>>>>>>>> public
>>>>>>>>>> void
>>>>>>>>>> feed(final
>>>>>>>>>> Buffer
>>>>>>>>>> buffer, final
>>>>>>>>>> boolean last)
>>>>>>>>>> throws
>>>>>>>>>> IOException {
>>>>>>>>>> try {
>>>>>>>>>>
>>>>>>>>>> queue.put(new
>>>>>>>>>> BodyPart(buffer,
>>>>>>>>>> last));
>>>>>>>>>> }
>>>>>>>>>> catch
>>>>>>>>>> (InterruptedException
>>>>>>>>>> e) {
>>>>>>>>>>
>>>>>>>>>> throw new
>>>>>>>>>> RuntimeException(e);
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> queueSize.incrementAndGet();
>>>>>>>>>> if
>>>>>>>>>> (context !=
>>>>>>>>>> null) {
>>>>>>>>>>
>>>>>>>>>> blockUntilConnectionIsReadyToWrite(context);
>>>>>>>>>>
>>>>>>>>>> flushQueue(true);
>>>>>>>>>> }
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> private
>>>>>>>>>> void
>>>>>>>>>> blockUntilConnectionIsReadyToWrite(FilterChainContext
>>>>>>>>>> fcc) {
>>>>>>>>>> if (
>>>>>>>>>> !connectionIsReadyToWrite(fcc)
>>>>>>>>>> ) {
>>>>>>>>>> while
>>>>>>>>>> (
>>>>>>>>>> !connectionIsReadyToWrite(fcc)
>>>>>>>>>> ) {
>>>>>>>>>> try
>>>>>>>>>> {
>>>>>>>>>> Thread.sleep(10);
>>>>>>>>>> } catch (
>>>>>>>>>> Exception e )
>>>>>>>>>> { throw new
>>>>>>>>>> RuntimeException(e);
>>>>>>>>>> }
>>>>>>>>>> }
>>>>>>>>>> }
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> private
>>>>>>>>>> boolean
>>>>>>>>>> connectionIsReadyToWrite(FilterChainContext
>>>>>>>>>> fcc) {
>>>>>>>>>>
>>>>>>>>>> Connection
>>>>>>>>>> connection =
>>>>>>>>>> fcc.getConnection();
>>>>>>>>>>
>>>>>>>>>> SSLEngine
>>>>>>>>>> sslEngine =
>>>>>>>>>> SSLUtils.getSSLEngine(connection);
>>>>>>>>>>
>>>>>>>>>> return
>>>>>>>>>> sslEngine !=
>>>>>>>>>> null &&
>>>>>>>>>> !SSLUtils.isHandshaking(sslEngine);
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> What do you
>>>>>>>>>> think?
>>>>>>>>>
>>>>>>>>> We had come to
>>>>>>>>> similar
>>>>>>>>> conclusions on
>>>>>>>>> this end. I'm
>>>>>>>>> still working
>>>>>>>>> through
>>>>>>>>> testing the
>>>>>>>>> idea I
>>>>>>>>> mentioned
>>>>>>>>> previously
>>>>>>>>> (took longer
>>>>>>>>> than I
>>>>>>>>> expected - sorry).
>>>>>>>>> I hope to have
>>>>>>>>> something for
>>>>>>>>> you to test
>>>>>>>>> very soon.
>>>>>>>>>
>>>>>>>>> Note that it
>>>>>>>>> will be taking
>>>>>>>>> the above into
>>>>>>>>> account as well.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> 2013/9/5
>>>>>>>>>> Sébastien
>>>>>>>>>> Lorber
>>>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> I have
>>>>>>>>>> tried to
>>>>>>>>>> put a
>>>>>>>>>> while (
>>>>>>>>>> context
>>>>>>>>>> == null )
>>>>>>>>>> Thread.sleep
>>>>>>>>>> but it
>>>>>>>>>> doesn't
>>>>>>>>>> seem to
>>>>>>>>>> work,
>>>>>>>>>> when the
>>>>>>>>>> context
>>>>>>>>>> gets
>>>>>>>>>> injected,
>>>>>>>>>> after the
>>>>>>>>>> sleeps,
>>>>>>>>>> there's
>>>>>>>>>> an OOM
>>>>>>>>>>
>>>>>>>>>> So I hope
>>>>>>>>>> you'll
>>>>>>>>>> have more
>>>>>>>>>> success
>>>>>>>>>> with your
>>>>>>>>>> alternative
>>>>>>>>>> :)
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> I have
>>>>>>>>>> done
>>>>>>>>>> another
>>>>>>>>>> test,
>>>>>>>>>> remember
>>>>>>>>>> my code
>>>>>>>>>> that
>>>>>>>>>> worked,
>>>>>>>>>> which
>>>>>>>>>> previously "warmed"
>>>>>>>>>> the
>>>>>>>>>> Thread
>>>>>>>>>> with an
>>>>>>>>>> useless
>>>>>>>>>> request.
>>>>>>>>>>
>>>>>>>>>> private
>>>>>>>>>> Runnable
>>>>>>>>>> uploadSingleDocumentRunnable
>>>>>>>>>> = new
>>>>>>>>>> Runnable() {
>>>>>>>>>> @Override
>>>>>>>>>>
>>>>>>>>>> public
>>>>>>>>>> void run() {
>>>>>>>>>> try {
>>>>>>>>>>
>>>>>>>>>> getUselessSessionCode();
>>>>>>>>>>
>>>>>>>>>> Thread.sleep(X);
>>>>>>>>>>
>>>>>>>>>> uploadSingleDocument();
>>>>>>>>>> }
>>>>>>>>>> catch (
>>>>>>>>>> Exception
>>>>>>>>>> e ) {
>>>>>>>>>>
>>>>>>>>>> throw new
>>>>>>>>>> RuntimeException("file
>>>>>>>>>> upload
>>>>>>>>>> failed",e);
>>>>>>>>>> }
>>>>>>>>>> }
>>>>>>>>>> };
>>>>>>>>>>
>>>>>>>>>> I have
>>>>>>>>>> put a
>>>>>>>>>> sleep of
>>>>>>>>>> X between
>>>>>>>>>> the
>>>>>>>>>> useless
>>>>>>>>>> warmup
>>>>>>>>>> request,
>>>>>>>>>> and the
>>>>>>>>>> real
>>>>>>>>>> upload
>>>>>>>>>> request
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> What I
>>>>>>>>>> noticed
>>>>>>>>>> is that
>>>>>>>>>> there is
>>>>>>>>>> a very
>>>>>>>>>> different
>>>>>>>>>> behavior
>>>>>>>>>> according
>>>>>>>>>> to the
>>>>>>>>>> value of X
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Under 10
>>>>>>>>>> seconds,
>>>>>>>>>> it seems
>>>>>>>>>> the stuff
>>>>>>>>>> is still
>>>>>>>>>> warm, I
>>>>>>>>>> can
>>>>>>>>>> upload
>>>>>>>>>> the
>>>>>>>>>> documents.
>>>>>>>>>> Around 10
>>>>>>>>>> seconds I
>>>>>>>>>> get a
>>>>>>>>>> stack
>>>>>>>>>> which
>>>>>>>>>> seems to
>>>>>>>>>> be
>>>>>>>>>> "connection
>>>>>>>>>> closed"
>>>>>>>>>> or something
>>>>>>>>>> Above 10
>>>>>>>>>> seconds,
>>>>>>>>>> I get OOM
>>>>>>>>>> like if
>>>>>>>>>> the stuff
>>>>>>>>>> wasn't warm.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> The
>>>>>>>>>> stacks I
>>>>>>>>>> get for
>>>>>>>>>> 10
>>>>>>>>>> seconds
>>>>>>>>>> looks like
>>>>>>>>>>
>>>>>>>>>> Caused
>>>>>>>>>> by:
>>>>>>>>>> javax.net.ssl.SSLException:
>>>>>>>>>> SSLEngine
>>>>>>>>>> is CLOSED
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.ssl.SSLConnectionContext.wrap(SSLConnectionContext.java:295)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.ssl.SSLConnectionContext.wrapAll(SSLConnectionContext.java:238)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter.wrapAll(SSLBaseFilter.java:405)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter.handleWrite(SSLBaseFilter.java:320)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.ssl.SSLFilter.accurateWrite(SSLFilter.java:255)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.ssl.SSLFilter.handleWrite(SSLFilter.java:143)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$SwitchingSSLFilter.handleWrite(GrizzlyAsyncHttpProvider.java:2500)
>>>>>>>>>> ~[async-http-client-1.7.20-SNAPSHOT.jar:na]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.filterchain.ExecutorResolver$8.execute(ExecutorResolver.java:111)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:853)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:720)
>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>> at
>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.flushQueue(FeedableBodyGenerator.java:133)
>>>>>>>>>> ~[async-http-client-1.7.20-SNAPSHOT.jar:na]
>>>>>>>>>> at
>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.feed(FeedableBodyGenerator.java:95)
>>>>>>>>>> ~[async-http-client-1.7.20-SNAPSHOT.jar:na]
>>>>>>>>>>
>>>>>>>>>> I think I
>>>>>>>>>> got some
>>>>>>>>>> other
>>>>>>>>>> different
>>>>>>>>>> stacks
>>>>>>>>>> saying
>>>>>>>>>> Connection Closed
>>>>>>>>>> Remotely
>>>>>>>>>> or
>>>>>>>>>> something
>>>>>>>>>> like that.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> So it
>>>>>>>>>> seems
>>>>>>>>>> that
>>>>>>>>>> something
>>>>>>>>>> is bound
>>>>>>>>>> to my
>>>>>>>>>> thread,
>>>>>>>>>> and it
>>>>>>>>>> stays
>>>>>>>>>> bound to
>>>>>>>>>> it for
>>>>>>>>>> about 10
>>>>>>>>>> seconds,
>>>>>>>>>> do you
>>>>>>>>>> have any
>>>>>>>>>> idea what
>>>>>>>>>> it could be?
>>>>>>>>>> (My
>>>>>>>>>> connection timeout
>>>>>>>>>> setting
>>>>>>>>>> seems to
>>>>>>>>>> have no
>>>>>>>>>> effect on
>>>>>>>>>> this 10s
>>>>>>>>>> threshold)
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> 2013/9/5
>>>>>>>>>> Ryan
>>>>>>>>>> Lubke
>>>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>>>
>>>>>>>>>> That
>>>>>>>>>> is
>>>>>>>>>> one
>>>>>>>>>> solution.
>>>>>>>>>> I'm
>>>>>>>>>> working
>>>>>>>>>> out
>>>>>>>>>> an
>>>>>>>>>> alternative
>>>>>>>>>> right
>>>>>>>>>> now.
>>>>>>>>>> Stay
>>>>>>>>>> tuned!
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Anyway
>>>>>>>>>>> it's
>>>>>>>>>>> not
>>>>>>>>>>> a
>>>>>>>>>>> problem,
>>>>>>>>>>> I
>>>>>>>>>>> think the
>>>>>>>>>>> FeedableBodyGenerator.feed()
>>>>>>>>>>> method
>>>>>>>>>>> just
>>>>>>>>>>> has
>>>>>>>>>>> to
>>>>>>>>>>> block until
>>>>>>>>>>> a
>>>>>>>>>>> context
>>>>>>>>>>> has
>>>>>>>>>>> been
>>>>>>>>>>> (and
>>>>>>>>>>> ThreadCache
>>>>>>>>>>> initialized)
>>>>>>>>>>> to
>>>>>>>>>>> avoid OOM
>>>>>>>>>>> errors
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> 2013/9/5
>>>>>>>>>>> Sébastien
>>>>>>>>>>> Lorber
>>>>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> What
>>>>>>>>>>> is
>>>>>>>>>>> very
>>>>>>>>>>> strange
>>>>>>>>>>> is
>>>>>>>>>>> that
>>>>>>>>>>> I tested
>>>>>>>>>>> with/without
>>>>>>>>>>> the
>>>>>>>>>>> same
>>>>>>>>>>> sessionCode
>>>>>>>>>>> with
>>>>>>>>>>> our
>>>>>>>>>>> previous
>>>>>>>>>>> code,
>>>>>>>>>>> the
>>>>>>>>>>> one
>>>>>>>>>>> not
>>>>>>>>>>> using
>>>>>>>>>>> FeedableBodyGenerator,
>>>>>>>>>>> which
>>>>>>>>>>> has
>>>>>>>>>>> a high
>>>>>>>>>>> memory
>>>>>>>>>>> consumption.
>>>>>>>>>>> Despites
>>>>>>>>>>> the
>>>>>>>>>>> fact
>>>>>>>>>>> it
>>>>>>>>>>> had
>>>>>>>>>>> high
>>>>>>>>>>> memory
>>>>>>>>>>> consumption,
>>>>>>>>>>> it
>>>>>>>>>>> seems
>>>>>>>>>>> work
>>>>>>>>>>> fine
>>>>>>>>>>> to
>>>>>>>>>>> upload
>>>>>>>>>>> multiple
>>>>>>>>>>> documents
>>>>>>>>>>> if
>>>>>>>>>>> allocated
>>>>>>>>>>> with
>>>>>>>>>>> a large
>>>>>>>>>>> heap,
>>>>>>>>>>> and
>>>>>>>>>>> the
>>>>>>>>>>> sessionCode
>>>>>>>>>>> seems
>>>>>>>>>>> to
>>>>>>>>>>> have
>>>>>>>>>>> no
>>>>>>>>>>> effect.
>>>>>>>>>>>
>>>>>>>>>>> On
>>>>>>>>>>> the
>>>>>>>>>>> new
>>>>>>>>>>> impl
>>>>>>>>>>> using
>>>>>>>>>>> the
>>>>>>>>>>> FeedableBodyGenerator,
>>>>>>>>>>> the
>>>>>>>>>>> sessionCode
>>>>>>>>>>> sent
>>>>>>>>>>> as
>>>>>>>>>>> a multipart
>>>>>>>>>>> bodypart
>>>>>>>>>>> seems
>>>>>>>>>>> to
>>>>>>>>>>> have
>>>>>>>>>>> an
>>>>>>>>>>> effect.
>>>>>>>>>>>
>>>>>>>>>>> I have
>>>>>>>>>>> tried
>>>>>>>>>>> to
>>>>>>>>>>> feed
>>>>>>>>>>> the
>>>>>>>>>>> queue
>>>>>>>>>>> before
>>>>>>>>>>> sending
>>>>>>>>>>> the
>>>>>>>>>>> request
>>>>>>>>>>> to
>>>>>>>>>>> AHC,
>>>>>>>>>>> but
>>>>>>>>>>> this
>>>>>>>>>>> leads
>>>>>>>>>>> to
>>>>>>>>>>> this
>>>>>>>>>>> exception
>>>>>>>>>>> (with/without
>>>>>>>>>>> sessionCode
>>>>>>>>>>> switching)
>>>>>>>>>>> Caused
>>>>>>>>>>> by:
>>>>>>>>>>> java.util.concurrent.TimeoutException:
>>>>>>>>>>> Timeout
>>>>>>>>>>> exceeded
>>>>>>>>>>> at
>>>>>>>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider.timeout(GrizzlyAsyncHttpProvider.java:528)
>>>>>>>>>>> at
>>>>>>>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$3.onTimeout(GrizzlyAsyncHttpProvider.java:361)
>>>>>>>>>>> at
>>>>>>>>>>> org.glassfish.grizzly.utils.IdleTimeoutFilter$DefaultWorker.doWork(IdleTimeoutFilter.java:383)
>>>>>>>>>>> at
>>>>>>>>>>> org.glassfish.grizzly.utils.IdleTimeoutFilter$DefaultWorker.doWork(IdleTimeoutFilter.java:362)
>>>>>>>>>>> at
>>>>>>>>>>> org.glassfish.grizzly.utils.DelayedExecutor$DelayedRunnable.run(DelayedExecutor.java:158)
>>>>>>>>>>> at
>>>>>>>>>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
>>>>>>>>>>> at
>>>>>>>>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> 2013/9/5
>>>>>>>>>>> Sébastien
>>>>>>>>>>> Lorber
>>>>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>>>>
>>>>>>>>>>> By
>>>>>>>>>>> the
>>>>>>>>>>> way,
>>>>>>>>>>> by
>>>>>>>>>>> using
>>>>>>>>>>> a low
>>>>>>>>>>> timeout
>>>>>>>>>>> with
>>>>>>>>>>> the
>>>>>>>>>>> same
>>>>>>>>>>> sessioncode,
>>>>>>>>>>> I got
>>>>>>>>>>> the
>>>>>>>>>>> following
>>>>>>>>>>> NPE:
>>>>>>>>>>>
>>>>>>>>>>> Caused
>>>>>>>>>>> by:
>>>>>>>>>>> java.lang.NullPointerException
>>>>>>>>>>> at
>>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.block(FeedableBodyGenerator.java:184)
>>>>>>>>>>> at
>>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.blockUntilQueueFree(FeedableBodyGenerator.java:167)
>>>>>>>>>>> at
>>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.flushQueue(FeedableBodyGenerator.java:124)
>>>>>>>>>>> at
>>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.feed(FeedableBodyGenerator.java:94)
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> GrizzlyAsyncHttpProvider.HttpTransactionContext
>>>>>>>>>>> httpCtx
>>>>>>>>>>> =
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> getHttpTransactionContext(c);
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> httpCtx.abort(e.getCause());
>>>>>>>>>>>
>>>>>>>>>>> I guess
>>>>>>>>>>> the
>>>>>>>>>>> httpCtx
>>>>>>>>>>> is
>>>>>>>>>>> not
>>>>>>>>>>> already
>>>>>>>>>>> available
>>>>>>>>>>> to
>>>>>>>>>>> be
>>>>>>>>>>> aborted
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> 2013/9/5
>>>>>>>>>>> Sébastien
>>>>>>>>>>> Lorber
>>>>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> This
>>>>>>>>>>> is
>>>>>>>>>>> right,
>>>>>>>>>>> here's
>>>>>>>>>>> a log
>>>>>>>>>>> I have
>>>>>>>>>>> when
>>>>>>>>>>> I use
>>>>>>>>>>> the
>>>>>>>>>>> same
>>>>>>>>>>> session
>>>>>>>>>>> code,
>>>>>>>>>>> ie
>>>>>>>>>>> the
>>>>>>>>>>> remote
>>>>>>>>>>> host
>>>>>>>>>>> is
>>>>>>>>>>> blocking
>>>>>>>>>>> the
>>>>>>>>>>> data
>>>>>>>>>>> or
>>>>>>>>>>> something.
>>>>>>>>>>> This
>>>>>>>>>>> is
>>>>>>>>>>> obtained
>>>>>>>>>>> by
>>>>>>>>>>> running
>>>>>>>>>>> 5 parallel
>>>>>>>>>>> uploads.
>>>>>>>>>>>
>>>>>>>>>>> *Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 0 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = false*
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> *Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 97
>>>>>>>>>>> with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = false*
>>>>>>>>>>> *Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 100
>>>>>>>>>>> with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = false*
>>>>>>>>>>> *Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 160
>>>>>>>>>>> with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true*
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 0 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> java.lang.OutOfMemoryError:
>>>>>>>>>>> GC
>>>>>>>>>>> overhead
>>>>>>>>>>> limit
>>>>>>>>>>> exceeded
>>>>>>>>>>> Dumping
>>>>>>>>>>> heap
>>>>>>>>>>> to
>>>>>>>>>>> /ome/lorber/ureau/om
>>>>>>>>>>> ...
>>>>>>>>>>> Unable
>>>>>>>>>>> to
>>>>>>>>>>> create
>>>>>>>>>>> /ome/lorber/ureau/om:
>>>>>>>>>>> Le
>>>>>>>>>>> fichier
>>>>>>>>>>> existe
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Disconnected
>>>>>>>>>>> from
>>>>>>>>>>> the
>>>>>>>>>>> target
>>>>>>>>>>> VM,
>>>>>>>>>>> address:
>>>>>>>>>>> '127.0.0.1:49268
>>>>>>>>>>> <http://127.0.0.1:49268>',
>>>>>>>>>>> transport:
>>>>>>>>>>> 'socket'
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Otherwise,
>>>>>>>>>>> with
>>>>>>>>>>> different
>>>>>>>>>>> session
>>>>>>>>>>> codes,
>>>>>>>>>>> I get
>>>>>>>>>>> the
>>>>>>>>>>> following:
>>>>>>>>>>>
>>>>>>>>>>> *Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 0 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = false*
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> *Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 0 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = false*
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> *Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 0 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = false*
>>>>>>>>>>> *Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 0 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = false*
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> Flushing
>>>>>>>>>>> queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1 with
>>>>>>>>>>> allowBlocking
>>>>>>>>>>> = true
>>>>>>>>>>> ...
>>>>>>>>>>> and
>>>>>>>>>>> this
>>>>>>>>>>> continues
>>>>>>>>>>> without
>>>>>>>>>>> OOM
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> So,
>>>>>>>>>>> this
>>>>>>>>>>> seems
>>>>>>>>>>> to
>>>>>>>>>>> be
>>>>>>>>>>> the
>>>>>>>>>>> problem.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> I think
>>>>>>>>>>> it
>>>>>>>>>>> would
>>>>>>>>>>> be
>>>>>>>>>>> great
>>>>>>>>>>> to
>>>>>>>>>>> be
>>>>>>>>>>> able
>>>>>>>>>>> to
>>>>>>>>>>> be
>>>>>>>>>>> able
>>>>>>>>>>> to
>>>>>>>>>>> choose
>>>>>>>>>>> the
>>>>>>>>>>> queue
>>>>>>>>>>> impl
>>>>>>>>>>> behind
>>>>>>>>>>> that FeedableBodyGenerator,
>>>>>>>>>>> like
>>>>>>>>>>> I suggested
>>>>>>>>>>> in
>>>>>>>>>>> my
>>>>>>>>>>> pull
>>>>>>>>>>> request.
>>>>>>>>>>>
>>>>>>>>>>> See
>>>>>>>>>>> here:
>>>>>>>>>>> https://github.com/slorber/async-http-client/blob/79b0c3b28a61b0aa4c4b055bca8f6be11d9ed1e6/src/main/java/com/ning/http/client/providers/grizzly/FeedableBodyGenerator.java
>>>>>>>>>>>
>>>>>>>>>>> Using
>>>>>>>>>>> a LinkedBlockingQueue
>>>>>>>>>>> seems
>>>>>>>>>>> to
>>>>>>>>>>> be
>>>>>>>>>>> a nice
>>>>>>>>>>> idea
>>>>>>>>>>> in
>>>>>>>>>>> this
>>>>>>>>>>> context,
>>>>>>>>>>> and
>>>>>>>>>>> in
>>>>>>>>>>> my
>>>>>>>>>>> case
>>>>>>>>>>> I would
>>>>>>>>>>> probably
>>>>>>>>>>> use
>>>>>>>>>>> a queue
>>>>>>>>>>> of
>>>>>>>>>>> size
>>>>>>>>>>> 1
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> This
>>>>>>>>>>> would
>>>>>>>>>>> handle
>>>>>>>>>>> the
>>>>>>>>>>> blocking
>>>>>>>>>>> of
>>>>>>>>>>> the
>>>>>>>>>>> feed
>>>>>>>>>>> method,
>>>>>>>>>>> without
>>>>>>>>>>> having
>>>>>>>>>>> to
>>>>>>>>>>> use
>>>>>>>>>>> this:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> if
>>>>>>>>>>> (context
>>>>>>>>>>> !=
>>>>>>>>>>> null)
>>>>>>>>>>> {
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> flushQueue(true);
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Or
>>>>>>>>>>> perhaps
>>>>>>>>>>> the
>>>>>>>>>>> feed()
>>>>>>>>>>> method
>>>>>>>>>>> have
>>>>>>>>>>> to
>>>>>>>>>>> wait
>>>>>>>>>>> until
>>>>>>>>>>> a context
>>>>>>>>>>> is
>>>>>>>>>>> set
>>>>>>>>>>> in
>>>>>>>>>>> the
>>>>>>>>>>> BodyGenerator
>>>>>>>>>>> ?
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> I think
>>>>>>>>>>> it
>>>>>>>>>>> would
>>>>>>>>>>> be
>>>>>>>>>>> more
>>>>>>>>>>> clear
>>>>>>>>>>> if
>>>>>>>>>>> the initializeAsynchronousTransfer
>>>>>>>>>>> simply
>>>>>>>>>>> didn't
>>>>>>>>>>> flush
>>>>>>>>>>> the
>>>>>>>>>>> queue
>>>>>>>>>>> but
>>>>>>>>>>> just
>>>>>>>>>>> setup
>>>>>>>>>>> the
>>>>>>>>>>> context.
>>>>>>>>>>> Then
>>>>>>>>>>> the
>>>>>>>>>>> feed
>>>>>>>>>>> method
>>>>>>>>>>> would
>>>>>>>>>>> block
>>>>>>>>>>> until
>>>>>>>>>>> there's
>>>>>>>>>>> a context
>>>>>>>>>>> set,
>>>>>>>>>>> and
>>>>>>>>>>> then
>>>>>>>>>>> flush
>>>>>>>>>>> the
>>>>>>>>>>> queue
>>>>>>>>>>> with
>>>>>>>>>>> blocking
>>>>>>>>>>> behavior.
>>>>>>>>>>>
>>>>>>>>>>> This
>>>>>>>>>>> is
>>>>>>>>>>> probably
>>>>>>>>>>> the
>>>>>>>>>>> next
>>>>>>>>>>> step,
>>>>>>>>>>> but
>>>>>>>>>>> as
>>>>>>>>>>> we
>>>>>>>>>>> are
>>>>>>>>>>> using
>>>>>>>>>>> AHC
>>>>>>>>>>> for
>>>>>>>>>>> async,
>>>>>>>>>>> it
>>>>>>>>>>> would
>>>>>>>>>>> probably
>>>>>>>>>>> be
>>>>>>>>>>> great
>>>>>>>>>>> if
>>>>>>>>>>> that
>>>>>>>>>>> blocking
>>>>>>>>>>> feed()
>>>>>>>>>>> method
>>>>>>>>>>> was
>>>>>>>>>>> called
>>>>>>>>>>> in
>>>>>>>>>>> a worker
>>>>>>>>>>> thread
>>>>>>>>>>> instead
>>>>>>>>>>> of
>>>>>>>>>>> our
>>>>>>>>>>> main
>>>>>>>>>>> thread.
>>>>>>>>>>>
>>>>>>>>>>> I won't
>>>>>>>>>>> use
>>>>>>>>>>> this
>>>>>>>>>>> but
>>>>>>>>>>> someone
>>>>>>>>>>> who
>>>>>>>>>>> really
>>>>>>>>>>> wants
>>>>>>>>>>> a non-blocking
>>>>>>>>>>> impl
>>>>>>>>>>> of
>>>>>>>>>>> performant
>>>>>>>>>>> multipart
>>>>>>>>>>> fileupload
>>>>>>>>>>> would
>>>>>>>>>>> probably
>>>>>>>>>>> need
>>>>>>>>>>> this,
>>>>>>>>>>> or
>>>>>>>>>>> will
>>>>>>>>>>> use
>>>>>>>>>>> an
>>>>>>>>>>> ExecutorService
>>>>>>>>>>> for
>>>>>>>>>>> the
>>>>>>>>>>> feeding
>>>>>>>>>>> operations
>>>>>>>>>>> as
>>>>>>>>>>> a workaround.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thanks
>>>>>>>>>>> again
>>>>>>>>>>> for
>>>>>>>>>>> your
>>>>>>>>>>> reactivity
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> 2013/9/4
>>>>>>>>>>> Ryan
>>>>>>>>>>> Lubke
>>>>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Sébastien
>>>>>>>>>>> Lorber
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> I've
>>>>>>>>>>>> integrated
>>>>>>>>>>>> this
>>>>>>>>>>>> change
>>>>>>>>>>>> and
>>>>>>>>>>>> it
>>>>>>>>>>>> works
>>>>>>>>>>>> fine
>>>>>>>>>>>> except
>>>>>>>>>>>> a little
>>>>>>>>>>>> detail.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> I'm
>>>>>>>>>>>> uploading
>>>>>>>>>>>> files
>>>>>>>>>>>> to
>>>>>>>>>>>> a third
>>>>>>>>>>>> party
>>>>>>>>>>>> API
>>>>>>>>>>>> (a
>>>>>>>>>>>> bit
>>>>>>>>>>>> like
>>>>>>>>>>>> S3).
>>>>>>>>>>>> This
>>>>>>>>>>>> API
>>>>>>>>>>>> requires
>>>>>>>>>>>> a "sessionCode"
>>>>>>>>>>>> in
>>>>>>>>>>>> each
>>>>>>>>>>>> request.
>>>>>>>>>>>> So
>>>>>>>>>>>> there
>>>>>>>>>>>> is
>>>>>>>>>>>> a multipart
>>>>>>>>>>>> StringPart
>>>>>>>>>>>> with
>>>>>>>>>>>> that
>>>>>>>>>>>> SessionCode.
>>>>>>>>>>>>
>>>>>>>>>>>> We
>>>>>>>>>>>> used
>>>>>>>>>>>> to
>>>>>>>>>>>> have
>>>>>>>>>>>> a cache
>>>>>>>>>>>> which
>>>>>>>>>>>> holds
>>>>>>>>>>>> the
>>>>>>>>>>>> sessionCode
>>>>>>>>>>>> 30min
>>>>>>>>>>>> per
>>>>>>>>>>>> user
>>>>>>>>>>>> so
>>>>>>>>>>>> that
>>>>>>>>>>>> we
>>>>>>>>>>>> do
>>>>>>>>>>>> not
>>>>>>>>>>>> need
>>>>>>>>>>>> to
>>>>>>>>>>>> init
>>>>>>>>>>>> a new
>>>>>>>>>>>> session
>>>>>>>>>>>> each
>>>>>>>>>>>> time.
>>>>>>>>>>>>
>>>>>>>>>>>> I had
>>>>>>>>>>>> troubles
>>>>>>>>>>>> in
>>>>>>>>>>>> this
>>>>>>>>>>>> very
>>>>>>>>>>>> specific
>>>>>>>>>>>> case:
>>>>>>>>>>>> when
>>>>>>>>>>>> I upload
>>>>>>>>>>>> 5 docs
>>>>>>>>>>>> with
>>>>>>>>>>>> the
>>>>>>>>>>>> same
>>>>>>>>>>>> session
>>>>>>>>>>>> code.
>>>>>>>>>>>> When
>>>>>>>>>>>> I remove
>>>>>>>>>>>> the
>>>>>>>>>>>> cache
>>>>>>>>>>>> and
>>>>>>>>>>>> use
>>>>>>>>>>>> 5 different
>>>>>>>>>>>> session
>>>>>>>>>>>> codes,
>>>>>>>>>>>> it
>>>>>>>>>>>> works
>>>>>>>>>>>> fine.
>>>>>>>>>>>>
>>>>>>>>>>>> I guess
>>>>>>>>>>>> the
>>>>>>>>>>>> remote
>>>>>>>>>>>> service
>>>>>>>>>>>> is
>>>>>>>>>>>> blocking
>>>>>>>>>>>> concurrent
>>>>>>>>>>>> uploads
>>>>>>>>>>>> with
>>>>>>>>>>>> the
>>>>>>>>>>>> same
>>>>>>>>>>>> session
>>>>>>>>>>>> code.
>>>>>>>>>>>> I don't
>>>>>>>>>>>> know
>>>>>>>>>>>> at
>>>>>>>>>>>> all.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Where
>>>>>>>>>>>> I want
>>>>>>>>>>>> to
>>>>>>>>>>>> go
>>>>>>>>>>>> is
>>>>>>>>>>>> that
>>>>>>>>>>>> I wouldn't
>>>>>>>>>>>> have
>>>>>>>>>>>> expected
>>>>>>>>>>>> Grizzly
>>>>>>>>>>>> to
>>>>>>>>>>>> OOM
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Avertissement:
>>>>>>>>>>>> Exception
>>>>>>>>>>>> during
>>>>>>>>>>>> FilterChain
>>>>>>>>>>>> execution
>>>>>>>>>>>> java.lang.OutOfMemoryError:
>>>>>>>>>>>> Java
>>>>>>>>>>>> heap
>>>>>>>>>>>> space
>>>>>>>>>>>> at
>>>>>>>>>>>> java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57)
>>>>>>>>>>>> at
>>>>>>>>>>>> java.nio.ByteBuffer.allocate(ByteBuffer.java:331)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLUtils.allocateOutputBuffer(SSLUtils.java:342)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter$2.grow(SSLBaseFilter.java:117)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLConnectionContext.ensureBufferSize(SSLConnectionContext.java:392)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLConnectionContext.wrap(SSLConnectionContext.java:272)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLConnectionContext.wrapAll(SSLConnectionContext.java:238)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter.wrapAll(SSLBaseFilter.java:405)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter.handleWrite(SSLBaseFilter.java:320)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLFilter.accurateWrite(SSLFilter.java:263)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLFilter.handleWrite(SSLFilter.java:143)
>>>>>>>>>>>> at
>>>>>>>>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$SwitchingSSLFilter.handleWrite(GrizzlyAsyncHttpProvider.java:2500)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.ExecutorResolver$8.execute(ExecutorResolver.java:111)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.FilterChainContext$1.run(FilterChainContext.java:196)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.FilterChainContext.resume(FilterChainContext.java:220)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLFilter$SSLHandshakeContext.completed(SSLFilter.java:383)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLFilter.notifyHandshakeComplete(SSLFilter.java:278)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter.handleRead(SSLBaseFilter.java:275)
>>>>>>>>>>>> at
>>>>>>>>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$SwitchingSSLFilter.handleRead(GrizzlyAsyncHttpProvider.java:2490)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:546)
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Caused
>>>>>>>>>>>> by:
>>>>>>>>>>>> java.util.concurrent.TimeoutException:
>>>>>>>>>>>> null
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.impl.SafeFutureImpl$Sync.innerGet(SafeFutureImpl.java:367)
>>>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>>>> at
>>>>>>>>>>>> org.glassfish.grizzly.impl.SafeFutureImpl.get(SafeFutureImpl.java:274)
>>>>>>>>>>>> ~[grizzly-framework-2.3.5.jar:2.3.5]
>>>>>>>>>>>> at
>>>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.block(FeedableBodyGenerator.java:177)
>>>>>>>>>>>> ~[async-http-client-1.7.20-204092c.jar:na]
>>>>>>>>>>>> at
>>>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.blockUntilQueueFree(FeedableBodyGenerator.java:167)
>>>>>>>>>>>> ~[async-http-client-1.7.20-204092c.jar:na]
>>>>>>>>>>>> at
>>>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.flushQueue(FeedableBodyGenerator.java:124)
>>>>>>>>>>>> ~[async-http-client-1.7.20-204092c.jar:na]
>>>>>>>>>>>> at
>>>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.feed(FeedableBodyGenerator.java:94)
>>>>>>>>>>>> ~[async-http-client-1.7.20-204092c.jar:na]
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> multipart.body.generator.feeder.buffer=100000
>>>>>>>>>>>> ->
>>>>>>>>>>>> size
>>>>>>>>>>>> of
>>>>>>>>>>>> each
>>>>>>>>>>>> Buffer
>>>>>>>>>>>> sent
>>>>>>>>>>>> to
>>>>>>>>>>>> the
>>>>>>>>>>>> FeedableBodyGenerator
>>>>>>>>>>>> transport.max.pending.bytes=1000000
>>>>>>>>>>>> (I
>>>>>>>>>>>> tried
>>>>>>>>>>>> other
>>>>>>>>>>>> settings,
>>>>>>>>>>>> including
>>>>>>>>>>>> AUTO_SIZE)
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Do
>>>>>>>>>>>> you
>>>>>>>>>>>> have
>>>>>>>>>>>> any
>>>>>>>>>>>> idea
>>>>>>>>>>>> why
>>>>>>>>>>>> is
>>>>>>>>>>>> there
>>>>>>>>>>>> an
>>>>>>>>>>>> OOM
>>>>>>>>>>>> with
>>>>>>>>>>>> these
>>>>>>>>>>>> settings?
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Perhaps
>>>>>>>>>>>> it
>>>>>>>>>>>> is
>>>>>>>>>>>> because
>>>>>>>>>>>> the
>>>>>>>>>>>> feed()
>>>>>>>>>>>> method
>>>>>>>>>>>> of
>>>>>>>>>>>> FeedableBodyGenerator
>>>>>>>>>>>> doesn't
>>>>>>>>>>>> block
>>>>>>>>>>>> until
>>>>>>>>>>>> the
>>>>>>>>>>>> context
>>>>>>>>>>>> is
>>>>>>>>>>>> initialized.
>>>>>>>>>>>>
>>>>>>>>>>>> I guess
>>>>>>>>>>>> the initializeAsynchronousTransfer
>>>>>>>>>>>> is
>>>>>>>>>>>> called
>>>>>>>>>>>> only
>>>>>>>>>>>> once
>>>>>>>>>>>> the
>>>>>>>>>>>> connection
>>>>>>>>>>>> is
>>>>>>>>>>>> established,
>>>>>>>>>>>> and
>>>>>>>>>>>> perhaps
>>>>>>>>>>>> a lot
>>>>>>>>>>>> of
>>>>>>>>>>>> Buffer
>>>>>>>>>>>> are
>>>>>>>>>>>> added
>>>>>>>>>>>> to
>>>>>>>>>>>> the
>>>>>>>>>>>> queue...
>>>>>>>>>>> Yes,
>>>>>>>>>>> it's
>>>>>>>>>>> invoked
>>>>>>>>>>> once
>>>>>>>>>>> the
>>>>>>>>>>> request
>>>>>>>>>>> has
>>>>>>>>>>> been
>>>>>>>>>>> dispatched,
>>>>>>>>>>> so
>>>>>>>>>>> if
>>>>>>>>>>> the
>>>>>>>>>>> generator
>>>>>>>>>>> is
>>>>>>>>>>> fed
>>>>>>>>>>> a lot
>>>>>>>>>>> before
>>>>>>>>>>> the
>>>>>>>>>>> request,
>>>>>>>>>>> I could
>>>>>>>>>>> see
>>>>>>>>>>> this
>>>>>>>>>>> happening.
>>>>>>>>>>> I'll
>>>>>>>>>>> see
>>>>>>>>>>> what
>>>>>>>>>>> I can
>>>>>>>>>>> do
>>>>>>>>>>> to
>>>>>>>>>>> alleviate
>>>>>>>>>>> that
>>>>>>>>>>> case.
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> But
>>>>>>>>>>>> I'm
>>>>>>>>>>>> not
>>>>>>>>>>>> sure
>>>>>>>>>>>> at
>>>>>>>>>>>> all
>>>>>>>>>>>> because
>>>>>>>>>>>> the
>>>>>>>>>>>> session
>>>>>>>>>>>> code
>>>>>>>>>>>> is
>>>>>>>>>>>> transmitted
>>>>>>>>>>>> as
>>>>>>>>>>>> a BodyPart
>>>>>>>>>>>> and
>>>>>>>>>>>> I get
>>>>>>>>>>>> the
>>>>>>>>>>>> same
>>>>>>>>>>>> problem
>>>>>>>>>>>> if
>>>>>>>>>>>> i put
>>>>>>>>>>>> it
>>>>>>>>>>>> as
>>>>>>>>>>>> the
>>>>>>>>>>>> first
>>>>>>>>>>>> or
>>>>>>>>>>>> last
>>>>>>>>>>>> multipart.
>>>>>>>>>>>>
>>>>>>>>>>>> It's
>>>>>>>>>>>> not
>>>>>>>>>>>> a big
>>>>>>>>>>>> deal,
>>>>>>>>>>>> perhaps
>>>>>>>>>>>> I should
>>>>>>>>>>>> always
>>>>>>>>>>>> use
>>>>>>>>>>>> a different
>>>>>>>>>>>> session
>>>>>>>>>>>> code
>>>>>>>>>>>> for
>>>>>>>>>>>> concurrent
>>>>>>>>>>>> operations
>>>>>>>>>>>> but
>>>>>>>>>>>> I'd
>>>>>>>>>>>> like
>>>>>>>>>>>> to
>>>>>>>>>>>> be
>>>>>>>>>>>> sure
>>>>>>>>>>>> that
>>>>>>>>>>>> we
>>>>>>>>>>>> won't
>>>>>>>>>>>> have
>>>>>>>>>>>> this
>>>>>>>>>>>> issue
>>>>>>>>>>>> in
>>>>>>>>>>>> production...
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> 2013/9/3
>>>>>>>>>>>> Ryan
>>>>>>>>>>>> Lubke
>>>>>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>>>>>
>>>>>>>>>>>> Good
>>>>>>>>>>>> catch.
>>>>>>>>>>>> Fixed.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Sébastien
>>>>>>>>>>>> Lorber
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Hello,
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> There's
>>>>>>>>>>>>> a little
>>>>>>>>>>>>> mistake
>>>>>>>>>>>>> in
>>>>>>>>>>>>> the
>>>>>>>>>>>>> grizzly
>>>>>>>>>>>>> ahc
>>>>>>>>>>>>> provider
>>>>>>>>>>>>> relative
>>>>>>>>>>>>> to
>>>>>>>>>>>>> the
>>>>>>>>>>>>> write
>>>>>>>>>>>>> queue
>>>>>>>>>>>>> size.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> https://github.com/AsyncHttpClient/async-http-client/blob/b5d97efe9fe14113ea92fb1f7db192a2d090fad7/src/main/java/com/ning/http/client/providers/grizzly/GrizzlyAsyncHttpProvider.java#L419
>>>>>>>>>>>>>
>>>>>>>>>>>>> As
>>>>>>>>>>>>> you
>>>>>>>>>>>>> can
>>>>>>>>>>>>> see,
>>>>>>>>>>>>> the
>>>>>>>>>>>>> TransportCustomizer
>>>>>>>>>>>>> is
>>>>>>>>>>>>> called,
>>>>>>>>>>>>> and
>>>>>>>>>>>>> then
>>>>>>>>>>>>> the
>>>>>>>>>>>>> write
>>>>>>>>>>>>> queue
>>>>>>>>>>>>> size
>>>>>>>>>>>>> (among
>>>>>>>>>>>>> other
>>>>>>>>>>>>> things)
>>>>>>>>>>>>> is
>>>>>>>>>>>>> set
>>>>>>>>>>>>> to
>>>>>>>>>>>>> AUTO_SIZE
>>>>>>>>>>>>> (instead
>>>>>>>>>>>>> of
>>>>>>>>>>>>> previously
>>>>>>>>>>>>> UNLIMITED)
>>>>>>>>>>>>>
>>>>>>>>>>>>> clientTransport.getAsyncQueueIO().getWriter()
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> .setMaxPendingBytesPerConnection(AsyncQueueWriter.AUTO_SIZE);
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> I think
>>>>>>>>>>>>> the
>>>>>>>>>>>>> default
>>>>>>>>>>>>> settings
>>>>>>>>>>>>> like
>>>>>>>>>>>>> this
>>>>>>>>>>>>> AUTO_SIZE
>>>>>>>>>>>>> attribute
>>>>>>>>>>>>> should
>>>>>>>>>>>>> be
>>>>>>>>>>>>> set
>>>>>>>>>>>>> before
>>>>>>>>>>>>> the
>>>>>>>>>>>>> customization
>>>>>>>>>>>>> of
>>>>>>>>>>>>> the
>>>>>>>>>>>>> transport,
>>>>>>>>>>>>> or
>>>>>>>>>>>>> they
>>>>>>>>>>>>> would
>>>>>>>>>>>>> override
>>>>>>>>>>>>> the
>>>>>>>>>>>>> value
>>>>>>>>>>>>> we
>>>>>>>>>>>>> customized.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> This
>>>>>>>>>>>>> is
>>>>>>>>>>>>> actually
>>>>>>>>>>>>> my
>>>>>>>>>>>>> case,
>>>>>>>>>>>>> since
>>>>>>>>>>>>> I can't
>>>>>>>>>>>>> reproduce
>>>>>>>>>>>>> my
>>>>>>>>>>>>> "bug"
>>>>>>>>>>>>> which
>>>>>>>>>>>>> is
>>>>>>>>>>>>> "high
>>>>>>>>>>>>> memory
>>>>>>>>>>>>> consumption",
>>>>>>>>>>>>> even
>>>>>>>>>>>>> when
>>>>>>>>>>>>> using
>>>>>>>>>>>>> -1
>>>>>>>>>>>>> / UNLIMITED
>>>>>>>>>>>>> in
>>>>>>>>>>>>> the
>>>>>>>>>>>>> TransportCustomizer.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> This
>>>>>>>>>>>>> could
>>>>>>>>>>>>> work
>>>>>>>>>>>>> fine
>>>>>>>>>>>>> for
>>>>>>>>>>>>> me
>>>>>>>>>>>>> with
>>>>>>>>>>>>> AUTO_SIZE,
>>>>>>>>>>>>> but
>>>>>>>>>>>>> I'd
>>>>>>>>>>>>> rather
>>>>>>>>>>>>> be
>>>>>>>>>>>>> able
>>>>>>>>>>>>> to
>>>>>>>>>>>>> tune
>>>>>>>>>>>>> this
>>>>>>>>>>>>> parameter
>>>>>>>>>>>>> during
>>>>>>>>>>>>> load
>>>>>>>>>>>>> tests
>>>>>>>>>>>>> to
>>>>>>>>>>>>> see
>>>>>>>>>>>>> the
>>>>>>>>>>>>> effect.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> 2013/8/31
>>>>>>>>>>>>> Sebastien
>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>> i will
>>>>>>>>>>>>> ckeck
>>>>>>>>>>>>> that
>>>>>>>>>>>>> on
>>>>>>>>>>>>> monday.
>>>>>>>>>>>>> I can
>>>>>>>>>>>>> now
>>>>>>>>>>>>> upload
>>>>>>>>>>>>> a 500m
>>>>>>>>>>>>> file
>>>>>>>>>>>>> with
>>>>>>>>>>>>> 40m
>>>>>>>>>>>>> heap
>>>>>>>>>>>>> size
>>>>>>>>>>>>> ;)
>>>>>>>>>>>>>
>>>>>>>>>>>>> Envoyé
>>>>>>>>>>>>> de
>>>>>>>>>>>>> mon
>>>>>>>>>>>>> iPhone
>>>>>>>>>>>>>
>>>>>>>>>>>>> Le
>>>>>>>>>>>>> 30
>>>>>>>>>>>>> août
>>>>>>>>>>>>> 2013
>>>>>>>>>>>>> à 20:49,
>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>>>>>> a écrit :
>>>>>>>>>>>>>
>>>>>>>>>>>>>> I'm
>>>>>>>>>>>>>> going
>>>>>>>>>>>>>> to
>>>>>>>>>>>>>> be
>>>>>>>>>>>>>> updating
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>> Grizzly
>>>>>>>>>>>>>> provider
>>>>>>>>>>>>>> such
>>>>>>>>>>>>>> that
>>>>>>>>>>>>>> AUTO_SIZE
>>>>>>>>>>>>>> (not
>>>>>>>>>>>>>> AUTO_TUNE)
>>>>>>>>>>>>>> is
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>> default,
>>>>>>>>>>>>>> so
>>>>>>>>>>>>>> you
>>>>>>>>>>>>>> can
>>>>>>>>>>>>>> avoid
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>> use
>>>>>>>>>>>>>> of
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>> TransportCustomizer.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Regarding
>>>>>>>>>>>>>>> your
>>>>>>>>>>>>>>> tuning
>>>>>>>>>>>>>>> question,
>>>>>>>>>>>>>>> I would
>>>>>>>>>>>>>>> probably
>>>>>>>>>>>>>>> set
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>> value
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>> AsyncQueueWriter.AUTO_TUNE
>>>>>>>>>>>>>>> (this
>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>> four
>>>>>>>>>>>>>>> times
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>> socket
>>>>>>>>>>>>>>> write
>>>>>>>>>>>>>>> buffer)
>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>> see
>>>>>>>>>>>>>>> how
>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>> works.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> A question
>>>>>>>>>>>>>>>> first.
>>>>>>>>>>>>>>>> With
>>>>>>>>>>>>>>>> these
>>>>>>>>>>>>>>>> changes,
>>>>>>>>>>>>>>>> your
>>>>>>>>>>>>>>>> memory
>>>>>>>>>>>>>>>> usage
>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>> more
>>>>>>>>>>>>>>>> inline
>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>> what
>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>> were
>>>>>>>>>>>>>>>> looking
>>>>>>>>>>>>>>>> for?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Sébastien
>>>>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> By
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> way,
>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>> any
>>>>>>>>>>>>>>>>> idea
>>>>>>>>>>>>>>>>> when
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> 1.7.20
>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>> released
>>>>>>>>>>>>>>>>> (with
>>>>>>>>>>>>>>>>> these
>>>>>>>>>>>>>>>>> new
>>>>>>>>>>>>>>>>> improvements?)
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> We
>>>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> know
>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>> wait
>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>> a release
>>>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>> install
>>>>>>>>>>>>>>>>> our
>>>>>>>>>>>>>>>>> own
>>>>>>>>>>>>>>>>> temp
>>>>>>>>>>>>>>>>> release
>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>> Nexus
>>>>>>>>>>>>>>>>> :)
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> 2013/8/30
>>>>>>>>>>>>>>>>> Sébastien
>>>>>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>>>>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Thank
>>>>>>>>>>>>>>>>> you,
>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>> works
>>>>>>>>>>>>>>>>> fine!
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I just
>>>>>>>>>>>>>>>>> had
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> modify
>>>>>>>>>>>>>>>>> a single
>>>>>>>>>>>>>>>>> line
>>>>>>>>>>>>>>>>> after
>>>>>>>>>>>>>>>>> your
>>>>>>>>>>>>>>>>> commit.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider#initializeTransport
>>>>>>>>>>>>>>>>> ->
>>>>>>>>>>>>>>>>> clientTransport.getAsyncQueueIO().getWriter().setMaxPendingBytesPerConnection(10000);
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> If
>>>>>>>>>>>>>>>>> I let
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> initial
>>>>>>>>>>>>>>>>> value
>>>>>>>>>>>>>>>>> (-1)
>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>> won't
>>>>>>>>>>>>>>>>> block,
>>>>>>>>>>>>>>>>> canWrite
>>>>>>>>>>>>>>>>> always
>>>>>>>>>>>>>>>>> returns
>>>>>>>>>>>>>>>>> true
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Btw,
>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>> AHC
>>>>>>>>>>>>>>>>> I didn't
>>>>>>>>>>>>>>>>> find
>>>>>>>>>>>>>>>>> any
>>>>>>>>>>>>>>>>> way
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> pass
>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>> value
>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>> a config
>>>>>>>>>>>>>>>>> attribute,
>>>>>>>>>>>>>>>>> neither
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> size
>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> write
>>>>>>>>>>>>>>>>> buffer
>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>> talked
>>>>>>>>>>>>>>>>> about.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> So
>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> end,
>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>> there
>>>>>>>>>>>>>>>>> a way
>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>> current
>>>>>>>>>>>>>>>>> AHC
>>>>>>>>>>>>>>>>> code
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> use
>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>> "canWrite
>>>>>>>>>>>>>>>>> = false"
>>>>>>>>>>>>>>>>> behavior?
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> If
>>>>>>>>>>>>>>>>> not,
>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>> please
>>>>>>>>>>>>>>>>> provide
>>>>>>>>>>>>>>>>> a way
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> set
>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>> behavior
>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>> v1.7.20
>>>>>>>>>>>>>>>>> ? thanks
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> PS:
>>>>>>>>>>>>>>>>> does
>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>> make
>>>>>>>>>>>>>>>>> sens
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> use
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> same
>>>>>>>>>>>>>>>>> number
>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>> bytes
>>>>>>>>>>>>>>>>> un
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> feed(Buffer)
>>>>>>>>>>>>>>>>> method
>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> setMaxPendingBytesPerConnection(10000);
>>>>>>>>>>>>>>>>> ? do
>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>> any
>>>>>>>>>>>>>>>>> tuning
>>>>>>>>>>>>>>>>> recommandation?
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> 2013/8/29
>>>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>>>>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Please
>>>>>>>>>>>>>>>>> disregard.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Sébastien,
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Could
>>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>> also
>>>>>>>>>>>>>>>>>> provide
>>>>>>>>>>>>>>>>>> a sample
>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>> how
>>>>>>>>>>>>>>>>>> you're
>>>>>>>>>>>>>>>>>> performing
>>>>>>>>>>>>>>>>>> your
>>>>>>>>>>>>>>>>>> feed?
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>> -rl
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Sébastien,
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> I'd
>>>>>>>>>>>>>>>>>>> recommend
>>>>>>>>>>>>>>>>>>> looking
>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>> Connection.canWrite()
>>>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> Connection.notifyCanWrite(WriteListener)
>>>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> By
>>>>>>>>>>>>>>>>>>> default,
>>>>>>>>>>>>>>>>>>> Grizzly
>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>> configure
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> async
>>>>>>>>>>>>>>>>>>> write
>>>>>>>>>>>>>>>>>>> queue
>>>>>>>>>>>>>>>>>>> length
>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>> four
>>>>>>>>>>>>>>>>>>> times
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> write
>>>>>>>>>>>>>>>>>>> buffer
>>>>>>>>>>>>>>>>>>> size
>>>>>>>>>>>>>>>>>>> (which
>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>> based
>>>>>>>>>>>>>>>>>>> off
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> socket
>>>>>>>>>>>>>>>>>>> write
>>>>>>>>>>>>>>>>>>> buffer).
>>>>>>>>>>>>>>>>>>> When
>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>> queue
>>>>>>>>>>>>>>>>>>> exceeds
>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>> value,
>>>>>>>>>>>>>>>>>>> canWrite()
>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>> return
>>>>>>>>>>>>>>>>>>> false.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> When
>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>> occurs,
>>>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>> register
>>>>>>>>>>>>>>>>>>> a WriteListener
>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>> notified
>>>>>>>>>>>>>>>>>>> when
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> queue
>>>>>>>>>>>>>>>>>>> length
>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>> below
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> configured
>>>>>>>>>>>>>>>>>>> max
>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>>> simulate
>>>>>>>>>>>>>>>>>>> blocking
>>>>>>>>>>>>>>>>>>> until
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> onWritePossible()
>>>>>>>>>>>>>>>>>>> callback
>>>>>>>>>>>>>>>>>>> has
>>>>>>>>>>>>>>>>>>> been
>>>>>>>>>>>>>>>>>>> invoked.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> ----------------------------------------------------------------
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> final
>>>>>>>>>>>>>>>>>>> FutureImpl<Boolean>
>>>>>>>>>>>>>>>>>>> future
>>>>>>>>>>>>>>>>>>> = Futures.createSafeFuture();
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> //
>>>>>>>>>>>>>>>>>>> Connection
>>>>>>>>>>>>>>>>>>> may
>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>> obtained
>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>> calling
>>>>>>>>>>>>>>>>>>> FilterChainContext.getConnection().
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> connection.notifyCanWrite(new
>>>>>>>>>>>>>>>>>>> WriteHandler()
>>>>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> @Override
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> public
>>>>>>>>>>>>>>>>>>> void
>>>>>>>>>>>>>>>>>>> onWritePossible()
>>>>>>>>>>>>>>>>>>> throws
>>>>>>>>>>>>>>>>>>> Exception
>>>>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> future.result(Boolean.TRUE);
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> @Override
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> public
>>>>>>>>>>>>>>>>>>> void
>>>>>>>>>>>>>>>>>>> onError(Throwable
>>>>>>>>>>>>>>>>>>> t)
>>>>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> future.failure(Exceptions.makeIOException(t));
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> });
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> try
>>>>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> final
>>>>>>>>>>>>>>>>>>> long
>>>>>>>>>>>>>>>>>>> writeTimeout
>>>>>>>>>>>>>>>>>>> = 30;
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> future.get(writeTimeout,
>>>>>>>>>>>>>>>>>>> TimeUnit.MILLISECONDS);
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> } catch
>>>>>>>>>>>>>>>>>>> (ExecutionException
>>>>>>>>>>>>>>>>>>> e)
>>>>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> HttpTransactionContext
>>>>>>>>>>>>>>>>>>> httpCtx
>>>>>>>>>>>>>>>>>>> = HttpTransactionContext.get(connection);
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> httpCtx.abort(e.getCause());
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> } catch
>>>>>>>>>>>>>>>>>>> (Exception
>>>>>>>>>>>>>>>>>>> e)
>>>>>>>>>>>>>>>>>>> {
>>>>>>>>>>>>>>>>>>> HttpTransactionContext
>>>>>>>>>>>>>>>>>>> httpCtx
>>>>>>>>>>>>>>>>>>> = HttpTransactionContext.get(connection);
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> httpCtx.abort(e);
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>>>>>> http://grizzly.java.net/docs/2.3/apidocs/org/glassfish/grizzly/OutputSink.html.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Sébastien
>>>>>>>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Ryan,
>>>>>>>>>>>>>>>>>>>> I've
>>>>>>>>>>>>>>>>>>>> did
>>>>>>>>>>>>>>>>>>>> some
>>>>>>>>>>>>>>>>>>>> other
>>>>>>>>>>>>>>>>>>>> tests.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> It
>>>>>>>>>>>>>>>>>>>> seems
>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>> using
>>>>>>>>>>>>>>>>>>>> a blocking
>>>>>>>>>>>>>>>>>>>> queue
>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> FeedableBodyGenerator
>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>> totally
>>>>>>>>>>>>>>>>>>>> useless
>>>>>>>>>>>>>>>>>>>> because
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> thread
>>>>>>>>>>>>>>>>>>>> consuming
>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>> blocking
>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> queue
>>>>>>>>>>>>>>>>>>>> never
>>>>>>>>>>>>>>>>>>>> blocks
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> feeding,
>>>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>> was
>>>>>>>>>>>>>>>>>>>> my
>>>>>>>>>>>>>>>>>>>> intention
>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> beginning.
>>>>>>>>>>>>>>>>>>>> Maybe
>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>> depends
>>>>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> IO
>>>>>>>>>>>>>>>>>>>> strategy
>>>>>>>>>>>>>>>>>>>> used?
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I use
>>>>>>>>>>>>>>>>>>>> AHC
>>>>>>>>>>>>>>>>>>>> default
>>>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>> seems
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> use SameThreadIOStrategy
>>>>>>>>>>>>>>>>>>>> so
>>>>>>>>>>>>>>>>>>>> I don't
>>>>>>>>>>>>>>>>>>>> think
>>>>>>>>>>>>>>>>>>>> it's
>>>>>>>>>>>>>>>>>>>> related
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> IO
>>>>>>>>>>>>>>>>>>>> strategy.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> So
>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> end
>>>>>>>>>>>>>>>>>>>> I can
>>>>>>>>>>>>>>>>>>>> upload
>>>>>>>>>>>>>>>>>>>> a 70m
>>>>>>>>>>>>>>>>>>>> file
>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>> a heap
>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>> 50m,
>>>>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>> I have
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> put
>>>>>>>>>>>>>>>>>>>> a Thread.sleep(30)
>>>>>>>>>>>>>>>>>>>> between
>>>>>>>>>>>>>>>>>>>> each
>>>>>>>>>>>>>>>>>>>> 100k
>>>>>>>>>>>>>>>>>>>> Buffer
>>>>>>>>>>>>>>>>>>>> send
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> FeedableBodyGenerator
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> The
>>>>>>>>>>>>>>>>>>>> connection
>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> server
>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>> good
>>>>>>>>>>>>>>>>>>>> here,
>>>>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>> production
>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>> normally
>>>>>>>>>>>>>>>>>>>> a lot
>>>>>>>>>>>>>>>>>>>> better
>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>> far
>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>> I know.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I've
>>>>>>>>>>>>>>>>>>>> tried
>>>>>>>>>>>>>>>>>>>> things
>>>>>>>>>>>>>>>>>>>> like clientTransport.getAsyncQueueIO().getWriter().setMaxPendingBytesPerConnection(100000);
>>>>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>> doesn't
>>>>>>>>>>>>>>>>>>>> seem
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> work
>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>> me.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I'd
>>>>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> Grizzly
>>>>>>>>>>>>>>>>>>>> internals
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> block
>>>>>>>>>>>>>>>>>>>> when
>>>>>>>>>>>>>>>>>>>> there
>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>> too
>>>>>>>>>>>>>>>>>>>> much
>>>>>>>>>>>>>>>>>>>> pending
>>>>>>>>>>>>>>>>>>>> bytes
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> send.
>>>>>>>>>>>>>>>>>>>> Is
>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>> possible?
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> PS:
>>>>>>>>>>>>>>>>>>>> I've
>>>>>>>>>>>>>>>>>>>> just
>>>>>>>>>>>>>>>>>>>> been
>>>>>>>>>>>>>>>>>>>> able
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> send
>>>>>>>>>>>>>>>>>>>> a 500mo
>>>>>>>>>>>>>>>>>>>> file
>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>> 100mo
>>>>>>>>>>>>>>>>>>>> heap,
>>>>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>> needed
>>>>>>>>>>>>>>>>>>>> a sleep
>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>> 100ms
>>>>>>>>>>>>>>>>>>>> between
>>>>>>>>>>>>>>>>>>>> each
>>>>>>>>>>>>>>>>>>>> 100k
>>>>>>>>>>>>>>>>>>>> Buffer
>>>>>>>>>>>>>>>>>>>> sent
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> bodygenerator
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> 2013/8/29
>>>>>>>>>>>>>>>>>>>> Sébastien
>>>>>>>>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>>>>>>>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> By
>>>>>>>>>>>>>>>>>>>> chance
>>>>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>> I can
>>>>>>>>>>>>>>>>>>>> remove
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> MessageCloner
>>>>>>>>>>>>>>>>>>>> used
>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> SSL
>>>>>>>>>>>>>>>>>>>> filter?
>>>>>>>>>>>>>>>>>>>> SSLBaseFilter$OnWriteCopyCloner
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> It
>>>>>>>>>>>>>>>>>>>> seems
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> allocate
>>>>>>>>>>>>>>>>>>>> a lot
>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>> memory.
>>>>>>>>>>>>>>>>>>>> I don't
>>>>>>>>>>>>>>>>>>>> really
>>>>>>>>>>>>>>>>>>>> understand
>>>>>>>>>>>>>>>>>>>> why
>>>>>>>>>>>>>>>>>>>> messages
>>>>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>> cloned,
>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>> I remove
>>>>>>>>>>>>>>>>>>>> this?
>>>>>>>>>>>>>>>>>>>> How?
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> 2013/8/29
>>>>>>>>>>>>>>>>>>>> Sébastien
>>>>>>>>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>>>>>>>>> <lorber.sebastien_at_gmail.com
>>>>>>>>>>>>>>>>>>>> <mailto:lorber.sebastien_at_gmail.com>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I'm
>>>>>>>>>>>>>>>>>>>> trying
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> send
>>>>>>>>>>>>>>>>>>>> a 500m
>>>>>>>>>>>>>>>>>>>> file
>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>> my
>>>>>>>>>>>>>>>>>>>> tests
>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>> a heap
>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>> 400m.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> In
>>>>>>>>>>>>>>>>>>>> our
>>>>>>>>>>>>>>>>>>>> real
>>>>>>>>>>>>>>>>>>>> use
>>>>>>>>>>>>>>>>>>>> cases
>>>>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>> probably
>>>>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>> files
>>>>>>>>>>>>>>>>>>>> under
>>>>>>>>>>>>>>>>>>>> 20mo
>>>>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>> want
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> reduce
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> memory
>>>>>>>>>>>>>>>>>>>> consumption
>>>>>>>>>>>>>>>>>>>> because
>>>>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>> x parallel
>>>>>>>>>>>>>>>>>>>> uploads
>>>>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> same
>>>>>>>>>>>>>>>>>>>> server
>>>>>>>>>>>>>>>>>>>> according
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>> activity.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I'll
>>>>>>>>>>>>>>>>>>>> try
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> check
>>>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>> using
>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>> BodyGenerator
>>>>>>>>>>>>>>>>>>>> reduced
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> memory
>>>>>>>>>>>>>>>>>>>> footprint
>>>>>>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>> it's
>>>>>>>>>>>>>>>>>>>> almost
>>>>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>> before.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> 2013/8/28
>>>>>>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>>>>>>>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> At
>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>> point
>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>> time,
>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>> far
>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> SSL
>>>>>>>>>>>>>>>>>>>> buffer
>>>>>>>>>>>>>>>>>>>> allocation
>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>> concerned,
>>>>>>>>>>>>>>>>>>>> it's
>>>>>>>>>>>>>>>>>>>> untunable.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> That
>>>>>>>>>>>>>>>>>>>> said,
>>>>>>>>>>>>>>>>>>>> feel
>>>>>>>>>>>>>>>>>>>> free
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> open
>>>>>>>>>>>>>>>>>>>> a feature
>>>>>>>>>>>>>>>>>>>> request.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> As
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>> your
>>>>>>>>>>>>>>>>>>>> second
>>>>>>>>>>>>>>>>>>>> question,
>>>>>>>>>>>>>>>>>>>> there
>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>> no
>>>>>>>>>>>>>>>>>>>> suggested
>>>>>>>>>>>>>>>>>>>> size.
>>>>>>>>>>>>>>>>>>>> This
>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>>>> very
>>>>>>>>>>>>>>>>>>>> application
>>>>>>>>>>>>>>>>>>>> specific.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I'm
>>>>>>>>>>>>>>>>>>>> curious,
>>>>>>>>>>>>>>>>>>>> how
>>>>>>>>>>>>>>>>>>>> large
>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>> a file
>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>>>> sending?
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Sébastien
>>>>>>>>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> I have
>>>>>>>>>>>>>>>>>>>>> seen
>>>>>>>>>>>>>>>>>>>>> a lot
>>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>> buffers
>>>>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>>> a size
>>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>> 33842
>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>> seems
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> limit
>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>> near
>>>>>>>>>>>>>>>>>>>>> half
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> capacity.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Perhaps
>>>>>>>>>>>>>>>>>>>>> there's
>>>>>>>>>>>>>>>>>>>>> a way
>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> tune
>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>> buffer
>>>>>>>>>>>>>>>>>>>>> size
>>>>>>>>>>>>>>>>>>>>> so
>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>> consumes
>>>>>>>>>>>>>>>>>>>>> less
>>>>>>>>>>>>>>>>>>>>> memory?
>>>>>>>>>>>>>>>>>>>>> Is
>>>>>>>>>>>>>>>>>>>>> there
>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>> ideal
>>>>>>>>>>>>>>>>>>>>> Buffer
>>>>>>>>>>>>>>>>>>>>> size
>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> send
>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> feed
>>>>>>>>>>>>>>>>>>>>> method?
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> 2013/8/28
>>>>>>>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>>>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>>>>>>>>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> I'll
>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>> reviewing
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> PR
>>>>>>>>>>>>>>>>>>>>> today,
>>>>>>>>>>>>>>>>>>>>> thanks
>>>>>>>>>>>>>>>>>>>>> again!
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Regarding
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> OOM:
>>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>> stands
>>>>>>>>>>>>>>>>>>>>> now,
>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>> each
>>>>>>>>>>>>>>>>>>>>> new
>>>>>>>>>>>>>>>>>>>>> buffer
>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>> passed
>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> SSLFilter,
>>>>>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>> allocate
>>>>>>>>>>>>>>>>>>>>> a buffer
>>>>>>>>>>>>>>>>>>>>> twice
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> size
>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>> order
>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> accommodate
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> encrypted
>>>>>>>>>>>>>>>>>>>>> result.
>>>>>>>>>>>>>>>>>>>>> So
>>>>>>>>>>>>>>>>>>>>> there's
>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>> increase.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Depending
>>>>>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> socket
>>>>>>>>>>>>>>>>>>>>> configurations
>>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>> both
>>>>>>>>>>>>>>>>>>>>> endpoints,
>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>> how
>>>>>>>>>>>>>>>>>>>>> fast
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> remote
>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>> reading
>>>>>>>>>>>>>>>>>>>>> data,
>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>> could
>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> write
>>>>>>>>>>>>>>>>>>>>> queue
>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>> becoming
>>>>>>>>>>>>>>>>>>>>> too
>>>>>>>>>>>>>>>>>>>>> large.
>>>>>>>>>>>>>>>>>>>>> We
>>>>>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>>> a way
>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> detect
>>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>> situation,
>>>>>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>>> I'm
>>>>>>>>>>>>>>>>>>>>> pretty
>>>>>>>>>>>>>>>>>>>>> sure
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> Grizzly
>>>>>>>>>>>>>>>>>>>>> internals
>>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>>> currently
>>>>>>>>>>>>>>>>>>>>> shielded
>>>>>>>>>>>>>>>>>>>>> here.
>>>>>>>>>>>>>>>>>>>>> I will
>>>>>>>>>>>>>>>>>>>>> see
>>>>>>>>>>>>>>>>>>>>> what
>>>>>>>>>>>>>>>>>>>>> I can
>>>>>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> allow
>>>>>>>>>>>>>>>>>>>>> users
>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> leverage
>>>>>>>>>>>>>>>>>>>>> this.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Sébastien
>>>>>>>>>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Hello,
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> I've
>>>>>>>>>>>>>>>>>>>>>> made
>>>>>>>>>>>>>>>>>>>>>> my
>>>>>>>>>>>>>>>>>>>>>> pull
>>>>>>>>>>>>>>>>>>>>>> request.
>>>>>>>>>>>>>>>>>>>>>> https://github.com/AsyncHttpClient/async-http-client/pull/367
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> With
>>>>>>>>>>>>>>>>>>>>>> my
>>>>>>>>>>>>>>>>>>>>>> usecase
>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>> works,
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> file
>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>> uploaded
>>>>>>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>>>> before.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> But
>>>>>>>>>>>>>>>>>>>>>> I didn't
>>>>>>>>>>>>>>>>>>>>>> notice
>>>>>>>>>>>>>>>>>>>>>> a big
>>>>>>>>>>>>>>>>>>>>>> memory
>>>>>>>>>>>>>>>>>>>>>> improvement.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Is
>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>> possible
>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>> SSL
>>>>>>>>>>>>>>>>>>>>>> doesn't
>>>>>>>>>>>>>>>>>>>>>> allow
>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>> stream
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> body
>>>>>>>>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>>> something
>>>>>>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>>>> that?
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> In
>>>>>>>>>>>>>>>>>>>>>> memory,
>>>>>>>>>>>>>>>>>>>>>> I have
>>>>>>>>>>>>>>>>>>>>>> a lot
>>>>>>>>>>>>>>>>>>>>>> of:
>>>>>>>>>>>>>>>>>>>>>> - HeapByteBuffer
>>>>>>>>>>>>>>>>>>>>>> Which
>>>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>>>> hold
>>>>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>> SSLUtils$3
>>>>>>>>>>>>>>>>>>>>>> Which
>>>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>>>> hold
>>>>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>> BufferBuffers
>>>>>>>>>>>>>>>>>>>>>> Which
>>>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>>>> hold
>>>>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>> WriteResult
>>>>>>>>>>>>>>>>>>>>>> Which
>>>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>>>> hold
>>>>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>> AsyncWriteQueueRecord
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Here
>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>> exemple
>>>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> OOM
>>>>>>>>>>>>>>>>>>>>>> stacktrace:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> java.lang.OutOfMemoryError:
>>>>>>>>>>>>>>>>>>>>>> Java
>>>>>>>>>>>>>>>>>>>>>> heap
>>>>>>>>>>>>>>>>>>>>>> space
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> java.nio.ByteBuffer.allocate(ByteBuffer.java:331)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLUtils.allocateOutputBuffer(SSLUtils.java:342)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter$2.grow(SSLBaseFilter.java:117)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLConnectionContext.ensureBufferSize(SSLConnectionContext.java:392)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLConnectionContext.wrap(SSLConnectionContext.java:272)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLConnectionContext.wrapAll(SSLConnectionContext.java:227)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter.wrapAll(SSLBaseFilter.java:404)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLBaseFilter.handleWrite(SSLBaseFilter.java:319)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLFilter.accurateWrite(SSLFilter.java:255)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.ssl.SSLFilter.handleWrite(SSLFilter.java:143)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider$SwitchingSSLFilter.handleWrite(GrizzlyAsyncHttpProvider.java:2503)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.filterchain.ExecutorResolver$8.execute(ExecutorResolver.java:111)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:853)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:720)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.flushQueue(FeedableBodyGenerator.java:132)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> com.ning.http.client.providers.grizzly.FeedableBodyGenerator.feed(FeedableBodyGenerator.java:101)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> com.ning.http.client.providers.grizzly.MultipartBodyGeneratorFeeder$FeedBodyGeneratorOutputStream.write(MultipartBodyGeneratorFeeder.java:222)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> java.io.BufferedOutputStream.write(BufferedOutputStream.java:126)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> com.ning.http.multipart.FilePart.sendData(FilePart.java:179)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> com.ning.http.multipart.Part.send(Part.java:331)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> com.ning.http.multipart.Part.sendParts(Part.java:397)
>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>> com.ning.http.client.providers.grizzly.MultipartBodyGeneratorFeeder.feed(MultipartBodyGeneratorFeeder.java:144)
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Any
>>>>>>>>>>>>>>>>>>>>>> idea?
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> 2013/8/27
>>>>>>>>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>>>>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>>>>>>>>>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Excellent!
>>>>>>>>>>>>>>>>>>>>>> Looking
>>>>>>>>>>>>>>>>>>>>>> forward
>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> pull
>>>>>>>>>>>>>>>>>>>>>> request!
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Sébastien
>>>>>>>>>>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>>>>>>>>>> thanks,
>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>> works
>>>>>>>>>>>>>>>>>>>>>>> fine,
>>>>>>>>>>>>>>>>>>>>>>> I'll
>>>>>>>>>>>>>>>>>>>>>>> make
>>>>>>>>>>>>>>>>>>>>>>> a pull
>>>>>>>>>>>>>>>>>>>>>>> request
>>>>>>>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>>>>> AHC
>>>>>>>>>>>>>>>>>>>>>>> tomorrow
>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>> a better
>>>>>>>>>>>>>>>>>>>>>>> code
>>>>>>>>>>>>>>>>>>>>>>> using
>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> same
>>>>>>>>>>>>>>>>>>>>>>> Part
>>>>>>>>>>>>>>>>>>>>>>> classes
>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>> already
>>>>>>>>>>>>>>>>>>>>>>> exist.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> I created
>>>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>> OutputStream
>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>> redirects
>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> BodyGenerator
>>>>>>>>>>>>>>>>>>>>>>> feeder.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> The
>>>>>>>>>>>>>>>>>>>>>>> problem
>>>>>>>>>>>>>>>>>>>>>>> I currently
>>>>>>>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> feeder
>>>>>>>>>>>>>>>>>>>>>>> feeds
>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> queue
>>>>>>>>>>>>>>>>>>>>>>> faster
>>>>>>>>>>>>>>>>>>>>>>> than
>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> async
>>>>>>>>>>>>>>>>>>>>>>> thread
>>>>>>>>>>>>>>>>>>>>>>> polling
>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>> :)
>>>>>>>>>>>>>>>>>>>>>>> I need
>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> expose
>>>>>>>>>>>>>>>>>>>>>>> a limit
>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>> queue
>>>>>>>>>>>>>>>>>>>>>>> size
>>>>>>>>>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>>>> something,
>>>>>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>>> work
>>>>>>>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>>>>> that,
>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>> better
>>>>>>>>>>>>>>>>>>>>>>> than
>>>>>>>>>>>>>>>>>>>>>>> a thread
>>>>>>>>>>>>>>>>>>>>>>> sleep
>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> slow
>>>>>>>>>>>>>>>>>>>>>>> down
>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> filepart
>>>>>>>>>>>>>>>>>>>>>>> reading
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> 2013/8/27
>>>>>>>>>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>>>>>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>>>>>>>>>>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Yes,
>>>>>>>>>>>>>>>>>>>>>>> something
>>>>>>>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>>>>> that.
>>>>>>>>>>>>>>>>>>>>>>> I was
>>>>>>>>>>>>>>>>>>>>>>> going
>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> tackle
>>>>>>>>>>>>>>>>>>>>>>> adding
>>>>>>>>>>>>>>>>>>>>>>> something
>>>>>>>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>> today.
>>>>>>>>>>>>>>>>>>>>>>> I'll
>>>>>>>>>>>>>>>>>>>>>>> follow
>>>>>>>>>>>>>>>>>>>>>>> up
>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>> something
>>>>>>>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>>>>> test
>>>>>>>>>>>>>>>>>>>>>>> out.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Sébastien
>>>>>>>>>>>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Ok
>>>>>>>>>>>>>>>>>>>>>>>> thanks!
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> I think
>>>>>>>>>>>>>>>>>>>>>>>> I see
>>>>>>>>>>>>>>>>>>>>>>>> what
>>>>>>>>>>>>>>>>>>>>>>>> I could
>>>>>>>>>>>>>>>>>>>>>>>> do,
>>>>>>>>>>>>>>>>>>>>>>>> probably
>>>>>>>>>>>>>>>>>>>>>>>> something
>>>>>>>>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>>>>>> that:
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> FeedableBodyGenerator
>>>>>>>>>>>>>>>>>>>>>>>> bodyGenerator
>>>>>>>>>>>>>>>>>>>>>>>> = new
>>>>>>>>>>>>>>>>>>>>>>>> FeedableBodyGenerator();
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> MultipartBodyGeneratorFeeder
>>>>>>>>>>>>>>>>>>>>>>>> bodyGeneratorFeeder
>>>>>>>>>>>>>>>>>>>>>>>> = new
>>>>>>>>>>>>>>>>>>>>>>>> MultipartBodyGeneratorFeeder(bodyGenerator);
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Request
>>>>>>>>>>>>>>>>>>>>>>>> uploadRequest1
>>>>>>>>>>>>>>>>>>>>>>>> = new
>>>>>>>>>>>>>>>>>>>>>>>> RequestBuilder("POST")
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> .setUrl("url")
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> .setBody(bodyGenerator)
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> .build();
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> ListenableFuture<Response>
>>>>>>>>>>>>>>>>>>>>>>>> asyncRes
>>>>>>>>>>>>>>>>>>>>>>>> = asyncHttpClient
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> .prepareRequest(uploadRequest1)
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> .execute(new
>>>>>>>>>>>>>>>>>>>>>>>> AsyncCompletionHandlerBase());
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> bodyGeneratorFeeder.append("param1","value1");
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> bodyGeneratorFeeder.append("param2","value2");
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> bodyGeneratorFeeder.append("fileToUpload",fileInputStream);
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> bodyGeneratorFeeder.end();
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Response
>>>>>>>>>>>>>>>>>>>>>>>> uploadResponse
>>>>>>>>>>>>>>>>>>>>>>>> = asyncRes.get();
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Does
>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>> seem
>>>>>>>>>>>>>>>>>>>>>>>> ok
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> you?
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> I guess
>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>> could
>>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>> interesting
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> provide
>>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>> MultipartBodyGeneratorFeeder
>>>>>>>>>>>>>>>>>>>>>>>> class
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> AHC
>>>>>>>>>>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>>>>> Grizzly
>>>>>>>>>>>>>>>>>>>>>>>> since
>>>>>>>>>>>>>>>>>>>>>>>> some
>>>>>>>>>>>>>>>>>>>>>>>> other
>>>>>>>>>>>>>>>>>>>>>>>> people
>>>>>>>>>>>>>>>>>>>>>>>> may
>>>>>>>>>>>>>>>>>>>>>>>> want
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> achieve
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> same
>>>>>>>>>>>>>>>>>>>>>>>> thing
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> 2013/8/26
>>>>>>>>>>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>>>>>>>>>>> Lubke
>>>>>>>>>>>>>>>>>>>>>>>> <ryan.lubke_at_oracle.com
>>>>>>>>>>>>>>>>>>>>>>>> <mailto:ryan.lubke_at_oracle.com>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Sébastien
>>>>>>>>>>>>>>>>>>>>>>>> Lorber
>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Hello,
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> I would
>>>>>>>>>>>>>>>>>>>>>>>> like
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> know
>>>>>>>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>>>>>> it's
>>>>>>>>>>>>>>>>>>>>>>>> possible
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> upload
>>>>>>>>>>>>>>>>>>>>>>>> a file
>>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>> AHC
>>>>>>>>>>>>>>>>>>>>>>>> / Grizzly
>>>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>> streaming,
>>>>>>>>>>>>>>>>>>>>>>>> I mean
>>>>>>>>>>>>>>>>>>>>>>>> without
>>>>>>>>>>>>>>>>>>>>>>>> loading
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> whole
>>>>>>>>>>>>>>>>>>>>>>>> file
>>>>>>>>>>>>>>>>>>>>>>>> bytes
>>>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>> memory.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> The
>>>>>>>>>>>>>>>>>>>>>>>> default
>>>>>>>>>>>>>>>>>>>>>>>> behavior
>>>>>>>>>>>>>>>>>>>>>>>> seems
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> allocate
>>>>>>>>>>>>>>>>>>>>>>>> a byte[]
>>>>>>>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>>>>>> contans
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> whole
>>>>>>>>>>>>>>>>>>>>>>>> file,
>>>>>>>>>>>>>>>>>>>>>>>> so
>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>> means
>>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>> my
>>>>>>>>>>>>>>>>>>>>>>>> server
>>>>>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>> OOM
>>>>>>>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>>>>>> too
>>>>>>>>>>>>>>>>>>>>>>>> many
>>>>>>>>>>>>>>>>>>>>>>>> users
>>>>>>>>>>>>>>>>>>>>>>>> upload
>>>>>>>>>>>>>>>>>>>>>>>> a large
>>>>>>>>>>>>>>>>>>>>>>>> file
>>>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> same
>>>>>>>>>>>>>>>>>>>>>>>> time.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> I've
>>>>>>>>>>>>>>>>>>>>>>>> tryied
>>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>> a Heap
>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>> ByteBuffer
>>>>>>>>>>>>>>>>>>>>>>>> memory
>>>>>>>>>>>>>>>>>>>>>>>> managers,
>>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>> reallocate=true/false
>>>>>>>>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>>>>>> no
>>>>>>>>>>>>>>>>>>>>>>>> more
>>>>>>>>>>>>>>>>>>>>>>>> success.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> It
>>>>>>>>>>>>>>>>>>>>>>>> seems
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> whole
>>>>>>>>>>>>>>>>>>>>>>>> file
>>>>>>>>>>>>>>>>>>>>>>>> content
>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> appended
>>>>>>>>>>>>>>>>>>>>>>>> wto
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> BufferOutputStream,
>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> underlying
>>>>>>>>>>>>>>>>>>>>>>>> buffer
>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> written.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> At
>>>>>>>>>>>>>>>>>>>>>>>> least
>>>>>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>>> seems
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> case
>>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>> AHC
>>>>>>>>>>>>>>>>>>>>>>>> integration:
>>>>>>>>>>>>>>>>>>>>>>>> https://github.com/AsyncHttpClient/async-http-client/blob/6faf1f316e5546110b0779a5a42fd9d03ba6bc15/providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/bodyhandler/PartsBodyHandler.java
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> So,
>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> there
>>>>>>>>>>>>>>>>>>>>>>>> a way
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> patch
>>>>>>>>>>>>>>>>>>>>>>>> AHC
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> stream
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> file
>>>>>>>>>>>>>>>>>>>>>>>> so
>>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>> I could
>>>>>>>>>>>>>>>>>>>>>>>> eventually
>>>>>>>>>>>>>>>>>>>>>>>> consume
>>>>>>>>>>>>>>>>>>>>>>>> only
>>>>>>>>>>>>>>>>>>>>>>>> 20mo
>>>>>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>>>> heap
>>>>>>>>>>>>>>>>>>>>>>>> while
>>>>>>>>>>>>>>>>>>>>>>>> uploading
>>>>>>>>>>>>>>>>>>>>>>>> a 500mo
>>>>>>>>>>>>>>>>>>>>>>>> file?
>>>>>>>>>>>>>>>>>>>>>>>> Or
>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>>> simply
>>>>>>>>>>>>>>>>>>>>>>>> impossible
>>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>> Grizzly?
>>>>>>>>>>>>>>>>>>>>>>>> I didn't
>>>>>>>>>>>>>>>>>>>>>>>> notice
>>>>>>>>>>>>>>>>>>>>>>>> anything
>>>>>>>>>>>>>>>>>>>>>>>> related
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> documentation.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> It's
>>>>>>>>>>>>>>>>>>>>>>>> possible
>>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> FeedableBodyGenerator.
>>>>>>>>>>>>>>>>>>>>>>>> But
>>>>>>>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>>>>>> you're
>>>>>>>>>>>>>>>>>>>>>>>> tied
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> using
>>>>>>>>>>>>>>>>>>>>>>>> Multipart
>>>>>>>>>>>>>>>>>>>>>>>> uploads,
>>>>>>>>>>>>>>>>>>>>>>>> you'd
>>>>>>>>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> convert
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> multipart
>>>>>>>>>>>>>>>>>>>>>>>> data
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> Buffers
>>>>>>>>>>>>>>>>>>>>>>>> manually
>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>> send
>>>>>>>>>>>>>>>>>>>>>>>> using
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> FeedableBodyGenerator.
>>>>>>>>>>>>>>>>>>>>>>>> I'll
>>>>>>>>>>>>>>>>>>>>>>>> take
>>>>>>>>>>>>>>>>>>>>>>>> a closer
>>>>>>>>>>>>>>>>>>>>>>>> look
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> see
>>>>>>>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>>> area
>>>>>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>> improved.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Btw
>>>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>> my
>>>>>>>>>>>>>>>>>>>>>>>> case
>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> a file
>>>>>>>>>>>>>>>>>>>>>>>> upload.
>>>>>>>>>>>>>>>>>>>>>>>> I receive
>>>>>>>>>>>>>>>>>>>>>>>> a file
>>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>> CXF
>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> transmit
>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> a storage
>>>>>>>>>>>>>>>>>>>>>>>> server
>>>>>>>>>>>>>>>>>>>>>>>> (like
>>>>>>>>>>>>>>>>>>>>>>>> S3).
>>>>>>>>>>>>>>>>>>>>>>>> CXF
>>>>>>>>>>>>>>>>>>>>>>>> doesn't
>>>>>>>>>>>>>>>>>>>>>>>> consume
>>>>>>>>>>>>>>>>>>>>>>>> memory
>>>>>>>>>>>>>>>>>>>>>>>> bevause
>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> streaming
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> large
>>>>>>>>>>>>>>>>>>>>>>>> fle
>>>>>>>>>>>>>>>>>>>>>>>> uploads
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> file
>>>>>>>>>>>>>>>>>>>>>>>> system,
>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>>>>>>>> provides
>>>>>>>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>> input
>>>>>>>>>>>>>>>>>>>>>>>> stream
>>>>>>>>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>> file.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>
>>>>>
>>>
>>
>>
>>
>