diff --git a/server/gateway.go b/server/gateway.go index 98439ac1..886f204a 100644 --- a/server/gateway.go +++ b/server/gateway.go @@ -603,7 +603,7 @@ func (g *srvGateway) generateInfoJSON() { // We could be here when processing a route INFO that has a gateway URL, // but this server is not configured for gateways, so simply ignore here. // The configuration mismatch is reported somewhere else. - if !g.enabled { + if !g.enabled || g.info == nil { return } g.info.GatewayURLs = g.URLs.getAsStringSlice() diff --git a/server/gateway_test.go b/server/gateway_test.go index bbde745c..b8f9c5ab 100644 --- a/server/gateway_test.go +++ b/server/gateway_test.go @@ -6749,3 +6749,34 @@ func TestGatewayDuplicateServerName(t *testing.T) { // to cluster "A" checkForDupError(scl.errCh) } + +func TestGatewayNoPanicOnStartupWithMonitoring(t *testing.T) { + o := testDefaultOptionsForGateway("B") + o.HTTPHost = "127.0.0.1" + o.HTTPPort = 8888 + s, err := NewServer(o) + require_NoError(t, err) + + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + + time.Sleep(50 * time.Millisecond) + s.Start() + s.WaitForShutdown() + }() + + for { + g, err := s.Gatewayz(nil) + if err != nil { + continue + } + if g.Port != 0 && g.Port != s.GatewayAddr().Port { + t.Fatalf("Unexpected port: %v vs %v", g.Port, s.GatewayAddr().Port) + } + break + } + s.Shutdown() + wg.Wait() +} diff --git a/server/monitor.go b/server/monitor.go index 8dc872b5..78e88ced 100644 --- a/server/monitor.go +++ b/server/monitor.go @@ -1777,7 +1777,7 @@ func (s *Server) Gatewayz(opts *GatewayzOptions) (*Gatewayz, error) { now := time.Now().UTC() gw := s.gateway gw.RLock() - if !gw.enabled { + if !gw.enabled || gw.info == nil { gw.RUnlock() gwz := &Gatewayz{ ID: srvID,