code: public Writable call(Writable param, InetSocketAddress addr, 
                         Class<?> protocol, UserGroupInformation ticket,
                         int rpcTimeout, boolean fastProtocol)
                         throws IOException {
      Call call = new Call(param);
      Connection connection = getConnection(addr, protocol, ticket,
  		rpcTimeout, call);
      try {
        connection.sendParam(call, fastProtocol);                 // send the parameter
      } catch (RejectedExecutionException e) {
        throw new ConnectionClosedException("connection has been closed", e);
      } catch (InterruptedException e) {
        throw (InterruptedIOException) new InterruptedIOException().initCause(e);
      }
  
      synchronized (call) {
        while (!call.done) {
          try {
            call.wait();                           // wait for the result
          } catch (InterruptedException ie) {
            // Exit on interruption.
            throw (InterruptedIOException) new InterruptedIOException()
                .initCause(ie);
          }
        }
  
        if (call.error != null) {
          if (call.error instanceof RemoteException) {
            call.error.fillInStackTrace();
            throw call.error;
          } else { // local exception
            throw wrapException(addr, call.error);
          }
        } else {
          return call.value;
        }
      }
    }
docs: Make a call, passing <code>param</code>, to the IPC server running at
  <code>address</code> which is servicing the <code>protocol</code> protocol,
  with the <code>ticket</code> credentials and <code>rpcTimeout</code>,
  returning the value.
  Throws exceptions if there are network problems or if the remote code
  threw an exception.