BackgrounDRb causing freeze and Mongrel timeout

I just installed BackgrounDRb to take care of sending emails to a list of users and when I try to call the worker, it causes the request to "freeze" until Mongrel times out.

This is the line that it fails on:

MiddleMan.worker(:invite_worker).send_invite_emails_test(@event.id, send_to)

The 'send_to' parameter is an array of user type (strings) which the worker will use to filter the list to send the email to. If I remove this array things work fine. So does this mean I'm limited to primitive types when I call a worker function?

Here's the worker code:

def send_invite_emails_test(event_id, send_to)     logger.debug("Start message...")     event = Event.find(event_id)

    for invite in event.invites       logger.debug("For invite #{invite.id}")     end   end

The various log files that BackgrounDRb don't seem to be much help either. If I call 'logger.debug' inside a worker, where does the log message go?

Any thoughts?

Thanks, Jeremy

I should have told you this earlier, but running git version of BackgrounDRb is currently the best way to go.

http://gnufied.org/2008/05/21/bleeding-edge-version-of-backgroundrb-for-better-memory-usage/

I upgraded it through Git and it still stalls and times out. Any other thoughts?

I just installed BackgrounDRb to take care of sending emails to a list of users and when I try to call the worker, it causes the request to "freeze" until Mongrel times out.

This is the line that it fails on:

MiddleMan.worker(:invite_worker).send_invite_emails_test(@event.id, send_to)

The 'send_to' parameter is an array of user type (strings) which the worker will use to filter the list to send the email to. If I remove this array things work fine. So does this mean I'm limited to primitive types when I call a worker function?

Here's the worker code:

def send_invite_emails_test(event_id, send_to)     logger.debug("Start message...")     event = Event.find(event_id)

    for invite in event.invites       logger.debug("For invite #{invite.id}")     end   end

The various log files that BackgrounDRb don't seem to be much help either. If I call 'logger.debug' inside a worker, where does the log message go?

Any thoughts?

Do you have packet and chronic gems installed?

Have you seenhttp://backgroundrb.rubyforge.org/

Yes, I have been to the main backgroundrb site and followed their instructions for installation and installed the packet and chronic gems. I've also read through their documentation to see if I could figure out what the problem is -- haven't found anything yet. Until I get this worked out I have installed Spawn and it seems to work on my local environment fine. I'm worried how that'll work in production, so I'd like to get this figured out if possible.

Well, no worker method will accept two arguments in your code snippet you are trying exactly the same. If you want two arguments, i am afraid, you will have to pass them as an array.

Hemant Kumar wrote:

gems. I've also read through their documentation to see if I could figure out what the problem is -- haven't found anything yet. Until I get this worked out I have installed Spawn and it seems to work on my local environment fine. I'm worried how that'll work in production, so I'd like to get this figured out if possible.

Well, no worker method will accept two arguments in your code snippet you are trying exactly the same. If you want two arguments, i am afraid, you will have to pass them as an array.

I'm sure this is resolved by now, one way or the other, but i found that it's simpler to pass all your arguments inside a single hash, eg

MiddleMan.worker(:invite_worker).send_invite_emails_test(:arg => {:event_id => @event.id, :send_to => send_to})

Then pull out at the other end just like a normal hash:

def send_invite_emails_test(arg_hash)     logger.debug("Start message...")     event = Event.find(arg_hash[:event_id])     ...etc   end

Also, if you send through an active record object (which i know you aren't doing), then it will die silently with no logging output anywhere. That's my experience anyway. Just mentioning for future browsers of this thread.

WRT logging, this probably isn't the smartest answer but the only way i could do it was to make a new logger inside the worker: eg from one of mine

class LmailWorker < BackgrounDRb::MetaWorker   set_worker_name :lmail_worker

  @@logger = Logger.new("log/backgroundrb_custom.log")

  def ldb(debug_text)     @@logger.info "### #{caller[0]}: #{debug_text}"   end

  def send_mail(arg_hash)     ldb "arg_hash = #{arg_hash.inspect}"     ...etc