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

Lines changed: 3 additions & 0 deletions
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

Lines changed: 17 additions & 2 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy