@@ -13,66 +13,50 @@ import (
1313)
1414
1515func TestWorkerReconcilesEnvironmentPromotionBeforeStart (t * testing.T ) {
16- for _ , deleted := range []bool {false , true } {
17- t .Run (map [bool ]string {false : "unbound" , true : "deleted" }[deleted ], func (t * testing.T ) {
18- s , _ := testStore (t )
19- tenant , pending := newEnvironmentExpiryReservation (t , s )
20- owner := executionOwner (t , s )
21- got , err := owner .Sessions .PromoteEnvironmentInput (t .Context (), tenant , pending .SessionID , pending .ID )
22- if err != nil || len (got .Receipts ) != 1 || got .Receipts [0 ].Replayed {
23- t .Fatal (got , err )
24- }
25- turnID := got .Receipts [0 ].TurnID
26- if deleted {
27- if err := sessionService (t , s ).DeleteSession (t .Context (), sessions.DeleteSessionCommand {TenantID : tenant , SessionID : pending .SessionID }); ! errors .Is (err , sessions .ErrNotIdle ) {
28- t .Fatal ("claimed Session deleted" , err )
29- }
30- if err := s .commitLegacyDeletion (t .Context (), tenant , pending .SessionID ); err != nil {
31- t .Fatal (err )
32- }
33- }
34- turn , err := sessionAdapter (s ).GetTurn (t .Context (), tenant , pending .SessionID , turnID )
35- if err != nil || turn .Status != sessions .TurnInProgress || (deleted && turn .CancelRequestedAt .IsZero ()) {
36- t .Fatal ("promotion did not retain the active claim" , turn , err )
37- }
38- // Simulate owner loss after commit, without sending any daemon Start.
39- awaitRelease := pgtest .ObserveExecutionLeaseRelease (t , s .pool )
40- if err := owner .Lease .Close (t .Context ()); err != nil {
41- t .Fatal (err )
42- }
43- awaitRelease ()
44- restarted := startWorker (t , t .Context (), s , & execution.Dispatcher {Registry : runtimegateway .NewRegistry ()})
45- stopped , cancel := context .WithCancel (t .Context ())
46- cancel ()
47- awaitRelease = pgtest .ObserveExecutionLeaseRelease (t , s .pool )
48- if err := restarted .Run (stopped ); ! errors .Is (err , context .Canceled ) {
49- t .Fatal (err )
50- }
51- awaitRelease ()
52- turn , err = sessionAdapter (s ).GetTurn (t .Context (), tenant , pending .SessionID , turnID )
53- var outcome struct {
54- ErrorCode string `json:"error_code"`
55- }
56- if err != nil || turn .Status != sessions .TurnFailed || json .Unmarshal (turn .Outcome , & outcome ) != nil || outcome .ErrorCode != "execution_interrupted" {
57- t .Fatal ("restart failed to settle the original claim" , turn , err )
58- }
59- var turns , inputs , queued int
60- err = s .pool .QueryRow (t .Context (), `SELECT
61- (SELECT count(*) FROM turns WHERE session_id=$1),
62- (SELECT count(*) FROM turn_inputs WHERE session_id=$1),
63- (SELECT count(*) FROM turns WHERE session_id=$1 AND status='queued')` , pending .SessionID ).Scan (& turns , & inputs , & queued )
64- if err != nil || turns != 1 || inputs != 1 || queued != 0 {
65- t .Fatal ("restart duplicated or requeued prepared work" , turns , inputs , queued , err )
66- }
67- successor := executionOwner (t , s ).Sessions
68- retry , err := successor .PromoteEnvironmentInput (t .Context (), tenant , pending .SessionID , pending .ID )
69- if deleted {
70- if ! errors .Is (err , sessions .ErrNotFound ) {
71- t .Fatal ("deleted reservation was exposed" , err )
72- }
73- } else if err != nil || len (retry .Receipts ) != 1 || ! retry .Receipts [0 ].Replayed || retry .Receipts [0 ].Sequence != got .Receipts [0 ].Sequence || retry .Receipts [0 ].TurnID != turnID {
74- t .Fatal ("recovery retry authorized another start" , retry , err )
75- }
76- })
16+ s , _ := testStore (t )
17+ tenant , pending := newEnvironmentExpiryReservation (t , s )
18+ owner := executionOwner (t , s )
19+ got , err := owner .Sessions .PromoteEnvironmentInput (t .Context (), tenant , pending .SessionID , pending .ID )
20+ if err != nil || len (got .Receipts ) != 1 || got .Receipts [0 ].Replayed {
21+ t .Fatal (got , err )
22+ }
23+ turnID := got .Receipts [0 ].TurnID
24+ turn , err := sessionAdapter (s ).GetTurn (t .Context (), tenant , pending .SessionID , turnID )
25+ if err != nil || turn .Status != sessions .TurnInProgress {
26+ t .Fatal ("promotion did not retain the active claim" , turn , err )
27+ }
28+ // Simulate owner loss after commit, without sending any daemon Start.
29+ awaitRelease := pgtest .ObserveExecutionLeaseRelease (t , s .pool )
30+ if err := owner .Lease .Close (t .Context ()); err != nil {
31+ t .Fatal (err )
32+ }
33+ awaitRelease ()
34+ restarted := startWorker (t , t .Context (), s , & execution.Dispatcher {Registry : runtimegateway .NewRegistry ()})
35+ stopped , cancel := context .WithCancel (t .Context ())
36+ cancel ()
37+ awaitRelease = pgtest .ObserveExecutionLeaseRelease (t , s .pool )
38+ if err := restarted .Run (stopped ); ! errors .Is (err , context .Canceled ) {
39+ t .Fatal (err )
40+ }
41+ awaitRelease ()
42+ turn , err = sessionAdapter (s ).GetTurn (t .Context (), tenant , pending .SessionID , turnID )
43+ var outcome struct {
44+ ErrorCode string `json:"error_code"`
45+ }
46+ if err != nil || turn .Status != sessions .TurnFailed || json .Unmarshal (turn .Outcome , & outcome ) != nil || outcome .ErrorCode != "execution_interrupted" {
47+ t .Fatal ("restart failed to settle the original claim" , turn , err )
48+ }
49+ var turns , inputs , queued int
50+ err = s .pool .QueryRow (t .Context (), `SELECT
51+ (SELECT count(*) FROM turns WHERE session_id=$1),
52+ (SELECT count(*) FROM turn_inputs WHERE session_id=$1),
53+ (SELECT count(*) FROM turns WHERE session_id=$1 AND status='queued')` , pending .SessionID ).Scan (& turns , & inputs , & queued )
54+ if err != nil || turns != 1 || inputs != 1 || queued != 0 {
55+ t .Fatal ("restart duplicated or requeued prepared work" , turns , inputs , queued , err )
56+ }
57+ successor := executionOwner (t , s ).Sessions
58+ retry , err := successor .PromoteEnvironmentInput (t .Context (), tenant , pending .SessionID , pending .ID )
59+ if err != nil || len (retry .Receipts ) != 1 || ! retry .Receipts [0 ].Replayed || retry .Receipts [0 ].Sequence != got .Receipts [0 ].Sequence || retry .Receipts [0 ].TurnID != turnID {
60+ t .Fatal ("recovery retry authorized another start" , retry , err )
7761 }
7862}
0 commit comments