[jcifs] Note about jcifs.smb.client.(responseTimeout|soTimeout)
Ronny Schuetz
Usenet.r96 at gishpuppy.com
Tue Apr 8 18:38:04 GMT 2008
Hi Michael,
just ran into an racing condition issue with jCIFS 1.2.7 (however, the
code seems to be unchanged in the latest version, but we're planning to
upgrade to use DFS), where threads started by
jcifs.util.transport.Transport.doConnect()
are piling up and causing OutOfMemory errors at a certain point in time
where no native threads can be started anymore (at least on HP-UX).
=== Setup ==============================
A test client retries more or less immediately (there is just a short
delay) to open a connection to a non-reachable server resp. server that
responds very slowly in SmbTransport#negotiate() as soon as the previous
attempt failed.
jcifs.smb.client.responseTimeout was set to 60000,
jcifs.smb.client.soTimeout was set to 90000.
=== Issue ==============================
The values for the timeouts are listed above. The documentation
recommends 30000 and 35000, the defaults are 10000 and 15000 so the
issue will appear here as well, but it will take longer.
As the socket timeout is higher than the response timeout, the threads
started in SmbTransport#doConnect() do not finish before the wait() in
Transport#connect() times out in case the server does not respond in
SmbTransport#negotiate().
Due to the synchronized block in SmbTransport#negotiate(), threads for
the same destination are queued up.
As the client is more or less retrying immediately trying to open a
connection after a failed connection attempt, more and more threads are
started, so at some point in time, the thread start in
Transport#connect() fails with an out of memory error ("unable to create
new native thread" on HP-UX) leaving the transport in an invalid state
(== 1) and might cause other classes to fail to start threads as well.
=== Proposed solution ==================
It would be better IMHO to use a much higher value for responseTimeout
than for soTimeout, maybe the following should be true:
responseTimeout >= 2 * soTimeout
(*2 due to potentially multiple negotiate() calls in
SmbTransport#doConnect())
Btw, something else about jcifs.smb.SmbTransport: Maybe it would be good
to use Socket#bind() and Socket#connect() instead of the used Socket
constructor to set a timeout already for the connection phase to avoid
waiting forever in such cases.
However, the library runs pretty stable for us although we're shuffling
a lot of files around the world every day. Keep up the good work, thanks
a lot!
Best regards,
Ronny
More information about the jcifs
mailing list