On Wed, 2016-01-27 at 08:44 -0600, Mark Johnson wrote:
> Hi Oleg,
>
> Yes, we're shutting down the client from a callback in the actual
> application. The design of the program is a state machine that issues
> requests and processes the responses. If there's a failure during the
> process (received via the failure() callback) we terminate the state
> machine and part of that process is closing the client.
>
But what for? HttpAsyncClient instances are expensive and, more
importantly, stateless. Unless you also intent to shut down the VM it
seems unreasonable to throw away the client simply because there was an
I/O error on one of connections.
Oleg
> We've added code, as a workaround, to spawn a temporary worker thread to
> close the connection. That has worked. So if there's no solution to
> the original problem, we have a way to get around this.
>
> Thanks again,
> Mark
>
>
> On 1/27/2016 3:38 AM, Oleg Kalnichevski wrote:
> > On Tue, 2016-01-26 at 13:30 -0600, Mark Johnson wrote:
> >> Hi Oleg,
> >>
> >> Below is a program that reproduces the hang. It might take a couple of
> >> runs to make this happen - it depends on what thread the callback is
> >> generated on. If it's on the IO Dispatcher thread, we can close the
> >> connection on that thread also and there's no problem. If the callback
> >> comes on the pool-thread the program hangs. The stack trace of the
> >> pool-thread when this happens looks like this:
> >>
> >> Thread [pool-1-thread] (Suspended) <-- I paused it in the debugger
> >> but this is where it stays
> >> owns: SessionRequestImpl (id=44)
> >> waiting for: Thread (id=21)
> >> Object.wait(long)
> >> Thread.join(long)
> >> Thread.join()
> >> InternalHttpAsyncClient(ClosableHttpAsyncClientBase).close()
> >> Testprog$Callback.failed(Exception)
> >> etc.
> > ...
> >
> >> @Override
> >>
> >> public void cancelled() {
> >>
> >> Thread t = Thread.currentThread();
> >>
> >> System.out.println(t.getName() + ": " + "Request cancelled");
> >>
> >> try {
> >>
> >> System.out.println(t.getName() + ": " + "Closing client connection");
> >>
> >> _httpclient.close();
> >>
> >> } catch (Exception ex) {
> >>
> >> System.out.println(t.getName() + ": " + ex.getMessage());
> >>
> >> }
> >>
> >> _latch.countDown();
> >>
> >> }
> >>
> > Good Lord! You are shutting down the client from a callback. Is there a
> > good reason for that?
> >
> > Regardless I'll see if there is a way to avoid a deadlock here.
> >
> > Thanks for the reproducer.
> >
> > Oleg
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [email protected]
> > For additional commands, e-mail: [email protected]
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]