{"record":{"id":"0822c61595da4f9d","repo":"santifer/career-ops","slug":"cannot-verify-tracker-lock-ownership-at-lockdir","errorCode":null,"errorMessage":"Cannot verify tracker lock ownership at ${lockDir}","messagePattern":"Cannot verify tracker lock ownership at (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"tracker-utils.mjs","lineNumber":456,"sourceCode":"              currentDir = statSync(lockDir);\n            } catch (err) {\n              if (err?.code === 'ENOENT') {\n                released = true;\n                return;\n              }\n              throw err;\n            }\n            if (!sameLockDirectory(verifiedDir, currentDir)) {\n              released = true;\n              return;\n            }\n            const owner = readLockOwner(lockDir);\n            if (owner && owner.token !== token) {\n              released = true;\n              return;\n            }\n            if (!owner && existsSync(join(lockDir, 'owner.json'))) {\n              throw new Error(`Cannot verify tracker lock ownership at ${lockDir}`);\n            }\n          } else {\n            let beforeRead;\n            try {\n              beforeRead = statSync(lockDir);\n            } catch (err) {\n              if (err?.code === 'ENOENT') {\n                released = true;\n                return;\n              }\n              throw err;\n            }\n            const owner = readLockOwner(lockDir);\n            if (owner?.token !== token) {\n              if (owner) released = true;\n              else throw new Error(`Cannot verify tracker lock ownership at ${lockDir}`);\n              return;\n            }","sourceCodeStart":438,"sourceCodeEnd":474,"githubUrl":"https://github.com/santifer/career-ops/blob/e7abd431fce9348a95261acac9e0c14779c35df8/tracker-utils.mjs#L438-L474","documentation":"During lock release, if no lock owner is readable but an owner.json still exists inside the lock directory, the code cannot prove who holds the lock and refuses to release, throwing instead of risking a stale/foreign lock removal. This is a safety check against deleting a lock whose ownership is unverifiable (corrupt or unreadable owner.json).","triggerScenarios":"Calling tracker transaction release() when the lock directory exists and contains owner.json, but readLockOwner returns null — e.g. owner.json is corrupt/empty JSON, unreadable due to permissions, or was truncated by a crashed process mid-write.","commonSituations":"A previous process was killed while writing owner.json, leaving invalid JSON; permissions changed between acquire and release (run as different user/container); an antivirus/sync tool (Dropbox) locked or altered owner.json; manually inspecting/cleaning the lock dir and damaging owner.json.","solutions":["Inspect <lockDir>/owner.json — if it is corrupt or belongs to a dead process, remove the stale lock directory manually and retry","Check read permissions on owner.json for the current user (chmod/chown as needed)","Retry release; a transient read race may resolve on a second attempt","If the owning process is confirmed dead, delete the lock dir (rm -rf the lock directory) as a last resort"],"exampleFix":"// before\nrelease(tx);  // throws: corrupt owner.json\n// after\n// remove stale lock, then retry\nfs.rmSync(lockDir, { recursive: true, force: true });\nrelease(tx);","handlingStrategy":"try-catch","validationCode":"// before releasing, confirm the lock is readable and attributable\nconst ownerPath = join(lockDir, 'owner.json');\nif (existsSync(ownerPath)) {\n  JSON.parse(readFileSync(ownerPath, 'utf-8')); // throws early if corrupt\n}","typeGuard":"const canVerifyOwner = (lockDir) => {\n  try { return !!readLockOwner(lockDir) || !existsSync(join(lockDir, 'owner.json')); }\n  catch { return false; }\n};","tryCatchPattern":"try {\n  tx.release();\n} catch (e) {\n  if (String(e.message).startsWith('Cannot verify tracker lock ownership')) {\n    // inspect/clean stale lock dir, then retry\n  }\n}","preventionTips":["Don't kill processes mid-lock-write; use graceful shutdown to release locks","Keep lock directories on local filesystems, not sync tools or NFS","Check lock dir permissions stay consistent across users/containers","Inspect owner.json before manually cleaning lock directories"],"tags":["file-lock","concurrency","state-corruption"],"backgroundTag":"file-lock-ownership-unverifiable","analyzedSha":"e7abd431fce9348a95261acac9e0c14779c35df8","analyzedAt":"2026-09-16T06:35:29.214Z","contentChangedAt":"2026-09-16T06:35:29.214Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}