diff --git a/server/monitor.go b/server/monitor.go index 407a028a..d279abb7 100644 --- a/server/monitor.go +++ b/server/monitor.go @@ -1120,14 +1120,17 @@ func (s *Server) HandleIPQueuesz(w http.ResponseWriter, r *http.Request) { queues := map[string]monitorIPQueue{} - s.ipQueues.Range(func(k, v interface{}) bool { + s.ipQueues.Range(func(k, v any) bool { + var pending, inProgress int name := k.(string) - queue := v.(interface { + queue, ok := v.(interface { len() int - inProgress() uint64 + inProgress() int64 }) - pending := queue.len() - inProgress := int(queue.inProgress()) + if ok { + pending = queue.len() + inProgress = int(queue.inProgress()) + } if !all && (pending == 0 && inProgress == 0) { return true } else if qfilter != _EMPTY_ && !strings.Contains(name, qfilter) { diff --git a/server/monitor_test.go b/server/monitor_test.go index d3bd215e..d5cd9ff6 100644 --- a/server/monitor_test.go +++ b/server/monitor_test.go @@ -4981,3 +4981,22 @@ func TestHealthzStatusUnavailable(t *testing.T) { checkHealthzEndpoint(t, s.MonitorAddr().String(), http.StatusServiceUnavailable, "unavailable") } + +// When we converted ipq to use generics we still were using sync.Map. Currently you can not convert +// interface{} or any to a generic parameterized type. So this stopped working and panics. +func TestIpqzWithGenerics(t *testing.T) { + opts := DefaultMonitorOptions() + opts.JetStream = true + + s := RunServer(opts) + defer s.Shutdown() + + url := fmt.Sprintf("http://%s/ipqueuesz?all=1", s.MonitorAddr().String()) + body := readBody(t, url) + require_True(t, len(body) > 0) + + queues := map[string]*monitorIPQueue{} + require_NoError(t, json.Unmarshal(body, &queues)) + require_True(t, len(queues) >= 4) + require_True(t, queues["SendQ"] != nil) +}