Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CLD-5461] Add fix so that when force is used a release can run in parallel with another one in progress forcing its way #21

Merged
merged 2 commits into from
Jun 28, 2023
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 33 additions & 23 deletions internal/supervisor/ring.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,37 +234,47 @@ func (s *RingSupervisor) releaseRing(ring *model.Ring, logger log.FieldLogger) s
}

func (s *RingSupervisor) checkRingReleasePending(ring *model.Ring, logger log.FieldLogger) string {
logger.Debug("Checking if other Rings are locked...")
logger.Debugf("Checking if pending ring release should be forced...")

ringsLocked, err := s.store.GetRingsLocked()
release, err := s.store.GetRingRelease(ring.DesiredReleaseID)
if err != nil {
logger.WithError(err).Error("Failed to query for rings that are under lock")
logger.WithError(err).Error("Failed to get the ring release for the ring pending work")
return model.RingStateReleaseFailed
}

ringsReleaseInProgress, err := s.store.GetRingsReleaseInProgress()
if err != nil {
logger.WithError(err).Error("Failed to query for rings that are under release")
return model.RingStateReleaseFailed
}
if !release.Force {
logger.Debug("Checking if other Rings are locked...")

//The total rings locked at this time will be at least 1
if len(ringsLocked) > 1 || len(ringsReleaseInProgress) > 0 {
logger.Debug("Another ring is under lock and being updated...")
return model.InstallationGroupReleasePending
}
ringsLocked, err := s.store.GetRingsLocked()
if err != nil {
logger.WithError(err).Error("Failed to query for rings that are under lock")
return model.RingStateReleaseFailed
}

logger.Debugf("Checking ring %s prioritization", ring.ID)
rings, err := s.store.GetUnlockedRingsPendingWork()
if err != nil {
logger.WithError(err).Error("Failed to get rings pending work for prioritization check")
return model.RingStateReleaseFailed
}
ringsReleaseInProgress, err := s.store.GetRingsReleaseInProgress()
if err != nil {
logger.WithError(err).Error("Failed to query for rings that are under release")
return model.RingStateReleaseFailed
}

//The total rings locked at this time will be at least 1
if len(ringsLocked) > 1 || len(ringsReleaseInProgress) > 0 {
logger.Debug("Another ring is under lock and being updated...")
return model.InstallationGroupReleasePending
}

logger.Debugf("Checking ring %s prioritization", ring.ID)
rings, err := s.store.GetUnlockedRingsPendingWork()
if err != nil {
logger.WithError(err).Error("Failed to get rings pending work for prioritization check")
return model.RingStateReleaseFailed
}

for _, rg := range rings {
if rg.Priority < ring.Priority {
logger.Debugf("Ring %s is in priority", rg.ID)
return model.RingStateReleasePending
for _, rg := range rings {
if rg.Priority < ring.Priority {
logger.Debugf("Ring %s is in priority", rg.ID)
return model.RingStateReleasePending
}
}
}

Expand Down
Loading