Skip to content

Commit 9b35a35

Browse files
author
Bogdan Tsechoev
committed
fix: Add pre-checks to full-refresh endpoint to avoid misleading success responses (#622)
1 parent f07bd83 commit 9b35a35

File tree

2 files changed

+55
-18
lines changed

2 files changed

+55
-18
lines changed

engine/internal/retrieval/retrieval.go

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
8086
func 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.
574580
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)
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+
}

engine/internal/srv/routes.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,16 @@ func (s *Server) healthCheck(w http.ResponseWriter, _ *http.Request) {
952952
}
953953

954954
func (s *Server) refresh(w http.ResponseWriter, r *http.Request) {
955+
if err := s.Retrieval.CanStartRefresh(); err != nil {
956+
api.SendBadRequestError(w, r, err.Error())
957+
return
958+
}
959+
960+
if err := s.Retrieval.HasAvailablePool(); err != nil {
961+
api.SendBadRequestError(w, r, err.Error())
962+
return
963+
}
964+
955965
go func() {
956966
if err := s.Retrieval.FullRefresh(context.Background()); err != nil {
957967
log.Err("failed to initiate full refresh", err)
@@ -963,6 +973,5 @@ func (s *Server) refresh(w http.ResponseWriter, r *http.Request) {
963973
Message: "Full refresh started",
964974
}); err != nil {
965975
api.SendError(w, r, err)
966-
return
967976
}
968977
}

0 commit comments

Comments
 (0)