quickwit-oss/quickwit · error

Kinesis stream_name cannot be updated

Error message

Kinesis stream_name cannot be updated

What it means

Kinesis source params cannot have their `stream_name` changed via an update. Kinesis shard IDs are used as metastore checkpoint PartitionIds and their uniqueness is only guaranteed within a stream, so switching streams would make stored checkpoints ambiguous. `KinesisSourceParams::validate_update` rejects updates where the stream name differs.

Source

Thrown at quickwit/quickwit-config/src/source_config/mod.rs:502

}

#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, utoipa::ToSchema)]
#[serde(try_from = "KinesisSourceParamsInner")]
pub struct KinesisSourceParams {
    pub stream_name: String,
    #[serde(flatten)]
    pub region_or_endpoint: Option<RegionOrEndpoint>,
    /// When backfill mode is enabled, the source exits after reaching the end of the stream.
    #[serde(skip_serializing_if = "is_false")]
    pub enable_backfill_mode: bool,
}

impl KinesisSourceParams {
    fn validate_update(&self, other: &Self) -> anyhow::Result<()> {
        // Changing the stream would likely mess up the checkpoints because the
        // Kinesis shard IDs are used as metastore checkpoint PartitionId, and
        // there uniqueness is only guaranteed within a stream.
        ensure!(
            self.stream_name == other.stream_name,
            "Kinesis stream_name cannot be updated"
        );
        ensure!(
            self.region_or_endpoint == other.region_or_endpoint,
            "Kinesis region or endpoint cannot be updated"
        );
        Ok(())
    }
}

#[derive(Clone, Debug, Eq, PartialEq, Deserialize)]
#[serde(deny_unknown_fields)]
struct KinesisSourceParamsInner {
    pub stream_name: String,
    pub region: Option<String>,
    pub endpoint: Option<String>,
    #[serde(default)]

View on GitHub (pinned to a39730c5cd)

Solutions

  1. Create a new Kinesis source bound to the new stream instead of updating the existing source.
  2. If migration is required: delete the old source and create a new one, then reset/adjust checkpoints knowingly.
  3. For other param changes, re-submit keeping `stream_name` unchanged.

Example fix

// before: update source with stream_name: logs-2026
// (original stream_name: logs-2025) -> rejected

// after: create a new source
quickwit source create --index my-index --source-config kinesis-2026.json
Defensive patterns

Strategy: validation

Validate before calling

let current = client.get_source(index_id, source_id).await?;
if current.params.stream_name != new_params.stream_name {
    return Err("Kinesis stream_name is immutable; create a new source".into());
}
client.update_source(index_id, source_id, new_params).await?;

Try / catch

match client.update_source(index_id, source_id, params).await {
    Err(e) if e.to_string().contains("stream_name cannot be updated") => {
        client.delete_source(index_id, source_id).await?;
        client.create_source(index_id, source_config_new_stream).await?;
    }
    other => other?,
}

Prevention

When it happens

Trigger: Calling the source update API/CLI with a Kinesis source config whose `stream_name` differs from the stored source, hitting validate_update before the update is applied.

Common situations: Migrating ingestion to a new Kinesis stream and attempting an in-place update; staging vs production stream names swapped in the config; region rename causing operators to recreate the stream and point the source at it.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of quickwit-oss/quickwit@a39730c5cd (2026-09-08). Data as JSON: /api/errors/36500fe49dcff4c2. Report an issue: GitHub.