2013-02-13 27 views
5

Ich bin in einigen Änderungen meiner Rails App zusammenführen, die das Hinzufügen des delayed_job Gem (was aussieht, AWESOME). Um zu testen, es aus, ich:Rake-Jobs: Arbeit gibt "PGError: FEHLER: SELECT für UPDATE/SHARE ist nicht erlaubt in Unterabfragen"

  • lief rails g delayed_job
  • rake db:migrate lief, die die delayed_jobs Tabelle erstellt
  • rails server neu gestartet (für alle Fälle)
  • den postgresql-Dienst neu gestartet (für alle Fälle)
  • ran scripts/delayed_job start
  • führte einige Aufgaben durch, um verzögerte Jobs zu erstellen

Aber nichts ist passiert:/Meine Aufträge sind in der Tabelle verzögerte Aufträge, aber locked_at ist Null (wie last_error).

Also habe ich versucht rake jobs:work, die einen seltsamen Postgres Fehler gab:
PGError: ERROR: SELECT FOR UPDATE/SHARE is not allowed in subqueries und eine Spur:

$ rake jobs:work 
[Worker(host:robert-vaio pid:21217)] Starting job worker 
rake aborted! 
PGError: ERROR: SELECT FOR UPDATE/SHARE is not allowed in subqueries 
: UPDATE "delayed_jobs" SET locked_at = '2013-02-13 19:53:46.803085', locked_by = 'host:robert-vaio pid:21217' WHERE id IN (SELECT id FROM "delayed_jobs" WHERE ((run_at <= '2013-02-13 19:53:46.792619' AND (locked_at IS NULL OR locked_at < '2013-02-13 15:53:46.792639') OR locked_by = 'host:robert-vaio pid:21217') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING * 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:1153:in `async_exec' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:1153:in `exec_no_cache' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:662:in `block in exec_query' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.12/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:661:in `exec_query' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:1248:in `select' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/database_statements.rb:18:in `select_all' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/query_cache.rb:63:in `select_all' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/querying.rb:38:in `block in find_by_sql' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/explain.rb:33:in `logging_query_plan' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.12/lib/active_record/querying.rb:37:in `find_by_sql' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job_active_record-0.4.1/lib/delayed/backend/active_record.rb:63:in `reserve' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:258:in `reserve_and_run_one_job' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:187:in `block in work_off' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:186:in `times' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:186:in `work_off' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:151:in `block (4 levels) in start' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:150:in `block (3 levels) in start' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `block in initialize' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `execute' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:38:in `run_callbacks' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:149:in `block (2 levels) in start' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:148:in `loop' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:148:in `block in start' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/plugins/clear_locks.rb:7:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/plugins/clear_locks.rb:7:in `block (2 levels) in <class:ClearLocks>' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `block (2 levels) in add' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `block in initialize' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `block in add' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `call' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `execute' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:38:in `run_callbacks' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/worker.rb:147:in `start' 
/home/robert/.rvm/gems/ruby-1.9.3-p327/gems/delayed_job-3.0.5/lib/delayed/tasks.rb:9:in `block (2 levels) in <top (required)>' 
Tasks: TOP => jobs:work 
(See full trace by running task with --trace) 

ich nicht herausfinden kann, was falsch ist - und was noch erstaunlicher ist, kann ich jemand anderes finden diese Frage stellend ....!

Danke für jede Hilfe!

+0

Lange Rede kurzer Sinn - Ich habe Postgre 9.1 aktualisiert und der Fehler ist weg. – rmosolgo

Antwort

5

Die Aktualisierung von Postgres behebt das Problem auch für mich - und das scheint besser zu sein als das Zurücksperren auf eine alte Version. Nicht, dass dies meine Antwort ist, aber als rmosgolgo beantwortete seine eigene Frage scheint es, als ob diese Frage richtig in "akzeptierte Antwort" Zustand gehen könnte.

+0

Auf welche Version von Postgres haben Sie zu aktualisieren Lass es funktionieren? – Jonah

+1

9.2.4 wahrscheinlich. Das ist, was ich jetzt mache, und ich erinnere mich nicht daran, seither zu aktualisieren. Ich sollte vielleicht auch beachten, dass ich es unter Windows ausführe. (Unternehmensumstände ...) – elc

6

Ich hatte genau das gleiche Problem. Ich löste dies durch meine Gemfile für delayed_job_active_record auf Version 0.3.3 Sperren:

gem 'delayed_job_active_record', '0.3.3'

das nicht arbeitende Juwel wurde Version 0.4.1, die am 12. Februar veröffentlicht wurde , 2012.

+0

Ich kann diese Lösung bestätigen.Gem 'delayed_job_active_record' Versionen 4.0.0 und 0.4.4 zeigen fehlerhaftes Verhalten, aber die Gem Version 0.3.3 funktioniert korrekt. Ich benutze PostgresSQL 8.3.7. – Ichimonji10

+0

Großartig, das funktioniert für mich. Du hast mir viel Zeit gespart. –

+0

Um "delayed_job_active_record" der Version 0.3.3 zu verwenden, benötigt es active_record Version < 4.0 & > 2.1.Ich verwende Rails4. Jede Idee von anderen alternativen bitte ... – Prem

2

Dies ist ein Problem für Know delayed_job,

https://github.com/collectiveidea/delayed_job_active_record/issues/33 sehen ein Zweig der delayed_job_active_record Es ist die mit Postgres 8.4 funktioniert gut und ist kompatibel mit Schienen 4.x

gem 'delayed_job_active_record', :git => '[email protected]:panter/delayed_job_active_record.git' 

Es behebt das Problem durch Verwenden von PostgreSQL-Aufrufen ohne die fehlgeschlagenen Abfragen.

1

Ich versuchte mit der Lösung zur Verfügung gestellt BT Neil Woods, aber es zeigte einige Authentifizierungsprobleme, dann habe ich versucht, mit der unteren Zeile mit kleinen Änderungen in der gleichen hinzuzufügen.

gem 'delayed_job_active_record', :git => 'git://github.com/panterch/delayed_job_active_record.git' 

Dies funktioniert, bitte versuchen Sie dies, wenn jemand die gleichen Probleme hat.

Danke.