mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 17:30:00 +00:00
Merge pull request #47000 from caesarxuchao/fix-gc-orphan
Automatic merge from submit-queue (batch tested with PRs 47000, 47188, 47094, 47323, 47124) GC should retry on patch error Fixing https://github.com/kubernetes/kubernetes/issues/46998. This is fixing a bug, so applying the 1.7 milestone.
This commit is contained in:
commit
3b05e19076
@ -399,7 +399,6 @@ 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 failedDependents []objectReference
|
|
||||||
var errorsSlice []error
|
var errorsSlice []error
|
||||||
for _, dependent := range dependents {
|
for _, dependent := range dependents {
|
||||||
// the dependent.identity.UID is used as precondition
|
// the dependent.identity.UID is used as precondition
|
||||||
@ -408,10 +407,10 @@ func (gc *GarbageCollector) orphanDependents(owner objectReference, dependents [
|
|||||||
// note that if the target ownerReference doesn't exist in the
|
// note that if the target ownerReference doesn't exist in the
|
||||||
// dependent, strategic merge patch will NOT return an error.
|
// dependent, strategic merge patch will NOT return an error.
|
||||||
if err != nil && !errors.IsNotFound(err) {
|
if err != nil && !errors.IsNotFound(err) {
|
||||||
errorsSlice = append(errorsSlice, fmt.Errorf("orphaning %s failed with %v", dependent.identity, err))
|
errorsSlice = append(errorsSlice, fmt.Errorf("orphaning %s failed, %v", dependent.identity, err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(failedDependents) != 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())
|
||||||
}
|
}
|
||||||
glog.V(5).Infof("successfully updated all dependents of owner %s", owner)
|
glog.V(5).Infof("successfully updated all dependents of owner %s", owner)
|
||||||
|
@ -586,3 +586,37 @@ func TestUnblockOwnerReference(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOrphanDependentsFailure(t *testing.T) {
|
||||||
|
testHandler := &fakeActionHandler{
|
||||||
|
response: map[string]FakeResponse{
|
||||||
|
"PATCH" + "/api/v1/namespaces/ns1/pods/pod": {
|
||||||
|
409,
|
||||||
|
[]byte{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
srv, clientConfig := testServerAndClientConfig(testHandler.ServeHTTP)
|
||||||
|
defer srv.Close()
|
||||||
|
|
||||||
|
gc := setupGC(t, clientConfig)
|
||||||
|
defer close(gc.stop)
|
||||||
|
|
||||||
|
dependents := []*node{
|
||||||
|
{
|
||||||
|
identity: objectReference{
|
||||||
|
OwnerReference: metav1.OwnerReference{
|
||||||
|
Kind: "Pod",
|
||||||
|
APIVersion: "v1",
|
||||||
|
Name: "pod",
|
||||||
|
},
|
||||||
|
Namespace: "ns1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
err := gc.orphanDependents(objectReference{}, dependents)
|
||||||
|
expected := `the server reported a conflict (patch pods pod)`
|
||||||
|
if err == nil || !strings.Contains(err.Error(), expected) {
|
||||||
|
t.Errorf("expected error contains text %s, got %v", expected, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user