Merge pull request #36377 from nikhiljindal/fixrace
Automatic merge from submit-queue Fix a data race condition in federation namespace controller Fixes https://github.com/kubernetes/kubernetes/issues/36364 Fixing federation namespace controller to create a copy of namespace fetched from the store before editing it. Without it there is a data race condition with other readers of the store. cc @kubernetes/sig-cluster-federation @mwielgus @madhusudancs
This commit is contained in:
		| @@ -27,6 +27,7 @@ go_library( | |||||||
|         "//pkg/client/clientset_generated/release_1_5:go_default_library", |         "//pkg/client/clientset_generated/release_1_5:go_default_library", | ||||||
|         "//pkg/client/record:go_default_library", |         "//pkg/client/record:go_default_library", | ||||||
|         "//pkg/controller:go_default_library", |         "//pkg/controller:go_default_library", | ||||||
|  |         "//pkg/conversion:go_default_library", | ||||||
|         "//pkg/runtime:go_default_library", |         "//pkg/runtime:go_default_library", | ||||||
|         "//pkg/util/flowcontrol:go_default_library", |         "//pkg/util/flowcontrol:go_default_library", | ||||||
|         "//pkg/watch:go_default_library", |         "//pkg/watch:go_default_library", | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ import ( | |||||||
| 	kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" | 	kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" | ||||||
| 	"k8s.io/kubernetes/pkg/client/record" | 	"k8s.io/kubernetes/pkg/client/record" | ||||||
| 	"k8s.io/kubernetes/pkg/controller" | 	"k8s.io/kubernetes/pkg/controller" | ||||||
|  | 	"k8s.io/kubernetes/pkg/conversion" | ||||||
| 	"k8s.io/kubernetes/pkg/runtime" | 	"k8s.io/kubernetes/pkg/runtime" | ||||||
| 	"k8s.io/kubernetes/pkg/util/flowcontrol" | 	"k8s.io/kubernetes/pkg/util/flowcontrol" | ||||||
| 	"k8s.io/kubernetes/pkg/watch" | 	"k8s.io/kubernetes/pkg/watch" | ||||||
| @@ -328,7 +329,7 @@ func (nc *NamespaceController) reconcileNamespace(namespace string) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	baseNamespaceObj, exist, err := nc.namespaceInformerStore.GetByKey(namespace) | 	namespaceObjFromStore, exist, err := nc.namespaceInformerStore.GetByKey(namespace) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		glog.Errorf("Failed to query main namespace store for %v: %v", namespace, err) | 		glog.Errorf("Failed to query main namespace store for %v: %v", namespace, err) | ||||||
| 		nc.deliverNamespace(namespace, 0, true) | 		nc.deliverNamespace(namespace, 0, true) | ||||||
| @@ -339,7 +340,15 @@ func (nc *NamespaceController) reconcileNamespace(namespace string) { | |||||||
| 		// Not federated namespace, ignoring. | 		// Not federated namespace, ignoring. | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	baseNamespace := baseNamespaceObj.(*api_v1.Namespace) | 	// Create a copy before modifying the namespace to prevent race condition with | ||||||
|  | 	// other readers of namespace from store. | ||||||
|  | 	namespaceObj, err := conversion.NewCloner().DeepCopy(namespaceObjFromStore) | ||||||
|  | 	baseNamespace, ok := namespaceObj.(*api_v1.Namespace) | ||||||
|  | 	if err != nil || !ok { | ||||||
|  | 		glog.Errorf("Error in retrieving obj from store: %v, %v", ok, err) | ||||||
|  | 		nc.deliverNamespace(namespace, 0, true) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
| 	if baseNamespace.DeletionTimestamp != nil { | 	if baseNamespace.DeletionTimestamp != nil { | ||||||
| 		if err := nc.delete(baseNamespace); err != nil { | 		if err := nc.delete(baseNamespace); err != nil { | ||||||
| 			glog.Errorf("Failed to delete %s: %v", namespace, err) | 			glog.Errorf("Failed to delete %s: %v", namespace, err) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Kubernetes Submit Queue
					Kubernetes Submit Queue