-
Notifications
You must be signed in to change notification settings - Fork 5.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
planner: add simple serializing scheduler (#51866)
ref #51664
- Loading branch information
Showing
6 changed files
with
267 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
// Copyright 2024 PingCAP, Inc. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package memo | ||
|
||
var _ TaskScheduler = &SimpleTaskScheduler{} | ||
|
||
// TaskScheduler is a scheduling interface defined for serializing(single thread)/concurrent(multi thread) running. | ||
type TaskScheduler interface { | ||
ExecuteTasks() | ||
} | ||
|
||
// SimpleTaskScheduler is defined for serializing scheduling of memo tasks. | ||
type SimpleTaskScheduler struct { | ||
Err error | ||
SchedulerCtx TaskSchedulerContext | ||
} | ||
|
||
// ExecuteTasks implements the interface of TaskScheduler. | ||
func (s *SimpleTaskScheduler) ExecuteTasks() { | ||
stack := s.SchedulerCtx.getStack() | ||
defer func() { | ||
// when step out of the scheduler, if the stack is empty, clean and release it. | ||
if !stack.Empty() { | ||
stack.Destroy() | ||
} | ||
}() | ||
for !stack.Empty() { | ||
// when use customized stack to drive the tasks, the call-chain state is dived in the stack. | ||
task := stack.Pop() | ||
if err := task.execute(); err != nil { | ||
s.Err = err | ||
return | ||
} | ||
} | ||
} | ||
|
||
// TaskSchedulerContext is defined for scheduling logic calling, also facilitate interface-oriented coding and testing. | ||
type TaskSchedulerContext interface { | ||
// we exported the Stack interface here rather than the basic stack implementation. | ||
getStack() Stack | ||
// we exported the only one push action to user, Task is an interface definition. | ||
pushTask(task Task) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
// Copyright 2024 PingCAP, Inc. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package memo | ||
|
||
import ( | ||
"errors" | ||
"strconv" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
// TestSchedulerContext is defined to test scheduling logic here. | ||
type TestSchedulerContext struct { | ||
ts *taskStack | ||
} | ||
|
||
func (t *TestSchedulerContext) getStack() Stack { | ||
return t.ts | ||
} | ||
|
||
func (t *TestSchedulerContext) pushTask(task Task) { | ||
t.ts.Push(task) | ||
} | ||
|
||
// TestSchedulerContext is defined to mock special error state in specified task. | ||
type TestTaskImpl2 struct { | ||
a int64 | ||
} | ||
|
||
func (t *TestTaskImpl2) execute() error { | ||
// mock error at special task | ||
if t.a == 2 { | ||
return errors.New("mock error at task id = 2") | ||
} | ||
return nil | ||
} | ||
|
||
func (t *TestTaskImpl2) desc() string { | ||
return strconv.Itoa(int(t.a)) | ||
} | ||
|
||
func TestSimpleTaskScheduler(t *testing.T) { | ||
testSchedulerContext := &TestSchedulerContext{ | ||
newTaskStack(), | ||
} | ||
testScheduler := &SimpleTaskScheduler{ | ||
SchedulerCtx: testSchedulerContext, | ||
} | ||
testScheduler.SchedulerCtx.pushTask(&TestTaskImpl2{a: 1}) | ||
testScheduler.SchedulerCtx.pushTask(&TestTaskImpl2{a: 2}) | ||
testScheduler.SchedulerCtx.pushTask(&TestTaskImpl2{a: 3}) | ||
|
||
var testTaskScheduler TaskScheduler = testScheduler | ||
testTaskScheduler.ExecuteTasks() | ||
require.NotNil(t, testScheduler.Err) | ||
require.Equal(t, testScheduler.Err.Error(), "mock error at task id = 2") | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters