Skip to content

Commit

Permalink
*: fix the order of FallbackOldAndSetNewAction (#37272)
Browse files Browse the repository at this point in the history
close #37058
  • Loading branch information
YangKeao authored Aug 23, 2022
1 parent fe4e6ba commit 78b32f3
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 21 deletions.
2 changes: 1 addition & 1 deletion executor/executor_pkg_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ func TestSortSpillDisk(t *testing.T) {
err = exec.Close()
require.NoError(t, err)

ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(-1, 24000)
ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(-1, 28000)
dataSource.prepareChunks()
err = exec.Open(tmpCtx)
require.NoError(t, err)
Expand Down
8 changes: 3 additions & 5 deletions util/memory/tracker.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,15 +193,15 @@ func (t *Tracker) SetActionOnExceed(a ActionOnExceed) {
func (t *Tracker) FallbackOldAndSetNewAction(a ActionOnExceed) {
t.actionMuForHardLimit.Lock()
defer t.actionMuForHardLimit.Unlock()
t.actionMuForHardLimit.actionOnExceed = reArrangeFallback(t.actionMuForHardLimit.actionOnExceed, a)
t.actionMuForHardLimit.actionOnExceed = reArrangeFallback(a, t.actionMuForHardLimit.actionOnExceed)
}

// FallbackOldAndSetNewActionForSoftLimit sets the action when memory usage exceeds bytesSoftLimit
// and set the original action as its fallback.
func (t *Tracker) FallbackOldAndSetNewActionForSoftLimit(a ActionOnExceed) {
t.actionMuForSoftLimit.Lock()
defer t.actionMuForSoftLimit.Unlock()
t.actionMuForSoftLimit.actionOnExceed = reArrangeFallback(t.actionMuForSoftLimit.actionOnExceed, a)
t.actionMuForSoftLimit.actionOnExceed = reArrangeFallback(a, t.actionMuForSoftLimit.actionOnExceed)
}

// GetFallbackForTest get the oom action used by test.
Expand All @@ -224,10 +224,8 @@ func reArrangeFallback(a ActionOnExceed, b ActionOnExceed) ActionOnExceed {
}
if a.GetPriority() < b.GetPriority() {
a, b = b, a
a.SetFallback(b)
} else {
a.SetFallback(reArrangeFallback(a.GetFallback(), b))
}
a.SetFallback(reArrangeFallback(a.GetFallback(), b))
return a
}

Expand Down
30 changes: 15 additions & 15 deletions util/memory/tracker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,8 @@ func TestOOMAction(t *testing.T) {
require.False(t, action1.called)
require.False(t, action2.called)
tracker.Consume(10000)
require.True(t, action1.called)
require.False(t, action2.called)
require.True(t, action2.called)
require.False(t, action1.called)
tracker.Consume(10000)
require.True(t, action1.called)
require.True(t, action2.called)
Expand All @@ -201,20 +201,20 @@ func TestOOMAction(t *testing.T) {
action1 = &mockAction{}
action2 = &mockAction{}
action3 := &mockAction{}
tracker.FallbackOldAndSetNewActionForSoftLimit(action1)
tracker.SetActionOnExceed(action1)
tracker.FallbackOldAndSetNewActionForSoftLimit(action2)
tracker.SetActionOnExceed(action3)
require.False(t, action1.called)
require.False(t, action2.called)
tracker.FallbackOldAndSetNewActionForSoftLimit(action3)
require.False(t, action3.called)
require.False(t, action2.called)
require.False(t, action1.called)
tracker.Consume(80)
require.True(t, action1.called)
require.True(t, action3.called)
require.False(t, action2.called)
require.False(t, action3.called)
require.False(t, action1.called)
tracker.Consume(20)
require.True(t, action1.called)
require.True(t, action3.called)
require.True(t, action2.called) // SoftLimit fallback
require.True(t, action3.called) // HardLimit
require.True(t, action1.called) // HardLimit

// test fallback
action1 = &mockAction{}
Expand All @@ -227,13 +227,13 @@ func TestOOMAction(t *testing.T) {
tracker.FallbackOldAndSetNewAction(action3)
tracker.FallbackOldAndSetNewAction(action4)
tracker.FallbackOldAndSetNewAction(action5)
require.Equal(t, action1, tracker.actionMuForHardLimit.actionOnExceed)
require.Equal(t, action2, tracker.actionMuForHardLimit.actionOnExceed.GetFallback())
action2.SetFinished()
require.Equal(t, action5, tracker.actionMuForHardLimit.actionOnExceed)
require.Equal(t, action4, tracker.actionMuForHardLimit.actionOnExceed.GetFallback())
action4.SetFinished()
require.Equal(t, action3, tracker.actionMuForHardLimit.actionOnExceed.GetFallback())
action3.SetFinished()
action4.SetFinished()
require.Equal(t, action5, tracker.actionMuForHardLimit.actionOnExceed.GetFallback())
action2.SetFinished()
require.Equal(t, action1, tracker.actionMuForHardLimit.actionOnExceed.GetFallback())
}

type mockAction struct {
Expand Down

0 comments on commit 78b32f3

Please sign in to comment.