2013-02-13 9 views
5

私はRailsアプリにいくつか変更を加えました。これにはdelayed_job宝石(AWESOMEと思われます)を追加しました。それをテストするには、I:rake jobs: "PGError:ERROR:サブクエリでUPDATE/SHAREを選択できません"

  • rails g delayed_job
  • を走った
  • delayed_jobsテーブルを作成した、rake db:migrateを走った(念のため)
  • rails serverを再起動PostgreSQLサービス(念のため)
  • を再起動
  • scripts/delayed_job start
  • が遅延ジョブを発生させるためにいくつかのタスクを実行しました

何も起こっていません:/私のジョブは遅延ジョブテーブルにありますが、locked_atはヌルです(last_error)。

だから私は、奇妙なPostgresのエラーを与えた、rake jobs:workを試してみました:
PGError: ERROR: SELECT FOR UPDATE/SHARE is not allowed in subqueries およびトレース:

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

私が間違っているかを把握することはできません - ともっと驚くべきことには、私は他の誰を見つけることができますこの質問に....!

ありがとうございました!

+0

短いストーリー - 私はpostgres 9.1にアップグレードしてエラーが消えました。 – rmosolgo

答えて

5

Updating postgresも私の問題を解決しました。これは古いバージョンにロックバックする方が望ましいと思われます。これは私のの回答ではありませんが、rmosolgoは自分の質問に答えているので、この質問が適切に「受け入れられた回答」状態に入るように思われます。

+0

どのバージョンのPostgresにアップグレードしましたか?それを働かせる? – Jonah

+1

9.2.4おそらく。それは私が今やっていることです。それ以来アップグレードは覚えていません。私はおそらく私はWindows上でそれを実行していることに注意する必要があります。 (企業の状況...) – elc

6

私はまったく同じ問題を抱えていました。私は、バージョン0.3.3にdelayed_job_active_recordのための私のGemfileをロックすることにより、これを解決:

宝石「delayed_job_active_record」、「0.3.3」

に2月12日にリリースされた非稼働宝石たバージョン0.4.1を、 、2012.

+0

この解決策を確認できます。Gem 'delayed_job_active_record'バージョン4.0.0と0.4.4はバグの動作を表示しますが、gemバージョン0.3.3は正しく機能します。私はPostgreSQL 8.3.7を使用しています。 – Ichimonji10

+0

それは私のために働く素晴らしい。あなたは私の多くの時間を救った。 –

+0

バージョン0.3.3の "delayed_job_active_record"を使用するには、active_recordバージョン< 4.0 & > 2.1が必要です.Rails4を使用しています。他の代替案のアイデアをどうぞ... – Prem

2

これはdelayed_jobための既知の問題であり、postgresの8.4で正常に動作し、レール4.xの

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

との互換性があることが、問題を修正しdelayed_job_active_recordの分岐がありhttps://github.com/collectiveidea/delayed_job_active_record/issues/33

を見ます失敗したクエリを使わずにpostgres sql呼び出しを使用します。

1

私は解決策を試してみましたが、それはいくつかの認証上の問題を示していました。

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

誰かが同じ問題を抱えている場合は、これを試してください。

ありがとうございました。

関連する問題