mirror of
https://github.com/gogrlx/nats-server.git
synced 2026-04-17 11:24:44 -07:00
[FIXED] JetStream: possible panic on stream info when leader not elected
It is possible that a stream info request would be handled at a time where the raft group would not yet be set/created, causing a panic. Resolves #3626 (at least the panic reports there) Signed-off-by: Ivan Kozlovic <ivan@synadia.com>
This commit is contained in:
@@ -1780,7 +1780,10 @@ func (s *Server) jsStreamInfoRequest(sub *subscription, c *client, a *Account, s
|
||||
if cc.meta != nil {
|
||||
ourID = cc.meta.ID()
|
||||
}
|
||||
bail := !rg.isMember(ourID)
|
||||
// We have seen cases where rg or rg.node is nil at this point,
|
||||
// so check explicitly on those conditions and bail if that is
|
||||
// the case.
|
||||
bail := rg == nil || rg.node == nil || !rg.isMember(ourID)
|
||||
if !bail {
|
||||
// We know we are a member here, if this group is new and we are preferred allow us to answer.
|
||||
bail = rg.Preferred != ourID || time.Since(rg.node.Created()) > lostQuorumIntervalDefault
|
||||
|
||||
@@ -1373,3 +1373,42 @@ func TestJetStreamClusterInterestStreamConsumer(t *testing.T) {
|
||||
t.Fatalf("Should not have any messages left: %d of %d", si.State.Msgs, n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestJetStreamClusterNoPanicOnStreamInfoWhenNoLeaderYet(t *testing.T) {
|
||||
c := createJetStreamClusterExplicit(t, "R3S", 3)
|
||||
defer c.shutdown()
|
||||
|
||||
nc := natsConnect(t, c.randomServer().ClientURL())
|
||||
defer nc.Close()
|
||||
|
||||
js, _ := nc.JetStream(nats.MaxWait(500 * time.Millisecond))
|
||||
|
||||
wg := sync.WaitGroup{}
|
||||
wg.Add(1)
|
||||
ch := make(chan struct{})
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
|
||||
for {
|
||||
js.StreamInfo("TEST")
|
||||
select {
|
||||
case <-ch:
|
||||
return
|
||||
case <-time.After(15 * time.Millisecond):
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
time.Sleep(250 * time.Millisecond)
|
||||
|
||||
// Don't care if this succeeds or not (could get a context deadline
|
||||
// due to the low MaxWait() when creating the context).
|
||||
js.AddStream(&nats.StreamConfig{
|
||||
Name: "TEST",
|
||||
Subjects: []string{"foo"},
|
||||
Replicas: 3,
|
||||
})
|
||||
|
||||
close(ch)
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user