ImageRendering: fix leakage of the rendering inflight counter (#34607)

pull/38675/head
knuzhdin 4 years ago committed by GitHub
parent 06c9f7e13b
commit 3df001db93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 19
      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)
}

Loading…
Cancel
Save