Finally, I think I have a resolution to the open design flaw of hard termination on disk full. It's a hard problem since each table is expended independently and generally in the midst of a logical transaction. There is no transactional rollback, so there must be sufficient space. But by ensuring a minimal amount of disk space after expansion we can ensure that a subsequent expansion will succeed at least to the extent of committing the current transaction. Otherwise the process can be terminated safely. The only failure scenarios then is that the disk becomes filled external to the process (which we could also try to manage). But with snapshots this is pretty reaonable.