Project

General

Profile

Actions

Bug #25723

closed

Foreman may create duplicate CreateRssNotifications tasks after restarting foreman tasks

Added by Adam Ruzicka about 6 years ago. Updated over 4 years ago.

Status:
Closed
Priority:
Normal
Assignee:
Category:
Notifications
Target version:
-
Difficulty:
Triaged:
No
Fixed in Releases:
Found in Releases:

Description

Cloned from https://bugzilla.redhat.com/show_bug.cgi?id=1654347

Description of problem:
Foreman may create duplicate CreateRssNotifications, CreatePulpDiskSpaceNotifications or SendExpireSoonNotifications when restart foreman-tasks.

  1. su - postgres c "psql -d foreman -c 'select label,count(label),state from foreman_tasks_tasks where state <> '\''stopped'\'' group by label,state;'"
    label | count | state
    ---------------------------------------
    ------------------
    CreateRssNotifications | 2 | scheduled
    CreatePulpDiskSpaceNotifications | 1 | scheduled
    SendExpireSoonNotifications | 1 | scheduled

The "spawn_if_missing" function is looking for task that is in "scheduled" state during the dynflow startup. If no "CreateRssNotifications" is in "schdeduled" state, then create one. I suspect that the task was not in "scheduled" state previously before Dynflow got terminated and cause Dynflow to create a duplicate task during startup.

/usr/share/foreman/app/jobs/application_job.rb

def self.spawn_if_missing(world)
return if (Foreman.in_rake? && !Foreman.in_rake?('dynflow:executor')) || Rails.env.test?
pending_jobs = world.persistence.find_execution_plans(filters: { :state => 'scheduled' })
scheduled_job = pending_jobs.select do |job|
delayed_plan = world.persistence.load_delayed_plan job.id
next unless delayed_plan.present?
arg = delayed_plan.to_hash[:serialized_args].first
arg.is_a?(Hash) && arg['job_class'] == self.to_s
end
  1. Schedule the job only if it doesn't exit yet
    self.perform_later if scheduled_job.blank?
    end
Actions

Also available in: Atom PDF