diff --git a/server/monitor.go b/server/monitor.go index 5b29ba4c..222ea81f 100644 --- a/server/monitor.go +++ b/server/monitor.go @@ -2617,6 +2617,10 @@ func (s *Server) Jsz(opts *JSzOptions) (*JSInfo, error) { js := s.getJetStream() if js == nil || !js.isEnabled() { + if opts.LeaderOnly { + return nil, fmt.Errorf("%w: not leader", errSkipZreq) + } + jsi.Disabled = true return jsi, nil } diff --git a/server/monitor_test.go b/server/monitor_test.go index f73128ab..7f970776 100644 --- a/server/monitor_test.go +++ b/server/monitor_test.go @@ -17,6 +17,7 @@ import ( "bytes" "crypto/tls" "encoding/json" + "errors" "fmt" "io/ioutil" "math/rand" @@ -3980,6 +3981,31 @@ func checkForJSClusterUp(t *testing.T, servers ...*Server) { }) } +func TestMonitorJszNonJszServer(t *testing.T) { + srv := RunServer(DefaultOptions()) + defer srv.Shutdown() + + if !srv.ReadyForConnections(5 * time.Second) { + t.Fatalf("server did not become ready") + } + + jsi, err := srv.Jsz(&JSzOptions{}) + if err != nil { + t.Fatalf("jsi failed: %v", err) + } + if jsi.ID != srv.ID() { + t.Fatalf("did not receive valid info") + } + + jsi, err = srv.Jsz(&JSzOptions{LeaderOnly: true}) + if !errors.Is(err, errSkipZreq) { + t.Fatalf("expected a skip z req error: %v", err) + } + if jsi != nil { + t.Fatalf("expected no jsi: %v", jsi) + } +} + func TestMonitorJsz(t *testing.T) { readJsInfo := func(url string) *JSInfo { t.Helper()