const completionIndexEnvName … const unknownCompletionIndex … func isIndexedJob(job *batch.Job) bool { … } func hasBackoffLimitPerIndex(job *batch.Job) bool { … } type interval … type orderedIntervals … // calculateSucceededIndexes returns the old and new list of succeeded indexes // in compressed format (intervals). // The old list is solely based off .status.completedIndexes, but returns an // empty list if this Job is not tracked with finalizers. The new list includes // the indexes that succeeded since the last sync. func calculateSucceededIndexes(logger klog.Logger, job *batch.Job, pods []*v1.Pod) (orderedIntervals, orderedIntervals) { … } // calculateFailedIndexes returns the list of failed indexes in compressed // format (intervals). The list includes indexes already present in // .status.failedIndexes and indexes that failed since the last sync. func calculateFailedIndexes(logger klog.Logger, job *batch.Job, pods []*v1.Pod) *orderedIntervals { … } func isIndexFailed(logger klog.Logger, job *batch.Job, pod *v1.Pod) bool { … } // withOrderedIndexes returns a new list of ordered intervals that contains // the newIndexes, provided in increasing order. func (oi orderedIntervals) withOrderedIndexes(newIndexes []int) orderedIntervals { … } // with returns a new list of ordered intervals that contains the newOrderedIntervals. func (oi orderedIntervals) merge(newOi orderedIntervals) orderedIntervals { … } // total returns number of indexes contained in the intervals. func (oi orderedIntervals) total() int { … } func (oi orderedIntervals) String() string { … } func (oi orderedIntervals) has(ix int) bool { … } func parseIndexesFromString(logger klog.Logger, indexesStr string, completions int) orderedIntervals { … } // firstPendingIndexes returns `count` indexes less than `completions` that are // not covered by `activePods`, `succeededIndexes` or `failedIndexes`. // In cases of PodReplacementPolicy as Failed we will include `terminatingPods` in this list. func firstPendingIndexes(jobCtx *syncJobCtx, count, completions int) []int { … } // Returns the list of indexes corresponding to the set of pods func getIndexes(pods []*v1.Pod) sets.Set[int] { … } // appendDuplicatedIndexPodsForRemoval scans active `pods` for duplicated // completion indexes. For each index, it selects n-1 pods for removal, where n // is the number of repetitions. The pods to be removed are appended to `rm`, // while the remaining pods are appended to `left`. // All pods that don't have a completion index are appended to `rm`. // All pods with index not in valid range are appended to `rm`. func appendDuplicatedIndexPodsForRemoval(rm, left, pods []*v1.Pod, completions int) ([]*v1.Pod, []*v1.Pod) { … } // getPodsWithDelayedDeletionPerIndex returns the pod which removal is delayed // in order to await for recreation. This map is used when BackoffLimitPerIndex // is enabled to delay pod finalizer removal, and thus pod deletion, until the // replacement pod is created. The pod deletion is delayed so that the // replacement pod can have the batch.kubernetes.io/job-index-failure-count // annotation set properly keeping track of the number of failed pods within // the index. func getPodsWithDelayedDeletionPerIndex(logger klog.Logger, jobCtx *syncJobCtx) map[int]*v1.Pod { … } func addIndexFailureCountAnnotation(logger klog.Logger, template *v1.PodTemplateSpec, job *batch.Job, podBeingReplaced *v1.Pod) { … } // getNewIndexFailureCount returns the value of the index-failure-count // annotation for the new pod being created func getNewIndexFailureCounts(logger klog.Logger, job *batch.Job, podBeingReplaced *v1.Pod) (int32, int32) { … } func appendPodsWithSameIndexForRemovalAndRemaining(rm, left, pods []*v1.Pod, ix int) ([]*v1.Pod, []*v1.Pod) { … } func getCompletionIndex(annotations map[string]string) int { … } // getIndexFailureCount returns the value of the batch.kubernetes.io/job-index-failure-count // annotation as int32. It fallbacks to 0 when: // - there is no annotation - for example the pod was created when the BackoffLimitPerIndex // feature was temporarily disabled, or the annotation was manually removed by the user, // - the value of the annotation isn't parsable as int - for example because // it was set by a malicious user, // - the value of the annotation is negative or greater by int32 - for example // because it was set by a malicious user. func getIndexFailureCount(logger klog.Logger, pod *v1.Pod) int32 { … } func getIndexAbsoluteFailureCount(logger klog.Logger, pod *v1.Pod) int32 { … } func parseIndexFailureCountAnnotation(logger klog.Logger, pod *v1.Pod) int32 { … } func parseIndexFailureIgnoreCountAnnotation(logger klog.Logger, pod *v1.Pod) int32 { … } func parseInt32(logger klog.Logger, vStr string) int32 { … } func addCompletionIndexEnvVariables(template *v1.PodTemplateSpec) { … } func addCompletionIndexEnvVariable(container *v1.Container) { … } func addCompletionIndexAnnotation(template *v1.PodTemplateSpec, index int) { … } func addCompletionIndexLabel(template *v1.PodTemplateSpec, index int) { … } func podGenerateNameWithIndex(jobName string, index int) string { … } type byCompletionIndex … func (bci byCompletionIndex) Less(i, j int) bool { … } func (bci byCompletionIndex) Swap(i, j int) { … } func (bci byCompletionIndex) Len() int { … } func completionModeStr(job *batch.Job) string { … }