Skip to content

Commit b0cd05a

Browse files
committed
apply suggestions from pr
1 parent 512f404 commit b0cd05a

File tree

1 file changed

+63
-103
lines changed

1 file changed

+63
-103
lines changed

support/support.go

Lines changed: 63 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strings"
88
"sync"
99

10+
"golang.org/x/sync/errgroup"
1011
"golang.org/x/xerrors"
1112

1213
"github.com/google/uuid"
@@ -62,141 +63,106 @@ type Deps struct {
6263
}
6364

6465
func DeploymentInfo(ctx context.Context, client *codersdk.Client, log slog.Logger) Deployment {
65-
var (
66-
d Deployment
67-
m sync.Mutex
68-
wg sync.WaitGroup
69-
)
70-
71-
wg.Add(1)
72-
go func() {
73-
defer wg.Done()
66+
// Note: each goroutine assigns to a different struct field, hence no mutex.
67+
var d Deployment
68+
eg, ctx := errgroup.WithContext(ctx)
69+
eg.Go(func() error {
7470
bi, err := client.BuildInfo(ctx)
7571
if err != nil {
76-
log.Error(ctx, "fetch build info", slog.Error(err))
77-
return
72+
return xerrors.Errorf("fetch build info: %w", err)
7873
}
79-
m.Lock()
8074
d.BuildInfo = &bi
81-
m.Unlock()
82-
}()
75+
return nil
76+
})
8377

84-
wg.Add(1)
85-
go func() {
86-
defer wg.Done()
78+
eg.Go(func() error {
8779
dc, err := client.DeploymentConfig(ctx)
8880
if err != nil {
89-
log.Error(ctx, "fetch deployment config", slog.Error(err))
90-
return
81+
return xerrors.Errorf("fetch deployment config: %w", err)
9182
}
92-
m.Lock()
9383
d.Config = dc
94-
m.Unlock()
95-
}()
84+
return nil
85+
})
9686

97-
wg.Add(1)
98-
go func() {
99-
defer wg.Done()
87+
eg.Go(func() error {
10088
hr, err := client.DebugHealth(ctx)
10189
if err != nil {
102-
log.Error(ctx, "fetch health report", slog.Error(err))
103-
return
90+
return xerrors.Errorf("fetch health report: %w", err)
10491
}
105-
m.Lock()
10692
d.HealthReport = &hr
107-
m.Unlock()
108-
}()
93+
return nil
94+
})
10995

110-
wg.Add(1)
111-
go func() {
112-
defer wg.Done()
96+
eg.Go(func() error {
11397
exp, err := client.Experiments(ctx)
11498
if err != nil {
115-
log.Error(ctx, "fetch experiments", slog.Error(err))
116-
return
99+
return xerrors.Errorf("fetch experiments: %w", err)
117100
}
118-
m.Lock()
119101
d.Experiments = exp
120-
m.Unlock()
121-
}()
102+
return nil
103+
})
104+
105+
if err := eg.Wait(); err != nil {
106+
log.Error(ctx, "fetch deployment information", slog.Error(err))
107+
}
122108

123-
wg.Wait()
124109
return d
125110
}
126111

127112
func NetworkInfo(ctx context.Context, client *codersdk.Client, log slog.Logger, agentID uuid.UUID) Network {
128-
var (
129-
n Network
130-
m sync.Mutex
131-
wg sync.WaitGroup
132-
)
113+
var n Network
133114

134-
wg.Add(1)
135-
go func() {
136-
defer wg.Done()
115+
eg, ctx := errgroup.WithContext(ctx)
116+
eg.Go(func() error {
137117
coordResp, err := client.Request(ctx, http.MethodGet, "/api/v2/debug/coordinator", nil)
138118
if err != nil {
139-
log.Error(ctx, "fetch coordinator debug page", slog.Error(err))
140-
return
119+
return xerrors.Errorf("fetch coordinator debug page: %w", err)
141120
}
142121
defer coordResp.Body.Close()
143122
bs, err := io.ReadAll(coordResp.Body)
144123
if err != nil {
145-
log.Error(ctx, "read coordinator debug page", slog.Error(err))
146-
return
124+
return xerrors.Errorf("read coordinator debug page: %w", err)
147125
}
148-
m.Lock()
149126
n.CoordinatorDebug = string(bs)
150-
m.Unlock()
151-
}()
127+
return nil
128+
})
152129

153-
wg.Add(1)
154-
go func() {
155-
defer wg.Done()
130+
eg.Go(func() error {
156131
tailResp, err := client.Request(ctx, http.MethodGet, "/api/v2/debug/tailnet", nil)
157132
if err != nil {
158-
log.Error(ctx, "fetch tailnet debug page", slog.Error(err))
159-
return
133+
return xerrors.Errorf("fetch tailnet debug page: %w", err)
160134
}
161135
defer tailResp.Body.Close()
162136
bs, err := io.ReadAll(tailResp.Body)
163137
if err != nil {
164-
log.Error(ctx, "read tailnet debug page", slog.Error(err))
165-
return
138+
return xerrors.Errorf("read tailnet debug page: %w", err)
166139
}
167-
m.Lock()
168140
n.TailnetDebug = string(bs)
169-
m.Unlock()
170-
}()
141+
return nil
142+
})
171143

172-
wg.Add(1)
173-
go func() {
174-
defer wg.Done()
144+
eg.Go(func() error {
175145
if agentID == uuid.Nil {
176146
log.Warn(ctx, "agent id required for agent connection info")
177-
return
147+
return nil
178148
}
179149
connInfo, err := client.WorkspaceAgentConnectionInfo(ctx, agentID)
180150
if err != nil {
181-
log.Error(ctx, "fetch agent conn info", slog.Error(err), slog.F("agent_id", agentID.String()))
182-
return
151+
return xerrors.Errorf("fetch agent conn info: %w", err)
183152
}
184-
m.Lock()
185153
n.NetcheckLocal = &connInfo
186-
m.Unlock()
187-
}()
154+
return nil
155+
})
188156

189-
wg.Wait()
157+
if err := eg.Wait(); err != nil {
158+
log.Error(ctx, "fetch network information", slog.Error(err))
159+
}
190160

191161
return n
192162
}
193163

