platform: modularize api/gui, add docs-tests-web foundation, and refresh root config
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func reconcileTransportAllocations(items []TransportClient, forceRebalance bool) ([]TransportClient, bool) {
|
||||
if len(items) == 0 {
|
||||
return items, false
|
||||
}
|
||||
changed := false
|
||||
|
||||
sort.Slice(items, func(i, j int) bool { return items[i].ID < items[j].ID })
|
||||
|
||||
usedMarks := map[uint64]struct{}{}
|
||||
usedPrefs := map[int]struct{}{}
|
||||
missingMark := make([]int, 0)
|
||||
missingPref := make([]int, 0)
|
||||
needRebalance := forceRebalance
|
||||
|
||||
for i := range items {
|
||||
if m, ok := parseTransportMarkHex(items[i].MarkHex); ok {
|
||||
if _, exists := usedMarks[m]; exists {
|
||||
needRebalance = true
|
||||
} else {
|
||||
usedMarks[m] = struct{}{}
|
||||
}
|
||||
} else if strings.TrimSpace(items[i].MarkHex) == "" {
|
||||
missingMark = append(missingMark, i)
|
||||
} else {
|
||||
needRebalance = true
|
||||
}
|
||||
|
||||
if p, ok := parseTransportPref(items[i].PriorityBase); ok {
|
||||
if _, exists := usedPrefs[p]; exists {
|
||||
needRebalance = true
|
||||
} else {
|
||||
usedPrefs[p] = struct{}{}
|
||||
}
|
||||
} else if items[i].PriorityBase == 0 {
|
||||
missingPref = append(missingPref, i)
|
||||
} else {
|
||||
needRebalance = true
|
||||
}
|
||||
}
|
||||
|
||||
if needRebalance {
|
||||
usedMarks = map[uint64]struct{}{}
|
||||
usedPrefs = map[int]struct{}{}
|
||||
for i := range items {
|
||||
m := nextTransportMark(usedMarks)
|
||||
p := nextTransportPref(usedPrefs)
|
||||
usedMarks[m] = struct{}{}
|
||||
usedPrefs[p] = struct{}{}
|
||||
|
||||
markHex := formatTransportMarkHex(m)
|
||||
if items[i].MarkHex != markHex {
|
||||
items[i].MarkHex = markHex
|
||||
changed = true
|
||||
}
|
||||
if items[i].PriorityBase != p {
|
||||
items[i].PriorityBase = p
|
||||
changed = true
|
||||
}
|
||||
}
|
||||
return items, changed
|
||||
}
|
||||
|
||||
for _, idx := range missingMark {
|
||||
m := nextTransportMark(usedMarks)
|
||||
usedMarks[m] = struct{}{}
|
||||
markHex := formatTransportMarkHex(m)
|
||||
if items[idx].MarkHex != markHex {
|
||||
items[idx].MarkHex = markHex
|
||||
changed = true
|
||||
}
|
||||
}
|
||||
for _, idx := range missingPref {
|
||||
p := nextTransportPref(usedPrefs)
|
||||
usedPrefs[p] = struct{}{}
|
||||
if items[idx].PriorityBase != p {
|
||||
items[idx].PriorityBase = p
|
||||
changed = true
|
||||
}
|
||||
}
|
||||
return items, changed
|
||||
}
|
||||
Reference in New Issue
Block a user