Erik Krogen created HDFS-14442:
----------------------------------

             Summary: Disagreement between HAUtil.getAddressOfActive and 
RpcInvocationHandler.getConnectionId
                 Key: HDFS-14442
                 URL: https://issues.apache.org/jira/browse/HDFS-14442
             Project: Hadoop HDFS
          Issue Type: Bug
    Affects Versions: 3.3.0
            Reporter: Erik Krogen


While working on HDFS-14245, we noticed a discrepancy in some proxy-handling 
code.

The description of {{RpcInvocationHandler.getConnectionId()}} states:
{code}
  /**
   * Returns the connection id associated with the InvocationHandler instance.
   * @return ConnectionId
   */
  ConnectionId getConnectionId();
{code}
It does not make any claims about whether this connection ID will be an active 
proxy or not. Yet in {{HAUtil}} we have:
{code}
  /**
   * Get the internet address of the currently-active NN. This should rarely be
   * used, since callers of this method who connect directly to the NN using the
   * resulting InetSocketAddress will not be able to connect to the active NN if
   * a failover were to occur after this method has been called.
   * 
   * @param fs the file system to get the active address of.
   * @return the internet address of the currently-active NN.
   * @throws IOException if an error occurs while resolving the active NN.
   */
  public static InetSocketAddress getAddressOfActive(FileSystem fs)
      throws IOException {
    if (!(fs instanceof DistributedFileSystem)) {
      throw new IllegalArgumentException("FileSystem " + fs + " is not a DFS.");
    }
    // force client address resolution.
    fs.exists(new Path("/"));
    DistributedFileSystem dfs = (DistributedFileSystem) fs;
    DFSClient dfsClient = dfs.getClient();
    return RPC.getServerAddress(dfsClient.getNamenode());
  }
{code}
Where the call {{RPC.getServerAddress()}} eventually terminates into 
{{RpcInvocationHandler#getConnectionId()}}, via {{RPC.getServerAddress()}} -> 
{{RPC.getConnectionIdForProxy()}} -> 
{{RpcInvocationHandler#getConnectionId()}}. {{HAUtil}} appears to be making an 
incorrect assumption that {{RpcInvocationHandler}} will necessarily return an 
_active_ connection ID. {{ObserverReadProxyProvider}} demonstrates a 
counter-example to this, since the current connection ID may be pointing at, 
for example, an Observer NameNode.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-dev-unsubscr...@hadoop.apache.org
For additional commands, e-mail: hdfs-dev-h...@hadoop.apache.org

Reply via email to