[jcifs] Note about jcifs.smb.client.(responseTimeout|soTimeout)
Michael B Allen
miallen at ioplex.com
Tue Apr 8 18:58:38 GMT 2008
I'll add this to the TODO for further investigation.
Thanks,
Mike
On Tue, 08 Apr 2008 20:38:04 +0200
Ronny Schuetz <Usenet.r96 at gishpuppy.com> wrote:
> 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
>
>
--
Michael B Allen
PHP Active Directory SPNEGO SSO
http://www.ioplex.com/
More information about the jcifs
mailing list