Hide snapshot prefix from transactions
TransactionManager isolates transaction's by creating a snapshot of the repository being accessed. It places it in the staging directory and rewrites the relative path to point to the snapshot repository by adding the prefix of the snapshot, eg staging/x/y/@hashed/...
. This works well to for most operations that just access Git.
Some operations actually use the relative path as a key. This has the downside that the relative path is now transaction specific and doesn't work as a key. We've previously worked around this by getting the original relative path with the OriginalRepository
helper. While this works, it's a leaky abstraction. The transaction's should not see the staging/x/y/...
prefixes.
We could complete the abstraction and hide the prefixes by also rewriting the storage paths to point to the transaction's snapshot root. The file system snapshot is a snapshot of the storage's state that only contains the partition owned state that the transaction is accessing. Gitaly is accessing the storage paths through the locator. We could add logic there that extracts the transaction's file system snapshot's root directory and returns that as the storage path. That way the snapshot prefixes would be hidden from the clients as it would be just included in the storage directory's prefix. All operations that work by walking the storage directory would work as normal.