{"record":{"id":"66900bc3a30c1509","repo":"spacedriveapp/spacedrive","slug":"contentidentity-not-found-66900b","errorCode":null,"errorMessage":"ContentIdentity not found","messagePattern":"ContentIdentity not found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/src/ops/media/proxy/processor.rs","lineNumber":117,"sourceCode":"\tpub async fn process(\n\t\t&self,\n\t\tdb: &sea_orm::DatabaseConnection,\n\t\tentry: &ProcessorEntry,\n\t) -> Result<ProcessorResult> {\n\t\tif !self.enabled {\n\t\t\treturn Ok(ProcessorResult::success(0, 0));\n\t\t}\n\n\t\t// Get content UUID\n\t\tlet content_uuid = if let Some(content_id) = entry.content_id {\n\t\t\tuse crate::infra::db::entities::content_identity;\n\t\t\tuse sea_orm::{ColumnTrait, EntityTrait, QueryFilter};\n\n\t\t\tlet ci = content_identity::Entity::find()\n\t\t\t\t.filter(content_identity::Column::Id.eq(content_id))\n\t\t\t\t.one(db)\n\t\t\t\t.await?\n\t\t\t\t.ok_or_else(|| anyhow::anyhow!(\"ContentIdentity not found\"))?;\n\n\t\t\tci.uuid\n\t\t\t\t.ok_or_else(|| anyhow::anyhow!(\"ContentIdentity missing UUID\"))?\n\t\t} else {\n\t\t\treturn Ok(ProcessorResult::failure(\n\t\t\t\t\"Entry has no content_id\".to_string(),\n\t\t\t));\n\t\t};\n\n\t\tdebug!(\"→ Generating scrubbing proxy for: {}\", entry.path.display());\n\n\t\t// Call shared generation function\n\t\tlet count = super::generate_proxy_for_file(\n\t\t\t&self.library,\n\t\t\t&content_uuid,\n\t\t\t&entry.path,\n\t\t\t&[self.variant.clone()],\n\t\t\tself.use_hardware_accel,","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/spacedriveapp/spacedrive/blob/6dfeccf2113039e35f2ce735f945e70dc3e4ea45/core/src/ops/media/proxy/processor.rs#L99-L135","documentation":"The scrubbing-proxy processor resolves content_uuid via content_identity before generating proxies: it queries by entry.content_id and errors when no row matches. Unlike the no-content_id case (which returns a ProcessorResult::failure), this path hard-errors, failing the processor run when the identity row vanished after scheduling.","triggerScenarios":"Entry deleted or re-identified between processor scheduling and execution, cascading to content_identity; queue backlog crossing a reindex that replaced content rows.","commonSituations":"Users deleting freshly-added media while proxy generation is queued; reindex rebuilding identities; database restores under a live job queue.","solutions":["Return ProcessorResult::failure/skip for a missing identity, matching the sibling no-content_id branch","Invalidate queued proxy jobs on entry delete or re-identification","Verify the entry still exists and its content_id still resolves before dequeuing work"],"exampleFix":"// before\nlet ci = content_identity::Entity::find()\n    .filter(content_identity::Column::Id.eq(content_id))\n    .one(db)\n    .await?\n    .ok_or_else(|| anyhow::anyhow!(\"ContentIdentity not found\"))?;\n\n// after: mirror the graceful sibling branch for vanished rows\nlet Some(ci) = content_identity::Entity::find()\n    .filter(content_identity::Column::Id.eq(content_id))\n    .one(db)\n    .await?\nelse {\n    return Ok(ProcessorResult::failure(\"ContentIdentity no longer exists\".to_string()));\n};","handlingStrategy":"try-catch","validationCode":"// Resolve the identity before dequeuing proxy work\nlet ci = content_identity::Entity::find()\n    .filter(content_identity::Column::Id.eq(entry.content_id.unwrap()))\n    .one(db).await?;\nif ci.is_none() { /* skip: nothing to key the proxy against */ }","typeGuard":null,"tryCatchPattern":"match content_identity::Entity::find().filter(content_identity::Column::Id.eq(content_id)).one(db).await? {\n    Some(ci) => ci,\n    None => return Ok(ProcessorResult::failure(\"ContentIdentity no longer exists\".into())),\n}","preventionTips":["Mirror the graceful no-content_id branch for the missing-row case","Cancel proxy jobs on entry deletion/re-identification","Log content_id on misses to correlate with concurrent reindex runs"],"tags":["proxy","media-processors","content-identity","race-condition"],"backgroundTag":null,"analyzedSha":"6dfeccf2113039e35f2ce735f945e70dc3e4ea45","analyzedAt":"2026-08-16T11:26:17.074Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}