|
1 | 1 | package backend
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "context" |
4 | 5 | "errors"
|
5 | 6 | "math/rand"
|
| 7 | + "strconv" |
6 | 8 | "sync"
|
7 | 9 |
|
8 | 10 | "inference.networking.x-k8s.io/gateway-api-inference-extension/api/v1alpha1"
|
9 | 11 | logutil "inference.networking.x-k8s.io/gateway-api-inference-extension/pkg/ext-proc/util/logging"
|
10 | 12 | corev1 "k8s.io/api/core/v1"
|
11 | 13 | "k8s.io/apimachinery/pkg/labels"
|
12 | 14 | "k8s.io/klog/v2"
|
| 15 | + "sigs.k8s.io/controller-runtime/pkg/client" |
13 | 16 | )
|
14 | 17 |
|
15 | 18 | func NewK8sDataStore(options ...K8sDatastoreOption) *K8sDatastore {
|
@@ -114,12 +117,36 @@ func IsCritical(model *v1alpha1.InferenceModel) bool {
|
114 | 117 | }
|
115 | 118 |
|
116 | 119 | func (ds *K8sDatastore) LabelsMatch(podLabels map[string]string) bool {
|
117 |
| - poolSelector := labels.SelectorFromSet(whimsicalWondersOfAliasTypes(ds.inferencePool.Spec.Selector)) |
| 120 | + poolSelector := selectorFromInferencePoolSelector(ds.inferencePool.Spec.Selector) |
118 | 121 | podSet := labels.Set(podLabels)
|
119 | 122 | return poolSelector.Matches(podSet)
|
120 | 123 | }
|
121 | 124 |
|
122 |
| -func whimsicalWondersOfAliasTypes(labels map[v1alpha1.LabelKey]v1alpha1.LabelValue) map[string]string { |
| 125 | +func (ds *K8sDatastore) flushPodsAndRefetch(ctx context.Context, ctrlClient client.Client, newServerPool *v1alpha1.InferencePool) { |
| 126 | + podList := &corev1.PodList{} |
| 127 | + if err := ctrlClient.List(ctx, podList, selectorFromInferencePoolSelector(newServerPool.Spec.Selector).(client.MatchingLabelsSelector)); err != nil { |
| 128 | + klog.Error(err, "error listing clients") |
| 129 | + } |
| 130 | + podMap := sync.Map{} |
| 131 | + |
| 132 | + for _, k8sPod := range podList.Items { |
| 133 | + pod := Pod{ |
| 134 | + Name: k8sPod.Name, |
| 135 | + Address: k8sPod.Status.PodIP + ":" + strconv.Itoa(int(newServerPool.Spec.TargetPortNumber)), |
| 136 | + } |
| 137 | + podMap.Store(pod, true) |
| 138 | + } |
| 139 | + |
| 140 | + // Clear is thread-safe, so if there are any in-flight accesses this should prevent odd data behavior. Then we replace after. |
| 141 | + ds.pods.Clear() |
| 142 | + ds.pods = &podMap |
| 143 | +} |
| 144 | + |
| 145 | +func selectorFromInferencePoolSelector(selector map[v1alpha1.LabelKey]v1alpha1.LabelValue) labels.Selector { |
| 146 | + return labels.SelectorFromSet(stripLabelKeyAliasFromLabelMap(selector)) |
| 147 | +} |
| 148 | + |
| 149 | +func stripLabelKeyAliasFromLabelMap(labels map[v1alpha1.LabelKey]v1alpha1.LabelValue) map[string]string { |
123 | 150 | outMap := make(map[string]string)
|
124 | 151 | for k, v := range labels {
|
125 | 152 | outMap[string(k)] = string(v)
|
|
0 commit comments