@@ -24,6 +24,7 @@ import (
2424 "strings"
2525 "time"
2626
27+ appsv1 "k8s.io/api/apps/v1"
2728 corev1 "k8s.io/api/core/v1"
2829 "k8s.io/apimachinery/pkg/types"
2930 "k8s.io/client-go/util/retry"
@@ -190,40 +191,44 @@ func (j *JuiceFSEngine) syncWorkerSpec(ctx cruntime.ReconcileRequestContext, run
190191 return
191192}
192193
193- func (j * JuiceFSEngine ) syncFuseSpec (ctx cruntime.ReconcileRequestContext , runtime * datav1alpha1.JuiceFSRuntime , value * JuiceFS ) (changed bool , err error ) {
194+ func (j * JuiceFSEngine ) syncFuseSpec (ctx cruntime.ReconcileRequestContext , runtime * datav1alpha1.JuiceFSRuntime , latestValue * JuiceFS ) (changed bool , err error ) {
194195 j .Log .V (1 ).Info ("syncFuseSpec" )
195- var cmdChanged bool
196+ var cmdChanged , generationNeedUpdate bool
196197 err = retry .RetryOnConflict (retry .DefaultBackoff , func () error {
197198 fuses , err := kubeclient .GetDaemonset (j .Client , j .getFuseName (), j .namespace )
198199 if err != nil {
199200 return err
200201 }
201-
202202 fusesToUpdate := fuses .DeepCopy ()
203203
204+ currentValue , err := j .GetValues ()
205+ if err != nil {
206+ return err
207+ }
208+
204209 // nodeSelector
205- if nodeSelectorChanged , newSelector := j .isNodeSelectorChanged (fusesToUpdate . Spec . Template . Spec . NodeSelector , value .Fuse .NodeSelector ); nodeSelectorChanged {
210+ if nodeSelectorChanged , newSelector := j .isNodeSelectorChanged (currentValue . Fuse . NodeSelector , latestValue .Fuse .NodeSelector ); nodeSelectorChanged {
206211 j .Log .Info ("syncFuseSpec nodeSelectorChanged" )
207212 fusesToUpdate .Spec .Template .Spec .NodeSelector = newSelector
208213 changed = true
209214 }
210215
211216 // volumes
212- if volumeChanged , newVolumes := j .isVolumesChanged (fusesToUpdate . Spec . Template . Spec . Volumes , value .Fuse .Volumes ); volumeChanged {
217+ if volumeChanged , newVolumes := j .isVolumesChanged (currentValue . Fuse . Volumes , latestValue .Fuse .Volumes ); volumeChanged {
213218 j .Log .Info ("syncFuseSpec volumeChanged" )
214219 fusesToUpdate .Spec .Template .Spec .Volumes = newVolumes
215220 changed = true
216221 }
217222
218223 // labels
219- if labelChanged , newLabels := j .isLabelsChanged (fusesToUpdate . Spec . Template . ObjectMeta . Labels , value .Fuse .Labels ); labelChanged {
224+ if labelChanged , newLabels := j .isLabelsChanged (currentValue . Fuse . Labels , latestValue .Fuse .Labels ); labelChanged {
220225 j .Log .Info ("syncFuseSpec labelChanged" )
221226 fusesToUpdate .Spec .Template .ObjectMeta .Labels = newLabels
222227 changed = true
223228 }
224229
225230 // annotations
226- if annoChanged , newAnnos := j .isAnnotationsChanged (fusesToUpdate . Spec . Template . ObjectMeta . Annotations , value .Fuse .Annotations ); annoChanged {
231+ if annoChanged , newAnnos := j .isAnnotationsChanged (currentValue . Fuse . Annotations , latestValue .Fuse .Annotations ); annoChanged {
227232 j .Log .Info ("syncFuseSpec annoChanged" )
228233 fusesToUpdate .Spec .Template .ObjectMeta .Annotations = newAnnos
229234 changed = true
@@ -235,7 +240,7 @@ func (j *JuiceFSEngine) syncFuseSpec(ctx cruntime.ReconcileRequestContext, runti
235240 j .Log .Error (err , "Failed to get fuse command" )
236241 return err
237242 }
238- cmdChanged , _ = j .isCommandChanged (fuseCommand , value .Fuse .Command )
243+ cmdChanged , _ = j .isCommandChanged (fuseCommand , latestValue .Fuse .Command )
239244
240245 if len (fusesToUpdate .Spec .Template .Spec .Containers ) == 1 {
241246 // resource
@@ -246,34 +251,40 @@ func (j *JuiceFSEngine) syncFuseSpec(ctx cruntime.ReconcileRequestContext, runti
246251 }
247252
248253 // env
249- if envChanged , newEnvs := j .isEnvsChanged (fusesToUpdate . Spec . Template . Spec . Containers [ 0 ]. Env , value .Fuse .Envs ); envChanged {
254+ if envChanged , newEnvs := j .isEnvsChanged (currentValue . Fuse . Envs , latestValue .Fuse .Envs ); envChanged {
250255 j .Log .Info ("syncFuseSpec envChanged" )
251256 fusesToUpdate .Spec .Template .Spec .Containers [0 ].Env = newEnvs
252257 changed = true
253258 }
254259
255260 // volumeMounts
256- if volumeMountChanged , newVolumeMounts := j .isVolumeMountsChanged (fusesToUpdate . Spec . Template . Spec . Containers [ 0 ]. VolumeMounts , value .Fuse .VolumeMounts ); volumeMountChanged {
261+ if volumeMountChanged , newVolumeMounts := j .isVolumeMountsChanged (currentValue . Fuse . VolumeMounts , latestValue .Fuse .VolumeMounts ); volumeMountChanged {
257262 j .Log .Info ("syncFuseSpec volumeMountChanged" )
258263 fusesToUpdate .Spec .Template .Spec .Containers [0 ].VolumeMounts = newVolumeMounts
259264 changed = true
260265 }
261266
262267 // image
263- fuseImage := value .Fuse .Image
264- if value .ImageTag != "" {
265- fuseImage = fuseImage + ":" + value .Fuse .ImageTag
268+ latestFuseImage := latestValue .Fuse .Image
269+ if latestValue .ImageTag != "" {
270+ latestFuseImage = latestFuseImage + ":" + latestValue .Fuse .ImageTag
271+ }
272+
273+ currentFuseImage := currentValue .Fuse .Image
274+ if currentValue .ImageTag != "" {
275+ currentFuseImage = currentFuseImage + ":" + currentValue .Fuse .ImageTag
266276 }
267- if imageChanged , newImage := j .isImageChanged (fusesToUpdate .Spec .Template .Spec .Containers [0 ].Image , fuseImage ); imageChanged {
277+
278+ if imageChanged , newImage := j .isImageChanged (currentFuseImage , latestFuseImage ); imageChanged {
268279 j .Log .Info ("syncFuseSpec imageChanged" )
269280 fusesToUpdate .Spec .Template .Spec .Containers [0 ].Image = newImage
270- changed = true
281+ changed , generationNeedUpdate = true , true
271282 }
272283 }
273284
274285 if cmdChanged {
275286 j .Log .Info ("The fuse config is updated" )
276- err = j .updateFuseScript (value .Fuse .Command )
287+ err = j .updateFuseScript (latestValue .Fuse .Command )
277288 if err != nil {
278289 j .Log .Error (err , "Failed to update the ds config" )
279290 return err
@@ -290,36 +301,24 @@ func (j *JuiceFSEngine) syncFuseSpec(ctx cruntime.ReconcileRequestContext, runti
290301 }
291302 j .Log .Info ("The fuse is updated" )
292303
293- if currentGeneration , exist := fusesToUpdate .Spec .Template .Labels [common .LabelRuntimeFuseGeneration ]; exist {
294- currentGenerationInt , err := strconv .Atoi (currentGeneration )
295- if err != nil {
296- j .Log .Error (err , "Failed to parse current fuse generation from the ds label" )
297- return nil
298- }
299- newGeneration := strconv .FormatInt (int64 (currentGenerationInt + 1 ), 10 )
300- fusesToUpdate .Spec .Template .Labels [common .LabelRuntimeFuseGeneration ] = newGeneration
301-
302- pvc , err := kubeclient .GetPersistentVolumeClaim (j .Client , j .name , j .namespace )
304+ if generationNeedUpdate {
305+ err := j .updateFuseGeneration (fusesToUpdate )
303306 if err != nil {
307+ j .Log .Error (err , "Failed to update the fuse generation" )
304308 return err
305309 }
306-
307- labelsToModify := common.LabelsToModify {}
308- if _ , exist := pvc .Labels [common .LabelRuntimeFuseGeneration ]; exist {
309- labelsToModify .Update (common .LabelRuntimeFuseGeneration , newGeneration )
310- } else {
311- labelsToModify .Add (common .LabelRuntimeFuseGeneration , newGeneration )
312- }
313-
314- if _ , err = utils .PatchLabels (j .Client , pvc , labelsToModify ); err != nil {
315- j .Log .Error (err , fmt .Sprintf ("imageChanged but failed to update image info on pvc %s/%s" , j .namespace , j .name ))
316- }
317310 }
311+
318312 err = j .Client .Update (context .TODO (), fusesToUpdate )
319313 if err != nil {
320314 j .Log .Error (err , "Failed to update the ds spec" )
321315 }
322316
317+ err = j .SaveValues (latestValue )
318+ if err != nil {
319+ j .Log .Error (err , "Failed to update the ds spec" )
320+ }
321+
323322 } else {
324323 j .Log .V (1 ).Info ("The fuse is not changed" )
325324 }
@@ -334,6 +333,37 @@ func (j *JuiceFSEngine) syncFuseSpec(ctx cruntime.ReconcileRequestContext, runti
334333 return
335334}
336335
336+ func (j * JuiceFSEngine ) updateFuseGeneration (fusesToUpdate * appsv1.DaemonSet ) error {
337+ newGeneration := "1"
338+ currentGeneration , exist := fusesToUpdate .Spec .Template .Labels [common .LabelRuntimeFuseGeneration ]
339+ if exist {
340+ currentGenerationInt , err := strconv .Atoi (currentGeneration )
341+ if err != nil {
342+ j .Log .Error (err , "Failed to parse current fuse generation from the ds label" )
343+ return nil
344+ }
345+ newGeneration = strconv .FormatInt (int64 (currentGenerationInt + 1 ), 10 )
346+ }
347+
348+ fusesToUpdate .Spec .Template .Labels [common .LabelRuntimeFuseGeneration ] = newGeneration
349+ pvc , err := kubeclient .GetPersistentVolumeClaim (j .Client , j .name , j .namespace )
350+ if err != nil {
351+ return err
352+ }
353+
354+ labelsToModify := common.LabelsToModify {}
355+ if _ , exist := pvc .Labels [common .LabelRuntimeFuseGeneration ]; exist {
356+ labelsToModify .Update (common .LabelRuntimeFuseGeneration , newGeneration )
357+ } else {
358+ labelsToModify .Add (common .LabelRuntimeFuseGeneration , newGeneration )
359+ }
360+
361+ if _ , err = utils .PatchLabels (j .Client , pvc , labelsToModify ); err != nil {
362+ j .Log .Error (err , fmt .Sprintf ("imageChanged but failed to update image info on pvc %s/%s" , j .namespace , j .name ))
363+ }
364+ return nil
365+ }
366+
337367func (j * JuiceFSEngine ) isVolumeMountsChanged (crtVolumeMounts , runtimeVolumeMounts []corev1.VolumeMount ) (changed bool , newVolumeMounts []corev1.VolumeMount ) {
338368 mounts := make (map [string ]corev1.VolumeMount )
339369 for _ , mount := range crtVolumeMounts {
0 commit comments