{"record":{"id":"5ecd0dd9235f9902","repo":"linera-io/linera-protocol","slug":"chain-description-not-found-for-chain-chain-id","errorCode":null,"errorMessage":"Chain description not found for chain {chain_id}","messagePattern":"Chain description not found for chain (.+?)","errorType":"exception","errorClass":"async_graphql::Error","httpStatus":null,"severity":"error","filePath":"linera-faucet/server/src/lib.rs","lineNumber":704,"sourceCode":"    let blob_id = BlobId::new(chain_id.0, BlobType::ChainDescription);\n\n    // Read the blob directly from storage\n    let blob = storage\n        .read_blob(blob_id)\n        .await\n        .map_err(|e| {\n            tracing::error!(\n                \"Failed to read chain description blob for {}: {}\",\n                chain_id,\n                e\n            );\n            Error::new(format!(\n                \"Storage error while reading chain description: {e}\"\n            ))\n        })?\n        .ok_or_else(|| {\n            tracing::error!(\"Chain description blob not found for chain {}\", chain_id);\n            Error::new(format!(\"Chain description not found for chain {chain_id}\"))\n        })?;\n\n    // Deserialize the chain description from the blob bytes\n    let description = bcs::from_bytes::<ChainDescription>(blob.bytes()).map_err(|e| {\n        tracing::error!(\n            \"Failed to deserialize chain description for {}: {}\",\n            chain_id,\n            e\n        );\n        Error::new(format!(\n            \"Invalid chain description data for chain {chain_id}\"\n        ))\n    })?;\n\n    Ok(description)\n}\n\nimpl<C> BatchProcessor<C>","sourceCodeStart":686,"sourceCodeEnd":722,"githubUrl":"https://github.com/linera-io/linera-protocol/blob/6c226ddcb332ef55118dc8d0aafbd093d5420899/linera-faucet/server/src/lib.rs#L686-L722","documentation":"On a duplicate `claim`, `read_blob` succeeded but returned `None`: the faucet's database maps the owner to a chain_id whose ChainDescription blob is no longer present in blob storage. A ChainId is the hash of its description blob, so the blob should always exist once the chain is registered — its absence means the faucet's claim database and its blob storage are out of sync (one was wiped or replaced while the other survived).","triggerScenarios":"Blob storage deleted/pruned/recreated while the faucet's claim database survived (exactly the scenario test_blockchain_sync_after_database_deletion exercises); the faucet repointed to a different or empty storage backend after chains were recorded; GC pruning blobs on shared storage.","commonSituations":"Deleting the database directory (or `linera net down && up`) under a persistent faucet; switching storage backends between runs (e.g. memory to DynamoDB) without clearing faucet records; partial restores from backup that include the mapping tables but not the blobs.","solutions":["Restore or re-sync the blob store that contained the chain description blobs so it is consistent with the faucet's claim database","Otherwise reset the faucet's claim database to clear stale owner-to-chain mappings, letting owners re-claim","Ensure the faucet is configured with the same storage backend and endpoint used when the chains were created","If neither is possible, take the faucet out of rotation and escalate to the operator — the mapping data is inconsistent"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"fn is_chain_description_missing(msg: &str) -> bool { msg.starts_with(\"Chain description not found for chain\") }","tryCatchPattern":"Catch the claim error; on `Chain description not found for chain <id>`, do not retry — the faucet's owner-to-chain mapping references a blob that is gone. Report the chain ID to the faucet operator; the fix is on the server side (re-sync blob storage or reset the faucet's claim records).","preventionTips":["Never wipe the faucet's blob store and its claim database independently — they must be reset together","Keep the faucet pointed at the same storage backend/endpoint across restarts","Back up the claim database and blob store as one unit","After any storage maintenance, probe a known owner's `claim` before reopening traffic"],"tags":["storage","blob","data-loss","out-of-sync","faucet","linera"],"backgroundTag":"blob-not-found","analyzedSha":"6c226ddcb332ef55118dc8d0aafbd093d5420899","analyzedAt":"2026-08-22T22:49:09.787Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}