Enable transactions for object pools
This MR enables transactions for each of the ObjectPool related RPCs. With all of the pre-requisites out of the way, this mostly requires just recording the various operations in the transaction in the RPC handlers. The major themes of changes that had to be done in tests include:
- Mismatching error messages, or erroring in a different location. Some invalid state causes beginning a transaction to fail before the RPC handler is invoked even which leads to different error messages.
- Some tests are testing state that isn't seemingly relevant anymore, for example locking semantics. Those are handled by the TransactionManager and the handlers won't see each others' locks.'
There are some smallish behavior changes as well, such as:
- GetSnapshot fails with transactions if the alternate is not valid. It's questionable whether creating a possibly corrupted snapshot is desirable. It fails with transactions due to us failing to build the snapshot as we can't follow the alternate link.
- FetchIntoObjectPool won't fix broken references. Such references should be historic state as we'd recover partial creations from the log entry, and Git should fsync them properly.
- Transactions require the object pool and the member repository to be in the same partition. This may not be the case when Praefect attempts to reconciliate alternate link differences during replication. Moving repositories between partitions is difficult, so for now we'll simply ignore the pool linking failure in Praefect and leave accept deviating alternate links.
Edited by Sami Hiltunen