TCPConnectionMap$Mapper.getConnection() acquires a lock and returns the an existing connection, or creates a new one if needed. The problem is that - while we try to establish a new connection - existing connections will have to wait before being returned until connection establishment has completed (or failed).
For instance, if we have valid connections to members B, C and D, and try to establish a connection to (failed) member E, all threads will try to send data to A, B and C will be blocked until they can acquire the lock !
SOLUTION: move socket creation under a different lock.
{Suggested by S. Simeonoff)