On Sat, 2007-01-27 at 18:03 +0300, Mike Aizatsky wrote:> While debugging stale backgroundrb it became apparent that
there''re
> memory leaks in it. Here''s top object counts dump:
>
> 36715 String
> 6211 Array
> 5598 Proc
> 3150 Hash
> 1478 DRb::DRbObject
> 1313 Regexp
> 1272 Class
> 750 Thread
> 741 Socket
> 739 Slave
> 739 Slave::LifeLine
> 737 Process::Status
> 691 DrillReminderWorker
> 391 Module
> 160 Range
> 75 Gem::Version
> 73 XSD::QName
>
> It''s easy to see that loads of threads and slaves are present in
the
> process. It also has references to 691 workers!
>
> In case there might be some problems with my worker here''s its
full code:
>
> class DrillReminderWorker < BackgrounDRb::Worker::RailsBase
>
> def do_work(args)
> logger.info "DrillReminderSender started"
> t = Time.now.gmtime
> tsec = t.sec + t.min*60 + t.hour*60*60
>
> logger.info "utc seconds: #{tsec}"
>
> User.find_all_to_send_drill_reminder(tsec).each do |u|
> Notification.deliver_drill_reminder(u)
> u.update_attributes!(
> :drill_notification_last_send => TimeUtils.nowf
> )
> end
>
> logger.info "DrillReminderSender end"
>
> self.delete
> end
>
> end
> DrillReminderWorker.register
>
>
For oneshot workers, I use explicit exit from the worker and it works,
rather than using self.delete, however delete would also work as
documented.