@@ -76,6 +76,12 @@ type Scheduler struct {
7676 Spec cron.Schedule
7777}
7878
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+
7985// New creates a new data retrieval.
8086func New (cfg * dblabCfg.Config , engineProps * global.EngineProps , docker * client.Client , pm * pool.Manager , tm * telemetry.Agent ,
8187 runner runners.Runner ) (* Retrieval , error ) {
@@ -572,20 +578,20 @@ func (r *Retrieval) refreshFunc(ctx context.Context) func() {
572578
573579// FullRefresh performs full refresh for an unused storage pool and makes it active.
574580func (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 )
586591
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+ }
589595
590596 return nil
591597 }
@@ -597,21 +603,22 @@ func (r *Retrieval) FullRefresh(ctx context.Context) error {
597603
598604 runCtx , cancel := context .WithCancel (ctx )
599605 r .ctxCancel = cancel
600- elementToUpdate := r .poolManager .GetPoolToUpdate ()
601606
602- if elementToUpdate == nil || elementToUpdate . Value = = nil {
607+ if err := r . HasAvailablePool (); err ! = nil {
603608 alert := telemetry.Alert {
604609 Level : models .RefreshSkipped ,
605- Message : "Pool to perform full refresh not found. Skip refreshing" ,
610+ Message : err . Error () ,
606611 }
607612 r .State .addAlert (alert )
608613 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. " +
610615 "Refresh can be performed only to a pool without clones." )
611616
612617 return nil
613618 }
614619
620+ elementToUpdate := r .poolManager .GetPoolToUpdate ()
621+
615622 poolToUpdate , err := r .poolManager .GetFSManager (elementToUpdate .Value .(string ))
616623 if err != nil {
617624 return errors .Wrap (err , "failed to get FSManager" )
@@ -775,3 +782,24 @@ func (r *Retrieval) reportContainerSyncStatus(ctx context.Context, containerID s
775782
776783 return value , nil
777784}
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