{"record":{"id":"a70d68bdf66feafb","repo":"influxdata/influxdb","slug":"snapshot-manifest-parse-task-panicked-0","errorCode":null,"errorMessage":"snapshot manifest parse task panicked: {0}","messagePattern":"snapshot manifest parse task panicked: (.+?)","errorType":"error_code","errorClass":"PersisterError","httpStatus":null,"severity":"critical","filePath":"influxdb3_write/src/persister.rs","lineNumber":74,"sourceCode":"    #[error(\"object_store error: {0}\")]\n    ObjectStore(#[from] object_store::Error),\n\n    #[error(\"parquet error: {0}\")]\n    ParquetError(#[from] parquet::errors::ParquetError),\n\n    #[error(\"tried to serialize a parquet file with no rows\")]\n    NoRows,\n\n    #[error(\"parse int error: {0}\")]\n    ParseInt(#[from] std::num::ParseIntError),\n\n    #[error(\"unexpected persister error: {0:?}\")]\n    Unexpected(#[from] anyhow::Error),\n\n    #[error(\"table snapshot persistence task panicked: {0}\")]\n    TableSnapshotPersistenceTaskFailed(#[source] tokio::task::JoinError),\n\n    #[error(\"snapshot manifest parse task panicked: {0}\")]\n    SnapshotParseTaskFailed(#[source] tokio::task::JoinError),\n\n    #[error(\"table index error: {0}\")]\n    TableIndexPathError(#[source] crate::paths::PathError),\n\n    #[error(\"object meta is missing filename\")]\n    MissingFilename,\n\n    #[error(\"failed to parse snapshot sequence number from filename\")]\n    InvalidSnapshotSequenceNumber,\n}\n\nimpl From<PersisterError> for DataFusionError {\n    fn from(error: PersisterError) -> Self {\n        match error {\n            PersisterError::DataFusion(e) => e,\n            PersisterError::ObjectStore(e) => DataFusionError::ObjectStore(Box::new(e)),\n            PersisterError::ParquetError(e) => DataFusionError::ParquetError(Box::new(e)),","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_write/src/persister.rs#L56-L92","documentation":"PersisterError::SnapshotParseTaskFailed indicates that a spawned tokio task responsible for parsing a snapshot manifest panicked. The JoinError from joining the task is attached as the `#[source]` and rendered into the message.","triggerScenarios":"Awaiting a `tokio::spawn`ed snapshot-manifest parse task whose body panicked — e.g. unwrap on malformed manifest JSON, invalid deserialized structure, or index out of range while walking the manifest.","commonSituations":"Corrupt or partially-written snapshot manifests in object storage causing unwraps to fail; version mismatch where an old manifest shape trips parsing logic; bugs in the parse task itself.","solutions":["Inspect the JoinError panic message to find the failing line in the manifest parse task.","Validate/repair or remove the corrupt snapshot manifest in the object store so a fresh one can be written.","Ensure influxdb3 versions are consistent across the deployment (manifest format compatibility).","Report/upgrade if the panic originates in influxdb3 parsing code."],"exampleFix":"// before: unwrap on potentially malformed manifest entry\nlet db = manifest.databases.get(db_name).unwrap();\n// after\nlet db = manifest.databases.get(db_name)\n    .ok_or_else(|| anyhow!(\"database {db_name} missing from snapshot manifest\"))?;","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"fn is_manifest_parse_panic(e: &PersisterError) -> bool {\n    matches!(e, PersisterError::SnapshotParseTaskFailed(_))\n}","tryCatchPattern":"match persister.load_snapshot(...).await {\n    Err(PersisterError::SnapshotParseTaskFailed(join)) => {\n        eprintln!(\"manifest parse task panicked: {join}\");\n        // fall back to the last known-good snapshot manifest\n    }\n    Err(e) => return Err(e.into()),\n    Ok(v) => v,\n}","preventionTips":["Validate snapshot manifests (schema/version) before spawning parse tasks.","Replace unwraps in manifest parsing with error-returning code.","Keep a fallback to the previous known-good snapshot manifest.","Ensure all nodes use compatible influxdb3 manifest formats."],"tags":["tokio","panic","task","snapshot","manifest","rust"],"backgroundTag":"thread-interrupted","analyzedSha":"06200ef96ba82c5f6727e5038a83af8e722c6875","analyzedAt":"2026-09-19T12:55:30.003Z","contentChangedAt":"2026-09-19T12:55:30.003Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}