@@ -70,6 +70,7 @@ func AddToManager(ctx *context.ControllerManagerContext, mgr manager.Manager) er
70
70
71
71
r := NewReconciler (
72
72
mgr .GetClient (),
73
+ mgr .GetAPIReader (),
73
74
ctrl .Log .WithName ("controllers" ).WithName (controlledTypeName ),
74
75
record .New (mgr .GetEventRecorderFor (controllerNameLong )),
75
76
ctx .VMProvider ,
@@ -124,12 +125,14 @@ func vmiToVMPubMapperFn(ctx *context.ControllerManagerContext, c client.Client)
124
125
125
126
func NewReconciler (
126
127
client client.Client ,
128
+ apiReader client.Reader ,
127
129
logger logr.Logger ,
128
130
recorder record.Recorder ,
129
131
vmProvider vmprovider.VirtualMachineProviderInterface ) * Reconciler {
130
132
131
133
return & Reconciler {
132
134
Client : client ,
135
+ apiReader : apiReader ,
133
136
Logger : logger ,
134
137
Recorder : recorder ,
135
138
VMProvider : vmProvider ,
@@ -140,6 +143,7 @@ func NewReconciler(
140
143
// Reconciler reconciles a VirtualMachinePublishRequest object.
141
144
type Reconciler struct {
142
145
client.Client
146
+ apiReader client.Reader
143
147
Logger logr.Logger
144
148
Recorder record.Recorder
145
149
VMProvider vmprovider.VirtualMachineProviderInterface
@@ -167,7 +171,11 @@ func requeueDelay(ctx *context.VirtualMachinePublishRequestContext) time.Duratio
167
171
168
172
func (r * Reconciler ) Reconcile (ctx goctx.Context , req ctrl.Request ) (_ ctrl.Result , reterr error ) {
169
173
vmPublishReq := & vmopv1alpha1.VirtualMachinePublishRequest {}
170
- err := r .Get (ctx , req .NamespacedName , vmPublishReq )
174
+ // Get the VirtualMachinePublishRequest directly from the API server - bypassing the cache of the
175
+ // regular client - to avoid potentially stale objects from cache. We rely on the up-to-date Status
176
+ // when sending publish VM requests during reconciliation.
177
+ // Update() of stale object will be rejected by API server and result in unnecessary reconciles.
178
+ err := r .apiReader .Get (ctx , req .NamespacedName , vmPublishReq )
171
179
if err != nil {
172
180
// Delete registered metrics if the resource is not found.
173
181
if apiErrors .IsNotFound (err ) {
0 commit comments