Skip to content

Commit 31ecdf7

Browse files
authored
Limit which errors to retry. (#1372)
1 parent 65a9992 commit 31ecdf7

File tree

1 file changed

+30
-14
lines changed
  • library/oss/postgres/prepare/database

1 file changed

+30
-14
lines changed

library/oss/postgres/prepare/database/main.go

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,26 +33,32 @@ const (
3333
func main() {
3434
ctx, p := provider.MustPrepare[*postgres.DatabaseIntent]()
3535

36+
if err := run(ctx, p); err != nil {
37+
log.Fatal(err)
38+
}
39+
}
40+
41+
func run(ctx context.Context, p *provider.Provider[*postgres.DatabaseIntent]) error {
3642
cluster := &postgresclass.ClusterInstance{}
3743
if err := p.Resources.Unmarshal(fmt.Sprintf("%s:cluster", providerPkg), cluster); err != nil {
38-
log.Fatalf("unable to read required resource \"cluster\": %v", err)
44+
return fmt.Errorf("unable to read required resource \"cluster\": %w", err)
3945
}
4046

4147
// TODO inject file as secret ref and propagate secret ref to server, too.
4248
if cluster.CaCert != "" {
4349
if err := os.WriteFile(caCertPath, []byte(cluster.CaCert), 0644); err != nil {
44-
log.Fatalf("failed to write %q: %v", caCertPath, err)
50+
return fmt.Errorf("failed to write %q: %w", caCertPath, err)
4551
}
4652

4753
if err := os.Setenv("PGSSLROOTCERT", caCertPath); err != nil {
48-
log.Fatalf("failed to set PGSSLROOTCERT: %v", err)
54+
return fmt.Errorf("failed to set PGSSLROOTCERT: %w", err)
4955
}
5056

5157
}
5258

5359
exists, err := ensureDatabase(ctx, cluster, p.Intent.Name)
5460
if err != nil {
55-
log.Fatalf("unable to create database %q: %v", p.Intent.Name, err)
61+
return fmt.Errorf("unable to create database %q: %w", p.Intent.Name, err)
5662
}
5763

5864
instance := &postgresclass.DatabaseInstance{
@@ -72,7 +78,7 @@ func main() {
7278
MaxConnIdleTime: connIdleTimeout,
7379
})
7480
if err != nil {
75-
log.Fatalf("unable to open connection: %v", err)
81+
return fmt.Errorf("unable to open connection: %w", err)
7682
}
7783
defer func() {
7884
if err := db.Close(); err != nil {
@@ -81,20 +87,30 @@ func main() {
8187
}()
8288

8389
for _, schema := range p.Intent.Schema {
84-
if err := backoff.Retry(func() error {
85-
_, err := db.Exec(ctx, string(schema.Contents))
86-
return err
87-
}, backOff{
88-
interval: 100 * time.Millisecond,
89-
deadline: time.Now().Add(15 * time.Second),
90-
jitter: 100 * time.Millisecond,
91-
}); err != nil {
92-
log.Fatalf("unable to apply schema %q: %v", schema.Path, err)
90+
if err := applyWithRetry(ctx, db, string(schema.Contents)); err != nil {
91+
return fmt.Errorf("unable to apply schema %q: %w", schema.Path, err)
9392
}
9493
}
9594
}
9695

9796
p.EmitResult(instance)
97+
return nil
98+
}
99+
100+
func applyWithRetry(ctx context.Context, db *universepg.DB, sql string) error {
101+
return backoff.Retry(func() error {
102+
_, err := db.Exec(ctx, sql)
103+
104+
if !universepg.ErrorIsRetryable(err) {
105+
return backoff.Permanent(err)
106+
}
107+
108+
return err
109+
}, backOff{
110+
interval: 100 * time.Millisecond,
111+
deadline: time.Now().Add(15 * time.Second),
112+
jitter: 100 * time.Millisecond,
113+
})
98114
}
99115

100116
func ensureDatabase(ctx context.Context, cluster *postgresclass.ClusterInstance, name string) (bool, error) {

0 commit comments

Comments
 (0)