valeriansaliou/sonic · error · std::io::Error

Command too long. Max buffer size

Error message

Command too long. Max buffer size: {}

What it means

The client's Channel::send returns an std::io::Error of kind InvalidInput when the serialized command exceeds channel_info.buffer_size, the negotiated maximum line buffer for this channel. The command is rejected locally without touching the network.

Solutions

  1. Check command length before sending and split payloads into chunks under buffer_size
  2. Increase the channel buffer size if the client/server configuration allows it
  3. Truncate or preprocess input to a safe maximum length
  4. Handle the io::ErrorKind::InvalidInput error in send_buffered callers and surface a clear message

Example fix

// client
// before
channel.send(Command::push(collection, bucket, huge_text), disc, parse)?;
// after
if huge_text.len() > channel.buffer_size() {
    return Err(...); // or split into chunks
}
channel.send(Command::push(collection, bucket, huge_text), disc, parse)?;
Defensive patterns

Strategy: validation

Validate before calling

if command.len() > channel.buffer_size() {
    return Err(std::io::Error::new(
        std::io::ErrorKind::InvalidInput,
        "command exceeds channel buffer size; split the payload",
    ));
}

Try / catch

match channel.send(cmd, disc, parse) {
    Err(e) if e.kind() == std::io::ErrorKind::InvalidInput => {
        // split into chunks and resend
    }
    other => other?,
}

Prevention

When it happens

Trigger: Calling send (directly or via send_buffered) with a Command whose byte length exceeds self.channel_info.buffer_size — e.g. a PUSH/QUERY payload larger than the channel's buffer size.

Common situations: Indexing documents larger than the client/server buffer; constructing commands with unbounded user input; mismatch between client buffer_size and the payload sizes the application assumes.

Understand the failure class

Background: payload too large / request exceeds maximum size: why libraries cap bytes and how to fix oversize payloads — this error's family across 50 libraries.

Related errors


AI-assisted analysis of valeriansaliou/sonic@e6a72da6a5 (2026-09-01). Data as JSON: /api/errors/b1d14ebf17cd088e. Report an issue: GitHub.

Appendix: source

Thrown at client/src/channel.rs:115

        multiplexer.attach(conn)?;

        Ok(Self {
            server_info,
            channel_info,
            dispatcher_tx: tx,
            poll_waker: Arc::clone(&multiplexer.poll_waker),
            is_closed: false,
        })
    }

    pub(crate) fn send<T: Send + 'static>(
        &self,
        command: Command,
        discriminant: Mode::Discriminant,
        parse: impl Fn(&str) -> std::io::Result<T> + Send + 'static,
    ) -> std::io::Result<oneshot::Receiver<std::io::Result<T>>> {
        if command.len() > self.channel_info.buffer_size {
            return Err(std::io::Error::new(
                std::io::ErrorKind::InvalidInput,
                format!(
                    "Command too long. Max buffer size: {}",
                    self.channel_info.buffer_size
                ),
            ));
        }

        let (tx, rx) = oneshot::channel();

        self.dispatcher_tx
            .send_timeout(
                Task {
                    command,
                    discriminant,
                    callback: Box::new(move |result| {
                        // log_debug!("Callback");

View on GitHub (pinned to e6a72da6a5)