@@ -817,12 +817,13 @@ func (api *API) watchWorkspaceAgentContainers(rw http.ResponseWriter, r *http.Re
817
817
var (
818
818
ctx = r .Context ()
819
819
workspaceAgent = httpmw .WorkspaceAgentParam (r )
820
+ logger = api .Logger .Named ("agent_container_watcher" ).With (slog .F ("agent_id" ,workspaceAgent .ID ))
820
821
)
821
822
822
823
// If the agent is unreachable, the request will hang. Assume that if we
823
824
// don't get a response after 30s that the agent is unreachable.
824
- dialCtx ,cancel := context .WithTimeout (ctx ,30 * time .Second )
825
- defer cancel ()
825
+ dialCtx ,dialCancel := context .WithTimeout (ctx ,30 * time .Second )
826
+ defer dialCancel ()
826
827
apiAgent ,err := db2sdk .WorkspaceAgent (
827
828
api .DERPMap (),
828
829
* api .TailnetCoordinator .Load (),
@@ -857,8 +858,7 @@ func (api *API) watchWorkspaceAgentContainers(rw http.ResponseWriter, r *http.Re
857
858
}
858
859
defer release ()
859
860
860
- watcherLogger := api .Logger .Named ("agent_container_watcher" ).With (slog .F ("agent_id" ,workspaceAgent .ID ))
861
- containersCh ,closer ,err := agentConn .WatchContainers (ctx ,watcherLogger )
861
+ containersCh ,closer ,err := agentConn .WatchContainers (ctx ,logger )
862
862
if err != nil {
863
863
httpapi .Write (ctx ,rw ,http .StatusInternalServerError , codersdk.Response {
864
864
Message :"Internal error watching agent's containers." ,
@@ -877,14 +877,17 @@ func (api *API) watchWorkspaceAgentContainers(rw http.ResponseWriter, r *http.Re
877
877
return
878
878
}
879
879
880
+ ctx ,cancel := context .WithCancel (r .Context ())
881
+ defer cancel ()
882
+
880
883
// Here we close the websocket for reading, so that the websocket library will handle pings and
881
884
// close frames.
882
885
_ = conn .CloseRead (context .Background ())
883
886
884
887
ctx ,wsNetConn := codersdk .WebsocketNetConn (ctx ,conn ,websocket .MessageText )
885
888
defer wsNetConn .Close ()
886
889
887
- go httpapi .Heartbeat (ctx ,conn )
890
+ go httpapi .HeartbeatClose (ctx , logger , cancel ,conn )
888
891
889
892
encoder := json .NewEncoder (wsNetConn )
890
893