let garbage collector send orphaning patches in parallel

This commit is contained in:
Chao Xu 2017-07-24 13:56:39 -07:00
parent 84db0a9487
commit 5e7d7c00a2

View File

@ -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())
} }