You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Dany Alain (JIRA)" <ji...@apache.org> on 2018/06/11 19:52:00 UTC
[jira] [Updated] (NET-661) FTPSClient hang
java.net.SocketInputStream.socketRead0 while doing SSL Handshake - Socket
timeout not set
[ https://issues.apache.org/jira/browse/NET-661?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Dany Alain updated NET-661:
---------------------------
Description:
In a lab with unstable connection we have our FTP client hanging forever (e.g. 36 hours -> base on our linux kernel configuration)
{quote}java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
locked <0x00000000ae243608> (a java.lang.Object)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
locked <0x00000000ae243620> (a java.lang.Object)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
at org.apache.commons.net.ftp.FTPSClient.sslNegotiation(FTPSClient.java:289)
at org.apache.commons.net.ftp.FTPSClient.connectAction(FTPSClient.java:220)
at org.apache.commons.net.SocketClient._connect(SocketClient.java:244)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:202)
at com.ericsson.mdn.logaccu.ftp.FTPClientWrapper.connectAndLogin(FTPClientWrapper.java:100)
at com.ericsson.mdn.logaccu.ftppull.ResourceFTPJob.run(ResourceFTPJob.java:122)
at
com.ericsson.mdn.daedalus.threadpool.queued.ThreadWorker.doWork(ThreadWorker.java:160)
at com.ericsson.mdn.daedalus.threadpool.queued.ThreadWorker.run(ThreadWorker.java:69)
{quote}
our code
{quote}final FTPSClient client = new FTPSClient("TLSv1.2", true);
// load the trust store& key store
client.setDataTimeout(1000);
client.setControlKeepAliveReplyTimeout(1000);
client.setControlKeepAliveTimeout(1000);
client.setDefaultTimeout(1000);
client.setConnectTimeout(1000);
client.connect(host, port); // hang randomly
client.setSoLinger(true, 10); // cannot be call before, socket is null
reply = client.getReplyCode();
{quote}
After looking at the FTP, FTPSClient code and reading on internet I realize that in the case of an implicit connection the Socket is initialized with So timeout of 0 because "_connectAction_()" is overwritten
*Socket.java*
{quote}protected void _connectAction_() throws IOException
*_socket_.setSoTimeout(_timeout_);*
_input_ = _socket_.getInputStream();
_output_ = _socket_.getOutputStream(); }
{quote}
*FTPSClient.java*
{quote}@Override
protected void _connectAction_() throws IOException {
// Implicit mode.
if (isImplicit) {
*sslNegotiation();* {color:#ff0000}// hangs at java.net.SocketInputStream.socketRead0(Native Method){color}
}
super._connectAction_(); *{color:#ff0000}// setSoTimeout will be set here - but too late{color}*
// Explicit mode.
if (!isImplicit)
Unknown macro: \{ execAUTH(); }
}
{quote}
So *workaround* for now is to overwrite FTPSClient-> _connectAction_()
{quote}new FTPSClient(...)
@Override
protected void _connectAction_() throws IOException {
// FTPS stuck in socketRead0
_socket_.setSoTimeout(_timeout_);
super._connectAction_(); }
};
{quote}
was:
In a lab with unstable connection we have our FTP client hanging forever (e.g. 36 hours -> base on our linux kernel configuration)
{quote}java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
locked <0x00000000ae243608> (a java.lang.Object)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
locked <0x00000000ae243620> (a java.lang.Object)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
at org.apache.commons.net.ftp.FTPSClient.sslNegotiation(FTPSClient.java:289)
at org.apache.commons.net.ftp.FTPSClient.connectAction(FTPSClient.java:220)
at org.apache.commons.net.SocketClient._connect(SocketClient.java:244)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:202)
at com.ericsson.mdn.logaccu.ftp.FTPClientWrapper.connectAndLogin(FTPClientWrapper.java:100)
at com.ericsson.mdn.logaccu.ftppull.ResourceFTPJob.run(ResourceFTPJob.java:122)
at
com.ericsson.mdn.daedalus.threadpool.queued.ThreadWorker.doWork(ThreadWorker.java:160)
at com.ericsson.mdn.daedalus.threadpool.queued.ThreadWorker.run(ThreadWorker.java:69)
{quote}
our code
{quote}final FTPSClient client = new FTPSClient("TLSv1.2", true);
// load the trust store& key store
client.setDataTimeout(1000);
client.setControlKeepAliveReplyTimeout(1000);
client.setControlKeepAliveTimeout(1000);
client.setDefaultTimeout(1000);
client.setConnectTimeout(1000);
client.connect(host, port); // hang randomly
client.setSoLinger(true, 10); // cannot be call before, socket is null
reply = client.getReplyCode();
{quote}
After looking at the FTP, FTPSClient code and reading on internet I realize that in the case of an implicit connection the Socket is initialized with So timeout of 0 because "_connectAction_()" is overwritten
*Socket.java*
{quote}protected void _connectAction_() throws IOException
*_socket_.setSoTimeout(_timeout_);*
_input_ = _socket_.getInputStream();
_output_ = _socket_.getOutputStream(); }{quote}
*FTPSClient.java*
{quote}@Override
protected void _connectAction_() throws IOException {
// Implicit mode.
if (isImplicit) {
*sslNegotiation();* {color:#ff0000}// hangs at java.net.SocketInputStream.socketRead0(Native Method){color}
}
super._connectAction_(); *{color:#ff0000}// setSoTimeout will be set here - but too late{color}*
// Explicit mode.
if (!isImplicit) {
execAUTH();
}
}
{quote}
So *workaround* for now is to overwrite FTPSClient-> _connectAction_()
{quote}new FTPSClient(...){
@Override
protected void _connectAction_() throws IOException
// FTPS stuck in socketRead0
_socket_.setSoTimeout(_timeout_);
super._connectAction_(); }
};
{quote}
> FTPSClient hang java.net.SocketInputStream.socketRead0 while doing SSL Handshake - Socket timeout not set
> ---------------------------------------------------------------------------------------------------------
>
> Key: NET-661
> URL: https://issues.apache.org/jira/browse/NET-661
> Project: Commons Net
> Issue Type: Bug
> Components: FTP
> Affects Versions: 3.6
> Environment: Apache NET 3.6
>
> #uname -a
> Linux myhost 2.6.32-696.23.1.el6.x86_64 #1 SMP Sat Feb 10 11:10:31 EST 2018 x86_64 x86_64 x86_64 GNU/Linux
> # java -version
> openjdk version "1.8.0_171"
> OpenJDK Runtime Environment (build 1.8.0_171-b10)
> OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)
>
>
> Reporter: Dany Alain
> Priority: Major
> Labels: SocketTimeout, hang, implicit, socketRead0, ssl
>
> In a lab with unstable connection we have our FTP client hanging forever (e.g. 36 hours -> base on our linux kernel configuration)
> {quote}java.lang.Thread.State: RUNNABLE
> at java.net.SocketInputStream.socketRead0(Native Method)
> at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
> at java.net.SocketInputStream.read(SocketInputStream.java:171)
> at java.net.SocketInputStream.read(SocketInputStream.java:141)
> at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
> at sun.security.ssl.InputRecord.read(InputRecord.java:503)
> at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
> locked <0x00000000ae243608> (a java.lang.Object)
> at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
> locked <0x00000000ae243620> (a java.lang.Object)
> at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
> at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
> at org.apache.commons.net.ftp.FTPSClient.sslNegotiation(FTPSClient.java:289)
> at org.apache.commons.net.ftp.FTPSClient.connectAction(FTPSClient.java:220)
> at org.apache.commons.net.SocketClient._connect(SocketClient.java:244)
> at org.apache.commons.net.SocketClient.connect(SocketClient.java:202)
> at com.ericsson.mdn.logaccu.ftp.FTPClientWrapper.connectAndLogin(FTPClientWrapper.java:100)
> at com.ericsson.mdn.logaccu.ftppull.ResourceFTPJob.run(ResourceFTPJob.java:122)
> at
> com.ericsson.mdn.daedalus.threadpool.queued.ThreadWorker.doWork(ThreadWorker.java:160)
> at com.ericsson.mdn.daedalus.threadpool.queued.ThreadWorker.run(ThreadWorker.java:69)
> {quote}
> our code
> {quote}final FTPSClient client = new FTPSClient("TLSv1.2", true);
> // load the trust store& key store
> client.setDataTimeout(1000);
> client.setControlKeepAliveReplyTimeout(1000);
> client.setControlKeepAliveTimeout(1000);
> client.setDefaultTimeout(1000);
> client.setConnectTimeout(1000);
> client.connect(host, port); // hang randomly
> client.setSoLinger(true, 10); // cannot be call before, socket is null
> reply = client.getReplyCode();
> {quote}
> After looking at the FTP, FTPSClient code and reading on internet I realize that in the case of an implicit connection the Socket is initialized with So timeout of 0 because "_connectAction_()" is overwritten
> *Socket.java*
> {quote}protected void _connectAction_() throws IOException
> *_socket_.setSoTimeout(_timeout_);*
> _input_ = _socket_.getInputStream();
> _output_ = _socket_.getOutputStream(); }
> {quote}
> *FTPSClient.java*
> {quote}@Override
> protected void _connectAction_() throws IOException {
> // Implicit mode.
> if (isImplicit) {
> *sslNegotiation();* {color:#ff0000}// hangs at java.net.SocketInputStream.socketRead0(Native Method){color}
> }
> super._connectAction_(); *{color:#ff0000}// setSoTimeout will be set here - but too late{color}*
> // Explicit mode.
> if (!isImplicit)
> Unknown macro: \{ execAUTH(); }
> }
> {quote}
> So *workaround* for now is to overwrite FTPSClient-> _connectAction_()
> {quote}new FTPSClient(...)
> @Override
> protected void _connectAction_() throws IOException {
> // FTPS stuck in socketRead0
> _socket_.setSoTimeout(_timeout_);
> super._connectAction_(); }
> };
> {quote}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)