linera-io/linera-protocol · error · async_graphql::Error

No chain created for owner {}

Error message

No chain created for owner {}

What it means

After the faucet commits a batch, it parses chain descriptions of newly opened chains out of the certificate's blobs (`extract_opened_single_owner_chains`) and maps them back to requesters. This error means an initial-claim request reached the response stage but no chain description for that owner was found in the certificate — an internal inconsistency between what was queued and what the block actually executed. The batch itself was committed, so the user's request fails after on-chain execution.

Source

Thrown at linera-faucet/server/src/lib.rs:1108

        for request in requests {
            #[cfg(with_metrics)]
            {
                let wait_time = request.queued_at.elapsed().as_secs_f64() * 1000.0;
                metrics::QUEUE_WAIT_TIME
                    .with_label_values(&[])
                    .observe(wait_time);
            }

            let response = if let Some(target_chain_id) = request.target_chain_id {
                PendingResponse::Daily(Ok(ClaimOutcome {
                    chain_id: target_chain_id,
                    certificate_hash,
                    amount: request.amount,
                }))
            } else if let Some(description) = initial_desc_map.get(&request.owner) {
                PendingResponse::Initial(Ok(Box::new(description.clone())))
            } else {
                PendingResponse::Initial(Err(Error::new(format!(
                    "No chain created for owner {}",
                    request.owner
                ))))
            };
            if request.responder.send(response).is_err() {
                tracing::warn!(
                    "Receiver dropped while sending response to {}.",
                    request.owner
                );
            }
        }

        #[cfg(with_metrics)]
        metrics::CHAINS_CREATED_TOTAL
            .with_label_values(&[])
            .inc_by(chains_created as u64);

        Ok(())

View on GitHub (pinned to 6c226ddcb3)

Solutions

  1. Retry the `claim` mutation — the front door returns the existing ChainDescription if the chain was in fact created and stored.
  2. Check faucet logs for 'retryable error' and batch-size reduction events around the same time; verify on-chain whether the chain exists before re-claiming.
  3. If it recurs, report it as a faucet bug, attaching the certificate hash from the logs.
  4. For operators: lower `max_batch_size` so the shrink-and-retry path is not exercised.

Example fix

// before
const desc = await faucet.claim(owner); // 'No chain created for owner 0x…'

// after
let desc;
try { desc = await faucet.claim(owner); }
catch (e) {
  if (!/No chain created for owner/i.test(String(e.message))) throw e;
  desc = await faucet.claim(owner); // front door now returns the existing chain, or queues a fresh one
}
Defensive patterns

Strategy: fallback

Try / catch

try { return await faucet.claim(owner); } catch (e) { if (!/No chain created for owner/i.test(e.message)) throw e; return await faucet.claim(owner); /* re-claim: idempotent fetch or fresh creation */ }

Prevention

When it happens

Trigger: The faucet's internal retry path (a retryable execution error like BlockTooLarge or FeesExceedFunding reduces `max_batch_size` and re-queues requests) desynchronizing requests from the operations that were finally executed; the chain-description blob missing from the certificate for that owner's OpenChain operation.

Common situations: Rare server-side race under concurrent load or with oversized batches; multi-owner faucet chains where leadership changes produce unexpected block contents.

Related errors


AI-assisted analysis of linera-io/linera-protocol@6c226ddcb3 (2026-08-22). Data as JSON: /api/errors/3d49366cf7062644. Report an issue: GitHub.