code: func (p *ConnPool) RPC(dc string, addr net.Addr, version int, method string, useTLS bool, args interface{}, reply interface{}) error {
  	p.once.Do(p.init)
  
  	// Get a usable client
  	conn, sc, err := p.getClient(dc, addr, version, useTLS)
  	if err != nil {
  		return fmt.Errorf("rpc error getting client: %v", err)
  	}
  
  	// Make the RPC call
  	err = msgpackrpc.CallWithCodec(sc.codec, method, args, reply)
  	if err != nil {
  		sc.Close()
  
  		// See the comment in leader_test.go TestLeader_ChangeServerID
  		// about how we found this. The tldr is that if we see this
  		// error, we know this connection is toast, so we should clear
  		// it and make a new one on the next attempt.
  		if lib.IsErrEOF(err) {
  			p.clearConn(conn)
  		}
  
  		p.releaseConn(conn)
  		return fmt.Errorf("rpc error making call: %v", err)
  	}
  
  	// Done with the connection
  	conn.returnClient(sc)
  	p.releaseConn(conn)
  	return nil
  }
docs: // RPC is used to make an RPC call to a remote host