Skip to content

Race condition in fake client with Unstructured get #3286

@sbueringer

Description

@sbueringer

Currently testing Cluster API with latest main of CR.

Found the following race condition:

Write at 0x00c0003fa240 by goroutine 1648:
  runtime.mapassign()
      /usr/local/go/src/internal/runtime/maps/runtime_swiss.go:191 +0x0
  k8s.io/apimachinery/pkg/runtime.(*Scheme).AddKnownTypeWithName()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/pkg/runtime/scheme.go:191 +0x4fa
  sigs.k8s.io/controller-runtime/pkg/client/fake.(*fakeClient).addToSchemeIfUnknownAndUnstructuredOrPartial()
      /home/prow/go/pkg/mod/sigs.k8s.io/[email protected]/pkg/client/fake/client.go:1882 +0x2ca
  sigs.k8s.io/controller-runtime/pkg/client/fake.(*fakeClient).Get()
      /home/prow/go/pkg/mod/sigs.k8s.io/[email protected]/pkg/client/fake/client.go:609 +0xb5
  sigs.k8s.io/cluster-api/controllers/external.GetObjectFromContractVersionedRef()
      /home/prow/go/src/sigs.k8s.io/cluster-api/controllers/external/util.go:78 +0x549
  sigs.k8s.io/cluster-api/internal/controllers/machineset.(*Reconciler).reconcileExternalTemplateReference()
      /home/prow/go/src/sigs.k8s.io/cluster-api/internal/controllers/machineset/machineset_controller.go:1561 +0x184
  sigs.k8s.io/cluster-api/internal/controllers/machineset.(*Reconciler).reconcileInfrastructure()
      /home/prow/go/src/sigs.k8s.io/cluster-api/internal/controllers/machineset/machineset_controller.go:384 +0x149
  sigs.k8s.io/cluster-api/internal/controllers/machineset.(*Reconciler).reconcileInfrastructure-fm()
      <autogenerated>:1 +0x5d
  sigs.k8s.io/cluster-api/internal/controllers/machineset.(*Reconciler).Reconcile.wrapErrMachineSetReconcileFunc.func3()
      /home/prow/go/src/sigs.k8s.io/cluster-api/internal/controllers/machineset/machineset_controller.go:286 +0x61
  sigs.k8s.io/cluster-api/internal/controllers/machineset.doReconcile()
      /home/prow/go/src/sigs.k8s.io/cluster-api/internal/controllers/machineset/machineset_controller.go:296 +0xf8
  sigs.k8s.io/cluster-api/internal/controllers/machineset.(*Reconciler).Reconcile()
      /home/prow/go/src/sigs.k8s.io/cluster-api/internal/controllers/machineset/machineset_controller.go:267 +0x16d7
  sigs.k8s.io/cluster-api/internal/controllers/machineset.TestMachineSetReconcile_MachinesCreatedConditionFalseOnBadInfraRef()
      /home/prow/go/src/sigs.k8s.io/cluster-api/internal/controllers/machineset/machineset_controller_test.go:1011 +0xfb9
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:1792 +0x225
  testing.(*T).Run.gowrap1()
      /usr/local/go/src/testing/testing.go:1851 +0x44

(This is a Get with Unstructured with the fake client)

Previous read at 0x00c0003fa240 by goroutine 850:
  runtime.mapaccess1()
      /usr/local/go/src/internal/runtime/maps/runtime_swiss.go:43 +0x0
  k8s.io/apimachinery/pkg/runtime.(*Scheme).ObjectKinds()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/pkg/runtime/scheme.go:273 +0x149
  k8s.io/apimachinery/pkg/runtime/serializer/json.(*Serializer).Decode()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/pkg/runtime/serializer/json/json.go:166 +0xb72
  k8s.io/apimachinery/pkg/runtime.WithoutVersionDecoder.Decode()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/pkg/runtime/helper.go:256 +0xb3
  k8s.io/apimachinery/pkg/runtime.(*WithoutVersionDecoder).Decode()
      <autogenerated>:1 +0xb1
  k8s.io/client-go/rest.Result.Into()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/rest/request.go:1462 +0x9a
  k8s.io/client-go/kubernetes/typed/core/v1.(*events).CreateWithEventNamespaceWithContext()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/kubernetes/typed/core/v1/event_expansion.go:86 +0x346
  k8s.io/client-go/kubernetes/typed/core/v1.(*events).CreateWithEventNamespace()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/kubernetes/typed/core/v1/event_expansion.go:69 +0x44
  k8s.io/client-go/kubernetes/typed/core/v1.(*EventSinkImpl).Create()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/kubernetes/typed/core/v1/event_expansion.go:217 +0x47
  k8s.io/client-go/tools/record.recordEvent()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/tools/record/event.go:340 +0x1de
  k8s.io/client-go/tools/record.(*eventBroadcasterImpl).recordToSink()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/tools/record/event.go:302 +0x26d
  k8s.io/client-go/tools/record.(*eventBroadcasterImpl).StartRecordingToSink.func1()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/tools/record/event.go:279 +0x64
  k8s.io/client-go/tools/record.(*eventBroadcasterImpl).StartEventWatcher.func1()
      /home/prow/go/pkg/mod/k8s.io/[email protected]/tools/record/event.go:418 +0x1a2

(Seems like a simple create event (CreateWithEventNamespaceWithContext))

Test code: https://github.com/kubernetes-sigs/cluster-api/blob/3adb25101d845af093cc44975b67cc1b94838e2e/internal/controllers/machineset/machineset_controller_test.go#L1005-L1010
PR: kubernetes-sigs/cluster-api#12634
Job: https://prow.k8s.io/view/gs/kubernetes-ci-logs/pr-logs/pull/kubernetes-sigs_cluster-api/12634/pull-cluster-api-test-main/1957403235211808768

Not sure if anything in controller-runtime changed or if there was a change in client-go.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions