Слишком высокий уровень стека при использовании версий несущей

Я пытаюсь использовать sidekiq worker, который более или менее сохраняет файл изображения в базу данных (используя несущую). Есть несколько файлов для сохранения, которые являются ключевыми кадрами, извлеченными из видеофайла. Это то, о чем говорит этот рабочий.

У моего загрузчика изображений есть несколько версий, которые определены и выглядят следующим образом:

class KeyframeUploader < CarrierWave::Uploader::Base

  # ...

  # Keyframe thumbnail sizes
  version :small do
    process resize_to_fill: [180, 180], if: :square?
    process resize_to_fill: [320, 180], if: :not_square?
  end

  version :medium do
    process resize_to_fill: [460, 460], if: :square?
    process resize_to_fill: [640, 460], if: :not_square?
  end

  version :large do
    process resize_to_fill: [720, 720], if: :square?
    process resize_to_fill: [1280, 720], if: :not_square?
  end


  private

    # Checks if image is a square
    def square? file
      img = Magick::Image.read(file.path)
      img[0].columns == img[0].rows
    end

    # Oposite to #square?
    def not_square? file
      !square? file
    end

end

Дело в том, что когда я пытаюсь запустить моего Sidekiq Worker, он бросает Celluloid::FiberStackError: stack level too deep и единственный способ исправить это, чтобы удалить определения моей версии. Он работает только в том случае, если для загрузчика нет какой-либо версии.

Я попытался переместить процесс сохранения другому работнику или использовать Carrierwave:: Backgrounder, но я всегда получаю тот же результат.

Есть ли у вас какие-нибудь идеи, что я могу сделать с этим?


Изменить: моя stracktrace:

SystemStackError: уровень стека слишком глубок /usr/local/rvm/rubies/ruby -2.1.1/lib/ruby/2.1.0/irb/workspace.rb:86

Ответ 2

Я бы нацелил цикл for на вашего рабочего.

for i in 1..(frames_to_extract)

вы не увеличиваете i, но вы, кажется, делаете индексированный цикл. Я бы переключил его на использование enum и each_with_index.

Рубисты склонны избегать цикла для, поскольку это неприятный беспорядок.

Ответ 3

  • проверьте свои модели, посмотрите, есть ли у вас крюк after_save, например, который будет регрессировать в бесконечный цикл, если вы обновите запись в этом случае - возможно, у вас есть after_save, который создает задание для создания эскизов, а затем сохранение этих эскизов инициирует другое задание.
  • проверяйте проблемы безопасности потоков, любые из используемых вами драгоценных камней здесь
  • проверить трассировку стека, можете ли вы видеть, какие строки повторяются?
  • - ошибка, возникающая, когда вы не используете sidekiq для обработки файлов?
  • Проблема всегда или просто при загрузке?
  • Ошибка RMagick с Ruby 2.1 - https://github.com/rmagick/rmagick/issues/100
  • ...