Skip to content

Commit 89f3db5

Browse files
committed
fix(codersdk): Wait for subscription in WatchWorkspaceAgentMetadata
1 parent 3e908d7 commit 89f3db5

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

coderd/workspaceagents_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -1335,6 +1335,9 @@ func TestWorkspaceAgent_Metadata(t *testing.T) {
13351335
tooLongValueMetadata.CollectedAt = time.Now()
13361336
post("foo3", tooLongValueMetadata)
13371337
got := recvUpdate()[2]
1338+
for len(got.Result.Value) != maxValueLen {
1339+
got = recvUpdate()[2]
1340+
}
13381341
require.Len(t, got.Result.Value, maxValueLen)
13391342
require.NotEmpty(t, got.Result.Error)
13401343

codersdk/workspaceagents.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ func (c *Client) WatchWorkspaceAgentMetadata(ctx context.Context, id uuid.UUID)
304304

305305
metadataChan := make(chan []WorkspaceAgentMetadata, 256)
306306

307+
ready := make(chan struct{})
307308
watch := func() error {
308309
res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspaceagents/%s/watch-metadata", id), nil)
309310
if err != nil {
@@ -316,19 +317,24 @@ func (c *Client) WatchWorkspaceAgentMetadata(ctx context.Context, id uuid.UUID)
316317
nextEvent := ServerSentEventReader(ctx, res.Body)
317318
defer res.Body.Close()
318319

320+
firstEvent := true
319321
for {
320322
select {
321323
case <-ctx.Done():
322324
return ctx.Err()
323325
default:
324-
break
325326
}
326327

327328
sse, err := nextEvent()
328329
if err != nil {
329330
return err
330331
}
331332

333+
if firstEvent {
334+
close(ready) // Only close ready after the first event is received.
335+
firstEvent = false
336+
}
337+
332338
b, ok := sse.Data.([]byte)
333339
if !ok {
334340
return xerrors.Errorf("unexpected data type: %T", sse.Data)
@@ -358,9 +364,18 @@ func (c *Client) WatchWorkspaceAgentMetadata(ctx context.Context, id uuid.UUID)
358364
errorChan := make(chan error, 1)
359365
go func() {
360366
defer close(errorChan)
361-
errorChan <- watch()
367+
err := watch()
368+
select {
369+
case <-ready:
370+
default:
371+
close(ready) // Error before first event.
372+
}
373+
errorChan <- err
362374
}()
363375

376+
// Wait until first event is received and the subscription is registered.
377+
<-ready
378+
364379
return metadataChan, errorChan
365380
}
366381

0 commit comments

Comments
 (0)