[Backgroundrb-devel] enq_method doesn't pass 'arg'

Justin Wood justin.wood at trifectagis.com
Fri Mar 13 18:07:57 EDT 2009


Hi, Hemant

Ah ok.   Found out where it was making the call in in meta_worker and saw
the args coming back nil from load_data.   So I ran this in IRB

>> job=BdrbJobQueue.find(:first,:conditions => [" worker_name = ? AND taken
= ? AND scheduled_at <= ? ", "notification_worker", 0, Time.now.utc ])
=> #<BdrbJobQueue id: 53, args: "\\004\\010\"\\011asdf", worker_name:
"notification_worker", worker_method: "asdf", job_key: "Fri Mar 13 16:14:48
+1300 2009", taken: 0, finished: 0, timeout: nil, priority: nil,
submitted_at: "2009-03-13 03:14:48", started_at: nil, finished_at: nil,
archived_at: nil, tag: nil, submitter_info: nil, runner_info: nil,
worker_key: "", scheduled_at: "2009-03-13 03:14:51">
>> job.args
=> "\\004\\010\"\\011asdf"
>> Marshal.load(job.args)
TypeError: incompatible marshal file format (can't be read)
        format version 4.8 required; 92.48 given
        from (irb):10:in `load'
        from (irb):10

So the problem is with marshalling ... double checked that by putting a
logger statement into BdrbServerHelper's load_data like so:

...
rescue
        error_msg = $!.message
        logger.error("Error marshaling data:  #{data}  #{error_msg})
#added
        if error_msg =~ /^undefined\ .+\ ([A-Z].+)/
....

and got the same error message.   Having something going to the log in the
rescue there would be a useful addition.

I'm using Postgres 8.3.1 (database in utf8) on Ubuntu found someone else
that encountered a marshalling error here:

http://blade.nagaokaut.ac.jp/ruby/ruby-talk/116099

Looks like a ruby/Postgres issue?    I'll have a look see if I can sort this
out but any advice you could give me would be much appreciated.

Thanks
Justin


On Fri, Mar 13, 2009 at 8:58 PM, hemant <gethemant at gmail.com> wrote:

> On Fri, Mar 13, 2009 at 11:57 AM, Justin Wood
> <justin.wood at trifectagis.com> wrote:
> > Hi, Samer
> >
> > Thanks for the quick reply.   I changed things a bit and ran this
> >
> >>>
> >>>
> MiddleMan.new_worker(:worker=>:notification_worker,:worker_key=>'testkey',:data=>"data
> >>> arguement")
> > => "testkey"
> >>>
> >>>
> MiddleMan.worker(:notification_worker,'testkey').enq_send_warranty_notice(:job_key=>Time.now.to_s,:arg
> >>> => "asdf",:scheduled_at => Time.now + 3.second)
> > => true
> >
> > ... but the arg is still not being passed.
> >
> > My understanding of new_worker is it explictly creates a worker for you
> that
> > you can refer to by the key, so
> >
> > If I do this:
> >
> >       MiddleMan.worker(:notification_worker,'testkey')
> >
> > I'm getting the worker I created above but when I call this:
> >
> >      MiddleMan.worker(:notification_worker)
> >
> > I'm getting the default worker that was created at startup.
> >
> > Regardless of how the worker is created the "arg" parameter is still not
> > being passed when it gets invoked to do enqued work.   Going through the
> > code ... I can't figure out how it gets invoked.
> >
>
> Well whatever you pass to enq_xxx method gets marshalled to database
> and gets unmarshalled from table when the task is scheduled inside
> worker. Can you paste your worker code?
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/backgroundrb-devel/attachments/20090314/e19cb0b8/attachment.html>


More information about the Backgroundrb-devel mailing list