risingwavelabs/risingwave · error · anyhow::Error

empty vnode bitmap

Error message

empty vnode bitmap

What it means

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.

Source

Thrown at src/meta/src/manager/sink_coordination/handle.rs:146

                        && request.epoch < prev_epoch
                    {
                        return Poll::Ready(Err(anyhow!(
                            "invalid commit epoch {}, prev_epoch {}",
                            request.epoch,
                            prev_epoch
                        )));
                    }
                    if request.metadata.is_none() {
                        return Poll::Ready(Err(anyhow!("empty commit metadata")));
                    };
                    self.prev_epoch = Some(request.epoch);
                }
                coordinate_request::Msg::UpdateVnodeRequest(request) => {
                    let bitmap = Bitmap::from(
                        request
                            .vnode_bitmap
                            .as_ref()
                            .ok_or_else(|| anyhow!("empty vnode bitmap"))?,
                    );
                    self.vnode_bitmap = bitmap;
                }
            };
            request
        };
        Poll::Ready(result)
    }
}

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Fix the executor to only send `UpdateVnodeRequest` once a valid bitmap is computed from the fragment vnode mappings.
  2. Upgrade to a version where vnode distribution requests always carry the bitmap.
  3. Check fragment/sink metadata in the meta catalog to ensure the sink has a valid parallelism assignment.
  4. Add a debug assertion on the executor that the bitmap is non-empty/Some before sending.

Example fix

// before
UpdateVnodeRequest { vnode_bitmap: None }
// after
UpdateVnodeRequest { vnode_bitmap: Some( bitmap.into() ) }
Defensive patterns

Strategy: validation

Validate before calling

// Executor side: only send vnode updates once a bitmap is known
if vnode_bitmap.is_none() {
    tracing::warn!("no vnode distribution yet; deferring UpdateVnodeRequest");
    return;
}

Try / catch

if let Err(e) = coordinator_next_request() {
    if e.to_string().contains("empty vnode bitmap") {
        tracing::error!("UpdateVnodeRequest missing bitmap; recompute fragment distribution");
    }
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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