From 698e151229e50849d906fbdbc0bcc9e71efe6af2 Mon Sep 17 00:00:00 2001 From: derekwaynecarr Date: Thu, 1 Sep 2016 17:04:54 -0400 Subject: [PATCH] Namespace controller deletes pods last --- .../namespace/namespace_controller_utils.go | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pkg/controller/namespace/namespace_controller_utils.go b/pkg/controller/namespace/namespace_controller_utils.go index 88e7f9a76a6..76c9beaff8e 100644 --- a/pkg/controller/namespace/namespace_controller_utils.go +++ b/pkg/controller/namespace/namespace_controller_utils.go @@ -18,6 +18,7 @@ package namespace import ( "fmt" + "sort" "time" "k8s.io/kubernetes/pkg/api" @@ -318,6 +319,8 @@ func deleteAllContent( estimate := int64(0) glog.V(4).Infof("namespace controller - deleteAllContent - namespace: %s, gvrs: %v", namespace, groupVersionResources) // iterate over each group version, and attempt to delete all of its resources + // we sort resources to delete in a priority order that deletes pods LAST + sort.Sort(sortableGroupVersionResources(groupVersionResources)) for _, gvr := range groupVersionResources { gvrEstimate, err := deleteAllContentForGroupVersionResource(kubeClient, clientPool, opCache, gvr, namespace, namespaceDeletedAt) if err != nil { @@ -453,3 +456,20 @@ func estimateGracefulTerminationForPods(kubeClient clientset.Interface, ns strin } return estimate, nil } + +// sortableGroupVersionResources sorts the input set of resources for deletion, and orders pods to always be last. +// the idea is that the namespace controller will delete all things that spawn pods first in order to reduce the time +// those controllers spend creating pods only to be told NO in admission and potentially overwhelming cluster especially if they lack rate limiting. +type sortableGroupVersionResources []unversioned.GroupVersionResource + +func (list sortableGroupVersionResources) Len() int { + return len(list) +} + +func (list sortableGroupVersionResources) Swap(i, j int) { + list[i], list[j] = list[j], list[i] +} + +func (list sortableGroupVersionResources) Less(i, j int) bool { + return list[j].Group == "" && list[j].Resource == "pods" +}