194164
func WorkspaceInfo(ctx context.Context, client *codersdk.Client, log slog.Logger, workspaceID, agentID uuid.UUID) Workspace {
195-
var (
196-
w Workspace
197-
m sync.Mutex
198-
wg sync.WaitGroup
199-
)
165+
var w Workspace
200166

201167
if workspaceID == uuid.Nil {
202168
log.Error(ctx, "no workspace id specified")
@@ -215,58 +181,52 @@ func WorkspaceInfo(ctx context.Context, client *codersdk.Client, log slog.Logger
215181
}
216182
w.Workspace = ws
217183

218-
wg.Add(1)
219-
go func() {
220-
defer wg.Done()
184+
eg, ctx := errgroup.WithContext(ctx)
185+
186+
eg.Go(func() error {
221187
agt, err := client.WorkspaceAgent(ctx, agentID)
222188
if err != nil {
223-
log.Error(ctx, "fetch workspace agent", slog.Error(err), slog.F("agent_id", agentID))
189+
return xerrors.Errorf("fetch workspace agent: %w", err)
224190
}
225-
m.Lock()
226191
w.Agent = agt
227-
m.Unlock()
228-
}()
192+
return nil
193+
})
229194

230-
wg.Add(1)
231-
go func() {
232-
defer wg.Done()
195+
eg.Go(func() error {
233196
buildLogCh, closer, err := client.WorkspaceBuildLogsAfter(ctx, ws.LatestBuild.ID, 0)
234197
if err != nil {
235-
log.Error(ctx, "fetch provisioner job logs", slog.Error(err), slog.F("job_id", ws.LatestBuild.Job.ID.String()))
236-
return
198+
return xerrors.Errorf("fetch provisioner job logs: %w", err)
237199
}
238200
defer closer.Close()
239201
var logs []codersdk.ProvisionerJobLog
240202
for log := range buildLogCh {
241203
logs = append(w.BuildLogs, log)
242204
}
243-
m.Lock()
244205
w.BuildLogs = logs
245-
m.Unlock()
246-
}()
206+
return nil
207+
})
247208

248-
wg.Add(1)
249-
go func() {
250-
defer wg.Done()
209+
eg.Go(func() error {
251210
if len(w.Workspace.LatestBuild.Resources) == 0 {
252211
log.Warn(ctx, "workspace build has no resources")
253-
return
212+
return nil
254213
}
255214
agentLogCh, closer, err := client.WorkspaceAgentLogsAfter(ctx, agentID, 0, false)
256215
if err != nil {
257-
log.Error(ctx, "fetch agent startup logs", slog.Error(err), slog.F("agent_id", agentID.String()))
216+
return xerrors.Errorf("fetch agent startup logs: %w", err)
258217
}
259218
defer closer.Close()
260219
var logs []codersdk.WorkspaceAgentLog
261220
for logChunk := range agentLogCh {
262221
logs = append(w.AgentStartupLogs, logChunk...)
263222
}
264-
m.Lock()
265223
w.AgentStartupLogs = logs
266-
m.Unlock()
267-
}()
224+
return nil
225+
})
268226

269-
wg.Wait()
227+
if err := eg.Wait(); err != nil {
228+
log.Error(ctx, "fetch workspace information", slog.Error(err))
229+
}
270230

271231
return w
272232
}

0 commit comments

Comments
 (0)