@@ -191,17 +191,22 @@ func expectProcessingLogAndHandoff(t *testing.T, m processMocks, id string, vers
191191
192192func expectProcessingLog (t * testing.T , m processMocks , id string , version int32 ) * gomock.Call {
193193 t .Helper ()
194+ return expectStateLog (t , m , id , entity .RequestStateProcessing , version , entity .RequestOutcomeReasonUnknown )
195+ }
196+
197+ func expectStateLog (t * testing.T , m processMocks , id string , state entity.RequestState , version int32 , reason entity.RequestOutcomeReason ) * gomock.Call {
198+ t .Helper ()
194199
195200 request := entity.Request {
196201 ID : id ,
197202 Queue : testQueue ,
198- State : entity . RequestStateProcessing ,
203+ State : state ,
199204 Version : version ,
200205 }
201206 return m .materializer .EXPECT ().PersistLog (
202207 gomock .Any (),
203208 m .store ,
204- requestlog .NewRequestStateLog (request , entity . RequestOutcomeReasonUnknown ),
209+ requestlog .NewRequestStateLog (request , reason ),
205210 ).Return (nil )
206211}
207212
@@ -487,11 +492,27 @@ func TestProcess(t *testing.T) {
487492 wantRetry bool
488493 }{
489494 {
490- name : "superseded is no-op " ,
495+ name : "superseded redelivery repairs its state log " ,
491496 setup : func (m processMocks ) {
492497 m .reqStore .EXPECT ().Get (gomock .Any (), testID ).Return (entity.Request {
493498 ID : testID , Queue : testQueue , State : entity .RequestStateSuperseded , Version : 2 ,
494499 }, nil )
500+ expectStateLog (t , m , testID , entity .RequestStateSuperseded , 2 , entity .RequestOutcomeReasonSupersededByNewerHead )
501+ },
502+ },
503+ {
504+ name : "superseded redelivery fails when log persistence fails" ,
505+ wantErr : true ,
506+ setup : func (m processMocks ) {
507+ request := entity.Request {
508+ ID : testID , Queue : testQueue , State : entity .RequestStateSuperseded , Version : 2 ,
509+ }
510+ m .reqStore .EXPECT ().Get (gomock .Any (), testID ).Return (request , nil )
511+ m .materializer .EXPECT ().PersistLog (
512+ gomock .Any (),
513+ m .store ,
514+ requestlog .NewRequestStateLog (request , entity .RequestOutcomeReasonSupersededByNewerHead ),
515+ ).Return (errors .New ("db down" ))
495516 },
496517 },
497518 {
@@ -757,7 +778,8 @@ func TestProcess(t *testing.T) {
757778 }, nil )
758779 superseded := acceptedRequest (testID )
759780 superseded .State = entity .RequestStateSuperseded
760- m .reqStore .EXPECT ().Update (gomock .Any (), superseded , int32 (1 ), int32 (2 )).Return (nil )
781+ updateCall := m .reqStore .EXPECT ().Update (gomock .Any (), superseded , int32 (1 ), int32 (2 )).Return (nil )
782+ expectStateLog (t , m , testID , entity .RequestStateSuperseded , 2 , entity .RequestOutcomeReasonSupersededByNewerHead ).After (updateCall )
761783 },
762784 },
763785 {
@@ -857,7 +879,32 @@ func TestProcess(t *testing.T) {
857879 }, nil )
858880 updated := acceptedRequest (testOlderID )
859881 updated .State = entity .RequestStateSuperseded
860- m .reqStore .EXPECT ().Update (gomock .Any (), updated , int32 (1 ), int32 (2 )).Return (nil )
882+ updateCall := m .reqStore .EXPECT ().Update (gomock .Any (), updated , int32 (1 ), int32 (2 )).Return (nil )
883+ expectStateLog (t , m , testOlderID , entity .RequestStateSuperseded , 2 , entity .RequestOutcomeReasonSupersededByNewerHead ).After (updateCall )
884+ },
885+ },
886+ {
887+ name : "superseded log failure retries the coalesce step" ,
888+ id : testOlderID ,
889+ wantErr : true ,
890+ setup : func (m processMocks ) {
891+ m .reqStore .EXPECT ().Get (gomock .Any (), testOlderID ).Return (acceptedRequest (testOlderID ), nil )
892+ m .queueStore .EXPECT ().Get (gomock .Any (), testQueue ).Return (entity.Queue {
893+ Name : testQueue ,
894+ LatestRequestID : testID ,
895+ Version : 1 ,
896+ }, nil )
897+ updated := acceptedRequest (testOlderID )
898+ updated .State = entity .RequestStateSuperseded
899+ updateCall := m .reqStore .EXPECT ().Update (gomock .Any (), updated , int32 (1 ), int32 (2 )).Return (nil )
900+ request := entity.Request {
901+ ID : testOlderID , Queue : testQueue , State : entity .RequestStateSuperseded , Version : 2 ,
902+ }
903+ m .materializer .EXPECT ().PersistLog (
904+ gomock .Any (),
905+ m .store ,
906+ requestlog .NewRequestStateLog (request , entity .RequestOutcomeReasonSupersededByNewerHead ),
907+ ).Return (errors .New ("db down" )).After (updateCall )
861908 },
862909 },
863910 {
@@ -873,9 +920,10 @@ func TestProcess(t *testing.T) {
873920 updated := acceptedRequest (testOlderID )
874921 updated .State = entity .RequestStateSuperseded
875922 m .reqStore .EXPECT ().Update (gomock .Any (), updated , int32 (1 ), int32 (2 )).Return (storage .ErrVersionMismatch )
876- m .reqStore .EXPECT ().Get (gomock .Any (), testOlderID ).Return (entity.Request {
923+ reloadCall := m .reqStore .EXPECT ().Get (gomock .Any (), testOlderID ).Return (entity.Request {
877924 ID : testOlderID , Queue : testQueue , State : entity .RequestStateSuperseded , Version : 2 ,
878925 }, nil )
926+ expectStateLog (t , m , testOlderID , entity .RequestStateSuperseded , 2 , entity .RequestOutcomeReasonSupersededByNewerHead ).After (reloadCall )
879927 },
880928 },
881929 {
0 commit comments