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

This commit is contained in:
knuzhdin 2021-08-28 10:05:03 +03:00 committed by GitHub
parent 06c9f7e13b
commit 3df001db93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -10,6 +10,7 @@ import (
"path" "path"
"path/filepath" "path/filepath"
"strings" "strings"
"sync/atomic"
"time" "time"
"github.com/grafana/grafana/pkg/infra/metrics" "github.com/grafana/grafana/pkg/infra/metrics"
@ -41,7 +42,7 @@ type RenderingService struct {
renderAction renderFunc renderAction renderFunc
renderCSVAction renderCSVFunc renderCSVAction renderCSVFunc
domain string domain string
inProgressCount int inProgressCount int32
version string version string
Cfg *setting.Cfg 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) { 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{ return &RenderResult{
FilePath: filepath.Join(setting.HomePath, "public/img/rendering_limit.png"), FilePath: filepath.Join(setting.HomePath, "public/img/rendering_limit.png"),
}, nil }, nil
@ -208,12 +209,10 @@ func (rs *RenderingService) render(ctx context.Context, opts Opts) (*RenderResul
defer rs.deleteRenderKey(renderKey) defer rs.deleteRenderKey(renderKey)
defer func() { defer func() {
rs.inProgressCount-- metrics.MRenderingQueue.Set(float64(atomic.AddInt32(&rs.inProgressCount, -1)))
metrics.MRenderingQueue.Set(float64(rs.inProgressCount))
}() }()
rs.inProgressCount++ metrics.MRenderingQueue.Set(float64(atomic.AddInt32(&rs.inProgressCount, 1)))
metrics.MRenderingQueue.Set(float64(rs.inProgressCount))
return rs.renderAction(ctx, renderKey, opts) 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) { 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 return nil, ErrConcurrentLimitReached
} }
@ -245,12 +244,10 @@ func (rs *RenderingService) renderCSV(ctx context.Context, opts CSVOpts) (*Rende
defer rs.deleteRenderKey(renderKey) defer rs.deleteRenderKey(renderKey)
defer func() { defer func() {
rs.inProgressCount-- metrics.MRenderingQueue.Set(float64(atomic.AddInt32(&rs.inProgressCount, -1)))
metrics.MRenderingQueue.Set(float64(rs.inProgressCount))
}() }()
rs.inProgressCount++ metrics.MRenderingQueue.Set(float64(atomic.AddInt32(&rs.inProgressCount, 1)))
metrics.MRenderingQueue.Set(float64(rs.inProgressCount))
return rs.renderCSVAction(ctx, renderKey, opts) return rs.renderCSVAction(ctx, renderKey, opts)
} }