{"record":{"id":"d559fc12a8ce5a45","repo":"dani-garcia/vaultwarden","slug":"error-loading-emergency-access","errorCode":null,"errorMessage":"Error loading emergency_access","messagePattern":"Error loading emergency_access","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/db/models/emergency_access.rs","lineNumber":263,"sourceCode":"        conn: &DbConn,\n    ) -> Option<Self> {\n        conn.run(move |conn| {\n            emergency_access::table\n                .filter(emergency_access::grantor_uuid.eq(grantor_uuid))\n                .filter(emergency_access::grantee_uuid.eq(grantee_uuid).or(emergency_access::email.eq(email)))\n                .first::<Self>(conn)\n                .ok()\n        })\n        .await\n    }\n\n    pub async fn find_all_recoveries_initiated(conn: &DbConn) -> Vec<Self> {\n        conn.run(move |conn| {\n            emergency_access::table\n                .filter(emergency_access::status.eq(EmergencyAccessStatus::RecoveryInitiated as i32))\n                .filter(emergency_access::recovery_initiated_at.is_not_null())\n                .load::<Self>(conn)\n                .expect(\"Error loading emergency_access\")\n        })\n        .await\n    }\n\n    pub async fn find_by_uuid_and_grantor_uuid(\n        uuid: &EmergencyAccessId,\n        grantor_uuid: &UserId,\n        conn: &DbConn,\n    ) -> Option<Self> {\n        conn.run(move |conn| {\n            emergency_access::table\n                .filter(emergency_access::uuid.eq(uuid))\n                .filter(emergency_access::grantor_uuid.eq(grantor_uuid))\n                .first::<Self>(conn)\n                .ok()\n        })\n        .await\n    }","sourceCodeStart":245,"sourceCodeEnd":281,"githubUrl":"https://github.com/dani-garcia/vaultwarden/blob/cc67d644f62605cb46f4d16c4a2eed1a861cc8bb/src/db/models/emergency_access.rs#L245-L281","documentation":"Panic from `.expect()` on the Diesel query in `EmergencyAccess::find_all_recoveries_initiated`, which loads all emergency_access rows in RecoveryInitiated status. Any SQL failure (connection loss, missing table/column, permissions) is fatal and panics instead of returning an empty vec or error.","triggerScenarios":"The periodic emergency-access recovery job or an API call listing initiated recoveries runs while the DB is unreachable, after a failed migration on the `emergency_access` table, or with corrupt/locked SQLite data.","commonSituations":"Upgrades where the emergency_access schema wasn't migrated; database restarted under load leaving stale pool connections; disk-full or locked SQLite file on nightly cron jobs.","solutions":["Verify database connectivity and that the `emergency_access` table/status column exist (run pending migrations)","Read the underlying Diesel error in the logs above the panic and fix that cause","Check DB user permissions (SELECT on emergency_access) and disk space for SQLite","Restart the server to reset the connection pool after a DB outage"],"exampleFix":"// before\n.load::<Self>(conn).expect(\"Error loading emergency_access\")\n// after\n.load::<Self>(conn).map_err(|e| err!(DbError, \"Error loading emergency_access: {e}\"))","handlingStrategy":"try-catch","validationCode":"// verify emergency_access table is queryable before running recovery jobs\n// SELECT 1 FROM emergency_access LIMIT 1;","typeGuard":null,"tryCatchPattern":"// Wrap the scheduled recovery scan so a DB failure logs and retries instead of crashing\nif let Err(e) = run_recovery_scan() { log_error(e); schedule_retry(); }","preventionTips":["Ensure migrations run before the periodic job executes","Monitor DB availability for scheduled-job windows","Keep SQLite files off full disks and out of backup-tool locks","Alert on Diesel/DB errors in logs before they escalate to panics"],"tags":["database","diesel","panic","emergency-access"],"backgroundTag":"database-query-failed","analyzedSha":"cc67d644f62605cb46f4d16c4a2eed1a861cc8bb","analyzedAt":"2026-09-19T08:28:46.370Z","contentChangedAt":"2026-09-19T08:28:46.370Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}