Skip to content

Commit

Permalink
🐛 delete orphan pods. (#713)
Browse files Browse the repository at this point in the history
Delete orphan pods. Pods orphaned when a task is cascade deleted.

---------

Signed-off-by: Jeff Ortel <jortel@redhat.com>
  • Loading branch information
jortel committed Jul 8, 2024
1 parent 3c579d1 commit 8bf0223
Showing 1 changed file with 45 additions and 2 deletions.
47 changes: 45 additions & 2 deletions task/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ func (m *Manager) Run(ctx context.Context) {
default:
err := m.cluster.Refresh()
if err == nil {
m.deleteOrphanPods()
m.runActions()
m.updateRunning()
m.startReady()
Expand Down Expand Up @@ -232,7 +233,7 @@ func (m *Manager) Delete(db *gorm.DB, id uint) (err error) {
if err != nil {
return
}
err = db.Delete(task).Error
err = m.DB.Delete(task).Error
return
})
return
Expand Down Expand Up @@ -266,7 +267,7 @@ func (m *Manager) Cancel(db *gorm.DB, id uint) (err error) {
if err != nil {
return
}
err = db.Save(task).Error
err = m.DB.Save(task).Error
if err != nil {
err = liberr.Wrap(err)
return
Expand Down Expand Up @@ -855,6 +856,38 @@ func (m *Manager) updateRunning() {
}
}

// deleteOrphanPods finds and deletes task pods not referenced by a task.
func (m *Manager) deleteOrphanPods() {
var err error
defer func() {
Log.Error(err, "")
}()
owned := make(map[string]byte)
list := []*Task{}
db := m.DB.Select("pod")
err = db.Find(&list, "pod != ''").Error
if err != nil {
err = liberr.Wrap(err)
return
}
for _, task := range list {
owned[task.Pod] = 0
}
for _, pod := range m.cluster.Pods() {
ref := path.Join(pod.Namespace, pod.Name)
if _, found := owned[ref]; !found {
Log.Info("Orphan pod found.", "ref", ref)
task := Task{&model.Task{}}
task.Pod = ref
err = task.Delete(m.Client)
if err != nil {
err = liberr.Wrap(err)
Log.Error(err, "")
}
}
}
}

// podSnapshot attaches a pod description and logs.
// Includes:
// - pod YAML
Expand Down Expand Up @@ -1781,6 +1814,16 @@ func (k *Cluster) Pod(name string) (r *core.Pod, found bool) {
return
}

// Pods returns a list of pods.
func (k *Cluster) Pods() (list []*core.Pod) {
k.mutex.RLock()
defer k.mutex.RUnlock()
for _, r := range k.pods {
list = append(list, r)
}
return
}

// getTackle
func (k *Cluster) getTackle() (err error) {
options := &k8s.ListOptions{Namespace: Settings.Namespace}
Expand Down

0 comments on commit 8bf0223

Please sign in to comment.