Make UpdateRepositoryStorageService idempotent

What does this MR do?

This fixes a data loss scenario that can occur when moving a repository between Gitaly shards ("storages"). The code that moves the repository soft-deletes the repository from its old location. If the new location and the old location are identical (i.e. have the same storage name), you end up losing your repository.

We already check for the "old storage equals new storage" in some places but that was not enough.

This bug was happening for me because I was in a case where the repository move job itself would fail halfway through, and got rescheduled by Sidekiq. That caused it to run a second time with the exact same inputs leading to data loss. This was not obvious to spot in development because the retry only happened after 1 minute.

Anyway, with this change we add a guard that checks if the old and new location are the same, and if they are, we bail out.

What are the relevant issue numbers?

gitaly#1568 (closed)

Does this MR meet the acceptance criteria?

Edited by Jacob Vosmaer

Merge request reports

Loading