func()

in conn.go [160:185]


func (c *Conn) rpc(opcode int32, w jute.RecordWriter, r jute.RecordReader) error {
	header := &proto.RequestHeader{
		Xid:  c.nextXid(),
		Type: opcode,
	}

	pending := &pendingRequest{
		reply: r,
		done:  make(chan struct{}, 1),
	}

	c.reqs.Store(header.Xid, pending)

	if err := WriteRecords(c.conn, header, w); err != nil {
		return fmt.Errorf("could not write rpc request: %w", err)
	}

	select {
	case <-pending.done:
		return pending.error
	case <-c.sessionCtx.Done():
		return fmt.Errorf("session closed: %w", c.sessionCtx.Err())
	case <-time.After(c.sessionTimeout):
		return fmt.Errorf("got a timeout waiting on response for xid %d", header.Xid)
	}
}