forked from TrueCloudLab/frostfs-node
[#1700] engine: Print stacks on test request limiter
Change-Id: I4952769ca431d1049955823b41b99b0984b385fc Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
parent
6e1576cfdb
commit
bc6cc9ae2a
1 changed files with 61 additions and 10 deletions
|
@ -2,8 +2,11 @@ package engine
|
|||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"sync/atomic"
|
||||
"runtime/debug"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/qos"
|
||||
|
@ -157,26 +160,74 @@ func newTestStorages(root string, smallSize uint64) ([]blobstor.SubStorage, *tes
|
|||
var _ qos.Limiter = (*testQoSLimiter)(nil)
|
||||
|
||||
type testQoSLimiter struct {
|
||||
t testing.TB
|
||||
read atomic.Int64
|
||||
write atomic.Int64
|
||||
t testing.TB
|
||||
quard sync.Mutex
|
||||
id int64
|
||||
readStacks map[int64][]byte
|
||||
writeStacks map[int64][]byte
|
||||
}
|
||||
|
||||
func (t *testQoSLimiter) SetMetrics(qos.Metrics) {}
|
||||
|
||||
func (t *testQoSLimiter) Close() {
|
||||
require.Equal(t.t, int64(0), t.read.Load(), "read requests count after limiter close must be 0")
|
||||
require.Equal(t.t, int64(0), t.write.Load(), "write requests count after limiter close must be 0")
|
||||
t.quard.Lock()
|
||||
defer t.quard.Unlock()
|
||||
|
||||
var sb strings.Builder
|
||||
var seqN int
|
||||
for _, stack := range t.readStacks {
|
||||
seqN++
|
||||
sb.WriteString(fmt.Sprintf("%d\n read request stack after limiter close: %s\n", seqN, string(stack)))
|
||||
}
|
||||
for _, stack := range t.writeStacks {
|
||||
seqN++
|
||||
sb.WriteString(fmt.Sprintf("%d\n write request stack after limiter close: %s\n", seqN, string(stack)))
|
||||
}
|
||||
require.True(t.t, seqN == 0, sb.String())
|
||||
}
|
||||
|
||||
func (t *testQoSLimiter) ReadRequest(context.Context) (qos.ReleaseFunc, error) {
|
||||
t.read.Add(1)
|
||||
return func() { t.read.Add(-1) }, nil
|
||||
t.quard.Lock()
|
||||
defer t.quard.Unlock()
|
||||
|
||||
stack := debug.Stack()
|
||||
|
||||
t.id++
|
||||
id := t.id
|
||||
|
||||
if t.readStacks == nil {
|
||||
t.readStacks = make(map[int64][]byte)
|
||||
}
|
||||
t.readStacks[id] = stack
|
||||
|
||||
return func() {
|
||||
t.quard.Lock()
|
||||
defer t.quard.Unlock()
|
||||
|
||||
delete(t.readStacks, id)
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (t *testQoSLimiter) WriteRequest(context.Context) (qos.ReleaseFunc, error) {
|
||||
t.write.Add(1)
|
||||
return func() { t.write.Add(-1) }, nil
|
||||
t.quard.Lock()
|
||||
defer t.quard.Unlock()
|
||||
|
||||
stack := debug.Stack()
|
||||
|
||||
t.id++
|
||||
id := t.id
|
||||
|
||||
if t.writeStacks == nil {
|
||||
t.writeStacks = make(map[int64][]byte)
|
||||
}
|
||||
t.writeStacks[id] = stack
|
||||
|
||||
return func() {
|
||||
t.quard.Lock()
|
||||
defer t.quard.Unlock()
|
||||
|
||||
delete(t.writeStacks, id)
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (t *testQoSLimiter) SetParentID(string) {}
|
||||
|
|
Loading…
Add table
Reference in a new issue