From faa6dc85eb01cc068b605572737046a52ea01c74 Mon Sep 17 00:00:00 2001 From: Derek Collison Date: Sat, 20 Mar 2021 11:16:40 -0700 Subject: [PATCH] Fix for flapping test Signed-off-by: Derek Collison --- server/jetstream_cluster.go | 17 ++++++++++++++++- server/jetstream_cluster_test.go | 8 ++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/server/jetstream_cluster.go b/server/jetstream_cluster.go index c912ed5f..671ccda6 100644 --- a/server/jetstream_cluster.go +++ b/server/jetstream_cluster.go @@ -3160,7 +3160,22 @@ func (s *Server) jsClusteredStreamRequest(ci *ClientInfo, acc *Account, subject, cfg := &ccfg js.mu.RLock() - numStreams := len(cc.streams[acc.Name]) + asa := cc.streams[acc.Name] + numStreams := len(asa) + + // Check for subject collisions here. + for _, sa := range asa { + for _, subj := range sa.Config.Subjects { + for _, tsubj := range cfg.Subjects { + if SubjectsCollide(tsubj, subj) { + js.mu.RUnlock() + resp.Error = jsError(fmt.Errorf("subjects overlap with an existing stream")) + s.sendAPIErrResponse(ci, acc, subject, reply, string(rmsg), s.jsonResponse(&resp)) + return + } + } + } + } js.mu.RUnlock() // Check for stream limits here before proposing. These need to be tracked from meta layer, not jsa. diff --git a/server/jetstream_cluster_test.go b/server/jetstream_cluster_test.go index fa45e2ff..13c435a7 100644 --- a/server/jetstream_cluster_test.go +++ b/server/jetstream_cluster_test.go @@ -1013,7 +1013,7 @@ func TestJetStreamClusterStreamPublishWithActiveConsumers(t *testing.T) { } func TestJetStreamClusterStreamOverlapSubjects(t *testing.T) { - c := createJetStreamClusterExplicit(t, "R32", 2) + c := createJetStreamClusterExplicit(t, "R3", 3) defer c.shutdown() // Client based API @@ -1021,12 +1021,12 @@ func TestJetStreamClusterStreamOverlapSubjects(t *testing.T) { nc, js := jsClientConnect(t, s) defer nc.Close() - if _, err := js.AddStream(&nats.StreamConfig{Name: "TEST", Subjects: []string{"foo"}, Replicas: 2}); err != nil { + if _, err := js.AddStream(&nats.StreamConfig{Name: "TEST", Subjects: []string{"foo"}}); err != nil { t.Fatalf("Unexpected error: %v", err) } - if _, err := js.AddStream(&nats.StreamConfig{Name: "TEST2", Subjects: []string{"foo"}, Replicas: 2}); err == nil || err == nats.ErrTimeout { - t.Fatalf("Expected error but got none or timeout") + if _, err := js.AddStream(&nats.StreamConfig{Name: "TEST2", Subjects: []string{"foo"}}); err == nil || err == nats.ErrTimeout { + t.Fatalf("Expected error but got none or timeout: %v", err) } // Now grab list of streams and make sure the second is not there.