mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 11:50:44 +00:00
let garbage collector send orphaning patches in parallel
This commit is contained in:
parent
84db0a9487
commit
5e7d7c00a2
@ -18,6 +18,7 @@ package garbagecollector
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
@ -409,17 +410,30 @@ func (gc *GarbageCollector) processDeletingDependentsItem(item *node) error {
|
|||||||
|
|
||||||
// dependents are copies of pointers to the owner's dependents, they don't need to be locked.
|
// dependents are copies of pointers to the owner's dependents, they don't need to be locked.
|
||||||
func (gc *GarbageCollector) orphanDependents(owner objectReference, dependents []*node) error {
|
func (gc *GarbageCollector) orphanDependents(owner objectReference, dependents []*node) error {
|
||||||
var errorsSlice []error
|
errCh := make(chan error, len(dependents))
|
||||||
for _, dependent := range dependents {
|
wg := sync.WaitGroup{}
|
||||||
// the dependent.identity.UID is used as precondition
|
wg.Add(len(dependents))
|
||||||
patch := deleteOwnerRefPatch(dependent.identity.UID, owner.UID)
|
for i := range dependents {
|
||||||
_, err := gc.patchObject(dependent.identity, patch)
|
go func(dependent *node) {
|
||||||
// note that if the target ownerReference doesn't exist in the
|
defer wg.Done()
|
||||||
// dependent, strategic merge patch will NOT return an error.
|
// the dependent.identity.UID is used as precondition
|
||||||
if err != nil && !errors.IsNotFound(err) {
|
patch := deleteOwnerRefPatch(dependent.identity.UID, owner.UID)
|
||||||
errorsSlice = append(errorsSlice, fmt.Errorf("orphaning %s failed, %v", dependent.identity, err))
|
_, err := gc.patchObject(dependent.identity, patch)
|
||||||
}
|
// note that if the target ownerReference doesn't exist in the
|
||||||
|
// dependent, strategic merge patch will NOT return an error.
|
||||||
|
if err != nil && !errors.IsNotFound(err) {
|
||||||
|
errCh <- fmt.Errorf("orphaning %s failed, %v", dependent.identity, err)
|
||||||
|
}
|
||||||
|
}(dependents[i])
|
||||||
}
|
}
|
||||||
|
wg.Wait()
|
||||||
|
close(errCh)
|
||||||
|
|
||||||
|
var errorsSlice []error
|
||||||
|
for e := range errCh {
|
||||||
|
errorsSlice = append(errorsSlice, e)
|
||||||
|
}
|
||||||
|
|
||||||
if len(errorsSlice) != 0 {
|
if len(errorsSlice) != 0 {
|
||||||
return fmt.Errorf("failed to orphan dependents of owner %s, got errors: %s", owner, utilerrors.NewAggregate(errorsSlice).Error())
|
return fmt.Errorf("failed to orphan dependents of owner %s, got errors: %s", owner, utilerrors.NewAggregate(errorsSlice).Error())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user