Skip to content

Commit f92d51e

Browse files
ldmonsterCopilot
andauthored
[shell-operator] fix/add recovery to possibly deadlock (#822)
Signed-off-by: Pavel Okhlopkov <[email protected]> Co-authored-by: Copilot <[email protected]>
1 parent f4f9960 commit f92d51e

16 files changed

+1363
-360
lines changed

.golangci.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ linters:
100100
- third_party$
101101
- builtin$
102102
- examples$
103+
- _test\.go$
103104
issues:
104105
max-issues-per-linter: 0
105106
max-same-issues: 0

pkg/hook/controller/hook_controller.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ type BindingExecutionInfo struct {
2727
KubernetesBinding htypes.OnKubernetesEventConfig
2828
}
2929

30-
// В каждый хук надо будет положить этот объект.
31-
// Предварительно позвав With*Bindings и InitBindingsControllers
30+
// This object needs to be placed in each hook.
31+
// After calling With*Bindings and InitBindingsControllers
3232

33-
// Для kube надо будет сделать HandleEnableKubernetesBindings, чтобы получить списки существующих обхектов
34-
// и потом StartMonitors
33+
// For kube, HandleEnableKubernetesBindings needs to be called to get lists of existing objects
34+
// and then StartMonitors
3535

36-
// Всё Handle* методы принимают callback, чтобы создавать задания независимо.
36+
// All Handle* methods accept a callback to create tasks independently.
3737

38-
// методом KubernetesSnapshots можно достать все кубовые объекты, чтобы добавить
39-
// их в какой-то свой binding context
38+
// The KubernetesSnapshots method can be used to get all Kubernetes objects to add
39+
// them to some binding context
4040

4141
func NewHookController() *HookController {
4242
return &HookController{}

pkg/shell-operator/manager_events_handler.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package shell_operator
22

33
import (
44
"context"
5-
"log/slog"
65

76
"github.com/deckhouse/deckhouse/pkg/log"
87

@@ -86,17 +85,7 @@ func (m *ManagerEventsHandler) Start() {
8685
return
8786
}
8887

89-
m.taskQueues.DoWithLock(func(tqs *queue.TaskQueueSet) {
90-
for _, resTask := range tailTasks {
91-
if q, ok := tqs.Queues.Get(resTask.GetQueueName()); !ok {
92-
log.Error("Possible bug!!! Got task for queue but queue is not created yet.",
93-
slog.String("queueName", resTask.GetQueueName()),
94-
slog.String("description", resTask.GetDescription()))
95-
} else {
96-
q.AddLast(resTask)
97-
}
98-
}
99-
})
88+
m.taskQueues.AddTailTasks(tailTasks...)
10089
}
10190
}()
10291
}

pkg/shell-operator/operator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@ func (op *ShellOperator) runMetrics() {
932932
// task queue length
933933
go func() {
934934
for {
935-
op.TaskQueues.Iterate(context.TODO(), func(_ context.Context, queue *queue.TaskQueue) {
935+
op.TaskQueues.IterateSnapshot(context.TODO(), func(_ context.Context, queue *queue.TaskQueue) {
936936
queueLen := float64(queue.Length())
937937
op.MetricStorage.GaugeSet(metrics.TasksQueueLength, queueLen, map[string]string{"queue": queue.Name})
938938
})

pkg/task/dump/dump.go

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -79,51 +79,61 @@ func TaskQueues(tqs *queue.TaskQueueSet, format string, showEmpty bool) interfac
7979
tasksCount := 0
8080
mainTasksCount := 0
8181

82-
tqs.Iterate(context.TODO(), func(_ context.Context, queue *queue.TaskQueue) {
82+
tqs.IterateSnapshot(context.TODO(), func(_ context.Context, queue *queue.TaskQueue) {
8383
if queue == nil {
8484
return
8585
}
8686

87+
tasks := getTasksForQueue(queue)
88+
length := queue.Length()
89+
status := queue.GetStatus()
90+
isEmpty := length == 0
91+
8792
if queue.Name == tqs.MainName {
88-
mainTasksCount = queue.Length()
89-
if queue.IsEmpty() {
93+
mainTasksCount = length
94+
if isEmpty {
9095
mainQueue := dumpQueue{
9196
Name: queue.Name,
92-
TasksCount: queue.Length(),
97+
TasksCount: length,
9398
}
99+
94100
result.Empty = append(result.Empty, mainQueue)
95101
result.MainQueue = &mainQueue
96-
} else {
97-
tasks := getTasksForQueue(queue)
98-
mainQueue := dumpQueue{
99-
Name: queue.Name,
100-
TasksCount: queue.Length(),
101-
Status: queue.GetStatus(),
102-
Tasks: tasks,
103-
}
104-
result.Active = append(result.Active, mainQueue)
105-
result.MainQueue = &mainQueue
102+
103+
return
104+
}
105+
106+
mainQueue := dumpQueue{
107+
Name: queue.Name,
108+
TasksCount: length,
109+
Status: status,
110+
Tasks: tasks,
106111
}
112+
113+
result.Active = append(result.Active, mainQueue)
114+
result.MainQueue = &mainQueue
115+
107116
return
108117
}
109118

110119
otherQueuesCount++
111-
if queue.IsEmpty() {
120+
if isEmpty {
112121
emptyQueues++
113122
result.Empty = append(result.Empty, dumpQueue{
114123
Name: queue.Name,
115124
})
116-
} else {
117-
activeQueues++
118-
tasksCount += queue.Length()
119-
tasks := getTasksForQueue(queue)
120-
result.Active = append(result.Active, dumpQueue{
121-
Name: queue.Name,
122-
TasksCount: queue.Length(),
123-
Status: queue.GetStatus(),
124-
Tasks: tasks,
125-
})
125+
126+
return
126127
}
128+
129+
activeQueues++
130+
tasksCount += length
131+
result.Active = append(result.Active, dumpQueue{
132+
Name: queue.Name,
133+
TasksCount: length,
134+
Status: status,
135+
Tasks: tasks,
136+
})
127137
})
128138

129139
result.SortByName()

pkg/task/dump/dump_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func Test_Dump(t *testing.T) {
8888
"queue_name": "active-queue",
8989
},
9090
{
91-
"queue_action": "IsEmpty",
91+
"queue_action": "Length",
9292
"queue_name": "empty",
9393
},
9494
}

0 commit comments

Comments
 (0)