@@ -111,21 +111,21 @@ func NewPhysicalInitialJob(cfg config.JobConfig, docker *client.Client, cloneMan
111
111
}
112
112
113
113
func (p * PhysicalInitial ) setupScheduler () error {
114
- if p .options .Scheduler == nil {
114
+ if p .options .Scheduler == nil ||
115
+ p .options .Scheduler .Snapshot .Timetable == "" && p .options .Scheduler .Retention .Timetable == "" {
115
116
return nil
116
117
}
117
118
118
119
specParser := cron .NewParser (cron .Minute | cron .Hour | cron .Dom | cron .Month | cron .Dow )
119
120
120
- if _ , err := specParser .Parse (p .options .Scheduler .Snapshot .Timetable ); err != nil {
121
+ if _ , err := specParser .Parse (p .options .Scheduler .Snapshot .Timetable ); p . options . Scheduler . Snapshot . Timetable != "" && err != nil {
121
122
return errors .Wrapf (err , "failed to parse schedule timetable %q" , p .options .Scheduler .Snapshot .Timetable )
122
123
}
123
124
124
- if _ , err := specParser .Parse (p .options .Scheduler .Retention .Timetable ); err != nil {
125
+ if _ , err := specParser .Parse (p .options .Scheduler .Retention .Timetable ); p . options . Scheduler . Retention . Timetable != "" && err != nil {
125
126
return errors .Wrapf (err , "failed to parse retention timetable %q" , p .options .Scheduler .Retention .Timetable )
126
127
}
127
128
128
- p .scheduleOnce = sync.Once {}
129
129
p .scheduler = cron .New ()
130
130
131
131
return nil
@@ -141,7 +141,7 @@ func (p *PhysicalInitial) Name() string {
141
141
}
142
142
143
143
// Run starts the job.
144
- func (p * PhysicalInitial ) Run (ctx context.Context ) error {
144
+ func (p * PhysicalInitial ) Run (ctx context.Context ) ( err error ) {
145
145
p .scheduleOnce .Do (p .startScheduler (ctx ))
146
146
147
147
select {
@@ -184,36 +184,42 @@ func (p *PhysicalInitial) Run(ctx context.Context) error {
184
184
}()
185
185
}
186
186
187
- // Promotion.
188
- if p .options .Promote {
189
- // Prepare pre-snapshot.
190
- snapshotName , err := p .cloneManager .CreateSnapshot ("" , preDataStateAt + pre )
191
- if err != nil {
192
- return errors .Wrap (err , "failed to create a snapshot" )
187
+ defer func () {
188
+ if _ , ok := err .(* skipSnapshotErr ); ok {
189
+ log .Msg (err .Error ())
190
+ err = nil
193
191
}
192
+ }()
194
193
195
- defer func () {
194
+ // Prepare pre-snapshot.
195
+ snapshotName , err := p .cloneManager .CreateSnapshot ("" , preDataStateAt + pre )
196
+ if err != nil {
197
+ return errors .Wrap (err , "failed to create snapshot" )
198
+ }
199
+
200
+ defer func () {
201
+ if err != nil {
196
202
if errDestroy := p .cloneManager .DestroySnapshot (snapshotName ); errDestroy != nil {
197
203
log .Err (fmt .Sprintf ("Failed to destroy the %q snapshot: %v" , snapshotName , err ))
198
204
}
199
- }()
200
-
201
- if err := p .cloneManager .CreateClone (cloneName , snapshotName ); err != nil {
202
- return errors .Wrapf (err , "failed to create a pre clone %s" , cloneName )
203
205
}
206
+ }()
204
207
205
- defer func () {
208
+ if err := p .cloneManager .CreateClone (cloneName , snapshotName ); err != nil {
209
+ return errors .Wrapf (err , "failed to create \" pre\" clone %s" , cloneName )
210
+ }
211
+
212
+ defer func () {
213
+ if err != nil {
206
214
if errDestroy := p .cloneManager .DestroyClone (cloneName ); errDestroy != nil {
207
215
log .Err (fmt .Sprintf ("Failed to destroy clone %q: %v" , cloneName , err ))
208
216
}
209
- }()
217
+ }
218
+ }()
210
219
220
+ // Promotion.
221
+ if p .options .Promote {
211
222
if err := p .promoteInstance (ctx , path .Join (p .globalCfg .MountDir , cloneName )); err != nil {
212
- if _ , ok := err .(* skipSnapshotErr ); ok {
213
- log .Msg (err .Error ())
214
- return nil
215
- }
216
-
217
223
return err
218
224
}
219
225
}
@@ -239,20 +245,25 @@ func (p *PhysicalInitial) Run(ctx context.Context) error {
239
245
}
240
246
241
247
func (p * PhysicalInitial ) startScheduler (ctx context.Context ) func () {
242
- if p .scheduler == nil {
248
+ if p .scheduler == nil || p .options .Scheduler == nil ||
249
+ p .options .Scheduler .Snapshot .Timetable == "" && p .options .Scheduler .Retention .Timetable == "" {
243
250
return func () {}
244
251
}
245
252
246
253
return func () {
247
- if _ , err := p .scheduler .AddFunc (p .options .Scheduler .Snapshot .Timetable , p .runAutoSnapshot (ctx )); err != nil {
248
- log .Err (errors .Wrap (err , "failed to schedule a new snapshot job" ))
249
- return
254
+ if p .options .Scheduler .Snapshot .Timetable != "" {
255
+ if _ , err := p .scheduler .AddFunc (p .options .Scheduler .Snapshot .Timetable , p .runAutoSnapshot (ctx )); err != nil {
256
+ log .Err (errors .Wrap (err , "failed to schedule a new snapshot job" ))
257
+ return
258
+ }
250
259
}
251
260
252
- if _ , err := p .scheduler .AddFunc (p .options .Scheduler .Retention .Timetable ,
253
- p .runAutoCleanup (p .options .Scheduler .Retention .Limit )); err != nil {
254
- log .Err (errors .Wrap (err , "failed to schedule a new cleanup job" ))
255
- return
261
+ if p .options .Scheduler .Retention .Timetable != "" {
262
+ if _ , err := p .scheduler .AddFunc (p .options .Scheduler .Retention .Timetable ,
263
+ p .runAutoCleanup (p .options .Scheduler .Retention .Limit )); err != nil {
264
+ log .Err (errors .Wrap (err , "failed to schedule a new cleanup job" ))
265
+ return
266
+ }
256
267
}
257
268
258
269
p .scheduler .Start ()
0 commit comments