func natsOptions(logger lager.Logger, c *config.Config, natsHost *atomic.Value, startMsg chan<- struct{}) nats.Options { natsServers := c.NatsServers() options := nats.DefaultOptions options.Servers = natsServers options.PingInterval = c.NatsClientPingInterval options.ClosedCB = func(conn *nats.Conn) { logger.Fatal("nats-connection-closed", errors.New("unexpected close"), lager.Data{"last_error": conn.LastError()}) } options.DisconnectedCB = func(conn *nats.Conn) { hostStr := natsHost.Load().(string) logger.Info("nats-connection-disconnected", lager.Data{"nats-host": hostStr}) } options.ReconnectedCB = func(conn *nats.Conn) { natsURL, err := url.Parse(conn.ConnectedUrl()) natsHostStr := "" if err != nil { logger.Error("nats-url-parse-error", err) } else { natsHostStr = natsURL.Host } natsHost.Store(natsHostStr) data := lager.Data{"nats-host": natsHostStr} logger.Info("nats-connection-reconnected", data) startMsg <- struct{}{} } // in the case of suspending pruning, we need to ensure we retry reconnects indefinitely if c.SuspendPruningIfNatsUnavailable { options.MaxReconnect = -1 } return options }