@@ -76,6 +76,12 @@ type Scheduler struct {
76
76
Spec cron.Schedule
77
77
}
78
78
79
+ var (
80
+ ErrRefreshInProgress = errors .New ("The data refresh/snapshot is currently in progress. Skip a new data refresh iteration" )
81
+ ErrRefreshPending = errors .New ("Data retrieving suspended because Retrieval state is pending" )
82
+ ErrNoAvailablePool = errors .New ("Pool to perform full refresh not found. Skip refreshing" )
83
+ )
84
+
79
85
// New creates a new data retrieval.
80
86
func New (cfg * dblabCfg.Config , engineProps * global.EngineProps , docker * client.Client , pm * pool.Manager , tm * telemetry.Agent ,
81
87
runner runners.Runner ) (* Retrieval , error ) {
@@ -572,20 +578,20 @@ func (r *Retrieval) refreshFunc(ctx context.Context) func() {
572
578
573
579
// FullRefresh performs full refresh for an unused storage pool and makes it active.
574
580
func (r * Retrieval ) FullRefresh (ctx context.Context ) error {
575
- if r .State .Status == models .Refreshing || r .State .Status == models .Snapshotting {
576
- alert := telemetry.Alert {
577
- Level : models .RefreshSkipped ,
578
- Message : "The data refresh/snapshot is currently in progress. Skip a new data refresh iteration" ,
579
- }
580
- r .State .addAlert (alert )
581
- r .tm .SendEvent (ctx , telemetry .AlertEvent , alert )
582
- log .Msg (alert .Message )
583
-
584
- return nil
585
- }
581
+ if err := r .CanStartRefresh (); err != nil {
582
+ switch {
583
+ case errors .Is (err , ErrRefreshInProgress ):
584
+ alert := telemetry.Alert {
585
+ Level : models .RefreshSkipped ,
586
+ Message : err .Error (),
587
+ }
588
+ r .State .addAlert (alert )
589
+ r .tm .SendEvent (ctx , telemetry .AlertEvent , alert )
590
+ log .Msg (alert .Message )
586
591
587
- if r .State .Status == models .Pending {
588
- log .Msg ("Data retrieving suspended because Retrieval state is pending" )
592
+ case errors .Is (err , ErrRefreshPending ):
593
+ log .Msg (err .Error ())
594
+ }
589
595
590
596
return nil
591
597
}
@@ -597,21 +603,22 @@ func (r *Retrieval) FullRefresh(ctx context.Context) error {
597
603
598
604
runCtx , cancel := context .WithCancel (ctx )
599
605
r .ctxCancel = cancel
600
- elementToUpdate := r .poolManager .GetPoolToUpdate ()
601
606
602
- if elementToUpdate == nil || elementToUpdate . Value = = nil {
607
+ if err := r . HasAvailablePool (); err ! = nil {
603
608
alert := telemetry.Alert {
604
609
Level : models .RefreshSkipped ,
605
- Message : "Pool to perform full refresh not found. Skip refreshing" ,
610
+ Message : err . Error () ,
606
611
}
607
612
r .State .addAlert (alert )
608
613
r .tm .SendEvent (ctx , telemetry .AlertEvent , alert )
609
- log .Msg (alert . Message + ". Hint: Check that there is at least one pool that does not have clones running. " +
614
+ log .Msg (err . Error () + ". Hint: Check that there is at least one pool that does not have clones running. " +
610
615
"Refresh can be performed only to a pool without clones." )
611
616
612
617
return nil
613
618
}
614
619
620
+ elementToUpdate := r .poolManager .GetPoolToUpdate ()
621
+
615
622
poolToUpdate , err := r .poolManager .GetFSManager (elementToUpdate .Value .(string ))
616
623
if err != nil {
617
624
return errors .Wrap (err , "failed to get FSManager" )
@@ -775,3 +782,24 @@ func (r *Retrieval) reportContainerSyncStatus(ctx context.Context, containerID s
775
782
776
783
return value , nil
777
784
}
785
+
786
+ func (r * Retrieval ) CanStartRefresh () error {
787
+ if r .State .Status == models .Refreshing || r .State .Status == models .Snapshotting {
788
+ return ErrRefreshInProgress
789
+ }
790
+
791
+ if r .State .Status == models .Pending {
792
+ return ErrRefreshPending
793
+ }
794
+
795
+ return nil
796
+ }
797
+
798
+ func (r * Retrieval ) HasAvailablePool () error {
799
+ element := r .poolManager .GetPoolToUpdate ()
800
+ if element == nil || element .Value == nil {
801
+ return ErrNoAvailablePool
802
+ }
803
+
804
+ return nil
805
+ }
0 commit comments