Skip to content

Commit 1191ca4

Browse files
committed
concurrency improvements
1 parent 2898d23 commit 1191ca4

File tree

1 file changed

+13
-27
lines changed

1 file changed

+13
-27
lines changed

builder.go

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"sync/atomic"
1212

1313
"github.com/BurntSushi/toml"
14+
"golang.org/x/sync/errgroup"
1415
)
1516

1617
var builderWorkers atomic.Int32
@@ -115,13 +116,10 @@ func resolveSecrets(
115116
config any,
116117
managers []SecretManager,
117118
) error {
118-
ctx, cancel := context.WithCancel(ctx)
119-
defer cancel()
119+
g, ctx := errgroup.WithContext(ctx)
120+
g.SetLimit(int(builderWorkers.Load()))
120121

121-
semaphore := make(chan struct{}, builderWorkers.Load())
122-
var wg sync.WaitGroup
123122
var mu sync.Mutex
124-
errGather := []string{}
125123

126124
strConfig, err := configToJSON(config)
127125
if err != nil {
@@ -131,50 +129,38 @@ func resolveSecrets(
131129
subs := findSubstitutions(strConfig)
132130
replacements := make([]replacement, 0, len(subs))
133131
for _, sub := range subs {
132+
sub := sub
134133
manager, err := getManagerForPrefix(sub.managerPrefix, managers)
135134
if err != nil {
136135
return err
137136
}
138137

139-
wg.Add(1)
140-
go func(s substitutions, m SecretManager) {
141-
semaphore <- struct{}{} // make sure we don't flood system
142-
defer func() { <-semaphore }() // release worker
143-
defer wg.Done()
144-
138+
g.Go(func() error {
145139
select {
146140
case <-ctx.Done():
147-
return
141+
return nil
148142
default:
149143
}
150144

151-
secret, err := m.Secret(ctx, s.managerKey)
145+
secret, err := manager.Secret(ctx, sub.managerKey)
152146
if err != nil {
153-
cancel()
154-
mu.Lock()
155-
errGather = append(errGather, err.Error())
156-
mu.Unlock()
157-
return
147+
return err
158148
}
159149

160150
escapedSecret := escape(secret)
161151

162152
mu.Lock()
163153
replacements = append(
164154
replacements,
165-
replacement{old: s.value, new: escapedSecret},
155+
replacement{old: sub.value, new: escapedSecret},
166156
)
167157
mu.Unlock()
168-
}(sub, manager)
158+
return nil
159+
})
169160
}
170161

171-
wg.Wait()
172-
173-
if len(errGather) > 0 {
174-
return fmt.Errorf(
175-
"failed to fetch some secrets, %s",
176-
strings.Join(errGather, ", "),
177-
)
162+
if err := g.Wait(); err != nil {
163+
return err
178164
}
179165

180166
// actually do the replacement

0 commit comments

Comments
 (0)