2013-02-13 11 views
5

Łączę się z pewnymi zmianami w mojej aplikacji Rails, które obejmują dodanie klejnotu delayed_job (który wygląda NIESAMOWITE). Aby przetestować go, I:zadań rake: praca daje "PGError: ERROR: SELECT dla UPDATE/SHARE jest niedozwolone w podkwerendach"

  • prowadził rails g delayed_job
  • prowadził rake db:migrate, który stworzył tabelę delayed_jobs
  • wznowiona rails server (na wszelki wypadek)
  • wznowiona usługę postgresql (na wszelki wypadek)
  • wykonał scripts/delayed_job start
  • wykonał niektóre zadania, aby naliczyć opóźnione zadania

Ale nic się nie stało:/Moje zadania znajdują się w tabeli opóźnionych zadań, ale locked_at ma wartość null (podobnie jak last_error).

Więc próbowałem rake jobs:work, który wydał dziwny PostgreSQL błąd:
PGError: ERROR: SELECT FOR UPDATE/SHARE is not allowed in subqueries i śledzenia:

$ 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) 

nie mogę dowiedzieć się, co się stało - i bardziej zaskakująco, mogę znaleźć nikogo innego zadając to pytanie ....!

Dzięki za pomoc!

+0

Krótka historia - zaktualizowałem do PostgreSQL 9.1 i błąd zniknął. – rmosolgo

Odpowiedz

5

Aktualizacja postgres rozwiązała problem również dla mnie - i wydaje się, że lepiej jest zamknąć z powrotem do starej wersji. Nie oznacza to, że jest to odpowiedź, ale ponieważ rmosolgo odpowiedział na własne pytanie, wydaje się, że to pytanie może właściwie przejść do stanu "zaakceptowanej odpowiedzi".

+0

Jaką wersję Postgrera zaktualizowałeś do sprawić, że działa? – Jonah

+1

9.2.4 prawdopodobnie. Właśnie o tym teraz mówię i od tego czasu nie pamiętam aktualizacji. Może powinienem również zauważyć, że używam go w systemie Windows. (okoliczności korporacyjne ...) – elc

6

Miałem dokładnie ten sam problem. Rozwiązałem to przez blokowanie mój Gemfile dla delayed_job_active_record do wersji 0.3.3:

gem 'delayed_job_active_record', '0.3.3'

Klejnot nieprodukcyjnym została wersja 0.4.1, która została wydana w dniu 12 lutego , 2012.

+0

Potwierdzam to rozwiązanie.Gem 'delayed_job_active_record' wersje 4.0.0 i 0.4.4 wyświetlają błędne zachowanie, ale gem 0.3.3 działa poprawnie. Używam PostgresSQL 8.3.7. – Ichimonji10

+0

Świetne, które działa dla mnie. Uratowałeś mi dużo czasu. –

+0

Aby użyć "delayed_job_active_record" wersji 0.3.3, potrzebuje wersji active_record < 4.0 & > 2.1. Używam Rails4. Wszelkich pomysłów na inną alternatywę proszę ... – Prem

1

Próbowałem z rozwiązaniem dostarczonym przez Neila Woodsa, ale pokazywałem pewne problemy z uwierzytelnianiem, a następnie próbowałem dodawać za pomocą poniższej linii z niewielkimi zmianami w tym samym.

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

To wypracowanie, spróbuj tego, jeśli ktoś ma takie same problemy.

Dzięki.

Powiązane problemy