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

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

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

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, но всегда получаю тот же результат.

Ты хоть представляешь, что я могу с этим поделать?


Изменить: Моя трассировка:

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


person mbajur    schedule 05.03.2014    source источник
comment
К вашему сведению Stack Level Too Deep означает, что у вас где-то бесконечный цикл   -  person Richard Peck    schedule 06.03.2014
comment
да, я знаю это. Проблема в том, что я не могу понять, где это взять. Я немного чувствую, что это не моя вина, а несущая волна.   -  person mbajur    schedule 06.03.2014
comment
Не могли бы вы показать нам и своего работника?   -  person tombeynon    schedule 10.03.2014
comment
он связан с помощью рабочих слов sidekiq в первом предложении;)   -  person mbajur    schedule 10.03.2014
comment
Что вы увидите, если добавите puts '...' в square??   -  person Uri Agassi    schedule 12.03.2014
comment
В вашем коде есть крошечная ошибка. За 31 секунду у вас будет 6 кадров, за 60 у вас будет 3 кадра. 60 покрыто еще ... Не важно, просто отметьте это.   -  person Ruby Racer    schedule 12.03.2014
comment
Вы искали след (трассировку стека), чтобы найти в нем повторяющуюся часть? Должна быть какая-то рекурсия.   -  person Boris Brodski    schedule 13.03.2014
comment
Вы можете разместить здесь трассировку стека? Кроме того, какую версию carrierwave / sidekiq вы используете?   -  person bbozo    schedule 16.03.2014
comment
Что ж, это довольно бесполезно, но я добавил его в исходный вопрос (это то, что я получаю при сохранении изображения из IRB)   -  person mbajur    schedule 17.03.2014


Ответы (3)


Оказалось, что это вина carrierwave (ну, собственно, osx). Тема с объяснением: https://github.com/carrierwaveuploader/carrierwave/issues/1330

Решение:

gem 'rmagick', :require => 'RMagick'
person mbajur    schedule 17.03.2014
comment
Ууууу. Спас мой день! - person Andre Zimpel; 02.11.2014
comment
Рад, что ты нашел свой ответ. Несмотря на то, что у вас есть ошибка Celluloid::, эта проблема, похоже, не является частью тега celluloid. Вы согласны? - person digitalextremist; 13.06.2015
comment
да, полностью. Целлулоидная метка удалена. - person mbajur; 13.06.2015

Я бы нацелился на цикл for вашего worker.

for i in 1..(frames_to_extract)

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

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

person engineerDave    schedule 13.03.2014
comment
Вероятно, это проблема ... Вы, вероятно, увидите целую кучу идентичных снимков экрана из ... записей журнала, если на самом деле проблема. - person Brad Werth; 16.03.2014
comment
Ну, это также действует, когда я загружаю изображение вне sidekiq. - person mbajur; 17.03.2014

  1. проверьте свои модели, посмотрите, есть ли у вас хук after_save, например, который регрессирует в бесконечный цикл, если вы обновите запись в этом хуке - возможно, у вас есть after_save, который создает задание для создания миниатюр, а затем сохраняет эти миниатюры инициирует другую работу
  2. проверьте, нет ли проблем с безопасностью потоков, перечислены ли какие-либо драгоценные камни, которые вы используете, здесь
  3. проверьте трассировку стека, вы можете увидеть, какие строки повторяются?
  4. присутствует ли ошибка, когда вы не используете sidekiq для обработки файлов?
  5. проблема возникает всегда или только под нагрузкой?
  6. Ошибка RMagick с Ruby 2.1 - https://github.com/rmagick/rmagick/issues/100
  7. ...
person bbozo    schedule 16.03.2014
comment
да, эта ошибка также возникает, если я не использую sidekiq для обработки. Stacktrace добавлен к исходному вопросу. - person mbajur; 17.03.2014
comment
Как вы запускаете постобработку? Через обратный звонок? Кроме того, вы видели stackoverflow.com/questions/18774686/? Может быть ошибка библиотеки постобработки, что вы используете для изменения размера изображений? Вы можете разместить Gemfile.lock? - person bbozo; 17.03.2014
comment
Да, я видел эту ветку, но я всегда без проблем использовал rmagick, и я бы хотел, чтобы это было так. Gemfile.lock: gist.github.com/f859f467755ba6b82335. Насчет запуска постобработки - я не знаю, как на это ответить, я запускаю их обычным способом, взятым из файла readme для несущей волны. - person mbajur; 17.03.2014
comment
mbajur, насколько я могу судить, в используемой вами версии RMagick есть ошибка github.com / rmagick / rmagick / issues / 100, посмотрите, работает ли ваш код с другой библиотекой постобработки, если да, попробуйте поиграть с версией RMagick и / или версией ruby, пока ваш код не заработает, или, если это не удается, дождитесь хороших людей в rmagick, чтобы исправить проблему, которую я связал - person bbozo; 17.03.2014
comment
Хорошо, проблема решена. Я опубликовал решение с объяснением в качестве ответа. Спасибо за поддержку! - person mbajur; 17.03.2014