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

Justin Wood justin.wood at trifectagis.com
Sat Mar 14 14:43:32 EDT 2009


Hi, All

Appreciate all the assistance, turns out this is a problem resulting from

Rails <= 2.1.1 and Postgres (to do with the way binary fields are escaped)

I upgraded Rails and it works.

Thanks
Justin

On Sat, Mar 14, 2009 at 11:07 AM, Justin Wood
<justin.wood at trifectagis.com>wrote:

> 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/20090315/cd5929cd/attachment-0001.html>


More information about the Backgroundrb-devel mailing list