Too bad even the trace doesn''t say which hash is involved. Sorry this post is long: am trying to provide enough context to be meaningful. Occurs _intermittently_ when rake jobs:work is pulling a command out of delayed_jobs while my status observer is in the process of parsing a log file for detailed results of the previous delayed_job denizen. I have an observer class (in RAILS_ROOT/lib ) which listens for the events, makes a copy of them and calls the owner class ( in apps/ models ) which then calls on the log parser (also in /lib) to do the actual work. (Should both of those classes, the observer and the parser be in app/models?) Am due to deliver this application in a few days and this is killing it (and me). Am using DirectoryWatcher to look for flag files that indicate the start and finish of the delayed_jobs. That is started at the end of environment.rb like this: require ''directory_watcher'' $scriptStatusObserver = ScriptStatusObserver.new dirToWatch ="#{RAILS_ROOT}/tmp/flags" $directoryWatcher = DirectoryWatcher.new( dirToWatch ) $directoryWatcher.glob= "*.flg" $directoryWatcher.interval=(15) $directoryWatcher.add_observer( $scriptStatusObserver ) $directoryWatcher.persist=("#{RAILS_ROOT}/tmp/flags/dw_state.yml") $directoryWatcher.start at_exit { $directoryWatcher.stop } This code is outside of the run method (btw is that the best place or is inside the run better?) Here is the observer: require ''script_run'' class ScriptStatusObserver def initialize @rcvdEvents = [] end def update( *events ) begin puts "#{__LINE__.to_s}: ScriptStatusObserver events: \n"+events.to_yaml cnt = 0 events.each do |e| if e.to_s.match(/^\s*added/) cnt = cnt + 1 @rcvdEvents << e end end ScriptRun.new.catch_up( @rcvdEvents ) if cnt > 0 @rcvdEvents.clear rescue puts $! end end end Here is ScriptRun (it attaches to an associative table built with has_many:through) #require ''observer'' class ScriptRun < ActiveRecord::Base set_table_name "scripts_runs" belongs_to :script belongs_to :run def parse( result ) parser = LogParser.new parser.parse(result) end def catch_up( events ) events.each do |e| typ = e.type path = e.path thisMatch = path.match(/flags\/(\d+)_(\d+)_([\d\.]+)_(\w+) \.flg/) run_id = thisMatch[1] script_id = thisMatch[2] ts = thisMatch[3] status = thisMatch[4] if e.to_s.match(/^\s*added/) status_update( script_id, run_id, status, ts, path ) end end end def status_update( script_id, run_id, status, ts, path ) scriptrun = ScriptRun.find(:first, :conditions => [ "run_id = ? and script_id = ?", run_id.to_i, script_id.to_i ]) if scriptrun.kind_of?(ScriptRun) currStatus = scriptrun.status if not currStatus == ''completed'' scriptrun.update_attribute(:status, status) if status == ''parse'' flag = File.new(path) logSpec = flag.gets flag.close logName = File.basename(logSpec) logPath = logSpec.sub(logName, '''') logName =~ /^(([\w_]+)_([\w]+)_(\d+))\.log$/ name = $1 basename = $2 runenv = $3 tsOrPid = $4 result = Result.new result.log_path = logPath result.basename = basename result.name = name result.script_id = script_id.to_i result.run_id = run_id.to_i if runenv == ''sit'' runenv = ''SIT3348'' end result.application_environment_id ApplicationEnvironment.find(:first, :conditions => [ "nodename = ?", runenv]).id parse(result) if run_completed?( run_id ) myRun = Run.find(run_id.to_i) if myRun.kind_of?( Run ) myRun.update_attribute( :completed, Time.now.to_f ) end end end end else puts "#{__LINE__.to_s}: ScriptRun.status_update: ScriptRun not found for run #{run_id} script #{script_id} ts #{ts.to_s}" end File.delete(path) end def run_completed?( id ) scriptruns = ScriptRun.find(:all, :conditions => [ "run_id = ?", id.to_i] ) scriptruns.each do |sr| if not sr.status == ''completed'' return false end end return true end end LogParser is too long even for this post but it reads the script log and pulls detailed information (counts and timings) out of the log and writes to a details table. It also tallies and calculates averages and rolls those up into summary tables for quicker access from the web pages. Here is the error trace: (don''t ask why everything is under my Windows profile. It''s a long story) Scanner running 1270239731.43 directory_watcher.notify_observers: #<ScriptStatusObserver:0x48ae838 @rcvdEvents =[#<struct DirectoryWatcher::Event type=:added, path="C:/Documents and Settings/ pneve/workspace/waftt-0.29/tmp/flags/ 100039_11_1270236464.921_parse.flg">, #<str uct DirectoryWatcher::Event type=:added, path="C:/Documents and Settings/pneve/w orkspace/waftt-0.29/tmp/flags/100039_18_1270239550.108_parse.flg">]> update:[#<struct DirectoryWatcher::Event type=:added, path="C:/ Documents and Set tings/pneve/workspace/waftt-0.29/tmp/flags/ 100039_19_1270239727.368_parse.flg">, #<struct DirectoryWatcher::Event type=:removed, path="C:/Documents and Settings /pneve/workspace/waftt-0.29/tmp/flags/ 100039_18_1270239550.108_parse.flg">] rake aborted! can''t modify frozen hash C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/rails/ activerecord/l ib/active_record/attribute_methods.rb:313:in `[]='' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/rails/ activerecord/l ib/active_record/attribute_methods.rb:313:in `write_attribute_without_dirty'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/rails/ activerecord/l ib/active_record/dirty.rb:139:in `write_attribute'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/rails/ activerecord/l ib/active_record/attribute_methods.rb:211:in `last_error='' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/worker.rb:141:in `handle_failed_job'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/worker.rb:115:in `run'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/worker.rb:162:in `reserve_and_run_one_job'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/worker.rb:92:in `work_off'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/worker.rb:91:in `times'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/worker.rb:91:in `work_off'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/worker.rb:66:in `start'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/rails/ activesupport/ lib/active_support/core_ext/benchmark.rb:10:in `realtime'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/worker.rb:65:in `start'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/worker.rb:62:in `loop'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/worker.rb:62:in `start'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/ delayed_job/ lib/delayed/tasks.rb:13 c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:636:in `call'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:636:in `execute'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:631:in `each'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:631:in `execute'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:597:in `invoke_with_call_chain'' c:/Documents and Settings/pneve/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize '' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:590:in `invoke_with_call_chain'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:583:in `invoke'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:2051:in `invoke_task'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:2029:in `top_level'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:2029:in `each'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:2029:in `top_level'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:2068:in `standard_exception_handling'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:2023:in `top_level'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:2001:in `run'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:2068:in `standard_exception_handling'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ lib/rake. rb:1998:in `run'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/ bin/rake: 31 c:/Documents and Settings/pneve/ruby/bin/rake:16:in `load'' c:/Documents and Settings/pneve/ruby/bin/rake:16 -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Too bad even the trace doesn''t say which hash is involved. Sorry this post is long: am trying to provide enough context to be meaningful. Occurs _intermittently_ when rake jobs:work is pulling a command out of delayed_jobs while my status observer is in the process of parsing a log file for detailed results of the previous delayed_job denizen. I have an observer class (in RAILS_ROOT/lib ) which listens for the events, makes a copy of them and calls the owner class ( in apps/models ) which then calls on the log parser (also in /lib) to do the actual work. (Should both of those classes, the observer and the parser be in app/models?) Am due to deliver this application in a few days and this is killing it (and me). Am using DirectoryWatcher to look for flag files that indicate the start and finish of the delayed_jobs. That is started at the end of environment.rb like this: require ''directory_watcher'' $scriptStatusObserver = ScriptStatusObserver.new dirToWatch ="#{RAILS_ROOT}/tmp/flags" $directoryWatcher = DirectoryWatcher.new( dirToWatch ) $directoryWatcher.glob= "*.flg" $directoryWatcher.interval=(15) $directoryWatcher.add_observer( $scriptStatusObserver ) $directoryWatcher.persist=("#{RAILS_ROOT}/tmp/flags/dw_state.yml") $directoryWatcher.start at_exit { $directoryWatcher.stop } This code is outside of the run method (btw is that the best place or is inside the run better?) Here is the observer: require ''script_run'' class ScriptStatusObserver def initialize @rcvdEvents = [] end def update( *events ) begin puts "#{__LINE__.to_s}: ScriptStatusObserver events: \n"+events.to_yaml cnt = 0 events.each do |e| if e.to_s.match(/^\s*added/) cnt = cnt + 1 @rcvdEvents << e end end ScriptRun.new.catch_up( @rcvdEvents ) if cnt > 0 @rcvdEvents.clear rescue puts $! end end end Here is ScriptRun (it attaches to an associative table built with has_many:through) #require ''observer'' class ScriptRun < ActiveRecord::Base set_table_name "scripts_runs" belongs_to :script belongs_to :run def parse( result ) parser = LogParser.new parser.parse(result) end def catch_up( events ) events.each do |e| typ = e.type path = e.path thisMatch = path.match(/flags\/(\d+)_(\d+)_([\d\.]+)_(\w+)\.flg/) run_id = thisMatch[1] script_id = thisMatch[2] ts = thisMatch[3] status = thisMatch[4] if e.to_s.match(/^\s*added/) status_update( script_id, run_id, status, ts, path ) end end end def status_update( script_id, run_id, status, ts, path ) scriptrun = ScriptRun.find(:first, :conditions => [ "run_id = ? and script_id = ?", run_id.to_i, script_id.to_i ]) if scriptrun.kind_of?(ScriptRun) currStatus = scriptrun.status if not currStatus == ''completed'' scriptrun.update_attribute(:status, status) if status == ''parse'' flag = File.new(path) logSpec = flag.gets flag.close logName = File.basename(logSpec) logPath = logSpec.sub(logName, '''') logName =~ /^(([\w_]+)_([\w]+)_(\d+))\.log$/ name = $1 basename = $2 runenv = $3 tsOrPid = $4 result = Result.new result.log_path = logPath result.basename = basename result.name = name result.script_id = script_id.to_i result.run_id = run_id.to_i if runenv == ''sit'' runenv = ''SIT3348'' end result.application_environment_id ApplicationEnvironment.find(:first, :conditions => [ "nodename = ?", runenv]).id parse(result) if run_completed?( run_id ) myRun = Run.find(run_id.to_i) if myRun.kind_of?( Run ) myRun.update_attribute( :completed, Time.now.to_f ) end end end end else puts "#{__LINE__.to_s}: ScriptRun.status_update: ScriptRun not found for run #{run_id} script #{script_id} ts #{ts.to_s}" end File.delete(path) end def run_completed?( id ) scriptruns = ScriptRun.find(:all, :conditions => [ "run_id = ?", id.to_i] ) scriptruns.each do |sr| if not sr.status == ''completed'' return false end end return true end end LogParser is too long even for this post but it reads the script log and pulls detailed information (counts and timings) out of the log and writes to a details table. It also tallies and calculates averages and rolls those up into summary tables for quicker access from the web pages. Here is the error trace: (don''t ask why everything is under my Windows profile. It''s a long story) Scanner running 1270239731.43 directory_watcher.notify_observers: #<ScriptStatusObserver:0x48ae838 @rcvdEvents =[#<struct DirectoryWatcher::Event type=:added, path="C:/Documents and Settings/ pneve/workspace/waftt-0.29/tmp/flags/100039_11_1270236464.921_parse.flg">, #<str uct DirectoryWatcher::Event type=:added, path="C:/Documents and Settings/pneve/w orkspace/waftt-0.29/tmp/flags/100039_18_1270239550.108_parse.flg">]> update:[#<struct DirectoryWatcher::Event type=:added, path="C:/Documents and Set tings/pneve/workspace/waftt-0.29/tmp/flags/100039_19_1270239727.368_parse.flg">, #<struct DirectoryWatcher::Event type=:removed, path="C:/Documents and Settings /pneve/workspace/waftt-0.29/tmp/flags/100039_18_1270239550.108_parse.flg">] rake aborted! can''t modify frozen hash C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/rails/activerecord/l ib/active_record/attribute_methods.rb:313:in `[]='' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/rails/activerecord/l ib/active_record/attribute_methods.rb:313:in `write_attribute_without_dirty'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/rails/activerecord/l ib/active_record/dirty.rb:139:in `write_attribute'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/rails/activerecord/l ib/active_record/attribute_methods.rb:211:in `last_error='' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/worker.rb:141:in `handle_failed_job'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/worker.rb:115:in `run'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/worker.rb:162:in `reserve_and_run_one_job'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/worker.rb:92:in `work_off'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/worker.rb:91:in `times'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/worker.rb:91:in `work_off'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/worker.rb:66:in `start'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/rails/activesupport/ lib/active_support/core_ext/benchmark.rb:10:in `realtime'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/worker.rb:65:in `start'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/worker.rb:62:in `loop'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/worker.rb:62:in `start'' C:/Documents and Settings/pneve/workspace/waftt-0.29/vendor/plugins/delayed_job/ lib/delayed/tasks.rb:13 c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:636:in `call'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:636:in `execute'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:631:in `each'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:631:in `execute'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:597:in `invoke_with_call_chain'' c:/Documents and Settings/pneve/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize '' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:590:in `invoke_with_call_chain'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:583:in `invoke'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:2051:in `invoke_task'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:2029:in `top_level'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:2029:in `each'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:2029:in `top_level'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:2068:in `standard_exception_handling'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:2023:in `top_level'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:2001:in `run'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:2068:in `standard_exception_handling'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake. rb:1998:in `run'' c:/Documents and Settings/pneve/ruby/lib/ruby/gems/1.8/gems/rake-0.8.7/bin/rake: 31 c:/Documents and Settings/pneve/ruby/bin/rake:16:in `load'' c:/Documents and Settings/pneve/ruby/bin/rake:16 -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.