{"record":{"id":"438c3c691f031b06","repo":"benbjohnson/litestream","slug":"get-size-after-delete-w","errorCode":null,"errorMessage":"get size after delete: %w","messagePattern":"get size after delete: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/litestream-test/shrink.go","lineNumber":100,"sourceCode":"\ttotalDeleted := int64(0)\n\tfor _, table := range tables {\n\t\tdeleted, err := c.deleteFromTable(db, table)\n\t\tif err != nil {\n\t\t\tslog.Error(\"Failed to delete from table\", \"table\", table, \"error\", err)\n\t\t\tcontinue\n\t\t}\n\t\ttotalDeleted += deleted\n\t\tslog.Info(\"Deleted rows from table\",\n\t\t\t\"table\", table,\n\t\t\t\"rows_deleted\", deleted,\n\t\t)\n\t}\n\n\tslog.Info(\"Deletion complete\", \"total_rows_deleted\", totalDeleted)\n\n\tsizeAfterDelete, err := getDatabaseSize(c.DB)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get size after delete: %w\", err)\n\t}\n\n\tslog.Info(\"Size after deletion\",\n\t\t\"size_mb\", sizeAfterDelete/1024/1024,\n\t\t\"change_mb\", (initialSize-sizeAfterDelete)/1024/1024,\n\t)\n\n\tif c.Checkpoint {\n\t\tif err := c.runCheckpoint(db); err != nil {\n\t\t\treturn fmt.Errorf(\"checkpoint: %w\", err)\n\t\t}\n\n\t\tsizeAfterCheckpoint, _ := getDatabaseSize(c.DB)\n\t\tslog.Info(\"Size after checkpoint\",\n\t\t\t\"size_mb\", sizeAfterCheckpoint/1024/1024,\n\t\t\t\"change_from_delete_mb\", (sizeAfterDelete-sizeAfterCheckpoint)/1024/1024,\n\t\t)\n\t}","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/benbjohnson/litestream/blob/4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3/cmd/litestream-test/shrink.go#L82-L118","documentation":"After the deletion loop completes, shrinkDatabase re-measures the database size with getDatabaseSize(c.DB) to log the post-delete footprint; failure is wrapped as `get size after delete: %w`. Like error 63 this is a filesystem/stat failure, not a SQL failure — the database connection is still open at this point, so the main file certainly existed moments earlier.","triggerScenarios":"The database file or its directory became unreadable mid-run (file deleted by an external process, mount dropped, permissions changed); an OS-level stat error inside getDatabaseSize.","commonSituations":"External cleanup jobs or tmpwatch removing files under /tmp during long deletions on large databases; running on a flaky network filesystem; container filesystem pressure causing I/O errors.","solutions":["Ensure nothing else deletes or moves the database while shrink runs","Re-run the command on a stable local filesystem","Check the wrapped inner error for the exact syscall/errno to identify the cause","Treat the shrink as partially complete: deletions already happened even though this measurement failed"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// ensure no concurrent deletion of the database file\n// fuser <dbpath> || true  # verify nothing else has it open/removing it","typeGuard":null,"tryCatchPattern":"if err := runShrink(args); err != nil {\n    if strings.Contains(err.Error(), \"get size after delete\") {\n        log.Printf(\"shrink deletions may have completed but sizing failed: %v\", err)\n        return err\n    }\n    return err\n}","preventionTips":["Exclude active shrink target files from tmpwatch/cleanup jobs","Run on local disk rather than flaky network mounts","Remember deletions persist even if this post-step fails — check row counts before re-running"],"tags":["filesystem","sqlite","stat"],"backgroundTag":"file-read-failed","analyzedSha":"4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3","analyzedAt":"2026-09-06T18:29:25.564Z","contentChangedAt":"2026-09-06T18:29:25.564Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}