sortContainers sorts containers the same way as convergence.go:138-160: obsolete first, then by container number descending, then reversed. mustRecreate is evaluated once per container before sorting to avoid quadratic re-evaluation in the comparator.
(containers []ObservedContainer, service types.ServiceConfig, expectedHash string, parentRecreated bool, policy string)
| 791 | // mustRecreate is evaluated once per container before sorting to avoid |
| 792 | // quadratic re-evaluation in the comparator. |
| 793 | func (r *reconciler) sortContainers(containers []ObservedContainer, service types.ServiceConfig, expectedHash string, parentRecreated bool, policy string) { |
| 794 | obsolete := make(map[string]bool, len(containers)) |
| 795 | for _, oc := range containers { |
| 796 | obsolete[oc.ID] = r.mustRecreate(service, expectedHash, parentRecreated, oc, policy) |
| 797 | } |
| 798 | sort.Slice(containers, func(i, j int) bool { |
| 799 | obsi, obsj := obsolete[containers[i].ID], obsolete[containers[j].ID] |
| 800 | if obsi != obsj { |
| 801 | return obsi // obsolete first |
| 802 | } |
| 803 | // preserve low container numbers |
| 804 | if containers[i].Number != containers[j].Number { |
| 805 | return containers[i].Number > containers[j].Number |
| 806 | } |
| 807 | return containers[i].Summary.Created < containers[j].Summary.Created |
| 808 | }) |
| 809 | slices.Reverse(containers) |
| 810 | } |
| 811 | |
| 812 | // reconcileOrphans plans stop + remove for orphaned containers. |
| 813 | func (r *reconciler) reconcileOrphans() { |
no test coverage detected