open-component-model / ocm

Open Component Model (Software Bill of Delivery Toolset)
https://ocm.software
Apache License 2.0
29 stars 18 forks source link

Race condition in MatchingResolver #820

Open achimweigel opened 3 weeks ago

achimweigel commented 3 weeks ago

What happened:

There seems to be a race condition in the MatchingResolver. Usually, the parallel access to the member rules is synchronized (e.g. here) but this is violated here.

During our tests we got the following error:


WARNING: DATA RACE
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:580)
Write at 0x00c00044f248 by goroutine 86:
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:581)
  github.com/open-component-model/ocm/pkg/contexts/ocm/internal.(*MatchingResolver).AddRule()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:582)
      [/go/pkg/mod/github.com/open-component-model/ocm@v0.10.0/pkg/contexts/ocm/internal/resolver.go:165](mailto:/go/pkg/mod/github.com/open-component-model/ocm@v0.10.0/pkg/contexts/ocm/internal/resolver.go:165) +0x38b
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:583)
  github.com/open-component-model/ocm/pkg/contexts/ocm/internal.(*_context).AddResolverRule()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:584)
      [/go/pkg/mod/github.com/open-component-model/ocm@v0.10.0/pkg/contexts/ocm/internal/context.go:329](mailto:/go/pkg/mod/github.com/open-component-model/ocm@v0.10.0/pkg/contexts/ocm/internal/context.go:329) +0xea
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:585)
  github.com/open-component-model/ocm/pkg/contexts/ocm/internal.(*gcWrapper).AddResolverRule()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:586)
      <autogenerated>:1 +0x1f
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:587)
  github.com/gardener/landscaper/pkg/components/ocmlib.(*RegistryAccess).GetComponentVersion()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:588)
      /tmp/build/86a4261d/pull-request-gardener.landscaper-master-pr/pkg/components/ocmlib/registryaccess.go:144 +0x6b0
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:589)
  github.com/gardener/landscaper/pkg/components/model.GetComponentVersionWithOverwriter()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:590)
      /tmp/build/86a4261d/pull-request-gardener.landscaper-master-pr/pkg/components/model/registryaccess.go:31 +0x101
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:591)
  github.com/gardener/landscaper/pkg/components/ocmlib.(*ComponentVersion).GetReferencedComponentVersion()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:592)
      /tmp/build/86a4261d/pull-request-gardener.landscaper-master-pr/pkg/components/ocmlib/componentversion.go:77 +0x1f0
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:593)
  github.com/gardener/landscaper/pkg/components/model.fetchComponentVersion()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:594)
      /tmp/build/86a4261d/pull-request-gardener.landscaper-master-pr/pkg/components/model/componentversion_refs.go:226 +0x1f3
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:595)
  github.com/gardener/landscaper/pkg/components/model.getTransitiveComponentReferencesRecursively.gowrap2()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:596)
      /tmp/build/86a4261d/pull-request-gardener.landscaper-master-pr/pkg/components/model/componentversion_refs.go:203 +0x124
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:597)

[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:598)
Previous read at 0x00c00044f248 by goroutine 87:
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:599)
  github.com/open-component-model/ocm/pkg/contexts/ocm/internal.(*_context).GetResolver()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:600)
      [/go/pkg/mod/github.com/open-component-model/ocm@v0.10.0/pkg/contexts/ocm/internal/context.go:322](mailto:/go/pkg/mod/github.com/open-component-model/ocm@v0.10.0/pkg/contexts/ocm/internal/context.go:322) +0xc6
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:601)
  github.com/open-component-model/ocm/pkg/contexts/ocm/internal.(*gcWrapper).GetResolver()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:602)
      <autogenerated>:1 +0x24
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:603)
  github.com/gardener/landscaper/pkg/components/ocmlib.(*RegistryAccess).GetComponentVersion()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:604)
      /tmp/build/86a4261d/pull-request-gardener.landscaper-master-pr/pkg/components/ocmlib/registryaccess.go:145 +0x6d5
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:605)
  github.com/gardener/landscaper/pkg/components/model.GetComponentVersionWithOverwriter()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:606)
      /tmp/build/86a4261d/pull-request-gardener.landscaper-master-pr/pkg/components/model/registryaccess.go:31 +0x101
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:607)
  github.com/gardener/landscaper/pkg/components/ocmlib.(*ComponentVersion).GetReferencedComponentVersion()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:608)
      /tmp/build/86a4261d/pull-request-gardener.landscaper-master-pr/pkg/components/ocmlib/componentversion.go:77 +0x1f0
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:609)
  github.com/gardener/landscaper/pkg/components/model.fetchComponentVersion()
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:610)
      /tmp/build/86a4261d/pull-request-gardener.landscaper-master-pr/pkg/components/model/componentversion_refs.go:226 +0x1f3
[04:35:15](https://concourse.ci.gardener.cloud/builds/306331845#L665a4bc5:611)
  github.com/gardener/landscaper/pkg/components/model.getTransitiveComponentReferencesRecursively.gowrap2()

What you expected to happen:

How to reproduce it (as minimally and precisely as possible):

Anything else we need to know:

Environment: