@@ -24,7 +24,7 @@ import (
2424 "github.com/stretchr/testify/require"
2525)
2626
27- func TestPendingMessageQueue_TryEnqueueDropsDuplicatesUntilDone (t * testing.T ) {
27+ func TestPendingMessageQueue_TryEnqueueDropsDuplicatesOnlyWhileQueued (t * testing.T ) {
2828 t .Parallel ()
2929
3030 q := newPendingMessageQueue ()
@@ -38,14 +38,18 @@ func TestPendingMessageQueue_TryEnqueueDropsDuplicatesUntilDone(t *testing.T) {
3838 require .True (t , q .TryEnqueue (key , msg ))
3939 require .False (t , q .TryEnqueue (key , msg ))
4040
41- poppedKey , ok := q .Pop ()
41+ poppedMsg , ok := q .Pop ()
4242 require .True (t , ok )
43- require .Equal (t , key , poppedKey )
43+ require .Same (t , msg , poppedMsg )
4444
45- // The key remains pending while being processed.
45+ // Once the request is popped, allow one queued retry for the next round.
46+ require .True (t , q .TryEnqueue (key , msg ))
4647 require .False (t , q .TryEnqueue (key , msg ))
4748
48- q .Done (key )
49+ nextMsg , ok := q .Pop ()
50+ require .True (t , ok )
51+ require .Same (t , msg , nextMsg )
52+
4953 require .True (t , q .TryEnqueue (key , msg ))
5054}
5155
@@ -62,15 +66,13 @@ func TestPendingMessageQueue_OrderPreservedAcrossKeys(t *testing.T) {
6266 require .True (t , q .TryEnqueue (key1 , & messaging.TargetMessage {Type : key1 .msgType }))
6367 require .True (t , q .TryEnqueue (key2 , & messaging.TargetMessage {Type : key2 .msgType }))
6468
65- poppedKey , ok := q .Pop ()
69+ poppedMsg , ok := q .Pop ()
6670 require .True (t , ok )
67- require .Equal (t , key1 , poppedKey )
68- q .Done (poppedKey )
71+ require .Equal (t , key1 .msgType , poppedMsg .Type )
6972
70- poppedKey , ok = q .Pop ()
73+ poppedMsg , ok = q .Pop ()
7174 require .True (t , ok )
72- require .Equal (t , key2 , poppedKey )
73- q .Done (poppedKey )
75+ require .Equal (t , key2 .msgType , poppedMsg .Type )
7476}
7577
7678func TestPendingMessageQueue_PopReturnsAfterClose (t * testing.T ) {
@@ -118,17 +120,14 @@ func TestPendingMessageQueue_CloseRequestRemovedTrueOverridesPendingFalse(t *tes
118120 require .True (t , q .TryEnqueue (key , msgFalse ))
119121 require .True (t , q .TryEnqueue (key , msgTrue ))
120122
121- poppedKey , ok := q .Pop ()
123+ poppedMsg , ok := q .Pop ()
122124 require .True (t , ok )
123- require .Equal (t , key , poppedKey )
124- poppedMsg := q .Get (poppedKey )
125125 require .NotNil (t , poppedMsg )
126126 req := poppedMsg .Message [0 ].(* heartbeatpb.MaintainerCloseRequest )
127127 require .True (t , req .Removed )
128- q .Done (key )
129128}
130129
131- func TestPendingMessageQueue_CloseRequestUpgradeBetweenPopAndGet (t * testing.T ) {
130+ func TestPendingMessageQueue_CloseRequestUpgradeAfterPopKeepsReturnedMessageStable (t * testing.T ) {
132131 t .Parallel ()
133132
134133 q := newPendingMessageQueue ()
@@ -150,16 +149,67 @@ func TestPendingMessageQueue_CloseRequestUpgradeBetweenPopAndGet(t *testing.T) {
150149 )
151150
152151 require .True (t , q .TryEnqueue (key , msgFalse ))
153- poppedKey , ok := q .Pop ()
152+ poppedMsg , ok := q .Pop ()
154153 require .True (t , ok )
155- require .Equal (t , key , poppedKey )
154+ require .NotNil (t , poppedMsg )
156155
157156 require .True (t , q .TryEnqueue (key , msgTrue ))
158- poppedMsg := q .Get (poppedKey )
159- require .NotNil (t , poppedMsg )
160157 req2 := poppedMsg .Message [0 ].(* heartbeatpb.MaintainerCloseRequest )
161- require .True (t , req2 .Removed )
162- q .Done (key )
158+ require .False (t , req2 .Removed )
159+ }
160+
161+ func TestPendingMessageQueue_CloseRequestUpgradeAfterPopRequeuesNextRound (t * testing.T ) {
162+ t .Parallel ()
163+
164+ q := newPendingMessageQueue ()
165+ cfID := common .NewChangeFeedIDWithName ("cf" , "default" )
166+ key := pendingMessageKey {
167+ changefeedID : cfID ,
168+ msgType : messaging .TypeMaintainerCloseRequest ,
169+ }
170+
171+ msgFalse := messaging .NewSingleTargetMessage (
172+ node .ID ("to" ),
173+ messaging .DispatcherManagerManagerTopic ,
174+ & heartbeatpb.MaintainerCloseRequest {ChangefeedID : cfID .ToPB (), Removed : false },
175+ )
176+ msgTrue := messaging .NewSingleTargetMessage (
177+ node .ID ("to" ),
178+ messaging .DispatcherManagerManagerTopic ,
179+ & heartbeatpb.MaintainerCloseRequest {ChangefeedID : cfID .ToPB (), Removed : true },
180+ )
181+
182+ require .True (t , q .TryEnqueue (key , msgFalse ))
183+
184+ poppedMsg , ok := q .Pop ()
185+ require .True (t , ok )
186+
187+ require .NotNil (t , poppedMsg )
188+ req := poppedMsg .Message [0 ].(* heartbeatpb.MaintainerCloseRequest )
189+ require .False (t , req .Removed )
190+
191+ require .True (t , q .TryEnqueue (key , msgTrue ))
192+
193+ type popResult struct {
194+ msg * messaging.TargetMessage
195+ ok bool
196+ }
197+ resultCh := make (chan popResult , 1 )
198+ go func () {
199+ nextMsg , nextOK := q .Pop ()
200+ resultCh <- popResult {msg : nextMsg , ok : nextOK }
201+ }()
202+
203+ select {
204+ case result := <- resultCh :
205+ require .True (t , result .ok )
206+ require .NotNil (t , result .msg )
207+ nextReq := result .msg .Message [0 ].(* heartbeatpb.MaintainerCloseRequest )
208+ require .True (t , nextReq .Removed )
209+ case <- time .After (time .Second ):
210+ q .Close ()
211+ require .FailNow (t , "upgraded close request was not requeued after the first pop" )
212+ }
163213}
164214
165215func TestGetPendingMessageKey_SupportedTypes (t * testing.T ) {
0 commit comments