diff --git a/internal/praefect/datastore/repository_store.go b/internal/praefect/datastore/repository_store.go index 49bb6e54789b511ee4e090471598fb2a2eb7040c..9c8dcf30e17a6bb8dd18f92904d1de8947467b6d 100644 --- a/internal/praefect/datastore/repository_store.go +++ b/internal/praefect/datastore/repository_store.go @@ -261,14 +261,15 @@ WITH updated_repository AS ( SET generation = generation + 1 WHERE virtual_storage = $1 AND relative_path = $2 - RETURNING virtual_storage, relative_path, generation + RETURNING repository_id, virtual_storage, relative_path, generation ) -INSERT INTO storage_repositories -SELECT virtual_storage, relative_path, $3, generation +INSERT INTO storage_repositories (repository_id, virtual_storage, relative_path, storage, generation) +SELECT repository_id, virtual_storage, relative_path, $3, generation FROM updated_repository ON CONFLICT (virtual_storage, relative_path, storage) DO UPDATE - SET generation = EXCLUDED.generation + SET repository_id = EXCLUDED.repository_id, + generation = EXCLUDED.generation `, virtualStorage, relativePath, storage) if err != nil { return fmt.Errorf("exec: %w", err) diff --git a/internal/praefect/datastore/repository_store_test.go b/internal/praefect/datastore/repository_store_test.go index caee75ce835827be86be545b00170bc3bc09e022..f8bd2085d0685722f11828b427e1fa80df026259 100644 --- a/internal/praefect/datastore/repository_store_test.go +++ b/internal/praefect/datastore/repository_store_test.go @@ -438,16 +438,18 @@ func testRepositoryStore(t *testing.T, newStore repositoryStoreFactory) { }) t.Run("SetAuthoritativeReplica", func(t *testing.T) { - rs, requireState := newStore(t, nil) - t.Run("fails when repository doesnt exist", func(t *testing.T) { + rs, _ := newStore(t, nil) + require.Equal(t, commonerr.NewRepositoryNotFoundError(vs, repo), rs.SetAuthoritativeReplica(ctx, vs, repo, stor), ) }) - t.Run("sets the given replica as the latest", func(t *testing.T) { + t.Run("sets an existing replica as the latest", func(t *testing.T) { + rs, requireState := newStore(t, nil) + require.NoError(t, rs.CreateRepository(ctx, 1, vs, repo, "storage-1", []string{"storage-2"}, nil, false, false)) requireState(t, ctx, virtualStorageState{ @@ -482,6 +484,43 @@ func testRepositoryStore(t *testing.T, newStore repositoryStoreFactory) { }, ) }) + + t.Run("sets a new replica as the latest", func(t *testing.T) { + rs, requireState := newStore(t, nil) + + require.NoError(t, rs.CreateRepository(ctx, 1, vs, repo, "storage-1", nil, nil, false, false)) + requireState(t, ctx, + virtualStorageState{ + "virtual-storage-1": { + "repository-1": {repositoryID: 1, replicaPath: "repository-1"}, + }, + }, + storageState{ + "virtual-storage-1": { + "repository-1": { + "storage-1": {repositoryID: 1, generation: 0}, + }, + }, + }, + ) + + require.NoError(t, rs.SetAuthoritativeReplica(ctx, vs, repo, "storage-2")) + requireState(t, ctx, + virtualStorageState{ + "virtual-storage-1": { + "repository-1": {repositoryID: 1, replicaPath: "repository-1"}, + }, + }, + storageState{ + "virtual-storage-1": { + "repository-1": { + "storage-1": {repositoryID: 1, generation: 0}, + "storage-2": {repositoryID: 1, generation: 1}, + }, + }, + }, + ) + }) }) t.Run("GetGeneration", func(t *testing.T) {