mirror of https://github.com/k3s-io/k3s
Do not move deletionTimestamp to the future
parent
5e86fa43f5
commit
17588f0fdc
|
@ -841,21 +841,25 @@ func deletionFinalizersForGarbageCollection(ctx context.Context, e *Store, acces
|
||||||
}
|
}
|
||||||
|
|
||||||
// markAsDeleting sets the obj's DeletionGracePeriodSeconds to 0, and sets the
|
// markAsDeleting sets the obj's DeletionGracePeriodSeconds to 0, and sets the
|
||||||
// DeletionTimestamp to "now". Finalizers are watching for such updates and will
|
// DeletionTimestamp to "now" if there is no existing deletionTimestamp or if the existing
|
||||||
|
// deletionTimestamp is further in future. Finalizers are watching for such updates and will
|
||||||
// finalize the object if their IDs are present in the object's Finalizers list.
|
// finalize the object if their IDs are present in the object's Finalizers list.
|
||||||
func markAsDeleting(obj runtime.Object) (err error) {
|
func markAsDeleting(obj runtime.Object, now time.Time) (err error) {
|
||||||
objectMeta, kerr := meta.Accessor(obj)
|
objectMeta, kerr := meta.Accessor(obj)
|
||||||
if kerr != nil {
|
if kerr != nil {
|
||||||
return kerr
|
return kerr
|
||||||
}
|
}
|
||||||
now := metav1.NewTime(time.Now())
|
|
||||||
// This handles Generation bump for resources that don't support graceful
|
// This handles Generation bump for resources that don't support graceful
|
||||||
// deletion. For resources that support graceful deletion is handle in
|
// deletion. For resources that support graceful deletion is handle in
|
||||||
// pkg/api/rest/delete.go
|
// pkg/api/rest/delete.go
|
||||||
if objectMeta.GetDeletionTimestamp() == nil && objectMeta.GetGeneration() > 0 {
|
if objectMeta.GetDeletionTimestamp() == nil && objectMeta.GetGeneration() > 0 {
|
||||||
objectMeta.SetGeneration(objectMeta.GetGeneration() + 1)
|
objectMeta.SetGeneration(objectMeta.GetGeneration() + 1)
|
||||||
}
|
}
|
||||||
objectMeta.SetDeletionTimestamp(&now)
|
existingDeletionTimestamp := objectMeta.GetDeletionTimestamp()
|
||||||
|
if existingDeletionTimestamp == nil || existingDeletionTimestamp.After(now) {
|
||||||
|
metaNow := metav1.NewTime(now)
|
||||||
|
objectMeta.SetDeletionTimestamp(&metaNow)
|
||||||
|
}
|
||||||
var zero int64 = 0
|
var zero int64 = 0
|
||||||
objectMeta.SetDeletionGracePeriodSeconds(&zero)
|
objectMeta.SetDeletionGracePeriodSeconds(&zero)
|
||||||
return nil
|
return nil
|
||||||
|
@ -910,7 +914,7 @@ func (e *Store) updateForGracefulDeletionAndFinalizers(ctx context.Context, name
|
||||||
// set the DeleteGracePeriods to 0 if the object has pendingFinalizers but not supporting graceful deletion
|
// set the DeleteGracePeriods to 0 if the object has pendingFinalizers but not supporting graceful deletion
|
||||||
if pendingFinalizers {
|
if pendingFinalizers {
|
||||||
klog.V(6).Infof("update the DeletionTimestamp to \"now\" and GracePeriodSeconds to 0 for object %s, because it has pending finalizers", name)
|
klog.V(6).Infof("update the DeletionTimestamp to \"now\" and GracePeriodSeconds to 0 for object %s, because it has pending finalizers", name)
|
||||||
err = markAsDeleting(existing)
|
err = markAsDeleting(existing, time.Now())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -2108,3 +2108,47 @@ func TestDeletionFinalizersForGarbageCollection(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMarkAsDeleting(t *testing.T) {
|
||||||
|
now := time.Now()
|
||||||
|
soon := now.Add(time.Second)
|
||||||
|
past := now.Add(-time.Second)
|
||||||
|
|
||||||
|
newTimePointer := func(t time.Time) *metav1.Time {
|
||||||
|
metaTime := metav1.NewTime(t)
|
||||||
|
return &metaTime
|
||||||
|
}
|
||||||
|
testcases := []struct {
|
||||||
|
name string
|
||||||
|
deletionTimestamp *metav1.Time
|
||||||
|
expectDeletionTimestamp *metav1.Time
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "unset",
|
||||||
|
deletionTimestamp: nil,
|
||||||
|
expectDeletionTimestamp: newTimePointer(now),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "set to future",
|
||||||
|
deletionTimestamp: newTimePointer(soon),
|
||||||
|
expectDeletionTimestamp: newTimePointer(now),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "set to past",
|
||||||
|
deletionTimestamp: newTimePointer(past),
|
||||||
|
expectDeletionTimestamp: newTimePointer(past),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range testcases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
rs := &example.ReplicaSet{}
|
||||||
|
rs.DeletionTimestamp = tc.deletionTimestamp
|
||||||
|
if err := markAsDeleting(rs, now); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if reflect.DeepEqual(*rs.DeletionTimestamp, tc.expectDeletionTimestamp) {
|
||||||
|
t.Errorf("expected %v, got %v", tc.expectDeletionTimestamp, *rs.DeletionTimestamp)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue