{"record":{"id":"3d49366cf7062644","repo":"linera-io/linera-protocol","slug":"no-chain-created-for-owner","errorCode":null,"errorMessage":"No chain created for owner {}","messagePattern":"No chain created for owner (.+?)","errorType":"http","errorClass":"async_graphql::Error","httpStatus":null,"severity":"error","filePath":"linera-faucet/server/src/lib.rs","lineNumber":1108,"sourceCode":"        for request in requests {\n            #[cfg(with_metrics)]\n            {\n                let wait_time = request.queued_at.elapsed().as_secs_f64() * 1000.0;\n                metrics::QUEUE_WAIT_TIME\n                    .with_label_values(&[])\n                    .observe(wait_time);\n            }\n\n            let response = if let Some(target_chain_id) = request.target_chain_id {\n                PendingResponse::Daily(Ok(ClaimOutcome {\n                    chain_id: target_chain_id,\n                    certificate_hash,\n                    amount: request.amount,\n                }))\n            } else if let Some(description) = initial_desc_map.get(&request.owner) {\n                PendingResponse::Initial(Ok(Box::new(description.clone())))\n            } else {\n                PendingResponse::Initial(Err(Error::new(format!(\n                    \"No chain created for owner {}\",\n                    request.owner\n                ))))\n            };\n            if request.responder.send(response).is_err() {\n                tracing::warn!(\n                    \"Receiver dropped while sending response to {}.\",\n                    request.owner\n                );\n            }\n        }\n\n        #[cfg(with_metrics)]\n        metrics::CHAINS_CREATED_TOTAL\n            .with_label_values(&[])\n            .inc_by(chains_created as u64);\n\n        Ok(())","sourceCodeStart":1090,"sourceCodeEnd":1126,"githubUrl":"https://github.com/linera-io/linera-protocol/blob/6c226ddcb332ef55118dc8d0aafbd093d5420899/linera-faucet/server/src/lib.rs#L1090-L1126","documentation":"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.","triggerScenarios":"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.","commonSituations":"Rare server-side race under concurrent load or with oversized batches; multi-owner faucet chains where leadership changes produce unexpected block contents.","solutions":["Retry the `claim` mutation — the front door returns the existing ChainDescription if the chain was in fact created and stored.","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.","If it recurs, report it as a faucet bug, attaching the certificate hash from the logs.","For operators: lower `max_batch_size` so the shrink-and-retry path is not exercised."],"exampleFix":"// before\nconst desc = await faucet.claim(owner); // 'No chain created for owner 0x…'\n\n// after\nlet desc;\ntry { desc = await faucet.claim(owner); }\ncatch (e) {\n  if (!/No chain created for owner/i.test(String(e.message))) throw e;\n  desc = await faucet.claim(owner); // front door now returns the existing chain, or queues a fresh one\n}","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"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 */ }","preventionTips":["Log the full error including the owner; keep the response of successful claims so a fallback fetch is possible.","Report repeated occurrences upstream — this path indicates a faucet-internal inconsistency.","Operators: lower max_batch_size to avoid the batch-shrink retry path."],"tags":["faucet","internal-error","open-chain","batch","race-condition"],"backgroundTag":"server-state-inconsistency","analyzedSha":"6c226ddcb332ef55118dc8d0aafbd093d5420899","analyzedAt":"2026-08-22T22:49:09.787Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}