Тупик Celluloid во время запроса rails

#ruby-on-rails #ruby #deadlock #celluloid

#ruby-on-rails #ruby #взаимоблокировка #celluloid

Вопрос:

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

 def do_upload(upload, container_name, path, name, data)
    Azure.config.storage_account_name = APP_CONFIG['ac_name']
    Azure.config.storage_access_key = APP_CONFIG['key']
    azure_blob_service = Azure::Blob::BlobService.new

    begin
      container = azure_blob_service.get_container_properties(container_name)
    rescue => error
      puts error
      upload.upload_failed = true
      upload.save
      render :body => nil, :status => 503 and return
    end

    begin
      azure_blob_service.create_block_blob(container.name, path   name, data, {chunking: true, timeout: 300})
    rescue => error
      puts error
      upload.upload_failed = true
      upload.save
      render :body => nil, :status => 503 and return
    end

    upload.number_of_files  = 1 unless (params[:type] == 'thumbnail' || params[:type] == 'model')
    upload.save

    render json: { :status => 200 } and return
  end
  

Я использую azure-contrib для загрузки фрагментированного файла в azure, а azure-contrib, в свою очередь, использует Celluloid.

Ошибка, которую я получаю, это:

 I, [2016-10-24T11:42:15.290622 #65239]  INFO -- : Completed 500 Internal Server Error in 93ms (ActiveRecord: 4.7ms)
F, [2016-10-24T11:42:15.296640 #65239] FATAL -- :
F, [2016-10-24T11:42:15.312435 #65239] FATAL -- : fatal (No live threads left. Deadlock?):
F, [2016-10-24T11:42:15.312543 #65239] FATAL -- :
  

Комментарии:

1. Да, это Rails 5.

2. Похоже, это была ошибка в celluloid. возврат к версии 0.16.0 решил эту проблему. Я думаю, что ошибка должна быть исправлена в следующем выпуске. 0.17.4, но она еще не выпущена.

3. Существует также некоторый новый способ, которым Rails5 приведет к взаимоблокировке, если в типичной конфигурации режима разработки с автозагрузкой, при параллелизме. Я подумал, возможно, вы столкнулись с одним из них.