diff --git a/pkg/services/rendering/rendering.go b/pkg/services/rendering/rendering.go index 383c97a79d5..45dfd2c6bfd 100644 --- a/pkg/services/rendering/rendering.go +++ b/pkg/services/rendering/rendering.go @@ -10,6 +10,7 @@ import ( "path" "path/filepath" "strings" + "sync/atomic" "time" "github.com/grafana/grafana/pkg/infra/metrics" @@ -41,7 +42,7 @@ type RenderingService struct { renderAction renderFunc renderCSVAction renderCSVFunc domain string - inProgressCount int + inProgressCount int32 version string Cfg *setting.Cfg @@ -183,7 +184,7 @@ func (rs *RenderingService) Render(ctx context.Context, opts Opts) (*RenderResul } func (rs *RenderingService) render(ctx context.Context, opts Opts) (*RenderResult, error) { - if rs.inProgressCount > opts.ConcurrentLimit { + if int(atomic.LoadInt32(&rs.inProgressCount)) > opts.ConcurrentLimit { return &RenderResult{ FilePath: filepath.Join(setting.HomePath, "public/img/rendering_limit.png"), }, nil @@ -208,12 +209,10 @@ func (rs *RenderingService) render(ctx context.Context, opts Opts) (*RenderResul defer rs.deleteRenderKey(renderKey) defer func() { - rs.inProgressCount-- - metrics.MRenderingQueue.Set(float64(rs.inProgressCount)) + metrics.MRenderingQueue.Set(float64(atomic.AddInt32(&rs.inProgressCount, -1))) }() - rs.inProgressCount++ - metrics.MRenderingQueue.Set(float64(rs.inProgressCount)) + metrics.MRenderingQueue.Set(float64(atomic.AddInt32(&rs.inProgressCount, 1))) return rs.renderAction(ctx, renderKey, opts) } @@ -228,7 +227,7 @@ func (rs *RenderingService) RenderCSV(ctx context.Context, opts CSVOpts) (*Rende } func (rs *RenderingService) renderCSV(ctx context.Context, opts CSVOpts) (*RenderCSVResult, error) { - if rs.inProgressCount > opts.ConcurrentLimit { + if int(atomic.LoadInt32(&rs.inProgressCount)) > opts.ConcurrentLimit { return nil, ErrConcurrentLimitReached } @@ -245,12 +244,10 @@ func (rs *RenderingService) renderCSV(ctx context.Context, opts CSVOpts) (*Rende defer rs.deleteRenderKey(renderKey) defer func() { - rs.inProgressCount-- - metrics.MRenderingQueue.Set(float64(rs.inProgressCount)) + metrics.MRenderingQueue.Set(float64(atomic.AddInt32(&rs.inProgressCount, -1))) }() - rs.inProgressCount++ - metrics.MRenderingQueue.Set(float64(rs.inProgressCount)) + metrics.MRenderingQueue.Set(float64(atomic.AddInt32(&rs.inProgressCount, 1))) return rs.renderCSVAction(ctx, renderKey, opts) }