From 3e7ca9403529ad0e9f4890f82df28ce721f1f23f Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Mon, 10 Mar 2025 16:58:38 +0300 Subject: [PATCH] Revert "[#7] mclock: Add tag stat" This reverts commit 25102d1e1aa3e9232af803ce3cd0088c37263de3. Signed-off-by: Dmitrii Stepanov --- scheduling/mclock.go | 46 +----------- scheduling/mclock_test.go | 150 -------------------------------------- scheduling/stat.go | 20 ----- 3 files changed, 2 insertions(+), 214 deletions(-) delete mode 100644 scheduling/stat.go diff --git a/scheduling/mclock.go b/scheduling/mclock.go index 213b3cf..82037d6 100644 --- a/scheduling/mclock.go +++ b/scheduling/mclock.go @@ -14,7 +14,6 @@ import ( const ( invalidIndex = -1 undefinedReservation float64 = -1.0 - minusOne = ^uint64(0) ) var ( @@ -61,8 +60,6 @@ type MClock struct { clock clock idleTimeout float64 tagInfo map[string]TagInfo - tagStat map[string]*Stat - stats []*Stat mtx sync.Mutex previous map[string]*request @@ -113,16 +110,6 @@ func NewMClock(runLimit, waitLimit uint64, tagInfo map[string]TagInfo, idleTimeo } result.previous = previous - result.tagStat = make(map[string]*Stat, len(tagInfo)) - result.stats = make([]*Stat, 0, len(tagInfo)) - for tag := range tagInfo { - s := &Stat{ - tag: tag, - } - result.tagStat[tag] = s - result.stats = append(result.stats, s) - } - return result, nil } @@ -163,12 +150,6 @@ func (q *MClock) Close() { } } -// Stats returns per tag stat. -// Returned slice should not be modified. -func (q *MClock) Stats() []*Stat { - return q.stats -} - func validateParams(runLimit uint64, tagInfo map[string]TagInfo) error { if runLimit == 0 { return ErrInvalidRunLimit @@ -191,16 +172,11 @@ func (q *MClock) dropRequest(req *request) { q.mtx.Lock() defer q.mtx.Unlock() - s, ok := q.tagStat[req.tag] - assert.Cond(ok, "undefined stat tag:", req.tag) - select { case <-req.scheduled: assert.Cond(q.inProgress > 0, "invalid requests count") q.inProgress-- - s.inProgress.Add(minusOne) default: - s.pending.Add(minusOne) } q.removeFromQueues(req) @@ -258,14 +234,9 @@ func (q *MClock) pushRequest(tag string) (*request, ReleaseFunc, error) { } heap.Push(q.sharesQueue, &sharesMQueueItem{r: r}) heap.Push(q.limitQueue, &limitMQueueItem{r: r}) - - s, ok := q.tagStat[tag] - assert.Cond(ok, "undefined stat tag:", tag) - s.pending.Add(1) - q.scheduleRequestUnsafe() - return r, func() { q.requestCompleted(tag) }, nil + return r, q.requestCompleted, nil } func (q *MClock) adjustTags(now float64, idleTag string) { @@ -347,10 +318,6 @@ func (q *MClock) scheduleByLimitAndWeight(now float64) { } q.removeFromQueues(next.r) - s, ok := q.tagStat[next.r.tag] - assert.Cond(ok, "undefined stat tag:", next.r.tag) - s.pending.Add(minusOne) - tagInfo, ok := q.tagInfo[next.r.tag] assert.Cond(ok, "unknown tag:", next.r.tag) if tagInfo.ReservedIOPS != nil && hadReservation { @@ -375,7 +342,6 @@ func (q *MClock) scheduleByLimitAndWeight(now float64) { assertIndexInvalid(next.r) q.inProgress++ - s.inProgress.Add(1) close(next.r.scheduled) } } @@ -385,10 +351,6 @@ func (q *MClock) scheduleByReservation(now float64) { next := heap.Pop(q.reservationQueue).(*reservationMQueueItem) q.removeFromQueues(next.r) - s, ok := q.tagStat[next.r.tag] - assert.Cond(ok, "undefined stat tag:", next.r.tag) - s.pending.Add(minusOne) - select { case <-next.r.canceled: continue @@ -397,7 +359,6 @@ func (q *MClock) scheduleByReservation(now float64) { assertIndexInvalid(next.r) q.inProgress++ - s.inProgress.Add(1) close(next.r.scheduled) } } @@ -417,7 +378,7 @@ func (q *MClock) removeFromQueues(r *request) { } } -func (q *MClock) requestCompleted(tag string) { +func (q *MClock) requestCompleted() { q.mtx.Lock() defer q.mtx.Unlock() @@ -427,9 +388,6 @@ func (q *MClock) requestCompleted(tag string) { assert.Cond(q.inProgress > 0, "invalid requests count") q.inProgress-- - s, ok := q.tagStat[tag] - assert.Cond(ok, "undefined stat tag:", tag) - s.inProgress.Add(minusOne) q.scheduleRequestUnsafe() } diff --git a/scheduling/mclock_test.go b/scheduling/mclock_test.go index 90b3b5a..3aa261f 100644 --- a/scheduling/mclock_test.go +++ b/scheduling/mclock_test.go @@ -39,21 +39,6 @@ func TestMClockSharesScheduling(t *testing.T) { releases = append(releases, release) } - stats := q.Stats() - require.Equal(t, 2, len(stats)) - for _, s := range stats { - switch s.Tag() { - case "class1": - require.Equal(t, uint64(1), s.InProgress()) - require.Equal(t, uint64(reqCount/2-1), s.Pending()) - case "class2": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(reqCount/2), s.Pending()) - default: - require.Fail(t, "unknown tag:"+s.Tag()) - } - } - var result []string var wg sync.WaitGroup for i := 0; i < reqCount; i++ { @@ -67,21 +52,6 @@ func TestMClockSharesScheduling(t *testing.T) { } wg.Wait() - stats = q.Stats() - require.Equal(t, 2, len(stats)) - for _, s := range stats { - switch s.Tag() { - case "class1": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(0), s.Pending()) - case "class2": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(0), s.Pending()) - default: - require.Fail(t, "unknown tag:"+s.Tag()) - } - } - // Requests must be scheduled as class1->class1->class2->class1->class1->class2..., // because the ratio is 2 to 1. // However, there may be deviations due to rounding and sorting. @@ -146,37 +116,7 @@ func TestMClockRequestCancel(t *testing.T) { require.Equal(t, 0, q.limitQueue.Len()) require.Equal(t, 0, q.reservationQueue.Len()) - stats := q.Stats() - require.Equal(t, 2, len(stats)) - for _, s := range stats { - switch s.Tag() { - case "class1": - require.Equal(t, uint64(1), s.InProgress()) - require.Equal(t, uint64(0), s.Pending()) - case "class2": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(0), s.Pending()) - default: - require.Fail(t, "unknown tag:"+s.Tag()) - } - } - release1() - - stats = q.Stats() - require.Equal(t, 2, len(stats)) - for _, s := range stats { - switch s.Tag() { - case "class1": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(0), s.Pending()) - case "class2": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(0), s.Pending()) - default: - require.Fail(t, "unknown tag:"+s.Tag()) - } - } } func TestMClockLimitScheduling(t *testing.T) { @@ -219,21 +159,6 @@ func TestMClockLimitScheduling(t *testing.T) { } } - stats := q.Stats() - require.Equal(t, 2, len(stats)) - for _, s := range stats { - switch s.Tag() { - case "class1": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(reqCount/2), s.Pending()) - case "class2": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(reqCount/2), s.Pending()) - default: - require.Fail(t, "unknown tag:"+s.Tag()) - } - } - cl.v = math.MaxFloat64 var result []string @@ -277,21 +202,6 @@ func TestMClockLimitScheduling(t *testing.T) { require.Equal(t, 0, q.sharesQueue.Len()) require.Equal(t, 0, q.limitQueue.Len()) require.Equal(t, 0, q.reservationQueue.Len()) - - stats = q.Stats() - require.Equal(t, 2, len(stats)) - for _, s := range stats { - switch s.Tag() { - case "class1": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(0), s.Pending()) - case "class2": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(0), s.Pending()) - default: - require.Fail(t, "unknown tag:"+s.Tag()) - } - } } func TestMClockReservationScheduling(t *testing.T) { @@ -335,39 +245,9 @@ func TestMClockReservationScheduling(t *testing.T) { } } - stats := q.Stats() - require.Equal(t, 2, len(stats)) - for _, s := range stats { - switch s.Tag() { - case "class1": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(reqCount/2), s.Pending()) - case "class2": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(reqCount/2), s.Pending()) - default: - require.Fail(t, "unknown tag:"+s.Tag()) - } - } - cl.v = 1.00001 // 1s elapsed q.scheduleRequest() - stats = q.Stats() - require.Equal(t, 2, len(stats)) - for _, s := range stats { - switch s.Tag() { - case "class1": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(reqCount/2), s.Pending()) - case "class2": - require.Equal(t, uint64(100), s.InProgress()) - require.Equal(t, uint64(reqCount/2-100), s.Pending()) - default: - require.Fail(t, "unknown tag:"+s.Tag()) - } - } - var result []string for i, req := range requests { select { @@ -383,21 +263,6 @@ func TestMClockReservationScheduling(t *testing.T) { require.Equal(t, "class2", res) } - stats = q.Stats() - require.Equal(t, 2, len(stats)) - for _, s := range stats { - switch s.Tag() { - case "class1": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(reqCount/2), s.Pending()) - case "class2": - require.Equal(t, uint64(0), s.InProgress()) - require.Equal(t, uint64(reqCount/2-100), s.Pending()) - default: - require.Fail(t, "unknown tag:"+s.Tag()) - } - } - cl.v = math.MaxFloat64 q.scheduleRequest() @@ -405,21 +270,6 @@ func TestMClockReservationScheduling(t *testing.T) { require.Equal(t, 0, q.sharesQueue.Len()) require.Equal(t, 0, q.limitQueue.Len()) require.Equal(t, 0, q.reservationQueue.Len()) - - stats = q.Stats() - require.Equal(t, 2, len(stats)) - for _, s := range stats { - switch s.Tag() { - case "class1": - require.Equal(t, uint64(reqCount/2), s.InProgress()) - require.Equal(t, uint64(0), s.Pending()) - case "class2": - require.Equal(t, uint64(reqCount/2-100), s.InProgress()) - require.Equal(t, uint64(0), s.Pending()) - default: - require.Fail(t, "unknown tag:"+s.Tag()) - } - } } func TestMClockIdleTag(t *testing.T) { diff --git a/scheduling/stat.go b/scheduling/stat.go deleted file mode 100644 index 1775027..0000000 --- a/scheduling/stat.go +++ /dev/null @@ -1,20 +0,0 @@ -package scheduling - -import "sync/atomic" - -type Stat struct { - tag string - inProgress, pending atomic.Uint64 -} - -func (s *Stat) Tag() string { - return s.tag -} - -func (s *Stat) InProgress() uint64 { - return s.inProgress.Load() -} - -func (s *Stat) Pending() uint64 { - return s.pending.Load() -}