Is there a way to abort a python write operation in such a way that the OS doesn’t feel it’s necessary to flush the unwritten data to the disc?
I’m writing data to a USB device, typically many megabytes. I’m using 4096 bytes as my block size on the write, but it appears that Linux caches up a bunch of data early on, and write it out to the USB device slowly. If at some point during the write, my user decides to cancel, I want the app to just stop writing immediately. I can see that there’s a delay between when the data stops flowing from the application, and the USB activity light stops blinking. Several seconds, up to about 10 seconds typically. I find that the app is holding in the close() method, I’m assuming, waiting for the OS to finish writing the buffered data. I call flush() after every write, but that doesn’t appear to have any impact on the delay. I’ve scoured the python docs for an answer but have found nothing.
It’s somewhat filesystem dependent, but in some filesystems, if you delete a file before (all of) it is allocated, the IO to write the blocks will never happen. This might also be true if you truncate it so that the part which is still being written is chopped off.
Not sure that you can really abort a write if you want to still access the data. Also the kinds of filesystems that support this (e.g. xfs, ext4) are not normally used on USB sticks.
If you want to flush data to the disc, use fdatasync(). Merely flushing your IO library’s buffer into the OS one will not achieve any physical flushing.