From 14b0f6e496971a690ff0e4f458a921353b552c9f Mon Sep 17 00:00:00 2001 From: Jason Wilder Date: Fri, 16 Sep 2016 11:49:15 -0600 Subject: [PATCH] Fix panic in subscriber.Statistics The tags passed into Statistics() calls are not supposed to be modified. The balanceWriter in subscribers tried to modify them triggering a panic because they can be nil. --- cmd/influxd/run/server_test.go | 44 ++++++++++++++++++++++++++++++++++ services/subscriber/service.go | 5 ++-- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/cmd/influxd/run/server_test.go b/cmd/influxd/run/server_test.go index 12e89f72e59..c7844d38a85 100644 --- a/cmd/influxd/run/server_test.go +++ b/cmd/influxd/run/server_test.go @@ -5608,6 +5608,50 @@ func TestServer_Query_ShowSeries(t *testing.T) { } } +func TestServer_Query_ShowStats(t *testing.T) { + t.Parallel() + s := OpenServer(NewConfig()) + defer s.Close() + + if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil { + t.Fatal(err) + } + if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil { + t.Fatal(err) + } + + if err := s.MetaClient.CreateSubscription("db0", "rp0", "foo", "ALL", []string{"udp://localhost:9000"}); err != nil { + t.Fatal(err) + } + + test := NewTest("db0", "rp0") + test.addQueries([]*Query{ + &Query{ + name: `show shots`, + command: "SHOW STATS", + exp: "subscriber", // Should see a subscriber stat in the json + pattern: true, + }, + }...) + + for i, query := range test.queries { + if i == 0 { + if err := test.init(s); err != nil { + t.Fatalf("test init failed: %s", err) + } + } + if query.skip { + t.Logf("SKIP:: %s", query.name) + continue + } + if err := query.Execute(s); err != nil { + t.Error(query.Error(err)) + } else if !query.success() { + t.Error(query.failureMessage()) + } + } +} + func TestServer_Query_ShowMeasurements(t *testing.T) { t.Parallel() s := OpenServer(NewConfig()) diff --git a/services/subscriber/service.go b/services/subscriber/service.go index cb8b72a2762..53b3b61e9cc 100644 --- a/services/subscriber/service.go +++ b/services/subscriber/service.go @@ -417,10 +417,11 @@ func (b *balancewriter) WritePoints(p *coordinator.WritePointsRequest) error { func (b *balancewriter) Statistics(tags map[string]string) []models.Statistic { statistics := make([]models.Statistic, len(b.stats)) for i := range b.stats { - tags["destination"] = b.stats[i].dest + subTags := b.defaultTags.Merge(tags) + subTags["destination"] = b.stats[i].dest statistics[i] = models.Statistic{ Name: "subscriber", - Tags: b.defaultTags.Merge(tags), + Tags: subTags, Values: map[string]interface{}{ statPointsWritten: atomic.LoadInt64(&b.stats[i].pointsWritten), statWriteFailures: atomic.LoadInt64(&b.stats[i].failures),