Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Data race when calling GetKustomizedManifest from multiple goroutines #657

Closed
2 tasks
pmalek opened this issue May 15, 2023 · 1 comment
Closed
2 tasks
Labels
area/tests bug Something isn't working good first issue Good for newcomers

Comments

@pmalek
Copy link
Member

pmalek commented May 15, 2023

Data race can be observed when e.g. running KIC's e2e tests

==================
WARNING: DATA RACE
Read at 0x000108313610 by goroutine 79:
  sigs.k8s.io/kustomize/kyaml/openapi.SetSchema()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/sigs.k8s.io/kustomize/kyaml@v0.13.9/openapi/openapi.go:555 +0x40
  sigs.k8s.io/kustomize/api/krusty.(*Kustomizer).Run()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/sigs.k8s.io/kustomize/api@v0.12.1/krusty/kustomizer.go:83 +0x2ec
  github.com/kong/kubernetes-testing-framework/pkg/utils/kubernetes/kubectl.runKustomize()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/utils/kubernetes/kubectl/kustomize.go:53 +0x1c0
  github.com/kong/kubernetes-testing-framework/pkg/utils/kubernetes/kubectl.GetKustomizedManifest()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/utils/kubernetes/kubectl/kustomize.go:43 +0x3b4
  github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/metallb.getManifest()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/clusters/addons/metallb/metallb.go:328 +0x36c
  github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/metallb.metallbDeployHack()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/clusters/addons/metallb/metallb.go:363 +0x144
  github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/metallb.deployMetallbForKindCluster()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/clusters/addons/metallb/metallb.go:167 +0x1b8
  github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/metallb.(*addon).Deploy()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/clusters/addons/metallb/metallb.go:84 +0xd8
  github.com/kong/kubernetes-testing-framework/pkg/clusters/types/kind.(*Cluster).DeployAddon()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/clusters/types/kind/cluster.go:122 +0x16c
  github.com/kong/kubernetes-testing-framework/pkg/environments.(*Builder).Build.func1()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/environments/builder.go:154 +0x80

Previous write at 0x000108313610 by goroutine 60:
  sigs.k8s.io/kustomize/kyaml/openapi.SetSchema()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/sigs.k8s.io/kustomize/kyaml@v0.13.9/openapi/openapi.go:574 +0x244
  sigs.k8s.io/kustomize/api/krusty.(*Kustomizer).Run()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/sigs.k8s.io/kustomize/api@v0.12.1/krusty/kustomizer.go:83 +0x2ec
  github.com/kong/kubernetes-testing-framework/pkg/utils/kubernetes/kubectl.runKustomize()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/utils/kubernetes/kubectl/kustomize.go:53 +0x1c0
  github.com/kong/kubernetes-testing-framework/pkg/utils/kubernetes/kubectl.GetKustomizedManifest()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/utils/kubernetes/kubectl/kustomize.go:43 +0x3b4
  github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/metallb.getManifest()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/clusters/addons/metallb/metallb.go:328 +0x36c
  github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/metallb.metallbDeployHack()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/clusters/addons/metallb/metallb.go:363 +0x144
  github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/metallb.deployMetallbForKindCluster()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/clusters/addons/metallb/metallb.go:167 +0x1b8
  github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/metallb.(*addon).Deploy()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/clusters/addons/metallb/metallb.go:84 +0xd8
  github.com/kong/kubernetes-testing-framework/pkg/clusters/types/kind.(*Cluster).DeployAddon()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/clusters/types/kind/cluster.go:122 +0x16c
  github.com/kong/kubernetes-testing-framework/pkg/environments.(*Builder).Build.func1()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/environments/builder.go:154 +0x80

Goroutine 79 (running) created at:
  github.com/kong/kubernetes-testing-framework/pkg/environments.(*Builder).Build()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/environments/builder.go:153 +0x9d0
  github.com/kong/kubernetes-ingress-controller/v2/test/e2e.setupE2ETest()
      /Users/USER/code_/kubernetes-ingress-controller/test/e2e/helpers_test.go:98 +0x1d4
  github.com/kong/kubernetes-ingress-controller/v2/test/e2e.TestDeployAllInOneDBLESSKuma()
      /Users/USER/code_/kubernetes-ingress-controller/test/e2e/kuma_test.go:19 +0x30c
  testing.tRunner()
      /Users/USER/.gvm/gos/go1.20.4/src/testing/testing.go:1576 +0x188
  testing.(*T).Run.func1()
      /Users/USER/.gvm/gos/go1.20.4/src/testing/testing.go:1629 +0x40

Goroutine 60 (running) created at:
  github.com/kong/kubernetes-testing-framework/pkg/environments.(*Builder).Build()
      /Users/USER/.gvm/pkgsets/go1.20.4/global/pkg/mod/github.com/kong/kubernetes-testing-framework@v0.30.1/pkg/environments/builder.go:153 +0x9d0
  github.com/kong/kubernetes-ingress-controller/v2/test/e2e.setupE2ETest()
      /Users/USER/code_/kubernetes-ingress-controller/test/e2e/helpers_test.go:98 +0x1d4
  github.com/kong/kubernetes-ingress-controller/v2/test/e2e.TestDeployAllInOneDBLESSLegacy()
      /Users/USER/code_/kubernetes-ingress-controller/test/e2e/all_in_one_test.go:48 +0x78
  testing.tRunner()
      /Users/USER/.gvm/gos/go1.20.4/src/testing/testing.go:1576 +0x188
  testing.(*T).Run.func1()
      /Users/USER/.gvm/gos/go1.20.4/src/testing/testing.go:1629 +0x40
==================

Proposed solution

Add a lock in

func runKustomize(path string) ([]byte, error) {
k := krusty.MakeKustomizer(krusty.MakeDefaultOptions())
m, err := k.Run(filesys.MakeFsOnDisk(), path)
if err != nil {
return []byte{}, err
}
return m.AsYaml()
}
to prevent concurrent access.

Acceptance criteria

  • As a user I do not experience data races when using GetKustomizedManifest()
  • An appropriate test is added to ensure ( to the extent possible ) that no data race is possible when calling GetKustomizedManifest() from multiple goroutines.
@pmalek pmalek added area/tests bug Something isn't working good first issue Good for newcomers labels May 15, 2023
@pmalek
Copy link
Member Author

pmalek commented Jun 15, 2023

This should not be an issue anymore since kubernetes-sigs/kustomize#4967 was merged and released.

@pmalek pmalek closed this as completed Jun 15, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/tests bug Something isn't working good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests

1 participant