vllm-project/vllm · error

connected engine range [{engine_start_index}, {engine_end_in

Error message

connected engine range [{engine_start_index}, {engine_end_index}) exceeds data parallel size {}

What it means

Thrown by Config::validate() in Bootstrapped mode when engine_start_index + engine_count exceeds --data-parallel-size. The frontend would be asked to serve engines that do not exist in the data-parallel pool. Both range endpoints and the DP size appear in the message.

Source

Thrown at rust/src/server/src/config.rs:275

                    );
                }
            }
            TransportMode::Bootstrapped {
                engine_start_index,
                engine_count,
                ..
            } => {
                if *engine_count == 0 {
                    bail!("engine count must be at least 1");
                }
                let engine_start_index = usize::try_from(*engine_start_index)
                    .map_err(|_| anyhow::anyhow!("engine start index does not fit usize"))?;
                let engine_end_index =
                    engine_start_index.checked_add(*engine_count).ok_or_else(|| {
                        anyhow::anyhow!("engine start index + engine count overflows")
                    })?;
                if engine_end_index > self.data_parallel_size {
                    bail!(
                        "connected engine range [{engine_start_index}, {engine_end_index}) exceeds data parallel size {}",
                        self.data_parallel_size
                    );
                }
            }
        }

        Ok(())
    }

    /// Return the number of engines implied by the configured transport mode.
    pub fn engine_count(&self) -> usize {
        match &self.transport_mode {
            TransportMode::HandshakeOwner { engine_count, .. }
            | TransportMode::Bootstrapped { engine_count, .. } => *engine_count,
        }
    }

View on GitHub (pinned to c794754062)

Solutions

  1. Make the assigned slice [start, start+count) fit inside [0, data_parallel_size).
  2. Recompute frontend assignments after changing --data-parallel-size.
  3. Cross-check the three numbers in the error message against what your supervisor actually started.

Example fix

# before
--data-parallel-size 4 with engine_start_index=4, engine_count=4

# after
--data-parallel-size 8 with engine_start_index=4, engine_count=4
Defensive patterns

Strategy: validation

Validate before calling

let end = start + count;
assert!(end <= data_parallel_size,
    "slice [{start},{end}) must fit in {data_parallel_size} engines");

Type guard

fn engine_slice_within_pool(start: usize, count: usize, dp: usize) -> bool {
    start.checked_add(count).map_or(false, |end| end <= dp)
}

Prevention

When it happens

Trigger: e.g. --data-parallel-size 4 with a bootstrapped frontend assigned engines [4, 8): end index 8 > 4. Happens when the number of engines actually started is smaller than the slice assignment assumes.

Common situations: Scaling down the engine pool without regenerating frontend assignments; a scheduler counting frontends*engines_per_frontend instead of total engines; mismatch between the pool size the supervisor started and the one it advertised when assigning slices.

Related errors


AI-assisted analysis of vllm-project/vllm@c794754062 (2026-08-14). Data as JSON: /api/errors/856b8cb770670eba. Report an issue: GitHub.