From 5043c6fce7cfe76590c10452ff88094d61d21fd5 Mon Sep 17 00:00:00 2001 From: Johannes 'fish' Ziemke Date: Thu, 25 Apr 2013 12:12:50 +0200 Subject: [PATCH 1/3] Have goroutine exit on signal via defer block. --- storage/metric/tiered.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/storage/metric/tiered.go b/storage/metric/tiered.go index c4364f7311..d68835b6c8 100644 --- a/storage/metric/tiered.go +++ b/storage/metric/tiered.go @@ -164,15 +164,20 @@ func (t *tieredStorage) Serve() { var ( flushMemoryTicker = time.Tick(t.flushMemoryInterval) writeMemoryTicker = time.Tick(t.writeMemoryInterval) + stopReport = make(chan bool) ) + defer func() { close(stopReport) }() go func() { reportTicker := time.Tick(time.Second) for { - <-reportTicker - - t.reportQueues() + select { + case <-reportTicker: + t.reportQueues() + case <-stopReport: + return + } } }() From 22da76e8ab4dc9752f0e4d3871f54fa9cdee5595 Mon Sep 17 00:00:00 2001 From: Johannes 'fish' Ziemke Date: Thu, 25 Apr 2013 13:04:45 +0200 Subject: [PATCH 2/3] Close of reportTicker to exit goroutine. --- storage/metric/tiered.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/storage/metric/tiered.go b/storage/metric/tiered.go index d68835b6c8..69fecb945a 100644 --- a/storage/metric/tiered.go +++ b/storage/metric/tiered.go @@ -164,20 +164,13 @@ func (t *tieredStorage) Serve() { var ( flushMemoryTicker = time.Tick(t.flushMemoryInterval) writeMemoryTicker = time.Tick(t.writeMemoryInterval) - stopReport = make(chan bool) + reportTicker = time.NewTicker(time.Second) ) - defer func() { close(stopReport) }() + defer reportTicker.Stop() go func() { - reportTicker := time.Tick(time.Second) - - for { - select { - case <-reportTicker: - t.reportQueues() - case <-stopReport: - return - } + for _ = range reportTicker.C { + t.reportQueues() } }() From 1ad41d4c00c6f6699640cf2fedf9ebce233842b5 Mon Sep 17 00:00:00 2001 From: Johannes 'fish' Ziemke Date: Thu, 25 Apr 2013 13:29:28 +0200 Subject: [PATCH 3/3] Call closer.Close() earlier. --- storage/metric/tiered_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/metric/tiered_test.go b/storage/metric/tiered_test.go index 7f9ae57e58..ff91382918 100644 --- a/storage/metric/tiered_test.go +++ b/storage/metric/tiered_test.go @@ -508,7 +508,6 @@ func TestGetAllValuesForLabel(t *testing.T) { for i, scenario := range scenarios { tiered, closer := newTestTieredStorage(t) - defer closer.Close() for j, metric := range scenario.in { sample := model.Sample{ Metric: model.Metric{model.MetricNameLabel: model.LabelValue(metric.metricName)}, @@ -525,6 +524,7 @@ func TestGetAllValuesForLabel(t *testing.T) { } } metricNames, err := tiered.GetAllValuesForLabel(model.MetricNameLabel) + closer.Close() if err != nil { t.Fatalf("%d. Error getting metric names: %s", i, err) }