{"record":{"id":"772bc7bcbe4dcb75","repo":"risingwavelabs/risingwave","slug":"updating-vnode-bitmap-in-place-is-not-supported","errorCode":null,"errorMessage":"updating vnode bitmap in place is not supported","messagePattern":"updating vnode bitmap in place is not supported","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/stream/src/executor/mod.rs","lineNumber":682,"sourceCode":"    /// Returns the new vnode bitmap if this barrier is to update the vnode bitmap for the actor\n    /// with `actor_id`.\n    ///\n    /// Actually, this vnode bitmap update is only useful for the record accessing validation for\n    /// distributed executors, since the read/write pattern will never be across multiple vnodes.\n    pub fn as_update_vnode_bitmap(&self, actor_id: ActorId) -> Option<Arc<Bitmap>> {\n        self.mutation\n            .as_deref()\n            .and_then(|mutation| match mutation {\n                Mutation::Update(UpdateMutation { vnode_bitmaps, .. }) => {\n                    vnode_bitmaps.get(&actor_id).cloned()\n                }\n                _ => None,\n            })\n    }\n\n    pub fn assume_no_update_vnode_bitmap(&self, actor_id: ActorId) -> StreamExecutorResult<()> {\n        if self.as_update_vnode_bitmap(actor_id).is_some() {\n            return Err(anyhow!(\"updating vnode bitmap in place is not supported\").into());\n        }\n        Ok(())\n    }\n\n    pub fn as_sink_schema_change(&self, sink_id: SinkId) -> Option<PbSinkSchemaChange> {\n        self.mutation\n            .as_deref()\n            .and_then(|mutation| match mutation {\n                Mutation::Update(UpdateMutation {\n                    sink_schema_change, ..\n                }) => sink_schema_change.get(&sink_id).cloned(),\n                _ => None,\n            })\n    }\n\n    pub fn should_flush_sink_log_store(&self, sink_id: SinkId) -> bool {\n        self.mutation\n            .as_deref()","sourceCodeStart":664,"sourceCodeEnd":700,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/stream/src/executor/mod.rs#L664-L700","documentation":"When a stream executor receives a configuration-change (mutation) message, the code checks whether that message carries a vnode bitmap update for the actor. In-place updating of the vnode bitmap is not supported by this path, so if `as_update_vnode_bitmap` finds one, the executor rejects it with this error instead of silently mis-applying a parallelism change.","triggerScenarios":"A mutation message containing `UpdateVnodeBitmap` is dispatched to an executor that calls `assume_no_update_vnode_bitmap`, i.e. a parallelism/rescale operation whose vnode-bitmap change reaches an executor that cannot apply it in place.","commonSituations":"Rescaling (ALTER ... SET PARALLELISM) a streaming job whose topology includes executors that only support this operation via the barrier-based no-update contract; bugs in the meta service's mutation routing.","solutions":["Avoid rescaling the affected materialization/job while this executor type is in the topology, or recreate it under the desired parallelism","Upgrade RisingWave: newer versions broaden which executors handle vnode bitmap updates","If it reproduces on a normal rescale, file an issue with the job definition and the actor list; the meta service should not route bitmap updates to this executor"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Before rescaling, confirm no executors reject in-place vnode updates\nlet change_ok = plan_mutations(&job).all(|m| !requires_vnode_bitmap_update_in_place(&m));","typeGuard":null,"tryCatchPattern":"match rescale_result {\n    Err(e) if e.to_string().contains(\"updating vnode bitmap in place is not supported\") => {\n        // Fall back to recreating the job at the new parallelism\n        recreate_job_with_parallelism(job_id, new_parallelism);\n    }\n    other => other?,\n}","preventionTips":["Plan rescaling during maintenance windows and verify executor compatibility first","Prefer recreate-over-rescale for jobs with executor types known to reject bitmap updates","Keep RisingWave updated for broader rescale support","Test rescale on a staging copy of the job before production"],"tags":["rust","streaming","rescale","mutation"],"backgroundTag":"unsupported-operation","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}