@@ -274,7 +274,6 @@ func (api *API) patchWorkspaceAgentStartupLogs(rw http.ResponseWriter, r *http.R
274
274
CreatedAfter : lowestID - 1 ,
275
275
})
276
276
if err != nil {
277
-
278
277
httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
279
278
Message : "Failed to marshal startup logs notify message" ,
280
279
Detail : err .Error (),
@@ -374,32 +373,28 @@ func (api *API) workspaceAgentStartupLogs(rw http.ResponseWriter, r *http.Reques
374
373
ctx , wsNetConn := websocketNetConn (ctx , conn , websocket .MessageText )
375
374
defer wsNetConn .Close () // Also closes conn.
376
375
377
- logIdsDone := make (map [int64 ]bool )
378
-
379
376
// The Go stdlib JSON encoder appends a newline character after message write.
380
377
encoder := json .NewEncoder (wsNetConn )
381
- for _ , provisionerJobLog := range logs {
382
- logIdsDone [provisionerJobLog .ID ] = true
383
- err = encoder .Encode (convertWorkspaceAgentStartupLog (provisionerJobLog ))
384
- if err != nil {
385
- return
386
- }
378
+ err = encoder .Encode (convertWorkspaceAgentStartupLogs (logs ))
379
+ if err != nil {
380
+ return
387
381
}
388
382
if agent .LifecycleState == database .WorkspaceAgentLifecycleStateReady {
389
383
// The startup script has finished running, so we can close the connection.
390
384
return
391
385
}
392
386
393
387
var (
394
- bufferedLogs = make (chan * database.WorkspaceAgentStartupLog , 128 )
388
+ // It's not impossible that
389
+ bufferedLogs = make (chan []database.WorkspaceAgentStartupLog , 128 )
395
390
endOfLogs atomic.Bool
396
391
lastSentLogID atomic.Int64
397
392
)
398
393
399
- sendLog := func (log * database.WorkspaceAgentStartupLog ) {
394
+ sendLogs := func (logs [] database.WorkspaceAgentStartupLog ) {
400
395
select {
401
- case bufferedLogs <- log :
402
- lastSentLogID .Store (log .ID )
396
+ case bufferedLogs <- logs :
397
+ lastSentLogID .Store (logs [ len ( logs ) - 1 ] .ID )
403
398
default :
404
399
logger .Warn (ctx , "workspace agent startup log overflowing channel" )
405
400
}
@@ -427,13 +422,7 @@ func (api *API) workspaceAgentStartupLogs(rw http.ResponseWriter, r *http.Reques
427
422
logger .Warn (ctx , "failed to get workspace agent startup logs after" , slog .Error (err ))
428
423
return
429
424
}
430
- for _ , log := range logs {
431
- if endOfLogs .Load () {
432
- return
433
- }
434
- log := log
435
- sendLog (& log )
436
- }
425
+ sendLogs (logs )
437
426
}
438
427
439
428
if jlMsg .EndOfLogs {
@@ -446,10 +435,7 @@ func (api *API) workspaceAgentStartupLogs(rw http.ResponseWriter, r *http.Reques
446
435
logger .Warn (ctx , "get workspace agent startup logs after" , slog .Error (err ))
447
436
return
448
437
}
449
- for _ , log := range logs {
450
- log := log
451
- sendLog (& log )
452
- }
438
+ sendLogs (logs )
453
439
bufferedLogs <- nil
454
440
}
455
441
},
@@ -468,19 +454,15 @@ func (api *API) workspaceAgentStartupLogs(rw http.ResponseWriter, r *http.Reques
468
454
case <- ctx .Done ():
469
455
logger .Debug (context .Background (), "job logs context canceled" )
470
456
return
471
- case log , ok := <- bufferedLogs :
457
+ case logs , ok := <- bufferedLogs :
472
458
// A nil log is sent when complete!
473
- if ! ok || log == nil {
459
+ if ! ok || logs == nil {
474
460
logger .Debug (context .Background (), "reached the end of published logs" )
475
461
return
476
462
}
477
- if logIdsDone [log .ID ] {
478
- logger .Debug (ctx , "subscribe duplicated log" )
479
- } else {
480
- err = encoder .Encode (convertWorkspaceAgentStartupLog (* log ))
481
- if err != nil {
482
- return
483
- }
463
+ err = encoder .Encode (convertWorkspaceAgentStartupLogs (logs ))
464
+ if err != nil {
465
+ return
484
466
}
485
467
}
486
468
}
0 commit comments