{"record":{"id":"1f9b7689bd424236","repo":"kovidgoyal/kitty","slug":"failed-to-read-data-from-image-output-data-file","errorCode":null,"errorMessage":"Failed to read data from image output data file: %w","messagePattern":"Failed to read data from image output data file: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kittens/icat/transmit.go","lineNumber":106,"sourceCode":"\tif frame.in_memory_bytes == nil {\n\t\tf, err := os.Open(frame.filename)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"Failed to open image data output file: %s with error: %w\", frame.filename, err)\n\t\t}\n\t\tdefer f.Close()\n\t\tif data_size, err = f.Seek(0, io.SeekEnd); err != nil {\n\t\t\treturn fmt.Errorf(\"Failed to seek in image data output file: %s with error: %w\", frame.filename, err)\n\t\t}\n\t\tif _, err = f.Seek(0, io.SeekStart); err != nil {\n\t\t\treturn fmt.Errorf(\"Failed to seek in image data output file: %s with error: %w\", frame.filename, err)\n\t\t}\n\t\tif mmap, err = shm.CreateTemp(\"icat-*\", uint64(data_size)); err != nil {\n\t\t\treturn fmt.Errorf(\"Failed to create a SHM file for transmission: %w\", err)\n\t\t}\n\t\tif _, err = io.ReadFull(f, mmap.Slice()); err != nil {\n\t\t\tmmap.Close()\n\t\t\tmmap.Unlink()\n\t\t\treturn fmt.Errorf(\"Failed to read data from image output data file: %w\", err)\n\t\t}\n\t} else {\n\t\tdata_size = int64(len(frame.in_memory_bytes))\n\t\tif mmap, err = shm.CreateTemp(\"icat-*\", uint64(data_size)); err != nil {\n\t\t\treturn fmt.Errorf(\"Failed to create a SHM file for transmission: %w\", err)\n\t\t}\n\t\tcopy(mmap.Slice(), frame.in_memory_bytes)\n\t}\n\tdefer mmap.Close() // terminal is responsible for unlink\n\tgc := gc_for_image(imgd, frame_num, frame)\n\tgc.SetTransmission(graphics.GRT_transmission_sharedmem)\n\tgc.SetDataSize(uint64(data_size))\n\terr = gc.WriteWithPayloadTo(os.Stdout, utils.UnsafeStringToBytes(mmap.Name()))\n\treturn\n}\n\nfunc transmit_file(imgd *image_data, frame_num int, frame *image_frame) (err error) {\n\tis_temp := false","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kittens/icat/transmit.go#L88-L124","documentation":"io.ReadFull failed while copying the frame file's bytes into the shared-memory segment — fewer bytes were available than the earlier size determination promised, or a read error occurred.","triggerScenarios":"File truncated between Seek (size) and ReadFull, or an I/O error mid-read from disk/NFS.","commonSituations":"Concurrent truncation of temp files; flaky network filesystems hosting TMPDIR; race with cleanup processes.","solutions":["Retry the icat run","Point TMPDIR at stable local storage","Avoid running concurrent icat instances over the same temp files"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"fi, _ := os.Stat(f)\n// verify size unchanged between sizing and reading before transmit","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"Failed to read data\") { /* regenerate frame and retry once */ }","preventionTips":["Don't share icat temp files across processes","Prefer local storage over NFS for temp dirs"],"tags":["kitty","icat","shm","read","filesystem"],"backgroundTag":"file-read-failed","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}