@@ -28,6 +28,7 @@ import (
28
28
"fmt"
29
29
"os"
30
30
"strings"
31
+ "sync/atomic"
31
32
32
33
v1 "k8s.io/api/core/v1"
33
34
resourcev1alpha2 "k8s.io/api/resource/v1alpha2"
@@ -95,14 +96,15 @@ func NewNameLookup(client kubernetes.Interface) *Lookup {
95
96
// Lookup stores the state which is necessary to look up ResourceClaim names.
96
97
type Lookup struct {
97
98
client kubernetes.Interface
98
- usePodStatus * bool
99
+ usePodStatus atomic. Pointer [ bool ]
99
100
}
100
101
101
102
// Name is a variant of the stand-alone Name with support also for Kubernetes < 1.28.
102
103
func (l * Lookup ) Name (pod * v1.Pod , podClaim * v1.PodResourceClaim ) (name * string , mustCheckOwner bool , err error ) {
103
- if l .usePodStatus == nil {
104
+ usePodStatus := l .usePodStatus .Load ()
105
+ if usePodStatus == nil {
104
106
if value , _ := os .LookupEnv ("DRA_WITH_DETERMINISTIC_RESOURCE_CLAIM_NAMES" ); value != "" {
105
- l . usePodStatus = ptr .To (false )
107
+ usePodStatus = ptr .To (false )
106
108
} else if l .client != nil {
107
109
// Check once. This does not detect upgrades or
108
110
// downgrades, but that is good enough for the simple
@@ -114,25 +116,29 @@ func (l *Lookup) Name(pod *v1.Pod, podClaim *v1.PodResourceClaim) (name *string,
114
116
}
115
117
if info .Major == "" {
116
118
// Fake client...
117
- l . usePodStatus = ptr .To (true )
119
+ usePodStatus = ptr .To (true )
118
120
} else {
119
121
switch strings .Compare (info .Major , "1" ) {
120
122
case - 1 :
121
123
// Huh?
122
- l . usePodStatus = ptr .To (false )
124
+ usePodStatus = ptr .To (false )
123
125
case 0 :
124
126
// info.Minor may have a suffix which makes it larger than 28.
125
127
// We don't care about pre-releases here.
126
- l . usePodStatus = ptr .To (strings .Compare ("28" , info .Minor ) <= 0 )
128
+ usePodStatus = ptr .To (strings .Compare ("28" , info .Minor ) <= 0 )
127
129
case 1 :
128
130
// Kubernetes 2? Yeah!
129
- l . usePodStatus = ptr .To (true )
131
+ usePodStatus = ptr .To (true )
130
132
}
131
133
}
134
+ } else {
135
+ // No information. Let's assume recent Kubernetes.
136
+ usePodStatus = ptr .To (true )
132
137
}
138
+ l .usePodStatus .Store (usePodStatus )
133
139
}
134
140
135
- if * l . usePodStatus {
141
+ if * usePodStatus {
136
142
return Name (pod , podClaim )
137
143
}
138
144
0 commit comments