{"record":{"id":"ce7c9fb5eb0e6448","repo":"syncthing/syncthing","slug":"delete-file-w","errorCode":null,"errorMessage":"delete file: %w","messagePattern":"delete file: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lib/model/folder_sendrecv.go","lineNumber":868,"sourceCode":"\t\tif fs.IsNotExist(err) || fs.IsErrCaseConflict(err) {\n\t\t\terr = nil\n\t\t\tdbUpdateChan <- dbUpdateJob{file, dbUpdateDeleteDir}\n\t\t}\n\t\treturn\n\t}\n\n\tif err = f.deleteDirOnDisk(file.Name, scanChan); err != nil {\n\t\treturn\n\t}\n\n\tdbUpdateChan <- dbUpdateJob{file, dbUpdateDeleteDir}\n}\n\n// deleteFile attempts to delete the given file\nfunc (f *sendReceiveFolder) deleteFile(file protocol.FileInfo, dbUpdateChan chan<- dbUpdateJob, scanChan chan<- string) {\n\tcur, hasCur, err := f.model.sdb.GetDeviceFile(f.folderID, protocol.LocalDeviceID, file.Name)\n\tif err != nil {\n\t\tf.newPullError(file.Name, fmt.Errorf(\"delete file: %w\", err))\n\t\treturn\n\t}\n\tf.deleteFileWithCurrent(file, cur, hasCur, dbUpdateChan, scanChan)\n}\n\nfunc (f *sendReceiveFolder) deleteFileWithCurrent(file, cur protocol.FileInfo, hasCur bool, dbUpdateChan chan<- dbUpdateJob, scanChan chan<- string) {\n\t// Used in the defer closure below, updated by the function body. Take\n\t// care not declare another err.\n\tvar err error\n\n\tf.sl.Debug(\"Deleting file or symlink\", slogutil.FilePath(file.Name))\n\n\tf.evLogger.Log(events.ItemStarted, map[string]string{\n\t\t\"folder\": f.folderID,\n\t\t\"item\":   file.Name,\n\t\t\"type\":   \"file\",\n\t\t\"action\": \"delete\",\n\t})","sourceCodeStart":850,"sourceCodeEnd":886,"githubUrl":"https://github.com/syncthing/syncthing/blob/058bcd7334839663cf569501d3ac539034d45cb5/lib/model/folder_sendrecv.go#L850-L886","documentation":"Pull error in deleteFile when fetching the current local database record for the file being deleted fails at the DB level. Before deleting, Syncthing looks up the existing FileInfo (needed to decide archiving vs plain delete); a GetDeviceFile error — not mere absence — aborts with 'delete file' before any filesystem action.","triggerScenarios":"deleteFile pulls a remote deletion, and model.sdb.GetDeviceFile(folderID, LocalDeviceID, file.Name) returns corruption/IO error from the database layer.","commonSituations":"LevelDB corruption or heavy compaction I/O errors; disk space exhaustion on the home/database volume; database damaged after power loss or forced kill.","solutions":["Restart Syncthing to clear transient DB states; deletions retry on next pull.","If persistent, stop the service and rebuild the database (remove index dir / -reset-database), then let it re-scan.","Verify disk health and free space on the database volume (ties into minHomeDiskFree).","Upgrade to the latest release for database robustness fixes."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"if strings.Contains(errStr, \"delete file\") && isDBReadError(err) {\n\t// restart service; if persistent, schedule database reset during a maintenance window\n}","preventionTips":["Graceful shutdowns only; avoid SIGKILL during sync.","Monitor DB disk space and I/O errors.","Maintain backups/restoral procedure for a database reset (full rescan cost)."],"tags":["pull","deletion","database","io"],"backgroundTag":null,"analyzedSha":"058bcd7334839663cf569501d3ac539034d45cb5","analyzedAt":"2026-08-15T07:53:43.174Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}