{"record":{"id":"9bead0426a13c2a7","repo":"risingwavelabs/risingwave","slug":"empty-vnode-bitmap","errorCode":null,"errorMessage":"empty vnode bitmap","messagePattern":"empty vnode bitmap","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/meta/src/manager/sink_coordination/handle.rs","lineNumber":146,"sourceCode":"                        && request.epoch < prev_epoch\n                    {\n                        return Poll::Ready(Err(anyhow!(\n                            \"invalid commit epoch {}, prev_epoch {}\",\n                            request.epoch,\n                            prev_epoch\n                        )));\n                    }\n                    if request.metadata.is_none() {\n                        return Poll::Ready(Err(anyhow!(\"empty commit metadata\")));\n                    };\n                    self.prev_epoch = Some(request.epoch);\n                }\n                coordinate_request::Msg::UpdateVnodeRequest(request) => {\n                    let bitmap = Bitmap::from(\n                        request\n                            .vnode_bitmap\n                            .as_ref()\n                            .ok_or_else(|| anyhow!(\"empty vnode bitmap\"))?,\n                    );\n                    self.vnode_bitmap = bitmap;\n                }\n            };\n            request\n        };\n        Poll::Ready(result)\n    }\n}\n","sourceCodeStart":128,"sourceCodeEnd":156,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/meta/src/manager/sink_coordination/handle.rs#L128-L156","documentation":"An `UpdateVnodeRequest` must include a `vnode_bitmap` describing which virtual nodes this sink coordinator instance handles; this error fires when the field is None. The bitmap is required to compute fragment/vnode mappings for the sink's parallelism, so an absent one makes the update meaningless.","triggerScenarios":"The sink executor sends `UpdateVnodeRequest` without setting `vnode_bitmap`, typically after a scaling/rescheduling event where the executor failed to fetch the new fragment distribution.","commonSituations":"Race during parallelism change or migration where the executor's vnode distribution is not yet populated; version skew between executor and meta; bug in the code that derives the bitmap from fragment metadata.","solutions":["Fix the executor to only send `UpdateVnodeRequest` once a valid bitmap is computed from the fragment vnode mappings.","Upgrade to a version where vnode distribution requests always carry the bitmap.","Check fragment/sink metadata in the meta catalog to ensure the sink has a valid parallelism assignment.","Add a debug assertion on the executor that the bitmap is non-empty/Some before sending."],"exampleFix":"// before\nUpdateVnodeRequest { vnode_bitmap: None }\n// after\nUpdateVnodeRequest { vnode_bitmap: Some( bitmap.into() ) }","handlingStrategy":"validation","validationCode":"// Executor side: only send vnode updates once a bitmap is known\nif vnode_bitmap.is_none() {\n    tracing::warn!(\"no vnode distribution yet; deferring UpdateVnodeRequest\");\n    return;\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = coordinator_next_request() {\n    if e.to_string().contains(\"empty vnode bitmap\") {\n        tracing::error!(\"UpdateVnodeRequest missing bitmap; recompute fragment distribution\");\n    }\n}","preventionTips":["Compute the vnode bitmap from fragment metadata before issuing UpdateVnodeRequest","Defer vnode updates until scaling/migration completes","Assert bitmap presence executor-side before send"],"tags":["rust","meta","vnode","protobuf","sink-coordinator"],"backgroundTag":"missing-required-argument","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}