Add on-disk caching with readahead. The cache will grow to a maximum size and then start recycling blocks. Block allocations are tracked in the leveldb, and cached data is stored in files on disk.

Yeah, that's fine (and logical), please just also update the comment to include that the chunks are left behind after reinit()