Previously, when the host repeatedly sent `UpdateWorktree` messages, new guests attempting to join a project would observe a severe slowdown caused by a database serialization error (e.g., the coherence of the data would get violated midway through `Database::join_project` due to worktree entries being mutated as the user joined). Writing entries is pretty fast, whereas reading all of them for a project can take more than 100ms. Transactions that failed due to a serialization error are retried, but the guest would keep retrying until the host finished writing because the guest's read was slow. This commit changes the semantics of `room_transaction` to acquire a room lock before even starting the transaction and holding it all the way after commit (storing it, as before, in the `RoomGuard`). This ensures that a fast writer (the host) can't starve a slow reader (the guest), allowing the latter to make progress by temporarily pausing writes by the former.
Antonio Scandurra committed on 2/22/2023, 3:04:29 PMparent24fcad3
1 file changedLine totals unavailable