code: public static <T extends VersionedProtocol> ProtocolProxy<T> waitForProtocolProxy(
                                                 Class<T> protocol,
                                                 long clientVersion,
                                                 InetSocketAddress addr,
                                                 Configuration conf,
                                                 long timeout,
                                                 int rpcTimeout
                                                 ) throws IOException { 
      long startTime = System.currentTimeMillis();
      UserGroupInformation ugi = null;
      try {
        ugi = UserGroupInformation.login(conf);
      } catch (LoginException le) {
        throw new RuntimeException("Couldn't login!");
      }
      IOException ioe;
      while (true) {
        try {
          return getProtocolProxy(protocol, clientVersion, addr,
  			ugi, conf,
  			NetUtils.getDefaultSocketFactory(conf), rpcTimeout);
        } catch(ConnectException se) {  // namenode has not been started
          LOG.info("Server at " + addr + " not available yet, Zzzzz...");
          ioe = se;
        } catch(SocketTimeoutException te) {  // namenode is busy
          LOG.info("Problem connecting to server: " + addr);
          ioe = te;
        }
        // check if timed out
        if (System.currentTimeMillis()-timeout >= startTime) {
          throw ioe;
        }
  
        // wait for retry
        try {
          Thread.sleep(1000);
        } catch (InterruptedException ie) {
          // IGNORE
        }
      }
    }
docs: Get a proxy connection to a remote server
  @param protocol protocol class
  @param clientVersion client version
  @param addr remote address
  @param conf configuration to use
  @param rpcTimeout timeout for each RPC
  @param timeout time in milliseconds before giving up
  @return the proxy
  @throws IOException if the far end through a RemoteException