@@ -214,7 +214,7 @@ func (r *ReconfigureReconciler) sync(reqCtx intctrlutil.RequestCtx, configMap *c
214214 configPatch .UpdateConfig ))
215215 }
216216
217- tasks , err := buildReconfigureTasks (configSpec , rctx , configPatch , forceRestart )
217+ tasks , err := r . buildReconfigureTasks (configSpec , rctx , configPatch , forceRestart )
218218 if err != nil {
219219 return intctrlutil .RequeueWithErrorAndRecordEvent (configMap , r .Recorder , err , reqCtx .Log )
220220 }
@@ -296,3 +296,121 @@ func (r *ReconfigureReconciler) succeed(rctx *ReconcileContext, reloadType strin
296296 result := reconciled (status , reloadType , parametersv1alpha1 .CFinishedPhase )
297297 return r .updateConfigCMStatus (rctx .RequestCtx , rctx .ConfigMap , reloadType , & result )
298298}
299+
300+ type reconfigureTask struct {
301+ policy parametersv1alpha1.ReloadPolicy
302+ taskCtx reconfigureContext
303+ }
304+
305+ func (r reconfigureTask ) reconfigure () (returnedStatus , error ) {
306+ if executor , ok := reconfigurePolicyMap [r .policy ]; ok {
307+ return executor .Upgrade (r .taskCtx )
308+ }
309+ return returnedStatus {}, fmt .Errorf ("unknown reconfigure policy: %s" , r .policy )
310+ }
311+
312+ func (r * ReconfigureReconciler ) buildReconfigureTasks (templateSpec * appsv1.ComponentFileTemplate , rctx * ReconcileContext , patch * cfgcore.ConfigPatchInfo , restart bool ) ([]reconfigureTask , error ) {
313+ var tasks []reconfigureTask
314+
315+ // If the patch or ConfigRender is nil, return a single restart task.
316+ if patch == nil || rctx .ConfigRender == nil {
317+ return []reconfigureTask {r .buildRestartTask (templateSpec , rctx )}, nil
318+ }
319+
320+ // needReloadAction determines if a reload action is needed based on the ParametersDefinition and ReloadPolicy.
321+ needReloadAction := func (pd * parametersv1alpha1.ParametersDefinition , policy parametersv1alpha1.ReloadPolicy ) bool {
322+ return ! restart || (policy == parametersv1alpha1 .SyncDynamicReloadPolicy && parameters .NeedDynamicReloadAction (& pd .Spec ))
323+ }
324+
325+ for key , jsonPatch := range patch .UpdateConfig {
326+ pd , ok := rctx .ParametersDefs [key ]
327+ // If the ParametersDefinition or its ReloadAction is nil, continue to the next iteration.
328+ if ! ok || pd .Spec .ReloadAction == nil {
329+ continue
330+ }
331+ configFormat := parameters .GetComponentConfigDescription (& rctx .ConfigRender .Spec , key )
332+ if configFormat == nil || configFormat .FileFormatConfig == nil {
333+ continue
334+ }
335+ // Determine the appropriate ReloadPolicy.
336+ policy , err := r .resolveReconfigurePolicy (string (jsonPatch ), configFormat .FileFormatConfig , & pd .Spec )
337+ if err != nil {
338+ return nil , err
339+ }
340+ // If a reload action is needed, append a new reload action task to the tasks slice.
341+ if needReloadAction (pd , policy ) {
342+ tasks = append (tasks , r .buildReloadTask (policy , templateSpec , rctx , pd , configFormat , patch ))
343+ }
344+ }
345+
346+ // If no tasks were added, return a single restart task.
347+ if len (tasks ) == 0 {
348+ return []reconfigureTask {r .buildRestartTask (templateSpec , rctx )}, nil
349+ }
350+
351+ return tasks , nil
352+ }
353+
354+ func (r * ReconfigureReconciler ) buildReloadTask (policy parametersv1alpha1.ReloadPolicy ,
355+ templateSpec * appsv1.ComponentFileTemplate ,
356+ rctx * ReconcileContext ,
357+ pd * parametersv1alpha1.ParametersDefinition ,
358+ configDescription * parametersv1alpha1.ComponentConfigDescription ,
359+ patch * cfgcore.ConfigPatchInfo ) reconfigureTask {
360+ return reconfigureTask {
361+ policy : policy ,
362+ taskCtx : reconfigureContext {
363+ RequestCtx : rctx .RequestCtx ,
364+ Client : rctx .Client ,
365+ ConfigTemplate : * templateSpec ,
366+ VersionHash : computeTargetVersionHash (rctx .RequestCtx , rctx .ConfigMap .Data ),
367+ ParametersDef : & pd .Spec ,
368+ ConfigDescription : configDescription ,
369+ Cluster : rctx .ClusterObj ,
370+ ClusterComponent : rctx .ClusterComObj ,
371+ SynthesizedComponent : rctx .BuiltinComponent ,
372+ its : rctx .its ,
373+ Patch : patch ,
374+ },
375+ }
376+ }
377+
378+ func (r * ReconfigureReconciler ) buildRestartTask (configTemplate * appsv1.ComponentFileTemplate , rctx * ReconcileContext ) reconfigureTask {
379+ return reconfigureTask {
380+ policy : parametersv1alpha1 .RestartPolicy ,
381+ taskCtx : reconfigureContext {
382+ RequestCtx : rctx .RequestCtx ,
383+ Client : rctx .Client ,
384+ ConfigTemplate : * configTemplate ,
385+ VersionHash : computeTargetVersionHash (rctx .RequestCtx , rctx .ConfigMap .Data ),
386+ ClusterComponent : rctx .ClusterComObj ,
387+ Cluster : rctx .ClusterObj ,
388+ SynthesizedComponent : rctx .BuiltinComponent ,
389+ its : rctx .its ,
390+ },
391+ }
392+ }
393+
394+ func (r * ReconfigureReconciler ) resolveReconfigurePolicy (jsonPatch string , format * parametersv1alpha1.FileFormatConfig ,
395+ pd * parametersv1alpha1.ParametersDefinitionSpec ) (parametersv1alpha1.ReloadPolicy , error ) {
396+ var policy = parametersv1alpha1 .NonePolicy
397+ dynamicUpdate , err := cfgcore .CheckUpdateDynamicParameters (format , pd , jsonPatch )
398+ if err != nil {
399+ return policy , err
400+ }
401+
402+ // make decision
403+ switch {
404+ case ! dynamicUpdate && parameters .NeedDynamicReloadAction (pd ): // static parameters update and need to do hot update
405+ policy = parametersv1alpha1 .DynamicReloadAndRestartPolicy
406+ case ! dynamicUpdate : // static parameters update and only need to restart
407+ policy = parametersv1alpha1 .RestartPolicy
408+ case parameters .IsAutoReload (pd .ReloadAction ): // if core support hot update, don't need to do anything
409+ policy = parametersv1alpha1 .AsyncDynamicReloadPolicy
410+ case enableSyncTrigger (pd .ReloadAction ): // sync config-manager exec hot update
411+ policy = parametersv1alpha1 .SyncDynamicReloadPolicy
412+ default : // config-manager auto trigger to hot update
413+ policy = parametersv1alpha1 .AsyncDynamicReloadPolicy
414+ }
415+ return policy , nil
416+ }
0 commit comments