From 0d6b0227800a3885309264f42dcbf50c9b7a1798 Mon Sep 17 00:00:00 2001 From: Derek Collison Date: Mon, 24 May 2021 14:05:42 -0700 Subject: [PATCH] Fix for varz JetStream usage showing total account usage vs server usage. Signed-off-by: Derek Collison --- server/jetstream.go | 10 +++---- server/jetstream_cluster_test.go | 48 ++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/server/jetstream.go b/server/jetstream.go index b9a0217a..ff132ce6 100644 --- a/server/jetstream.go +++ b/server/jetstream.go @@ -1538,7 +1538,7 @@ func (js *jetStream) dynamicAccountLimits() *JetStreamAccountLimits { return limits } -// Report on JetStream stats and usage. +// Report on JetStream stats and usage for this server. func (js *jetStream) usageStats() *JetStreamStats { var stats JetStreamStats @@ -1556,10 +1556,10 @@ func (js *jetStream) usageStats() *JetStreamStats { // Collect account information. for _, jsa := range accounts { jsa.mu.RLock() - stats.Memory += uint64(jsa.memTotal) - stats.Store += uint64(jsa.storeTotal) - stats.API.Total += jsa.apiTotal - stats.API.Errors += jsa.apiErrors + stats.Memory += uint64(jsa.usage.mem) + stats.Store += uint64(jsa.usage.store) + stats.API.Total += jsa.usage.api + stats.API.Errors += jsa.usage.err jsa.mu.RUnlock() } return &stats diff --git a/server/jetstream_cluster_test.go b/server/jetstream_cluster_test.go index 70d0f4c1..b580f972 100644 --- a/server/jetstream_cluster_test.go +++ b/server/jetstream_cluster_test.go @@ -7012,6 +7012,54 @@ func TestJetStreamClusterNilMsgWithHeaderThroughSourcedStream(t *testing.T) { } } +// Make sure varz reports the server usage not replicated usage etc. +func TestJetStreamClusterVarzReporting(t *testing.T) { + c := createJetStreamClusterExplicit(t, "JSC", 3) + defer c.shutdown() + + s := c.randomServer() + nc, js := jsClientConnect(t, s) + defer nc.Close() + + _, err := js.AddStream(&nats.StreamConfig{ + Name: "TEST", + Replicas: 3, + }) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + // ~100k per message. + msg := []byte(strings.Repeat("A", 99_960)) + msz := fileStoreMsgSize("TEST", nil, msg) + total := msz * 10 + + for i := 0; i < 10; i++ { + if _, err := js.Publish("TEST", msg); err != nil { + t.Fatalf("Unexpected publish error: %v", err) + } + } + // To show the bug we need this to allow remote usage to replicate. + time.Sleep(2 * usageTick) + + v, err := s.Varz(nil) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + if v.JetStream.Stats.Store > total { + t.Fatalf("Single server varz JetStream store usage should be <= %d, got %d", total, v.JetStream.Stats.Store) + } + + info, err := js.AccountInfo() + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if info.Store < total*3 { + t.Fatalf("Expected account information to show usage ~%d, got %d", total*3, info.Store) + } +} + // Support functions // Used to setup superclusters for tests.