Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToon Claes <toon@gitlab.com>2022-05-04 17:12:16 +0300
committerToon Claes <toon@gitlab.com>2022-05-04 17:12:16 +0300
commitfb86bb6cb61a072f1003699e482f3819f2c84fd1 (patch)
tree6d03eed6de602aaeb90da8e171a0c2e69cebd93c
parent86aa7ee82a5dd241fd7d4b33435da0a7ecad12b0 (diff)
parent7c78dcb8514bba6195993f83706bacebe3b71dd4 (diff)
Merge branch 'smh-no-up-to-date-replicas-error' into 'master'
Return correct error when repository has no up to date replicas See merge request gitlab-org/gitaly!4518
-rw-r--r--internal/praefect/datastore/repository_store.go8
-rw-r--r--internal/praefect/datastore/repository_store_test.go14
2 files changed, 20 insertions, 2 deletions
diff --git a/internal/praefect/datastore/repository_store.go b/internal/praefect/datastore/repository_store.go
index 780073155..b2c0378f2 100644
--- a/internal/praefect/datastore/repository_store.go
+++ b/internal/praefect/datastore/repository_store.go
@@ -576,7 +576,7 @@ func (rs *PostgresRepositoryStore) GetConsistentStoragesByRepositoryID(ctx conte
return rs.getConsistentStorages(ctx, `
SELECT replica_path, ARRAY_AGG(storage)
FROM repositories
-JOIN storage_repositories USING (repository_id, relative_path, generation)
+LEFT JOIN storage_repositories USING (repository_id, relative_path, generation)
WHERE repository_id = $1
GROUP BY replica_path
`, repositoryID)
@@ -587,7 +587,7 @@ func (rs *PostgresRepositoryStore) GetConsistentStorages(ctx context.Context, vi
replicaPath, storages, err := rs.getConsistentStorages(ctx, `
SELECT replica_path, ARRAY_AGG(storage)
FROM repositories
-JOIN storage_repositories USING (repository_id, relative_path, generation)
+LEFT JOIN storage_repositories USING (repository_id, relative_path, generation)
WHERE repositories.virtual_storage = $1
AND repositories.relative_path = $2
GROUP BY replica_path
@@ -613,6 +613,10 @@ func (rs *PostgresRepositoryStore) getConsistentStorages(ctx context.Context, qu
}
result := storages.Slice()
+ if len(result) == 0 {
+ return "", nil, fmt.Errorf("repository has no up to date replicas")
+ }
+
consistentStorages := make(map[string]struct{}, len(result))
for _, storage := range result {
consistentStorages[storage] = struct{}{}
diff --git a/internal/praefect/datastore/repository_store_test.go b/internal/praefect/datastore/repository_store_test.go
index 9c980376c..a4c50d54b 100644
--- a/internal/praefect/datastore/repository_store_test.go
+++ b/internal/praefect/datastore/repository_store_test.go
@@ -972,6 +972,20 @@ func TestRepositoryStore_Postgres(t *testing.T) {
require.Equal(t, "new-path", replicaPath)
require.Equal(t, map[string]struct{}{"storage-1": {}, "storage-2": {}}, storages)
})
+
+ t.Run("returns error when no up to date replicas", func(t *testing.T) {
+ rs := newRepositoryStore(t, nil)
+
+ require.NoError(t, rs.CreateRepository(ctx, 1, vs, repo, "replica-path", "primary", []string{"secondary"}, nil, false, false))
+ require.NoError(t, rs.IncrementGeneration(ctx, 1, "primary", nil))
+ require.NoError(t, rs.DeleteReplica(ctx, 1, "primary"))
+
+ _, _, err := rs.GetConsistentStorages(ctx, vs, repo)
+ require.EqualError(t, err, "repository has no up to date replicas")
+
+ _, _, err = rs.GetConsistentStoragesByRepositoryID(ctx, 1)
+ require.EqualError(t, err, "repository has no up to date replicas")
+ })
})
t.Run("DeleteInvalidRepository", func(t *testing.T) {