mirror of https://github.com/grafana/loki
feat: new stream count limiter (#13006)
Signed-off-by: Vladyslav Diachenko <vlad.diachenko@grafana.com> Co-authored-by: JordanRushing <rushing.jordan@gmail.com>pull/13021/head
parent
987e551f9e
commit
1111595179
@ -0,0 +1,44 @@ |
||||
package ingester |
||||
|
||||
import "go.uber.org/atomic" |
||||
|
||||
type ownedStreamService struct { |
||||
tenantID string |
||||
limiter *Limiter |
||||
fixedLimit *atomic.Int32 |
||||
|
||||
//todo: implement job to recalculate it
|
||||
ownedStreamCount *atomic.Int64 |
||||
} |
||||
|
||||
func newOwnedStreamService(tenantID string, limiter *Limiter) *ownedStreamService { |
||||
svc := &ownedStreamService{ |
||||
tenantID: tenantID, |
||||
limiter: limiter, |
||||
ownedStreamCount: atomic.NewInt64(0), |
||||
fixedLimit: atomic.NewInt32(0), |
||||
} |
||||
svc.updateFixedLimit() |
||||
return svc |
||||
} |
||||
|
||||
func (s *ownedStreamService) getOwnedStreamCount() int { |
||||
return int(s.ownedStreamCount.Load()) |
||||
} |
||||
|
||||
func (s *ownedStreamService) updateFixedLimit() { |
||||
limit, _, _, _ := s.limiter.GetStreamCountLimit(s.tenantID) |
||||
s.fixedLimit.Store(int32(limit)) |
||||
} |
||||
|
||||
func (s *ownedStreamService) getFixedLimit() int { |
||||
return int(s.fixedLimit.Load()) |
||||
} |
||||
|
||||
func (s *ownedStreamService) incOwnedStreamCount() { |
||||
s.ownedStreamCount.Inc() |
||||
} |
||||
|
||||
func (s *ownedStreamService) decOwnedStreamCount() { |
||||
s.ownedStreamCount.Dec() |
||||
} |
@ -0,0 +1,36 @@ |
||||
package ingester |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/require" |
||||
|
||||
"github.com/grafana/loki/v3/pkg/validation" |
||||
) |
||||
|
||||
func Test_OwnedStreamService(t *testing.T) { |
||||
limits, err := validation.NewOverrides(validation.Limits{ |
||||
MaxGlobalStreamsPerUser: 100, |
||||
}, nil) |
||||
require.NoError(t, err) |
||||
// Mock the ring
|
||||
ring := &ringCountMock{count: 30} |
||||
limiter := NewLimiter(limits, NilMetrics, ring, 3) |
||||
|
||||
service := newOwnedStreamService("test", limiter) |
||||
require.Equal(t, 0, service.getOwnedStreamCount()) |
||||
require.Equal(t, 10, service.getFixedLimit(), "fixed limit must be initialised during the instantiation") |
||||
|
||||
limits.DefaultLimits().MaxGlobalStreamsPerUser = 1000 |
||||
require.Equal(t, 10, service.getFixedLimit(), "fixed list must not be changed until update is triggered") |
||||
|
||||
service.updateFixedLimit() |
||||
require.Equal(t, 100, service.getFixedLimit()) |
||||
|
||||
service.incOwnedStreamCount() |
||||
service.incOwnedStreamCount() |
||||
require.Equal(t, 2, service.getOwnedStreamCount()) |
||||
|
||||
service.decOwnedStreamCount() |
||||
require.Equal(t, 1, service.getOwnedStreamCount()) |
||||
} |
Loading…
Reference in new issue