Skip to content

Commit

Permalink
[FIXED] Interface conversion bug for ipQueues in monitor which would …
Browse files Browse the repository at this point in the history
…cause panics. (#4477)

Signed-off-by: Derek Collison <derek@nats.io>
  • Loading branch information
derekcollison committed Sep 2, 2023
2 parents 7f13ecc + 2c81224 commit f61ad32
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 5 deletions.
13 changes: 8 additions & 5 deletions server/monitor.go
Expand Up @@ -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) {
Expand Down
19 changes: 19 additions & 0 deletions server/monitor_test.go
Expand Up @@ -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)
}

0 comments on commit f61ad32

Please sign in to comment.