mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 03:41:45 +00:00
Merge pull request #49516 from caesarxuchao/parallel-patch
Automatic merge from submit-queue (batch tested with PRs 48360, 48469, 49576, 49516, 49558) Let garbage collector send orphaning patches in parallel Garbage collector sends orphaning patches in parallel now.
This commit is contained in:
commit
89525c62fd
@ -18,6 +18,7 @@ package garbagecollector
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
@ -410,17 +411,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