t8y2/dbx · error

driver token registered

Error message

driver token registered

What it means

Before spawning per-driver installs, upgrade_all_agent_drivers_with_registry pre-registers one cancellation token per updatable driver in driver_cancellations. The .expect("driver token registered") asserts each driver being iterated has a token in that map; a missing entry means the pre-registration and the install loop got out of sync, so it panics.

Solutions

  1. Register driver cancellation tokens from the exact same iterator (same snapshot) that feeds the install loop.
  2. If a token is genuinely missing, fall back to creating one: driver_cancellations.entry(db_type).or_insert_with(...) or begin_install_cancellation with the per-driver key.
  3. Use entry().and_expect-style removal only after asserting key presence, or restructure to carry tokens alongside drivers in one collection.
  4. Add a test that every db_type in updatable has a token before the loop.

Example fix

// before
let token = driver_cancellations.remove(&db_type).expect("driver token registered");
// after
let token = match driver_cancellations.remove(&db_type) {
    Some(t) => t,
    None => am.begin_install_cancellation(&batch_driver_cancellation_key(effective_operation_id, &db_type)).await,
};
Defensive patterns

Strategy: validation

Validate before calling

// before the install loop, verify registration coverage
for db_type in &updatable {
    assert!(driver_cancellations.contains_key(db_type), "missing token for {db_type}");
}

Type guard

fn tokens_cover<'a>(tokens: &HashMap<DbType, AgentInstallCancellation>, drivers: impl IntoIterator<Item = &'a DbType>) -> bool {
    drivers.into_iter().all(|d| tokens.contains_key(d))
}

Try / catch

let token = match driver_cancellations.remove(&db_type) {
    Some(t) => t,
    None => return Err(format!("internal error: no cancellation token registered for {db_type}")),
};

Prevention

When it happens

Trigger: The set of drivers enumerated in the install loop (updatable.into_iter()) differs from the set for which driver_cancellations was populated earlier in the same function — e.g. tokens registered before a filter/re-check of updatable drivers, or remove() called twice for the same db_type across a retry within the same run.

Common situations: Concurrent modification of the updatable list between token registration and the install map; a code change inserts or reorders filtering after token registration; batch tests exercise a path where the registration loop was skipped.

Related errors


AI-assisted analysis of t8y2/dbx@c0390bff16 (2026-09-05). Data as JSON: /api/errors/4fbc6ecc798c2e1c. Report an issue: GitHub.

Appendix: source

Thrown at crates/dbx-core/src/agent_service.rs:829

    }

    // Register a per-driver token for every driver in the batch, keyed by the
    // batch operation id so per-driver cancels target this batch's driver even
    // when the same db_type is being installed concurrently elsewhere. The
    // batch token lets one click abort the whole upgrade; each driver token
    // lets the user cancel a single driver while the rest continue.
    let mut driver_cancellations = std::collections::HashMap::new();
    for db_type in &updatable {
        let key = batch_driver_cancellation_key(effective_operation_id, db_type);
        let token = am.begin_install_cancellation(&key).await;
        driver_cancellations.insert(db_type.clone(), token);
    }

    // Run independent driver installs concurrently, with a fixed upper bound
    // so a large registry cannot saturate download and file-system resources.
    let installs = updatable.into_iter().enumerate().map(|(index, db_type)| {
        let key = batch_driver_cancellation_key(effective_operation_id, &db_type);
        let token = driver_cancellations.remove(&db_type).expect("driver token registered");
        let batch_token = Arc::clone(&active_batch_arc);
        async move {
            let result = if batch_token.is_cancelled() {
                Err(AGENT_DOWNLOAD_CANCELED_ERROR.to_string())
            } else {
                install_agent_driver_from_registry_locked(
                    am,
                    registry,
                    source,
                    &db_type,
                    progress,
                    Some((index + 1) as u32),
                    Some(total),
                    // Observe BOTH the row token (per-driver cancel) and the
                    // batch token (cancel-all): a batch cancel must interrupt a
                    // driver whose download already started, not just one that
                    // is still waiting to begin.
                    &[&token, &batch_token],

View on GitHub (pinned to c0390bff16)