@@ -7,20 +7,19 @@ import (
77 "os"
88 "strconv"
99 "strings"
10- "sync"
1110
1211 "github.com/go-errors/errors"
1312 "github.com/jackc/pgconn"
1413 "github.com/jackc/pgx/v4"
1514 "github.com/spf13/afero"
16- "github.com/spf13/viper"
1715 "github.com/supabase/cli/internal/utils"
1816 "github.com/supabase/cli/internal/utils/flags"
1917 "github.com/supabase/cli/internal/utils/tenant"
2018 "github.com/supabase/cli/pkg/api"
2119 "github.com/supabase/cli/pkg/cast"
2220 cliConfig "github.com/supabase/cli/pkg/config"
2321 "github.com/supabase/cli/pkg/migration"
22+ "github.com/supabase/cli/pkg/queue"
2423)
2524
2625func Run (ctx context.Context , projectRef string , fsys afero.Fs , options ... func (* pgx.ConnConfig )) error {
@@ -60,59 +59,20 @@ major_version = %d
6059}
6160
6261func LinkServices (ctx context.Context , projectRef , serviceKey string , fsys afero.Fs ) {
63- // Ignore non-fatal errors linking services
64- var wg sync.WaitGroup
65- wg .Add (8 )
66- go func () {
67- defer wg .Done ()
68- if err := linkDatabaseSettings (ctx , projectRef ); err != nil && viper .GetBool ("DEBUG" ) {
69- fmt .Fprintln (os .Stderr , err )
70- }
71- }()
72- go func () {
73- defer wg .Done ()
74- if err := linkNetworkRestrictions (ctx , projectRef ); err != nil && viper .GetBool ("DEBUG" ) {
75- fmt .Fprintln (os .Stderr , err )
76- }
77- }()
78- go func () {
79- defer wg .Done ()
80- if err := linkPostgrest (ctx , projectRef ); err != nil && viper .GetBool ("DEBUG" ) {
81- fmt .Fprintln (os .Stderr , err )
82- }
83- }()
84- go func () {
85- defer wg .Done ()
86- if err := linkGotrue (ctx , projectRef ); err != nil && viper .GetBool ("DEBUG" ) {
87- fmt .Fprintln (os .Stderr , err )
88- }
89- }()
90- go func () {
91- defer wg .Done ()
92- if err := linkStorage (ctx , projectRef ); err != nil && viper .GetBool ("DEBUG" ) {
93- fmt .Fprintln (os .Stderr , err )
94- }
95- }()
96- go func () {
97- defer wg .Done ()
98- if err := linkPooler (ctx , projectRef , fsys ); err != nil && viper .GetBool ("DEBUG" ) {
99- fmt .Fprintln (os .Stderr , err )
100- }
101- }()
62+ jq := queue .NewJobQueue (5 )
63+ logger := utils .GetDebugLogger ()
64+ fmt .Fprintln (logger , jq .Put (func () error { return linkDatabaseSettings (ctx , projectRef ) }))
65+ fmt .Fprintln (logger , jq .Put (func () error { return linkNetworkRestrictions (ctx , projectRef ) }))
66+ fmt .Fprintln (logger , jq .Put (func () error { return linkPostgrest (ctx , projectRef ) }))
67+ fmt .Fprintln (logger , jq .Put (func () error { return linkGotrue (ctx , projectRef ) }))
68+ fmt .Fprintln (logger , jq .Put (func () error { return linkStorage (ctx , projectRef ) }))
69+ fmt .Fprintln (logger , jq .Put (func () error { return linkPooler (ctx , projectRef , fsys ) }))
10270 api := tenant .NewTenantAPI (ctx , projectRef , serviceKey )
103- go func () {
104- defer wg .Done ()
105- if err := linkPostgrestVersion (ctx , api , fsys ); err != nil && viper .GetBool ("DEBUG" ) {
106- fmt .Fprintln (os .Stderr , err )
107- }
108- }()
109- go func () {
110- defer wg .Done ()
111- if err := linkGotrueVersion (ctx , api , fsys ); err != nil && viper .GetBool ("DEBUG" ) {
112- fmt .Fprintln (os .Stderr , err )
113- }
114- }()
115- wg .Wait ()
71+ fmt .Fprintln (logger , jq .Put (func () error { return linkPostgrestVersion (ctx , api , fsys ) }))
72+ fmt .Fprintln (logger , jq .Put (func () error { return linkGotrueVersion (ctx , api , fsys ) }))
73+ fmt .Fprintln (logger , jq .Put (func () error { return linkStorageVersion (ctx , api , fsys ) }))
74+ // Ignore non-fatal errors linking services
75+ fmt .Fprintln (logger , jq .Collect ())
11676}
11777
11878func linkPostgrest (ctx context.Context , projectRef string ) error {
@@ -164,14 +124,23 @@ func linkStorage(ctx context.Context, projectRef string) error {
164124 return nil
165125}
166126
127+ func linkStorageVersion (ctx context.Context , api tenant.TenantAPI , fsys afero.Fs ) error {
128+ version , err := api .GetStorageVersion (ctx )
129+ if err != nil {
130+ return err
131+ }
132+ fmt .Fprintln (os .Stderr , version )
133+ return utils .WriteFile (utils .StorageVersionPath , []byte (version ), fsys )
134+ }
135+ 167136const GET_LATEST_STORAGE_MIGRATION = "SELECT name FROM storage.migrations ORDER BY id DESC LIMIT 1"
168137
169- func linkStorageVersion (ctx context.Context , conn * pgx.Conn , fsys afero.Fs ) error {
138+ func linkStorageMigration (ctx context.Context , conn * pgx.Conn , fsys afero.Fs ) error {
170139 var name string
171140 if err := conn .QueryRow (ctx , GET_LATEST_STORAGE_MIGRATION ).Scan (& name ); err != nil {
172141 return errors .Errorf ("failed to fetch storage migration: %w" , err )
173142 }
174- return utils .WriteFile (utils .StorageVersionPath , []byte (name ), fsys )
143+ return utils .WriteFile (utils .StorageMigrationPath , []byte (name ), fsys )
175144}
176145
177146func linkDatabaseSettings (ctx context.Context , projectRef string ) error {
@@ -203,7 +172,7 @@ func linkDatabase(ctx context.Context, config pgconn.Config, fsys afero.Fs, opti
203172 }
204173 defer conn .Close (context .Background ())
205174 updatePostgresConfig (conn )
206- if err := linkStorageVersion (ctx , conn , fsys ); err != nil {
175+ if err := linkStorageMigration (ctx , conn , fsys ); err != nil {
207176 fmt .Fprintln (os .Stderr , err )
208177 }
209178 // If `schema_migrations` doesn't exist on the remote database, create it.
0 commit comments