From 56edb778e8d6d31476902c57f48d00b6d4392e3c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 27 Mar 2025 16:48:15 +0100 Subject: [PATCH 1/2] [core] fix a recursive mutex locking in task Fixes a bug reported in OCTRL-999. --- core/task/task.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/task/task.go b/core/task/task.go index d7420a4e..eb834d67 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -251,6 +251,16 @@ func (t *Task) GetTraits() Traits { return Traits{} } +// lock-free version of GetTraits +func (t *Task) getTraits() Traits { + if class := t.GetTaskClass(); class != nil { + if t.parent != nil { + return t.parent.GetTaskTraits() + } + } + return Traits{} +} + // Returns a consolidated CommandInfo for this Task, based on Roles tree and // Class. func (t *Task) BuildTaskCommand(role parentRole) (err error) { @@ -525,7 +535,7 @@ func (t *Task) SendEvent(ev event.Event) { Hostname: t.hostname, ClassName: t.className, Path: t.getParentRolePath(), - Traits: traitsToPbTraits(t.GetTraits()), + Traits: traitsToPbTraits(t.getTraits()), } if t.parent == nil { From 82f632055ae4cf73c68dedc142bda21656db1de5 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 27 Mar 2025 17:44:38 +0100 Subject: [PATCH 2/2] [core] when getting task traits, retrieve parent only once for thread safety --- core/task/task.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index eb834d67..9e379c31 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -242,20 +242,18 @@ func (t *Task) GetControlMode() controlmode.ControlMode { return controlmode.DIRECT } -func (t *Task) GetTraits() Traits { - if class := t.GetTaskClass(); class != nil { - if t.GetParent() != nil { - return t.GetParent().GetTaskTraits() - } +func getTraits(role parentRole) Traits { + if role != nil { + return role.GetTaskTraits() } return Traits{} } -// lock-free version of GetTraits -func (t *Task) getTraits() Traits { +func (t *Task) GetTraits() Traits { if class := t.GetTaskClass(); class != nil { - if t.parent != nil { - return t.parent.GetTaskTraits() + parent := t.GetParent() + if parent != nil { + return getTraits(parent) } } return Traits{} @@ -535,7 +533,7 @@ func (t *Task) SendEvent(ev event.Event) { Hostname: t.hostname, ClassName: t.className, Path: t.getParentRolePath(), - Traits: traitsToPbTraits(t.getTraits()), + Traits: traitsToPbTraits(getTraits(t.parent)), } if t.parent == nil {