Ошибка восстановления работника на сервере PostgreSQL - PullRequest
10 голосов
/ 18 октября 2011

Мне удалось настроить моих работников, и они раньше выполняли без проблем (в разработке), но теперь они не работают ни в производстве, ни в разработке (я думаю, после перехода с SQlite3 на PostgreSQL).

Когда я запускаю команду rake для запуска рабочих с rake resque:work QUEUE=*, я получаю следующую ошибку и трассировку стека:

getaddrinfo: nodename nor servname provided, or not known

Я получаю следующие ошибки при запуске heroku rake resque:work QUEUE=* в консоли для проверки ожидающих работников в очереди.

Class         SentimentJob
Arguments     [4, 5, 6]
Exception     ActiveRecord::StatementInvalid
Error         PGError: server closed the connection unexpectedly This probably means
              the server terminated abnormally before or while processing the request.
              : SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc,
              a.attnotnull FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid =
              d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"taggings"'::regclass
              AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum

А для моего работника в Facebook:

Class         FBConnectionsJob
Arguments     1
Exception     OpenSSL::SSL::SSLError
Error         SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B:
              certificate verify failed

Class         FBConnectionsJob
Arguments     1
Exception     ActiveRecord::StatementInvalid
Error         PGError: server closed the connection unexpectedly This probably means
              the server terminated abnormally before or while processing the request.
              : SELECT tablename FROM pg_tables WHERE schemaname = ANY
              (current_schemas(false)) 

Почему я получаю разные ошибки в разных средах? Мои файлы инициализатора выглядят так:

Должен ли я добавить спецификации ENV здесь?

Resque.rb

uri = URI.parse(ENV["REDISTOGO_URL"])
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file }

Redis.rb

uri = URI.parse(ENV["REDISTOGO_URL"])
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Resque.redis = REDIS

Мой файл environment / production.rb не имеет ссылки на Redis, а мой файл environment / development.rb имеет это для установки Redis:

ENV["REDISTOGO_URL"] = 'redis://username:password@my.host:6789' 

Ответы [ 4 ]

29 голосов
/ 21 октября 2011

Добавление следующего в мой Rakefile исправило похожую проблему для меня:

task "resque:setup" => :environment do
  Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
end

Это переподключает PostgreSQL до того, как Resque разветвляет свой процесс для создания работника.

0 голосов
/ 20 октября 2011

Я изменил инициализаторы на следующий, и теперь он работает на localhost, поэтому @mirtinciu был прав насчет соединения с сервером.Еще нужно выяснить, что не так на рабочем сервере.

if Rails.env.development?
  uri = URI.parse(ENV["REDISTOGO_URL"])
  Resque.redis = Redis.new(:host => 'localhost', :port => '6379')
else
  uri = URI.parse(ENV["REDISTOGO_URL"])
  Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
end
0 голосов
/ 20 октября 2011

Я думаю, что это дубликат, и он решается восстановлением соединения ActiveRecord: Работники Rails Resque не работают с PGError: сервер неожиданно закрыл соединение

0 голосов
/ 19 октября 2011

Похоже, ваше приложение не может подключиться к серверу Redis.Предоставили ли вы действительные данные для подключения к производственной среде?Ваш сервер Redis доступен?Разве это не за брандмауэром какая-то частная сеть?

Я думаю, что это может быть та же проблема с вашим сервером PostgreSQL производства.

...