From ea6891f808598e5c73762eec8a4e8408a9a229a6 Mon Sep 17 00:00:00 2001 From: Weizhen Wang Date: Wed, 18 Jan 2023 16:30:25 +0800 Subject: [PATCH 1/2] resourcemanager: avoid to get nil after task finished when to stop task Signed-off-by: Weizhen Wang --- resourcemanager/pooltask/task_manager.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resourcemanager/pooltask/task_manager.go b/resourcemanager/pooltask/task_manager.go index d08443dc7caf1..25ce9e8ad1b4b 100644 --- a/resourcemanager/pooltask/task_manager.go +++ b/resourcemanager/pooltask/task_manager.go @@ -139,8 +139,12 @@ func (t *TaskManager[T, U, C, CT, TF]) StopTask(taskID uint64) { shardID := getShardID(taskID) t.task[shardID].rw.Lock() defer t.task[shardID].rw.Unlock() - l := t.task[shardID].stats[taskID].stats - for e := l.Front(); e != nil; e = e.Next() { - e.Value.(tContainer[T, U, C, CT, TF]).task.SetStatus(StopTask) + // When call the StopTask, the task may have been deleted from the manager. + s, ok := t.task[shardID].stats[taskID] + if ok { + l := s.stats + for e := l.Front(); e != nil; e = e.Next() { + e.Value.(tContainer[T, U, C, CT, TF]).task.SetStatus(StopTask) + } } } From 7654271159d31d41669872601b72b8bc37293b9d Mon Sep 17 00:00:00 2001 From: Weizhen Wang Date: Wed, 18 Jan 2023 16:33:25 +0800 Subject: [PATCH 2/2] resourcemanage: avoid to get nil pointer after task finishes when to call Stop Signed-off-by: Weizhen Wang --- util/gpool/spmc/spmcpool_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/util/gpool/spmc/spmcpool_test.go b/util/gpool/spmc/spmcpool_test.go index 1106e7bd98f69..3036ad7412a3c 100644 --- a/util/gpool/spmc/spmcpool_test.go +++ b/util/gpool/spmc/spmcpool_test.go @@ -114,6 +114,8 @@ func TestStopPool(t *testing.T) { control.Stop() close(exit) control.Wait() + // it should pass. Stop can be used after the pool is closed. we should prevent it from panic. + control.Stop() wg.Wait() // close pool pool.ReleaseAndWait()