quickwit-oss/quickwit · error

indexing service should be initialized

Error message

indexing service should be initialized

What it means

`build_indexing_service` hit the self-node branch but the optional `Mailbox<IndexingService>` was `None`, violating the invariant that a node advertising itself as an indexer has a locally built indexing service actor. This expect fires on internal wiring inconsistency, not bad user input.

Solutions

  1. Ensure the `indexer` service is enabled in the node's enabled_services
  2. Check earlier logs for a failure while building the indexing service during startup
  3. Report as a bug if the service is enabled but the expect still fires
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at quickwit/quickwit-serve/src/lib.rs:1533 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of quickwit-oss/quickwit@a39730c5cd (2026-09-08). Data as JSON: /api/errors/89e88b5f35eebc5d. Report an issue: GitHub.

Appendix: source

Thrown at quickwit/quickwit-serve/src/lib.rs:1533

        generation_id = %chitchat_id.generation_id,
        "removing node `{}` from indexer pool",
        chitchat_id.node_id,
    );
    let node_id: NodeId = node.node_id.clone();
    Change::Remove(node_id)
}

fn build_indexing_service(
    node: &ClusterNode,
    indexing_service_opt: Option<Mailbox<IndexingService>>,
    max_message_size: ByteSize,
) -> IndexingServiceClient {
    if node.is_self_node() {
        // Here, since the service is available locally, we bypass the network stack
        // and use the mailbox directly. However, we still want client-side metrics,
        // so we use both metrics layers.
        let indexing_service_mailbox =
            indexing_service_opt.expect("indexing service should be initialized");
        let shared_layers = ServiceBuilder::new()
            .layer(INDEXING_GRPC_CLIENT_METRICS_LAYER.clone())
            .layer(INDEXING_GRPC_SERVER_METRICS_LAYER.clone())
            .into_inner();
        return IndexingServiceClient::tower()
            .stack_layer(shared_layers)
            .build_from_mailbox(indexing_service_mailbox);
    }
    IndexingServiceClient::tower()
        .stack_layer(INDEXING_GRPC_CLIENT_METRICS_LAYER.clone())
        .stack_layer(TimeoutLayer::new(GRPC_INDEXING_SERVICE_TIMEOUT))
        .build_from_channel(
            node.grpc_advertise_addr,
            node.channel(),
            max_message_size,
            None,
        )
}

View on GitHub (pinned to a39730c5cd)