{"record":{"id":"ac1264daf538c8a8","repo":"plandex-ai/plandex","slug":"error-deleting-result-file-v","errorCode":null,"errorMessage":"error deleting result file: %v","messagePattern":"error deleting result file: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/server/db/result_helpers.go","lineNumber":887,"sourceCode":"\t\t\t}\n\n\t\t\tvar result PlanFileResult\n\t\t\terr = json.Unmarshal(bytes, &result)\n\n\t\t\tif err != nil {\n\t\t\t\terrCh <- fmt.Errorf(\"error unmarshalling result file: %v\", err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// log.Printf(\"Checking pending result: %s\", resultId)\n\n\t\t\tif result.ToApi().IsPending() && paths[result.Path] {\n\t\t\t\tlog.Printf(\"Deleting pending result: %s\", resultId)\n\n\t\t\t\terr = os.Remove(filepath.Join(resultsDir, resultId+\".json\"))\n\n\t\t\t\tif err != nil {\n\t\t\t\t\terrCh <- fmt.Errorf(\"error deleting result file: %v\", err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\terrCh <- nil\n\t\t}(resultId)\n\t}\n\n\tfor i := 0; i < len(files); i++ {\n\t\terr := <-errCh\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error deleting pending results: %v\", err)\n\t\t}\n\t}\n\n\treturn nil\n}\n","sourceCodeStart":869,"sourceCodeEnd":905,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/server/db/result_helpers.go#L869-L905","documentation":"Inside DeletePendingResultsForPaths, when a result is pending and its path matches, the goroutine calls os.Remove on `<resultId>.json`. If the removal fails (permissions, file already gone, directory not writable), it reports 'error deleting result file: %v' and aborts the sweep.","triggerScenarios":"os.Remove fails because the results directory is read-only, the process lacks write permission, the file was deleted between ReadDir and Remove (race with another worker), or the path is on a read-only/full filesystem.","commonSituations":"Container running as non-root user against files owned by root; two servers or replays racing on the same plan; disk full or mounted read-only after a crash; NFS/permissions issues in shared storage.","solutions":["Check and fix filesystem permissions on the results directory (process user needs write/delete)","Treat os.IsNotExist(err) as success (file already deleted) instead of an error","Ensure only one process/worker deletes pending results at a time (lock or leader election)","Verify the volume is not read-only or full (df, mount) and remount/clean"],"exampleFix":"// before\nerr = os.Remove(filepath.Join(resultsDir, resultId+\".json\"))\nif err != nil {\n    errCh <- fmt.Errorf(\"error deleting result file: %v\", err)\n    return\n}\n// after\nerr = os.Remove(filepath.Join(resultsDir, resultId+\".json\"))\nif err != nil && !os.IsNotExist(err) {\n    errCh <- fmt.Errorf(\"error deleting result file: %v\", err)\n    return\n}","handlingStrategy":"try-catch","validationCode":"if info, err := os.Stat(resultsDir); err != nil || !info.IsDir() {\n    return fmt.Errorf(\"results dir not accessible: %v\", err)\n}\n// check writability\nf, err := os.CreateTemp(resultsDir, \".wtest\")\nif err != nil {\n    return fmt.Errorf(\"results dir not writable: %v\", err)\n}\nf.Close(); os.Remove(f.Name())","typeGuard":null,"tryCatchPattern":"err := DeletePendingResultsForPaths(orgId, planId, paths)\nif err != nil && strings.Contains(err.Error(), \"error deleting result file\") {\n    if errors.Is(err, os.ErrPermission) { /* fix perms or surface to admin */ }\n    if errors.Is(err, os.ErrNotExist) { /* safe to ignore */ }\n}","preventionTips":["Run the service with a user that owns or can write the data/results directories","Ignore os.ErrNotExist in delete paths — deleting an already-deleted file is success","Ensure single-writer semantics for the results directory (locks or one worker per plan)","Monitor disk space and mount flags on the data volume"],"tags":["go","filesystem","permissions","os-remove","concurrency"],"backgroundTag":"file-delete-permission-denied","analyzedSha":"e2d772072efadbe41d2946d97d79be55532dbab5","analyzedAt":"2026-09-05T20:56:53.631Z","contentChangedAt":"2026-09-05T20:56:53.631Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}