Search code examples
ruby-on-railsruby-on-rails-4paperclipdelayed-job

DelayedJob creating infinite loop of tasks


I am using Paperclip and DelayedJob, to process uploaded styles in the background. When I send an image into the queue to be processed, DelayedJob finishes the job, but it gets sent into an infinite loop creating more of the exact same job.

Versions:

delayed_job_active_record version 4.0.2.

paperclip version 4.2.0.

Here is some code plus the worker log to show what is going on...

has_attached_file :data,
  url: '/updates/:id/:style/:basename.:extension',
  styles: { large: '750x750>', medium: '300x300>', thumb: '50x50#' },
  convert_options: { thumb: '-quality 75 -strip' }

validates_attachment_size :data, less_than: 20.megabytes
validates_attachment_content_type :data, content_type: /\Aimage\/.*\Z/

before_data_post_process do |update|
  if !update.processing && update.data_changed?
    update.processing = true
    false # stop processing
  end
end

after_save do |update|
  if update.processing
    update.delay.regenerate_styles!
  end
end

def regenerate_styles!
  data.reprocess!
  update_attribute(:processing, false)
  save
end

def data_changed?
  data_file_size_changed? ||
  data_file_name_changed? ||
  data_content_type_changed? ||
  data_updated_at_changed?
end

Worker response

[Worker(host:Justins-MacBook-Pro.local pid:98244)] Starting job worker
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=52) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=52) COMPLETED after 2.5247
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=53) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=53) COMPLETED after 0.1654
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=54) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=54) COMPLETED after 0.0895
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=55) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=55) COMPLETED after 0.0993
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=56) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=56) COMPLETED after 0.0990
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=57) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=57) COMPLETED after 0.0947
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=58) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=58) COMPLETED after 0.0949
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=59) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=59) COMPLETED after 0.0855
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=60) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=60) COMPLETED after 0.1004
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=61) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=61) COMPLETED after 0.0941
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=62) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=62) COMPLETED after 0.0860
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=63) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=63) COMPLETED after 0.0980
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=64) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=64) COMPLETED after 0.0928
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=65) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=65) COMPLETED after 0.1053
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=66) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=66) COMPLETED after 0.7533
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=67) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=67) COMPLETED after 0.0950
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=68) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=68) COMPLETED after 0.0952
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=69) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=69) COMPLETED after 0.0867
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=70) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=70) COMPLETED after 0.0944
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=71) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=71) COMPLETED after 0.0913
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=72) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=72) COMPLETED after 0.0918
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=73) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=73) COMPLETED after 0.0982
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=74) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=74) COMPLETED after 0.0976
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=75) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=75) COMPLETED after 0.0925
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=76) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=76) COMPLETED after 0.0914
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=77) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=77) COMPLETED after 0.0970
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=78) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=78) COMPLETED after 0.0922
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=79) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=79) COMPLETED after 1.4655
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=80) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=80) COMPLETED after 0.0892
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=81) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=81) COMPLETED after 0.0839
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=82) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=82) COMPLETED after 0.0848
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=83) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=83) COMPLETED after 0.0965
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=84) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=84) COMPLETED after 0.0963
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=85) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=85) COMPLETED after 0.0917
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=86) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=86) COMPLETED after 0.0919
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=87) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=87) COMPLETED after 0.0909
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=88) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=88) COMPLETED after 0.1006
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=89) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=89) COMPLETED after 0.0936
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=90) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=90) COMPLETED after 0.2311
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=91) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=91) COMPLETED after 0.1069
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=92) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=92) COMPLETED after 0.6727
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=93) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=93) COMPLETED after 0.0904
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=94) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=94) COMPLETED after 0.0993
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=95) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=95) COMPLETED after 0.0903
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=96) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=96) COMPLETED after 0.0976
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=97) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=97) COMPLETED after 0.0916
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=98) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=98) COMPLETED after 0.1023
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=99) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=99) COMPLETED after 0.0991
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=100) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=100) COMPLETED after 0.0997
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=101) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=101) COMPLETED after 0.0953
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=102) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=102) COMPLETED after 0.0933
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=103) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=103) COMPLETED after 0.0918
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=104) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=104) COMPLETED after 0.6735
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=105) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=105) COMPLETED after 0.0884
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=106) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=106) COMPLETED after 0.0916
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=107) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=107) COMPLETED after 0.0859
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=108) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=108) COMPLETED after 0.0886
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=109) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=109) COMPLETED after 0.0871
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=110) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=110) COMPLETED after 0.0853
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=111) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=111) COMPLETED after 0.0991
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=112) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=112) COMPLETED after 0.0889
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=113) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=113) COMPLETED after 0.0969
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=114) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=114) COMPLETED after 0.0956
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=115) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=115) COMPLETED after 0.0993
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=116) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=116) COMPLETED after 0.0987
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=117) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=117) COMPLETED after 0.6886
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=118) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=118) COMPLETED after 0.0927
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=119) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=119) COMPLETED after 0.0962
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=120) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=120) COMPLETED after 0.0991
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=121) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=121) COMPLETED after 0.0924
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=122) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=122) COMPLETED after 0.0938
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=123) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=123) COMPLETED after 0.0965
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=124) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=124) COMPLETED after 0.0949
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=125) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=125) COMPLETED after 0.0933
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=126) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=126) COMPLETED after 0.0950
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=127) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=127) COMPLETED after 0.0877
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=128) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=128) COMPLETED after 0.0954
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=129) RUNNING
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=129) COMPLETED after 0.8408
[Worker(host:Justins-MacBook-Pro.local pid:98244)] Job Update#regenerate_styles! (id=130) RUNNING

It probably takes 10 seconds for DJ to run through all those jobs as well. Has anyone run into this issue or can anyone spot an error with my configuration? Let me know if any more code is needed. Thanks in advance.


Solution

  • You call data.reprocess! with a bang, this probably saves the model (before you set processing to false) which then with the after_save generates another job.

    Your data changed method also checks updated_at (like you commented below) calling any kind of save (also the "processing, false" save) will update the updated_at. (causing processing again to be turned on)

    Check the second answer here: How to update a single attribute without touch updated_at attribute?

    and use update_column to skip the updating of the updated_at column.

    thus:

    def regenerate_styles!
      update_column(:processing, false)
      data.reprocess!
    end