Use of isConnected() in DataXceiver is invalid
----------------------------------------------

                 Key: HDFS-2071
                 URL: https://issues.apache.org/jira/browse/HDFS-2071
             Project: Hadoop HDFS
          Issue Type: Bug
          Components: data-node
    Affects Versions: 0.23.0
            Reporter: Kihwal Lee
            Priority: Minor


The use of Socket.isConnected() in DataXceiver.run() is not valid. It returns 
false until the connection is made and then always returns true after that. It 
will never return false after the initial connection is successfully made. 
Socket.isClosed() or SocketChannel.isOpen() should be used instead, assuming 
someone is handling SocketException and does Socket.close() or 
SocketChannel.close(). It seems the op handlers in DataXceiver are diligently 
using IOUtils.closeStream(), which will invoke SocketChannel.close().

{code}
- } while (s.isConnected() && socketKeepaliveTimeout > 0);
+ } while (!s.isClosed() && socketKeepaliveTimeout > 0);
{code}

The effect of this bug is very minor, as the socket is read again right after. 
If the connection was closed, the readOp() will throw an EOFException, which is 
caught and dealt with properly.  The system still functions normally with 
probably only few microseconds of extra overhead in the premature connection 
closure cases.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to