diff --git a/config/initializers/unicorn.rb b/config/initializers/unicorn.rb index 0874986..5ad8081 100644 --- a/config/initializers/unicorn.rb +++ b/config/initializers/unicorn.rb @@ -1,8 +1,8 @@ -require_dependency 'scheduler/defer' +require_dependency 'noosfero/scheduler/defer' if defined? Unicorn ObjectSpace.each_object Unicorn::HttpServer do |s| - s.extend Scheduler::Defer::Unicorn + s.extend Noosfero::Scheduler::Defer::Unicorn end end diff --git a/lib/noosfero/scheduler/defer.rb b/lib/noosfero/scheduler/defer.rb index cdd1064..455e090 100644 --- a/lib/noosfero/scheduler/defer.rb +++ b/lib/noosfero/scheduler/defer.rb @@ -1,95 +1,97 @@ # based on https://github.com/discourse/discourse/blob/master/lib/scheduler/defer.rb -module Scheduler - module Deferrable - def initialize - # FIXME: do some other way when not using Unicorn - @async = (not Rails.env.test?) and defined? Unicorn - @queue = Queue.new - @mutex = Mutex.new - @paused = false - @thread = nil - end +module Noosfero + module Scheduler + module Deferrable + def initialize + # FIXME: do some other way when not using Unicorn + @async = (not Rails.env.test?) and defined? Unicorn + @queue = Queue.new + @mutex = Mutex.new + @paused = false + @thread = nil + end - def pause - stop! - @paused = true - end + def pause + stop! + @paused = true + end - def resume - @paused = false - end + def resume + @paused = false + end - # for test - def async= val - @async = val - end + # for test + def async= val + @async = val + end - def later desc = nil, &blk - if @async - start_thread unless (@thread && @thread.alive?) || @paused - @queue << [blk, desc] - else - blk.call + def later desc = nil, &blk + if @async + start_thread unless (@thread && @thread.alive?) || @paused + @queue << [blk, desc] + else + blk.call + end end - end - def stop! - @thread.kill if @thread and @thread.alive? - @thread = nil - end + def stop! + @thread.kill if @thread and @thread.alive? + @thread = nil + end - # test only - def stopped? - !(@thread and @thread.alive?) - end + # test only + def stopped? + !(@thread and @thread.alive?) + end - def do_all_work - while !@queue.empty? - do_work _non_block=true + def do_all_work + while !@queue.empty? + do_work _non_block=true + end end - end - private + private - def start_thread - @mutex.synchronize do - return if @thread && @thread.alive? - @thread = Thread.new do - while true - do_work + def start_thread + @mutex.synchronize do + return if @thread && @thread.alive? + @thread = Thread.new do + while true + do_work + end end + @thread.priority = -2 end - @thread.priority = -2 end - end - # using non_block to match Ruby #deq - def do_work non_block=false - job, desc = @queue.deq non_block - begin - job.call + # using non_block to match Ruby #deq + def do_work non_block=false + job, desc = @queue.deq non_block + begin + job.call + rescue => ex + ExceptionNotifier.notify_exception ex, message: "Running deferred code '#{desc}'" + end rescue => ex - ExceptionNotifier.notify_exception ex, message: "Running deferred code '#{desc}'" + ExceptionNotifier.notify_exception ex, message: "Processing deferred code queue" end - rescue => ex - ExceptionNotifier.notify_exception ex, message: "Processing deferred code queue" end - end - class Defer + class Defer - module Unicorn - def process_client client - ::Scheduler::Defer.pause - super client - ::Scheduler::Defer.do_all_work - ::Scheduler::Defer.resume + module Unicorn + def process_client client + ::Noosfero::Scheduler::Defer.pause + super client + ::Noosfero::Scheduler::Defer.do_all_work + ::Noosfero::Scheduler::Defer.resume + end end + + extend Deferrable + initialize end - extend Deferrable - initialize end - end diff --git a/plugins/analytics/controllers/profile/analytics_plugin/time_on_page_controller.rb b/plugins/analytics/controllers/profile/analytics_plugin/time_on_page_controller.rb index 4aa5969..471e2a2 100644 --- a/plugins/analytics/controllers/profile/analytics_plugin/time_on_page_controller.rb +++ b/plugins/analytics/controllers/profile/analytics_plugin/time_on_page_controller.rb @@ -4,7 +4,7 @@ class AnalyticsPlugin::TimeOnPageController < ProfileController def page_load # to avoid concurrency problems with the original deferred request, also defer this - Scheduler::Defer.later do + Noosfero::Scheduler::Defer.later do page_view = profile.page_views.where(request_id: params[:id]).first page_view.request = request page_view.page_load! diff --git a/plugins/analytics/lib/analytics_plugin/base.rb b/plugins/analytics/lib/analytics_plugin/base.rb index b7e2562..7e1e024 100644 --- a/plugins/analytics/lib/analytics_plugin/base.rb +++ b/plugins/analytics/lib/analytics_plugin/base.rb @@ -22,7 +22,7 @@ class AnalyticsPlugin::Base < Noosfero::Plugin return if @analytics_skip_page_view return unless profile and profile.analytics_enabled? - Scheduler::Defer.later 'analytics: register page view' do + Noosfero::Scheduler::Defer.later 'analytics: register page view' do page_view = profile.page_views.build request: request, profile_id: profile, request_started_at: request_started_at, request_finished_at: request_finished_at -- libgit2 0.21.2