On Thu, Jan 30, 2020 at 06:20:01AM -0800, Eliot Miranda wrote:
Hi Dave,
On Jan 30, 2020, at 5:18 AM, David T. Lewis lewis@mail.msen.com wrote:
???My suggestion is to just try some ideas in your own image and see if it's something you want to live with. The intentions are good but I have a feeling that this is the kind of thing where the inintended side effects are worse than the problem to be solved.
+1
In my own experience, I have encountered an IO error while saving the image several times over the years. In every case, the cause has been a file system full condition. A solution that uses more disc space would not have been helpful.
Good point. The snapshot primitive *could* make a conservative estimate of the file size needed (easy; it knows how big the heap is), create a file, write that many zeros (only way to actually commit the disc space), and then overwrite with the real data, but that???s twice the disc traffic.
That's a good idea, and on a unix platform we can use statvfs() to check space availability without adding any disc traffic. To prove out the idea, I implemented it as a primitive in the unix OSProcess plugin so that you can test it like this:
primSpaceFor: byteSize InDirectoryPath: dirPath <primitive: 'primitiveSpaceForByteSizeInDirectoryPath' module: 'UnixOSProcessPlugin'> ^ self primitiveFailed
If you want to give it a try, the primitive is now in the latest UnixOSProcessPlugin in www.squeaksource.com/OSProcessPlugin in VMConstruction-Plugins-OSProcessPlugin-dtl.47, and I merged it into VMConstruction-Plugins-OSProcessPlugin.oscog-dtl.67 for the Cog/Spur VMs.
I also added access from OSProcess is added in OSProcess-dtl.114.
I have not really looked into how best to put this into the VM proper, but we could consider either adding a primitive similar to the one in OSPP, or maybe add a check directly into the image write function (which is currently a macro that we could override).
I also have not looked into how to implement this on Windows. I'm sure there is a way but I have not yet checked. It's likely that statvsf() is available on Windows but I have not looked.
In any case, treat this is a proof of concept to illustrate a way to handle the file system full scenario.
Dave