@@ -111,21 +111,21 @@ func NewPhysicalInitialJob(cfg config.JobConfig, docker *client.Client, cloneMan
111111}
112112
113113func (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 == "" {
115116 return nil
116117 }
117118
118119 specParser := cron .NewParser (cron .Minute | cron .Hour | cron .Dom | cron .Month | cron .Dow )
119120
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 {
121122 return errors .Wrapf (err , "failed to parse schedule timetable %q" , p .options .Scheduler .Snapshot .Timetable )
122123 }
123124
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 {
125126 return errors .Wrapf (err , "failed to parse retention timetable %q" , p .options .Scheduler .Retention .Timetable )
126127 }
127128
128- p .scheduleOnce = sync.Once {}
129129 p .scheduler = cron .New ()
130130
131131 return nil
@@ -141,7 +141,7 @@ func (p *PhysicalInitial) Name() string {
141141}
142142
143143// Run starts the job.
144- func (p * PhysicalInitial ) Run (ctx context.Context ) error {
144+ func (p * PhysicalInitial ) Run (ctx context.Context ) ( err error ) {
145145 p .scheduleOnce .Do (p .startScheduler (ctx ))
146146
147147 select {
@@ -184,36 +184,42 @@ func (p *PhysicalInitial) Run(ctx context.Context) error {
184184 }()
185185 }
186186
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
193191 }
192+ }()
194193
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 {
196202 if errDestroy := p .cloneManager .DestroySnapshot (snapshotName ); errDestroy != nil {
197203 log .Err (fmt .Sprintf ("Failed to destroy the %q snapshot: %v" , snapshotName , err ))
198204 }
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 )
203205 }
206+ }()
204207
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 {
206214 if errDestroy := p .cloneManager .DestroyClone (cloneName ); errDestroy != nil {
207215 log .Err (fmt .Sprintf ("Failed to destroy clone %q: %v" , cloneName , err ))
208216 }
209- }()
217+ }
218+ }()
210219
220+ // Promotion.
221+ if p .options .Promote {
211222 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-
217223 return err
218224 }
219225 }
@@ -239,20 +245,25 @@ func (p *PhysicalInitial) Run(ctx context.Context) error {
239245}
240246
241247func (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 == "" {
243250 return func () {}
244251 }
245252
246253 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+ }
250259 }
251260
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+ }
256267 }
257268
258269 p .scheduler .Start ()
0 commit comments