On Versions: So we don't really need these anymore but they can be used to provide a solution to garbage collecting of mutable chunks. Extend the Storage interface to have a copy operation taking a ContentId and a Version. This can be naively implemented as creating a uuid, copying to that uuid, and storing a (ContentId, Version) -> Uuid map. Change the delete operation to take an Option. copy can be efficiently implemented by just incrementing a refcount and decrementing when receiving a versioned delete Add a promote operation which deletes all versioned copies and creates a non-versioned one if it doesn't exist already save chunks as uuids? // for fs::write have initial write possibly return reserved if the chunk is immutable do the same WriteResult stuff on reserved, fetch/read? the data and feed it back writers should block on reserved state