@@ -17,11 +17,12 @@ import (
1717const (
1818 defaultReplicas = 50
1919 defaultDuration = 3 * time .Second
20- )
2120
22- const (
2321 dcronRunning = 1
2422 dcronStopped = 0
23+
24+ dcronStateSteady = "dcronStateSteady"
25+ dcronStateUpgrade = "dcronStateUpgrade"
2526)
2627
2728type RecoverFuncType func (d * Dcron )
@@ -45,6 +46,9 @@ type Dcron struct {
4546 crOptions []cron.Option
4647
4748 RecoverFunc RecoverFuncType
49+
50+ recentJobs IRecentJobPacker
51+ state atomic.Value
4852}
4953
5054// NewDcron create a Dcron
@@ -66,7 +70,6 @@ func NewDcronWithOption(serverName string, driver driver.DriverV2, dcronOpts ...
6670
6771 dcron .cr = cron .New (dcron .crOptions ... )
6872 dcron .nodePool = NewNodePool (serverName , driver , dcron .nodeUpdateDuration , dcron .hashReplicas , dcron .logger )
69-
7073 return dcron
7174}
7275
@@ -137,8 +140,24 @@ func (d *Dcron) Remove(jobName string) {
137140 }
138141}
139142
140- func (d * Dcron ) allowThisNodeRun (jobName string ) bool {
141- return d .nodePool .CheckJobAvailable (jobName )
143+ func (d * Dcron ) allowThisNodeRun (jobName string ) (ok bool ) {
144+ ok , err := d .nodePool .CheckJobAvailable (jobName )
145+ if err != nil {
146+ d .logger .Errorf ("allow this node run error, err=%v" , err )
147+ ok = false
148+ d .state .Store (dcronStateUpgrade )
149+ } else {
150+ d .state .Store (dcronStateSteady )
151+ if d .recentJobs != nil {
152+ go d .reRunRecentJobs (d .recentJobs .PopAllJobs ())
153+ }
154+ }
155+ if d .recentJobs != nil {
156+ if d .state .Load ().(string ) == dcronStateUpgrade {
157+ d .recentJobs .AddJob (jobName , time .Now ())
158+ }
159+ }
160+ return
142161}
143162
144163// Start job
@@ -147,14 +166,13 @@ func (d *Dcron) Start() {
147166 if d .RecoverFunc != nil {
148167 d .RecoverFunc (d )
149168 }
150-
151169 if atomic .CompareAndSwapInt32 (& d .running , dcronStopped , dcronRunning ) {
152170 if err := d .startNodePool (); err != nil {
153171 atomic .StoreInt32 (& d .running , dcronStopped )
154172 return
155173 }
156174 d .cr .Start ()
157- d .logger .Infof ("dcron started , nodeID is %s" , d .nodePool .GetNodeID ())
175+ d .logger .Infof ("dcron started, nodeID is %s" , d .nodePool .GetNodeID ())
158176 } else {
159177 d .logger .Infof ("dcron have started" )
160178 }
@@ -171,8 +189,7 @@ func (d *Dcron) Run() {
171189 atomic .StoreInt32 (& d .running , dcronStopped )
172190 return
173191 }
174-
175- d .logger .Infof ("dcron running nodeID is %s" , d .nodePool .GetNodeID ())
192+ d .logger .Infof ("dcron running, nodeID is %s" , d .nodePool .GetNodeID ())
176193 d .cr .Run ()
177194 } else {
178195 d .logger .Infof ("dcron already running" )
@@ -199,3 +216,18 @@ func (d *Dcron) Stop() {
199216 }
200217 }
201218}
219+
220+ func (d * Dcron ) reRunRecentJobs (jobNames []string ) {
221+ d .logger .Infof ("reRunRecentJobs: length=%d" , len (jobNames ))
222+ for _ , jobName := range jobNames {
223+ if job , ok := d .jobs [jobName ]; ok {
224+ if ok , _ := d .nodePool .CheckJobAvailable (jobName ); ok {
225+ job .Execute ()
226+ }
227+ }
228+ }
229+ }
230+
231+ func (d * Dcron ) NodeID () string {
232+ return d .nodePool .GetNodeID ()
233+ }
0 commit comments