@@ -33,6 +33,8 @@ import (
33
33
"testing"
34
34
"time"
35
35
36
+ "github.com/nats-io/nats.go/jetstream"
37
+
36
38
"github.com/nats-io/jwt/v2"
37
39
"github.com/nats-io/nats.go"
38
40
)
@@ -6942,6 +6944,58 @@ func TestJetStreamClusterConsumerInfoAfterCreate(t *testing.T) {
6942
6944
require_NoError (t , err )
6943
6945
}
6944
6946
6947
+ func TestJetStreamClusterRespectConsumerStartSeq (t * testing.T ) {
6948
+ c := createJetStreamClusterExplicit (t , "R3S" , 3 )
6949
+ defer c .shutdown ()
6950
+
6951
+ nc := clientConnectToServer (t , c .randomServer ())
6952
+ defer nc .Close ()
6953
+ js , err := jetstream .New (nc )
6954
+ require_NoError (t , err )
6955
+
6956
+ ctx , cancel := context .WithTimeout (context .Background (), 4 * time .Second )
6957
+ defer cancel ()
6958
+
6959
+ // Create replicated stream.
6960
+ _ , err = js .CreateStream (ctx , jetstream.StreamConfig {
6961
+ Name : "TEST" ,
6962
+ Subjects : []string {"foo" },
6963
+ Replicas : 3 ,
6964
+ })
6965
+ require_NoError (t , err )
6966
+
6967
+ // We could have published messages into the stream that have not yet been applied on the follower.
6968
+ // If we create a consumer with a starting sequence in the future, we must respect it.
6969
+ consumer , err := js .OrderedConsumer (ctx , "TEST" , jetstream.OrderedConsumerConfig {
6970
+ DeliverPolicy : jetstream .DeliverByStartSequencePolicy ,
6971
+ OptStartSeq : 20 ,
6972
+ })
6973
+ require_NoError (t , err )
6974
+ require_Equal (t , consumer .CachedInfo ().Delivered .Stream , 19 )
6975
+
6976
+ // Same thing if the first sequence is not 0.
6977
+ stream , err := js .Stream (ctx , "TEST" )
6978
+ require_NoError (t , err )
6979
+ err = stream .Purge (ctx , jetstream .WithPurgeSequence (10 ))
6980
+ require_NoError (t , err )
6981
+
6982
+ consumer , err = js .OrderedConsumer (ctx , "TEST" , jetstream.OrderedConsumerConfig {
6983
+ DeliverPolicy : jetstream .DeliverByStartSequencePolicy ,
6984
+ OptStartSeq : 20 ,
6985
+ })
6986
+ require_NoError (t , err )
6987
+ require_Equal (t , consumer .CachedInfo ().Delivered .Stream , 19 )
6988
+
6989
+ // Only if we're requested to start at a sequence that's not available anymore
6990
+ // can we safely move it up. That data is gone already, so can't do anything else.
6991
+ consumer , err = js .OrderedConsumer (ctx , "TEST" , jetstream.OrderedConsumerConfig {
6992
+ DeliverPolicy : jetstream .DeliverByStartSequencePolicy ,
6993
+ OptStartSeq : 5 ,
6994
+ })
6995
+ require_NoError (t , err )
6996
+ require_Equal (t , consumer .CachedInfo ().Delivered .Stream , 9 )
6997
+ }
6998
+
6945
6999
//
6946
7000
// DO NOT ADD NEW TESTS IN THIS FILE (unless to balance test times)
6947
7001
// Add at the end of jetstream_cluster_<n>_test.go, with <n> being the highest value.
0 commit comments