Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e83bb4c

Browse files
fix: link both storage version and migration (#4315)
1 parent fcafbbc commit e83bb4c

File tree

5 files changed

+52
-63
lines changed

5 files changed

+52
-63
lines changed

‎internal/link/link.go‎

Lines changed: 26 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2625
func Run(ctx context.Context, projectRef string, fsys afero.Fs, options ...func(*pgx.ConnConfig)) error {
@@ -60,59 +59,20 @@ major_version = %d
6059
}
6160

6261
func 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

11878
func 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+
167136
const 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

177146
func 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.

‎internal/link/link_test.go‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ func TestLinkCommand(t *testing.T) {
113113
Get("/rest/v1/").
114114
Reply(200).
115115
JSON(rest)
116+
storage := "1.28.0"
117+
gock.New("https://" + utils.GetSupabaseHost(project)).
118+
Get("/storage/v1/version").
119+
Reply(200).
120+
BodyString(storage)
116121
// Run test
117122
err := Run(context.Background(), project, fsys, conn.Intercept)
118123
// Check error
@@ -128,6 +133,9 @@ func TestLinkCommand(t *testing.T) {
128133
authVersion, err := afero.ReadFile(fsys, utils.GotrueVersionPath)
129134
assert.NoError(t, err)
130135
assert.Equal(t, []byte(auth.Version), authVersion)
136+
storageVersion, err := afero.ReadFile(fsys, utils.StorageVersionPath)
137+
assert.NoError(t, err)
138+
assert.Equal(t, []byte("v"+storage), storageVersion)
131139
postgresVersion, err := afero.ReadFile(fsys, utils.PostgresVersionPath)
132140
assert.NoError(t, err)
133141
assert.Equal(t, []byte(mockPostgres.Database.Version), postgresVersion)
@@ -180,6 +188,9 @@ func TestLinkCommand(t *testing.T) {
180188
gock.New("https://" + utils.GetSupabaseHost(project)).
181189
Get("/rest/v1/").
182190
ReplyError(errors.New("network error"))
191+
gock.New("https://" + utils.GetSupabaseHost(project)).
192+
Get("/storage/v1/version").
193+
ReplyError(errors.New("network error"))
183194
// Run test
184195
err := Run(context.Background(), project, fsys, func(cc *pgx.ConnConfig) {
185196
cc.LookupFunc = func(ctx context.Context, host string) (addrs []string, err error) {
@@ -251,6 +262,9 @@ func TestLinkCommand(t *testing.T) {
251262
gock.New("https://" + utils.GetSupabaseHost(project)).
252263
Get("/rest/v1/").
253264
ReplyError(errors.New("network error"))
265+
gock.New("https://" + utils.GetSupabaseHost(project)).
266+
Get("/storage/v1/version").
267+
ReplyError(errors.New("network error"))
254268
gock.New(utils.DefaultApiHost).
255269
Get("/v1/projects").
256270
ReplyError(errors.New("network error"))
@@ -430,7 +444,7 @@ func TestLinkDatabase(t *testing.T) {
430444
err := linkDatabase(context.Background(), dbConfig, fsys, conn.Intercept)
431445
// Check error
432446
assert.NoError(t, err)
433-
version, err := afero.ReadFile(fsys, utils.StorageVersionPath)
447+
version, err := afero.ReadFile(fsys, utils.StorageMigrationPath)
434448
assert.NoError(t, err)
435449
assert.Equal(t, "custom-metadata", string(version))
436450
})
@@ -454,7 +468,7 @@ func TestLinkDatabase(t *testing.T) {
454468
// Check error
455469
assert.NoError(t, err)
456470
assert.Equal(t, uint(15), utils.Config.Db.MajorVersion)
457-
version, err := afero.ReadFile(fsys, utils.StorageVersionPath)
471+
version, err := afero.ReadFile(fsys, utils.StorageMigrationPath)
458472
assert.NoError(t, err)
459473
assert.Equal(t, "custom-metadata", string(version))
460474
})
@@ -479,7 +493,7 @@ func TestLinkDatabase(t *testing.T) {
479493
err := linkDatabase(context.Background(), dbConfig, fsys, conn.Intercept)
480494
// Check error
481495
assert.ErrorContains(t, err, "ERROR: permission denied for relation supabase_migrations (SQLSTATE 42501)")
482-
exists, err := afero.Exists(fsys, utils.StorageVersionPath)
496+
exists, err := afero.Exists(fsys, utils.StorageMigrationPath)
483497
assert.NoError(t, err)
484498
assert.False(t, exists)
485499
})

‎internal/utils/misc.go‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ var (
6969
GotrueVersionPath = filepath.Join(TempDir, "gotrue-version")
7070
RestVersionPath = filepath.Join(TempDir, "rest-version")
7171
StorageVersionPath = filepath.Join(TempDir, "storage-version")
72+
StorageMigrationPath = filepath.Join(TempDir, "storage-migration")
7273
StudioVersionPath = filepath.Join(TempDir, "studio-version")
7374
PgmetaVersionPath = filepath.Join(TempDir, "pgmeta-version")
7475
PoolerVersionPath = filepath.Join(TempDir, "pooler-version")

‎pkg/config/config.go‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -607,11 +607,14 @@ func (c *config) Load(path string, fsys fs.FS) error {
607607
}
608608
}
609609
if version, err := fs.ReadFile(fsys, builder.StorageVersionPath); err == nil && len(version) > 0 {
610-
// For backwards compatibility, exclude all strings that look like semver
611-
if v := strings.TrimSpace(string(version)); !semver.IsValid(v) {
612-
c.Storage.TargetMigration = v
610+
// Only replace image if local storage version is newer
611+
if i := strings.IndexByte(Images.Storage, ':'); VersionCompare(string(version), Images.Storage[i+1:]) >0 {
612+
c.Storage.Image = replaceImageTag(Images.Storage, string(version))
613613
}
614614
}
615+
if version, err := fs.ReadFile(fsys, builder.StorageMigrationPath); err == nil && len(version) > 0 {
616+
c.Storage.TargetMigration = string(version)
617+
}
615618
if version, err := fs.ReadFile(fsys, builder.EdgeRuntimeVersionPath); err == nil && len(version) > 0 {
616619
c.EdgeRuntime.Image = replaceImageTag(Images.EdgeRuntime, string(version))
617620
}

‎pkg/config/utils.go‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type pathBuilder struct {
2121
GotrueVersionPath string
2222
RestVersionPath string
2323
StorageVersionPath string
24+
StorageMigrationPath string
2425
StudioVersionPath string
2526
PgmetaVersionPath string
2627
PoolerVersionPath string
@@ -55,6 +56,7 @@ func NewPathBuilder(configPath string) pathBuilder {
5556
GotrueVersionPath: filepath.Join(base, ".temp", "gotrue-version"),
5657
RestVersionPath: filepath.Join(base, ".temp", "rest-version"),
5758
StorageVersionPath: filepath.Join(base, ".temp", "storage-version"),
59+
StorageMigrationPath: filepath.Join(base, ".temp", "storage-migration"),
5860
EdgeRuntimeVersionPath: filepath.Join(base, ".temp", "edge-runtime-version"),
5961
StudioVersionPath: filepath.Join(base, ".temp", "studio-version"),
6062
PgmetaVersionPath: filepath.Join(base, ".temp", "pgmeta-version"),

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /