@@ -178,11 +178,26 @@ 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
}
185
185
186
+ state , err := rpty .state .waitForStateOrContext (ctx , StateReady )
187
+ if state != StateReady {
188
+ return xerrors .Errorf ("reconnecting pty ready wait: %w" , err )
189
+ }
190
+
191
+ go heartbeat (ctx , rpty .timer , rpty .timeout )
192
+
193
+ // Resize the PTY to initial height + width.
194
+ err = rpty .ptty .Resize (height , width )
195
+ if err != nil {
196
+ // We can continue after this, it's not fatal!
197
+ logger .Warn (ctx , "reconnecting PTY initial resize failed, but will continue" , slog .Error (err ))
198
+ rpty .metrics .WithLabelValues ("resize" ).Add (1 )
199
+ }
200
+
186
201
defer func () {
187
202
rpty .state .cond .L .Lock ()
188
203
defer rpty .state .cond .L .Unlock ()
@@ -194,10 +209,10 @@ func (rpty *bufferedReconnectingPTY) Attach(ctx context.Context, connID string,
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