@@ -22,6 +22,7 @@ import (
22
22
"time"
23
23
24
24
v1 "k8s.io/api/core/v1"
25
+ "k8s.io/apimachinery/pkg/util/sets"
25
26
"k8s.io/client-go/tools/cache"
26
27
"k8s.io/klog/v2"
27
28
apipod "k8s.io/kubernetes/pkg/api/v1/pod"
@@ -183,16 +184,27 @@ func getFinishedTime(p *v1.Pod) time.Time {
183
184
}
184
185
185
186
func getFinishTimeFromContainers (p * v1.Pod ) * time.Time {
186
- finishTime := latestFinishTime (nil , p .Status .ContainerStatuses )
187
+ finishTime := latestFinishTime (nil , p .Status .ContainerStatuses , nil )
187
188
// We need to check InitContainerStatuses here also,
188
189
// because with the sidecar (restartable init) containers,
189
190
// 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
+ })
191
200
}
192
201
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 {
194
203
var finishTime = prevFinishTime
195
204
for _ , containerState := range cs {
205
+ if check != nil && ! check (containerState ) {
206
+ continue
207
+ }
196
208
if containerState .State .Terminated == nil ||
197
209
containerState .State .Terminated .FinishedAt .Time .IsZero () {
198
210
return nil
0 commit comments