@@ -6467,7 +6467,7 @@ func TestJetStreamConsumerPendingLowerThanStreamFirstSeq(t *testing.T) {
6467
6467
})
6468
6468
require_NoError (t , err )
6469
6469
6470
- for i := 0 ; i < 100 ; i ++ {
6470
+ for i := 0 ; i < 10 ; i ++ {
6471
6471
sendStreamMsg (t , nc , "foo" , "msg" )
6472
6472
}
6473
6473
@@ -6482,7 +6482,8 @@ func TestJetStreamConsumerPendingLowerThanStreamFirstSeq(t *testing.T) {
6482
6482
6483
6483
sub := natsSubSync (t , nc , inbox )
6484
6484
for i := 0 ; i < 10 ; i ++ {
6485
- natsNexMsg (t , sub , time .Second )
6485
+ msg := natsNexMsg (t , sub , time .Second )
6486
+ require_NoError (t , msg .AckSync ())
6486
6487
}
6487
6488
6488
6489
acc , err := s .lookupAccount (globalAccountName )
@@ -6508,6 +6509,13 @@ func TestJetStreamConsumerPendingLowerThanStreamFirstSeq(t *testing.T) {
6508
6509
require_True (t , si .State .FirstSeq == 1_000_000 )
6509
6510
require_True (t , si .State .LastSeq == 999_999 )
6510
6511
6512
+ acc , err = s .lookupAccount (globalAccountName )
6513
+ require_NoError (t , err )
6514
+ mset , err = acc .lookupStream ("TEST" )
6515
+ require_NoError (t , err )
6516
+ o = mset .lookupConsumer ("dur" )
6517
+ require_True (t , o != nil )
6518
+
6511
6519
natsSubSync (t , nc , inbox )
6512
6520
checkFor (t , 2 * time .Second , 15 * time .Millisecond , func () error {
6513
6521
ci , err := js .ConsumerInfo ("TEST" , "dur" )
@@ -6517,8 +6525,18 @@ func TestJetStreamConsumerPendingLowerThanStreamFirstSeq(t *testing.T) {
6517
6525
if ci .NumAckPending != 0 {
6518
6526
return fmt .Errorf ("NumAckPending should be 0, got %v" , ci .NumAckPending )
6519
6527
}
6520
- if ci .Delivered .Stream != 999_999 {
6521
- return fmt .Errorf ("Delivered.Stream should be 999,999, got %v" , ci .Delivered .Stream )
6528
+ // Delivered stays the same because it reflects what was actually delivered.
6529
+ // And must not be influenced by purges/compacts.
6530
+ if ci .Delivered .Stream != 10 {
6531
+ return fmt .Errorf ("Delivered.Stream should be 10, got %v" , ci .Delivered .Stream )
6532
+ }
6533
+
6534
+ // Starting sequence should be skipped ahead, respecting the compact.
6535
+ o .mu .RLock ()
6536
+ sseq := o .sseq
6537
+ o .mu .RUnlock ()
6538
+ if sseq != 1_000_000 {
6539
+ return fmt .Errorf ("o.sseq should be 1,000,000, got %v" , sseq )
6522
6540
}
6523
6541
return nil
6524
6542
})
@@ -9531,3 +9549,60 @@ func TestJetStreamConsumerDeliverAllOverlappingFilterSubjects(t *testing.T) {
9531
9549
}
9532
9550
}
9533
9551
}
9552
+
9553
+ func TestJetStreamConsumerStateAlwaysFromStore (t * testing.T ) {
9554
+ s := RunBasicJetStreamServer (t )
9555
+ defer s .Shutdown ()
9556
+
9557
+ nc , js := jsClientConnect (t , s )
9558
+ defer nc .Close ()
9559
+
9560
+ _ , err := js .AddStream (& nats.StreamConfig {
9561
+ Name : "TEST" ,
9562
+ Subjects : []string {"foo.>" },
9563
+ })
9564
+ require_NoError (t , err )
9565
+
9566
+ _ , err = js .AddConsumer ("TEST" , & nats.ConsumerConfig {
9567
+ Durable : "CONSUMER" ,
9568
+ AckWait : 2 * time .Second ,
9569
+ AckPolicy : nats .AckExplicitPolicy ,
9570
+ FilterSubject : "foo.bar" ,
9571
+ })
9572
+ require_NoError (t , err )
9573
+
9574
+ // Publish two messages, one the consumer is interested in.
9575
+ _ , err = js .Publish ("foo.bar" , nil )
9576
+ require_NoError (t , err )
9577
+ _ , err = js .Publish ("foo.other" , nil )
9578
+ require_NoError (t , err )
9579
+
9580
+ sub , err := js .PullSubscribe ("foo.bar" , "CONSUMER" )
9581
+ require_NoError (t , err )
9582
+ defer sub .Drain ()
9583
+
9584
+ // Consumer info should start empty.
9585
+ ci , err := js .ConsumerInfo ("TEST" , "CONSUMER" )
9586
+ require_NoError (t , err )
9587
+ require_Equal (t , ci .Delivered .Stream , 0 )
9588
+ require_Equal (t , ci .AckFloor .Stream , 0 )
9589
+
9590
+ // Fetch more messages than match our filter.
9591
+ msgs , err := sub .Fetch (2 , nats .MaxWait (time .Second ))
9592
+ require_NoError (t , err )
9593
+ require_Len (t , len (msgs ), 1 )
9594
+
9595
+ // We have received, but not acknowledged, consumer info must reflect that.
9596
+ ci , err = js .ConsumerInfo ("TEST" , "CONSUMER" )
9597
+ require_NoError (t , err )
9598
+ require_Equal (t , ci .Delivered .Stream , 1 )
9599
+ require_Equal (t , ci .AckFloor .Stream , 0 )
9600
+
9601
+ // Now we acknowledge the message and expect our delivered/ackfloor to be correct.
9602
+ require_NoError (t , msgs [0 ].AckSync ())
9603
+
9604
+ ci , err = js .ConsumerInfo ("TEST" , "CONSUMER" )
9605
+ require_NoError (t , err )
9606
+ require_Equal (t , ci .Delivered .Stream , 1 )
9607
+ require_Equal (t , ci .AckFloor .Stream , 1 )
9608
+ }
0 commit comments