@@ -178,7 +178,7 @@ func (rpty *bufferedReconnectingPTY) Attach(ctx context.Context, connID string,
178
178
ctx , cancel := context .WithCancel (ctx )
179
179
defer cancel ()
180
180
181
- err := rpty .doAttach (ctx , connID , conn , height , width , logger )
181
+ err := rpty .doAttach (connID , conn )
182
182
if err != nil {
183
183
return err
184
184
}
@@ -189,15 +189,30 @@ func (rpty *bufferedReconnectingPTY) Attach(ctx context.Context, connID string,
189
189
delete (rpty .activeConns , connID )
190
190
}()
191
191
192
+ state , err := rpty .state .waitForStateOrContext (ctx , StateReady )
193
+ if state != StateReady {
194
+ return xerrors .Errorf ("reconnecting pty ready wait: %w" , err )
195
+ }
196
+
197
+ go heartbeat (ctx , rpty .timer , rpty .timeout )
198
+
199
+ // Resize the PTY to initial height + width.
200
+ err = rpty .ptty .Resize (height , width )
201
+ if err != nil {
202
+ // We can continue after this, it's not fatal!
203
+ logger .Warn (ctx , "reconnecting PTY initial resize failed, but will continue" , slog .Error (err ))
204
+ rpty .metrics .WithLabelValues ("resize" ).Add (1 )
205
+ }
206
+
192
207
// Pipe conn -> pty and block. pty -> conn is handled in newBuffered().
193
208
readConnLoop (ctx , conn , rpty .ptty , rpty .metrics , logger )
194
209
return nil
195
210
}
196
211
197
- // doAttach adds the connection to the map, replays the buffer, and starts the
198
- // heartbeat. It exists separately only so we can defer the mutex unlock which
199
- // is not possible in Attach since it blocks.
200
- func (rpty * bufferedReconnectingPTY ) doAttach (ctx context. Context , connID string , conn net.Conn , height , width uint16 , logger slog. Logger ) error {
212
+ // doAttach adds the connection to the map and replays the buffer. It exists
213
+ // separately only for convenience to defer the mutex unlock which is not
214
+ // possible in Attach since it blocks.
215
+ func (rpty * bufferedReconnectingPTY ) doAttach (connID string , conn net.Conn ) error {
201
216
rpty .state .cond .L .Lock ()
202
217
defer rpty .state .cond .L .Unlock ()
203
218
@@ -211,21 +226,6 @@ func (rpty *bufferedReconnectingPTY) doAttach(ctx context.Context, connID string
211
226
return xerrors .Errorf ("write buffer to conn: %w" , err )
212
227
}
213
228
214
- state , err := rpty .state .waitForStateOrContextLocked (ctx , StateReady )
215
- if state != StateReady {
216
- return xerrors .Errorf ("reconnecting pty ready wait: %w" , err )
217
- }
218
-
219
- go heartbeat (ctx , rpty .timer , rpty .timeout )
220
-
221
- // Resize the PTY to initial height + width.
222
- err = rpty .ptty .Resize (height , width )
223
- if err != nil {
224
- // We can continue after this, it's not fatal!
225
- logger .Warn (ctx , "reconnecting PTY initial resize failed, but will continue" , slog .Error (err ))
226
- rpty .metrics .WithLabelValues ("resize" ).Add (1 )
227
- }
228
-
229
229
rpty .activeConns [connID ] = conn
230
230
231
231
return nil
0 commit comments