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.568s

closes #101

Edited by Priya Goyal

Merge request reports

Loading
Loading