[Backgroundrb-devel] do_work and long running rails tasks?

Jens-Christian Fischer jcfischer.lists at gmail.com
Wed Oct 4 10:49:04 EDT 2006


Hi there

I have some long running queries against a nice litte database (20  
million new records per day) that I have offloaded to backgroundRB.  
The trouble is, that backgroundrb seems to be blockin on Model.find  
calls.

Here's the code

--- worker.rb --
   def do_work(args)
     @rows = []
     @percent = 0
     @host = Host.find( args[:id])
     ips = @host.ipaddresses

     step = 100.0/ips.size

     ips.each  do |ip|
       @percent += step
       new_rows = Sysloglog.find(:all,
                                 :limit => 20,
                                 :offset => 0,
                                 :order => "eventtime DESC",
                                 :conditions => [ "assets_ipaddr_id  
= ?", ip.id ]
                               )
       @rows << new_rows.collect { |s| s.id }
     end
     self.kill
   rescue Exception => e
     @logger.error "Exception: #{e}"
     @percent = 100
     self.kill
   end

-- snip ---

--- controller.rb --

def syslog_progress
     if request.xhr?
       worker = MiddleMan.get_worker(session[:host_info])
       if worker
         progress_percent = worker.progress
         render :update do |page|
           page.call('progressPercent', 'progressbar', progress_percent)
           @rows = Sysloglog.find( worker.rows) rescue []
           page.replace_html  'syslog_rows', :partial => "analysis/ 
syslog", :object => @rows
           if progress_percent >= 100
             page.assign 'stop_polling', true  #<< here is the magick!
             page.hide 'progress'
             MiddleMan.delete_worker(session[:host_info])
           end
         end
       else
         render :update do |page|
         end
       end
     else
       redirect_to :action => 'list'
     end
   end

-- snip --

An AJAX call to syslog_progress blocks for the time it takes to do  
the find( :all .... ) (which sort of renders the whole point of the  
sending this task to the background moot)

Is this the way it is? Any other ways of doing this?

Thanks
Jens-Christian





More information about the Backgroundrb-devel mailing list