risingwavelabs/risingwave · error · SinkError::Mongodb

bulk write write errors

Error message

bulk write write errors

What it means

After running the bulk write command, the response document's 'ok' field was present but not equal to 1, meaning MongoDB reports the command itself did not succeed. The sink returns a generic 'bulk write write errors' Mongodb error.

Source

Thrown at src/connector/src/sink/mongodb.rs:89

            if let Some(delete) = delete {
                send_bulk_write_command(db, delete).await?;
            }
            Ok(())
        }
    }

    async fn send_bulk_write_command(db: Database, command: Document) -> Result<()> {
        let result = db.run_command(command).await.map_err(|err| {
            SinkError::Mongodb(anyhow!(err).context(format!(
                "sending bulk write command failed, database: {}",
                db.name()
            )))
        })?;

        if let Ok(ok) = result.get_i32("ok")
            && ok != 1
        {
            return Err(SinkError::Mongodb(anyhow!("bulk write write errors")));
        }

        if let Ok(write_errors) = result.get_array("writeErrors") {
            return Err(SinkError::Mongodb(anyhow!(
                "bulk write respond with write errors: {:?}",
                write_errors,
            )));
        }

        if let Ok(write_concern_error) = result.get_array("writeConcernError") {
            return Err(SinkError::Mongodb(anyhow!(
                "bulk write respond with write errors: {:?}",
                write_concern_error,
            )));
        }

        Ok(())
    }

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Grant the sink user write privileges (dbAdmin/write role) on the target database.
  2. Check the server's full response by enabling driver command logging to see the actual errmsg.
  3. Verify the MongoDB deployment supports the bulk write command (version/compatibility).
  4. Retry if the server reported a transient internal error.

Example fix

// before: generic error loses the server message
return Err(SinkError::Mongodb(anyhow!("bulk write write errors")));
// after: include server errmsg for diagnosability
let msg = result.get_str("errmsg").unwrap_or("unknown");
return Err(SinkError::Mongodb(anyhow!("bulk write failed: ok != 1 ({msg})")));
Defensive patterns

Strategy: validation

Validate before calling

// verify sink user permissions before writing
mongosh "$MONGO_URI" --eval "db.runCommand({connectionStatus: 1, showPrivileges: true})"

Try / catch

// surface errmsg from the response instead of failing blind
if ok != 1 {
    let msg = result.get_str("errmsg").unwrap_or("unknown");
    return Err(SinkError::Mongodb(anyhow!("bulk write failed: {msg}")));
}

Prevention

When it happens

Trigger: result.get_i32("ok") yields ok != 1: the server rejected the bulk write command, e.g. unauthorized, command not supported, or an internal server error returned without a detailed writeErrors array.

Common situations: Sink user lacking write role on the target database, mongos/sharded cluster rejecting the command, or server-side errors like command-not-allowed on restricted deployments (e.g. Atlas free tier limits).

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/023ddce87fd9bf50. Report an issue: GitHub.