Skip to content

Commit

Permalink
fix: perform refresh operations asynchronously (#11)
Browse files Browse the repository at this point in the history
  • Loading branch information
kurtisvg committed Apr 16, 2021
1 parent e2a5238 commit 925d6c2
Showing 1 changed file with 44 additions and 8 deletions.
52 changes: 44 additions & 8 deletions internal/cloudsql/instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,15 +170,51 @@ func performRefresh(client *sqladmin.Service, cn connName, k *rsa.PrivateKey, d
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

// TODO: perform these steps asynchronously and return the results
md, err := fetchMetadata(ctx, client, cn)
if err != nil {
return md, nil, fmt.Errorf("fetch metadata failed: %w", err)
// start async fetching the instance's metadata
type mdRes struct {
md metadata
err error
}
mdC := make(chan mdRes, 1)
go func() {
defer close(mdC)
md, err := fetchMetadata(ctx, client, cn)
mdC <- mdRes{md, err}
}()

// start async fetching the certs
type ecRes struct {
ec tls.Certificate
err error
}
ecC := make(chan ecRes, 1)
go func() {
defer close(ecC)
ec, err := fetchEphemeralCert(ctx, client, cn, k)
ecC <- ecRes{ec, err}
}()

// wait for the results of each operations
var md metadata
select {
case r := <-mdC:
if r.err != nil {
return md, nil, fmt.Errorf("fetch metadata failed: %w", r.err)
}
md = r.md
case <-ctx.Done():
return md, nil, fmt.Errorf("refresh failed: %w", ctx.Err())
}
var ec tls.Certificate
ec, err = fetchEphemeralCert(ctx, client, cn, k)
if err != nil {
return md, nil, fmt.Errorf("fetch ephemeral cert failed: %w", err)
select {
case r := <-ecC:
if r.err != nil {
return md, nil, fmt.Errorf("fetch ephemeral cert failed: %w", r.err)
}
ec = r.ec
case <-ctx.Done():
return md, nil, fmt.Errorf("refresh failed: %w", ctx.Err())
}
return md, createTLSConfig(cn, md, ec), err

return md, createTLSConfig(cn, md, ec), nil
}

0 comments on commit 925d6c2

Please sign in to comment.