Draft: prevent data race on node.FluxObject and add race flag
node embeds FluxObject as an interface field. Go auto-generates forwarding methods (e.g QualifiedName()) for embedded interfaces, but these auto-generated methods read n.FluxObject without holding any lock.
This races with setObject(), which writes n.FluxObject under a write lock.
Additionally, computeStatus was called directly on the raw FluxObject in objectMap.Store(), mutating internal fields (status, ready) without the node lock that concurrent readers rely on.
This MR adds explicit lock mechanism for all FluxObject methods on *node, fixes SetMissingDependencies and computeStatus to use write locks, Store() uses node to call computeStatus , and enables go test -race in CI with pipefail so races fail the pipeline.
Before the fix, race detected by go test -race ./....
WARNING: DATA RACE
Write at 0x00c0009fc060 by goroutine 324:
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*node).setObject()
/home/priya/sylva/sylvactl/internal/informer/dag.go:446 +0x92
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*objectMap).Store()
/home/priya/sylva/sylvactl/internal/informer/dag.go:110 +0x10b1
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*TreeInformer).handleEvent()
/home/priya/sylva/sylvactl/internal/informer/flux_informer.go:321 +0x332
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*TreeInformer).eventHandler()
/home/priya/sylva/sylvactl/internal/informer/flux_informer.go:297 +0x3af
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.NewInformer.gowrap1()
/home/priya/sylva/sylvactl/internal/informer/flux_informer.go:190 +0x2e
Previous read at 0x00c0009fc060 by goroutine 162:
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*node).DisplayName()
<autogenerated>:1 +0x28
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.logSummary()
/home/priya/sylva/sylvactl/cmd/watch.go:320 +0x229
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.logResources()
/home/priya/sylva/sylvactl/cmd/watch.go:428 +0x1c65
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.watchCmdRun()
/home/priya/sylva/sylvactl/cmd/watch.go:184 +0x9f9
WARNING: DATA RACE
Write at 0x00c000d49b60 by goroutine 324:
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*node).setObject()
/home/priya/sylva/sylvactl/internal/informer/dag.go:446 +0x92
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*objectMap).Store()
/home/priya/sylva/sylvactl/internal/informer/dag.go:110 +0x10b1
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*TreeInformer).handleEvent()
/home/priya/sylva/sylvactl/internal/informer/flux_informer.go:321 +0x332
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*TreeInformer).eventHandler()
/home/priya/sylva/sylvactl/internal/informer/flux_informer.go:297 +0x3af
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.NewInformer.gowrap1()
/home/priya/sylva/sylvactl/internal/informer/flux_informer.go:190 +0x2e
Previous read at 0x00c000d49b60 by goroutine 162:
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*node).HasMissingDependencies()
<autogenerated>:1 +0x28
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.showResource()
/home/priya/sylva/sylvactl/cmd/watch.go:550 +0x76
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.computeProgressingResources()
/home/priya/sylva/sylvactl/cmd/watch.go:293 +0x10b
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.logResources()
/home/priya/sylva/sylvactl/cmd/watch.go:423 +0x1284
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.watchCmdRun()
/home/priya/sylva/sylvactl/cmd/watch.go:184 +0x9f9
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.watchCmdRun()
WARNING: DATA RACE
Write at 0x00c0010b7ce0 by goroutine 324:
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*node).setObject()
/home/priya/sylva/sylvactl/internal/informer/dag.go:446 +0x92
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*objectMap).Store()
/home/priya/sylva/sylvactl/internal/informer/dag.go:110 +0x10b1
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*TreeInformer).handleEvent()
/home/priya/sylva/sylvactl/internal/informer/flux_informer.go:321 +0x332
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*TreeInformer).eventHandler()
/home/priya/sylva/sylvactl/internal/informer/flux_informer.go:297 +0x3af
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.NewInformer.gowrap1()
/home/priya/sylva/sylvactl/internal/informer/flux_informer.go:190 +0x2e
Previous read at 0x00c0010b7ce0 by goroutine 162:
gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer.(*node).QualifiedName()
<autogenerated>:1 +0x28
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.computeProgressingResources()
/home/priya/sylva/sylvactl/cmd/watch.go:294 +0x122
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.logResources()
/home/priya/sylva/sylvactl/cmd/watch.go:423 +0x1284
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.watchCmdRun()
/home/priya/sylva/sylvactl/cmd/watch.go:184 +0x9f9
gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd.watchCmdRun()After the fix, no race detected
go test -race ./...
ok gitlab.com/sylva-projects/sylva-elements/sylvactl/cmd 54.724s
ok gitlab.com/sylva-projects/sylva-elements/sylvactl/internal/informer 119.568scloses #101