Archived

This forum has been archived. Please start a new discussion on GitHub.

Synchronous calls from AMI callback may lead to deadlock

Hi,

Let's consider Client, Server1 and Server2 and following logical flow.

1. Client calls asynchronously to function foo1 implemented by a servant deployed by Server1.
2. Response/exception is received by Client's AMI_foo1 callback object.
3. In ice_response/ice_exception implemented by AMI_foo1 we call synchronously to foo2 implemented by a servant deployed by Server2.

Now, if Client runs this logic in a loop it may lead to a deadlock (deadlock's probability grows with a loop counter limit).
Workaround:
Client may call foo2 asynchronously (no deadlock for loop_counter_limit=50000 according to my tests).
Please explain this behaviour.

Environment:
Ice version: 3.3.1
System: Vista Premium 32bit
Compiler: VS 2005

Comments

  • mes
    mes California
    Hi,

    Thread starvation is quite likely in the situation you've described. Keep in mind that a thread from the client thread pool reads the reply messages and dispatches AMI callbacks. If you make a nested synchronous invocation from within an AMI callback, there may not be any threads remaining in the client thread pool to read the reply for that synchronous invocation, thus causing a deadlock.

    Consequently, you must either increase the maximum size of your client thread pool to be sufficiently large enough to guarantee that such a deadlock never occurs, or avoid the use of nested synchronous invocations altogether. In general we recommend the latter approach.

    Hope that helps,
    Mark