@@ -595,49 +595,56 @@ func (cd *Conchd) Run(ctx context.Context) error {
595595 return fmt .Errorf ("watch channel closed" )
596596 }
597597 for _ , ev := range wresp .Events {
598- name := strings .TrimPrefix (string (ev .Kv .Key ), core .CronJobPrefix ())
599- if ev .Type == clientv3 .EventTypeDelete {
600- if cancel , ok := cancels [name ]; ok {
601- cancel ()
602- delete (cancels , name )
603- }
604- delete (jobs , name )
605- cd .logger .Info ("job removed" , "name" , name )
606- } else {
607- var spec JobSpec
608- if err := json .Unmarshal (ev .Kv .Value , & spec ); err == nil {
609- oldSpec , exists := jobs [name ]
610- if exists && oldSpec .Schedule == spec .Schedule && oldSpec .RunTTL == spec .RunTTL && len (oldSpec .Cmd ) == len (spec .Cmd ) {
611- cmdChanged := false
612- for i := range spec .Cmd {
613- if spec .Cmd [i ] != oldSpec .Cmd [i ] {
614- cmdChanged = true
615- break
616- }
617- }
618- if ! cmdChanged {
619- // Execution spec is unchanged. Update jobs map for metadata, but do NOT restart scheduler.
620- jobs [name ] = spec
621- cd .logger .Debug ("job touched but execution spec unchanged; not restarting scheduler" , "name" , name )
622- continue
623- }
624- }
625-
626- if cancel , ok := cancels [name ]; ok {
627- cancel ()
628- }
629- jobs [name ] = spec
630- jobCtx , cancel := context .WithCancel (ctx )
631- cancels [name ] = cancel
632- go runJobScheduler (ctx , jobCtx , cd .logger , cd .client , sess , name , spec )
633- cd .logger .Info ("job added/updated" , "name" , name )
634- }
635- }
598+ cd .handleWatchEvent (ctx , ev , jobs , cancels , sess )
636599 }
637600 }
638601 }
639602}
640603
604+ func (cd * Conchd ) handleWatchEvent (ctx context.Context , ev * clientv3.Event , jobs map [string ]JobSpec , cancels map [string ]context.CancelFunc , sess * core.CoreSession ) {
605+ name := strings .TrimPrefix (string (ev .Kv .Key ), core .CronJobPrefix ())
606+ if ev .Type == clientv3 .EventTypeDelete {
607+ if cancel , ok := cancels [name ]; ok {
608+ cancel ()
609+ delete (cancels , name )
610+ }
611+ delete (jobs , name )
612+ cd .logger .Info ("job removed" , "name" , name )
613+ return
614+ }
615+
616+ var spec JobSpec
617+ if err := json .Unmarshal (ev .Kv .Value , & spec ); err != nil {
618+ return
619+ }
620+
621+ oldSpec , exists := jobs [name ]
622+ if exists && oldSpec .Schedule == spec .Schedule && oldSpec .RunTTL == spec .RunTTL && len (oldSpec .Cmd ) == len (spec .Cmd ) {
623+ cmdChanged := false
624+ for i := range spec .Cmd {
625+ if spec .Cmd [i ] != oldSpec .Cmd [i ] {
626+ cmdChanged = true
627+ break
628+ }
629+ }
630+ if ! cmdChanged {
631+ // Execution spec is unchanged. Update jobs map for metadata, but do NOT restart scheduler.
632+ jobs [name ] = spec
633+ cd .logger .Debug ("job touched but execution spec unchanged; not restarting scheduler" , "name" , name )
634+ return
635+ }
636+ }
637+
638+ if cancel , ok := cancels [name ]; ok {
639+ cancel ()
640+ }
641+ jobs [name ] = spec
642+ jobCtx , cancel := context .WithCancel (ctx )
643+ cancels [name ] = cancel
644+ go runJobScheduler (ctx , jobCtx , cd .logger , cd .client , sess , name , spec )
645+ cd .logger .Info ("job added/updated" , "name" , name )
646+ }
647+
641648func runJobScheduler (daemonCtx , jobCtx context.Context , logger * slog.Logger , client * clientv3.Client , sess * core.CoreSession , name string , spec JobSpec ) {
642649 parser := cron .NewParser (cron .Minute | cron .Hour | cron .Dom | cron .Month | cron .Dow | cron .Descriptor )
643650 sched , err := parser .Parse (spec .Schedule )
0 commit comments