@@ -7340,7 +7340,7 @@ func TestJetStreamClusterSourceAndMirrorConsumersLeaderChange(t *testing.T) {
7340
7340
7341
7341
// Now make sure we only have a single direct consumer on our origin streams.
7342
7342
// Pick one at random.
7343
- name := fmt .Sprintf ("O%d" , rand .Intn (numStreams ) )
7343
+ name := fmt .Sprintf ("O%d" , rand .Intn (numStreams - 1 ) + 1 )
7344
7344
c1 .waitOnStreamLeader ("$G" , name )
7345
7345
s := c1 .streamLeader ("$G" , name )
7346
7346
a , err := s .lookupAccount ("$G" )
@@ -7351,6 +7351,7 @@ func TestJetStreamClusterSourceAndMirrorConsumersLeaderChange(t *testing.T) {
7351
7351
if err != nil {
7352
7352
t .Fatalf ("Unexpected error: %v" , err )
7353
7353
}
7354
+
7354
7355
checkFor (t , 10 * time .Second , 250 * time .Millisecond , func () error {
7355
7356
if ndc := mset .numDirectConsumers (); ndc != 1 {
7356
7357
return fmt .Errorf ("Stream %q wanted 1 direct consumer, got %d" , name , ndc )
@@ -7640,6 +7641,59 @@ func TestJetStreamClusterMaxConsumers(t *testing.T) {
7640
7641
}
7641
7642
}
7642
7643
7644
+ func TestJetStreamClusterMaxConsumersMultipleConcurrentRequests (t * testing.T ) {
7645
+ c := createJetStreamClusterExplicit (t , "JSC" , 3 )
7646
+ defer c .shutdown ()
7647
+
7648
+ nc , js := jsClientConnect (t , c .randomServer ())
7649
+ defer nc .Close ()
7650
+
7651
+ cfg := & nats.StreamConfig {
7652
+ Name : "MAXCC" ,
7653
+ Storage : nats .MemoryStorage ,
7654
+ Subjects : []string {"in.maxcc.>" },
7655
+ MaxConsumers : 1 ,
7656
+ Replicas : 3 ,
7657
+ }
7658
+ if _ , err := js .AddStream (cfg ); err != nil {
7659
+ t .Fatalf ("Unexpected error: %v" , err )
7660
+ }
7661
+ si , err := js .StreamInfo ("MAXCC" )
7662
+ if err != nil {
7663
+ t .Fatalf ("Unexpected error: %v" , err )
7664
+ }
7665
+ if si .Config .MaxConsumers != 1 {
7666
+ t .Fatalf ("Expected max of 1, got %d" , si .Config .MaxConsumers )
7667
+ }
7668
+
7669
+ startCh := make (chan bool )
7670
+ var wg sync.WaitGroup
7671
+
7672
+ for n := 0 ; n < 10 ; n ++ {
7673
+ wg .Add (1 )
7674
+ go func () {
7675
+ defer wg .Done ()
7676
+ nc , js := jsClientConnect (t , c .randomServer ())
7677
+ defer nc .Close ()
7678
+ <- startCh
7679
+ js .SubscribeSync ("in.maxcc.foo" )
7680
+ }()
7681
+ }
7682
+ // Wait for Go routines.
7683
+ time .Sleep (250 * time .Millisecond )
7684
+
7685
+ close (startCh )
7686
+ wg .Wait ()
7687
+
7688
+ var names []string
7689
+ for n := range js .ConsumerNames ("MAXCC" ) {
7690
+ names = append (names , n )
7691
+ }
7692
+ if nc := len (names ); nc > 1 {
7693
+ t .Fatalf ("Expected only 1 consumer, got %d" , nc )
7694
+ }
7695
+ }
7696
+
7643
7697
// Support functions
7644
7698
7645
7699
// Used to setup superclusters for tests.
0 commit comments