Skip to content

Commit 3a2a500

Browse files
committed
check restartpolicy in getFinishTimeFromContainers
1 parent e4348a1 commit 3a2a500

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

pkg/controller/job/backoff_utils.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"time"
2323

2424
v1 "k8s.io/api/core/v1"
25+
"k8s.io/apimachinery/pkg/util/sets"
2526
"k8s.io/client-go/tools/cache"
2627
"k8s.io/klog/v2"
2728
apipod "k8s.io/kubernetes/pkg/api/v1/pod"
@@ -183,16 +184,27 @@ func getFinishedTime(p *v1.Pod) time.Time {
183184
}
184185

185186
func getFinishTimeFromContainers(p *v1.Pod) *time.Time {
186-
finishTime := latestFinishTime(nil, p.Status.ContainerStatuses)
187+
finishTime := latestFinishTime(nil, p.Status.ContainerStatuses, nil)
187188
// We need to check InitContainerStatuses here also,
188189
// because with the sidecar (restartable init) containers,
189190
// sidecar containers will always finish later than regular containers.
190-
return latestFinishTime(finishTime, p.Status.InitContainerStatuses)
191+
names := sets.New[string]()
192+
for _, c := range p.Spec.InitContainers {
193+
if c.RestartPolicy != nil && *c.RestartPolicy == v1.ContainerRestartPolicyAlways {
194+
names.Insert(c.Name)
195+
}
196+
}
197+
return latestFinishTime(finishTime, p.Status.InitContainerStatuses, func(status v1.ContainerStatus) bool {
198+
return names.Has(status.Name)
199+
})
191200
}
192201

193-
func latestFinishTime(prevFinishTime *time.Time, cs []v1.ContainerStatus) *time.Time {
202+
func latestFinishTime(prevFinishTime *time.Time, cs []v1.ContainerStatus, check func(status v1.ContainerStatus) bool) *time.Time {
194203
var finishTime = prevFinishTime
195204
for _, containerState := range cs {
205+
if check != nil && !check(containerState) {
206+
continue
207+
}
196208
if containerState.State.Terminated == nil ||
197209
containerState.State.Terminated.FinishedAt.Time.IsZero() {
198210
return nil

pkg/controller/job/backoff_utils_test.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ func TestNewBackoffRecord(t *testing.T) {
202202
func TestGetFinishedTime(t *testing.T) {
203203
defaultTestTime := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
204204
defaultTestTimeMinus30s := defaultTestTime.Add(-30 * time.Second)
205+
containerRestartPolicyAlways := v1.ContainerRestartPolicyAlways
205206
testCases := map[string]struct {
206207
pod v1.Pod
207208
wantFinishTime time.Time
@@ -358,8 +359,16 @@ func TestGetFinishedTime(t *testing.T) {
358359
// In this case, init container is stopped after the regular containers.
359360
// This is because with the sidecar (restartable init) containers,
360361
// sidecar containers will always finish later than regular containers.
361-
"Pod with init container and all containers terminated": {
362+
"Pod with sidecar container and all containers terminated": {
362363
pod: v1.Pod{
364+
Spec: v1.PodSpec{
365+
InitContainers: []v1.Container{
366+
{
367+
Name: "sidecar",
368+
RestartPolicy: &containerRestartPolicyAlways,
369+
},
370+
},
371+
},
363372
Status: v1.PodStatus{
364373
ContainerStatuses: []v1.ContainerStatus{
365374
{
@@ -370,6 +379,7 @@ func TestGetFinishedTime(t *testing.T) {
370379
},
371380
InitContainerStatuses: []v1.ContainerStatus{
372381
{
382+
Name: "sidecar",
373383
State: v1.ContainerState{
374384
Terminated: &v1.ContainerStateTerminated{FinishedAt: metav1.NewTime(defaultTestTime)},
375385
},

0 commit comments

Comments
 (0)