From abd4e1531dc30c04c399c0227904895dfb950444 Mon Sep 17 00:00:00 2001 From: Kieran Pilkington Date: Fri, 31 Oct 2008 18:27:18 +1300 Subject: [PATCH] bugfix: most of the time, site registrations would fail because of timeouts. This should fix it (moved registration to a backgroundrb task). --- app/controllers/configure_controller.rb | 114 ++++++++++++--------- app/views/configure/_link_to_site.html.erb | 55 +++++----- app/views/importers/create.html.erb | 3 +- lib/site_registration.rb | 46 +++++++++ lib/workers/site_registration_worker.rb | 49 +++++++++ 5 files changed, 191 insertions(+), 76 deletions(-) create mode 100644 lib/site_registration.rb create mode 100644 lib/workers/site_registration_worker.rb diff --git a/app/controllers/configure_controller.rb b/app/controllers/configure_controller.rb index d5c7bcb02..86ffe1170 100644 --- a/app/controllers/configure_controller.rb +++ b/app/controllers/configure_controller.rb @@ -7,6 +7,8 @@ class ConfigureController < ApplicationController permit "tech_admin of :site" + include SiteRegistration + def index @advanced = params[:advanced] || false @sections = SETUP_SECTIONS.collect { |s| s} @@ -217,50 +219,79 @@ def prime_zebra # that we also at site configure in index def add_link_from_kete_net # check to see if the site is already listed + # loads variable used in the reload-site-index section site_listing end def send_information - register_url = "http://kete.net.nz" - kete_sites_link = register_url + "/site/kete_sites" - register_new_link = "#{kete_sites_link}/new" + set_kete_net_urls if !request.xhr? - redirect_to register_new_link + redirect_to @kete_sites_register else - # this will break if reached when these constants aren't set - raise "Pretty Site Name and Site URL constants are not set, are you sure you restarted your server after you configured your Kete site?" if SITE_URL.blank? || PRETTY_SITE_NAME.blank? - begin - register = RegisterSiteResource.create(:name => PRETTY_SITE_NAME, :url => SITE_URL, :description => params[:site_description]) - rescue - register = nil - @register_error = $! + @worker_type = "site_registration_worker".to_sym + if backgroundrb_is_running?(@worker_type) + MiddleMan.worker(@worker_type, @worker_type.to_s).delete + sleep 5 # give it time to kill the worker end - render :update do |page| - top_message = String.new - if !register.nil? && register && register.errors.empty? && register.id > 0 - top_message = "Your Kete installation has been registered. Thank you. You can view the whole directory of Kete sites at " + link_to(kete_sites_link) + "." - elsif !register.nil? && !register.errors.empty? - register_message = "Some fields were incorrect:
" - register.errors.each do |field, error| - register_message += "  #{field.humanize} #{error}
" + + unless backgroundrb_is_running?(@worker_type) + MiddleMan.new_worker( :worker => @worker_type, :worker_key => @worker_type.to_s ) + MiddleMan.worker(@worker_type, @worker_type.to_s).async_do_work( :arg => { :params => params } ) + render :update do |page| + page.replace_html("updater", periodically_call_remote(:url => { :action => 'get_registration_progress' }, :frequency => 3)) + end + else + render :update do |page| + page.replace_html("top_message", "There is already a site registration worker active. Weird! Try refreshing the page.") + page.hide('spinner') + end + end + end + end + + include WorkerControllerHelpers + + def get_registration_progress + set_kete_net_urls + begin + @worker_type = "site_registration_worker".to_sym + status = MiddleMan.worker(@worker_type, @worker_type.to_s).ask_result(:results) + logger.debug(status.inspect) + if !status.blank? + if status[:registration_complete] == true + # the following lines means the periodic calls to this method wont cause errors + # when trying to process the registration again + MiddleMan.worker(@worker_type, @worker_type.to_s).reset_worker + MiddleMan.worker(@worker_type, @worker_type.to_s).delete + + if status[:registration_success] == true + top_message = "Your Kete installation has been registered. Thank you. You can view the whole directory of Kete sites at #{@kete_sites}." + render :update do |page| + page.hide('spinner') + page.replace_html("top_message", top_message) + end + elsif !status[:registration_validation_errors].blank? + register_errors = "Some fields were incorrect:
" + status[:registration_validation_errors].each do |field, error| + register_errors += "  #{field.humanize} #{error}
" + end + render :update do |page| + page.replace_html("register_errors", register_errors) + page.hide('spinner') + page.show('form_fields') + end + else + error_registering_site end - page.replace_html("register_errors", register_message) - page.show('form_fields') - page.show('site_description') - page.show('data-button') - page.hide('top_message') else - logger.error("Error linking from Kete.net.nz: " + @register_error) if @register_error - top_message = "There was an error linking to your site. " - site_listing - if @site_listing.blank? - top_message += "You can do it manually at "+ link_to(register_new_link) + "." - else - top_message += "However, it appears that your site is now listed. Please check the listing to make sure it is correct at " + link_to(@site_listing) + '.' + render :update do |page| # we don't update anything, this just licenses errors end end - page.replace_html("top_message", top_message) + else + error_registering_site end + rescue + error_registering_site end end @@ -281,19 +312,6 @@ def set_not_completed @not_completed = SystemSetting.not_completed end - def site_listing - # we empty @site_listing in case it already exists - @site_listing = String.new - require 'net/http' - require 'uri' - remote_url = URI.parse("http://kete.net.nz/site/kete_sites/has_link_to") - remote_url.path = "/" if remote_url.path.length < 1 - http = Net::HTTP.new(remote_url.host, 80) - @site_listing = http.request_post(remote_url.path, "url=#{SITE_URL}").body - end - - helper_method :site_listing - private def ssl_required? @@ -307,9 +325,3 @@ def ssl_allowed? end end - -class RegisterSiteResource < ActiveResource::Base - self.site = "http://kete.net.nz/site/" - self.element_name = "kete_site" - self.timeout = 60 -end diff --git a/app/views/configure/_link_to_site.html.erb b/app/views/configure/_link_to_site.html.erb index baf6e7b60..2d480e280 100644 --- a/app/views/configure/_link_to_site.html.erb +++ b/app/views/configure/_link_to_site.html.erb @@ -1,29 +1,38 @@

List your site on Kete.net.nz (optional)

+ <% if @site_listing.blank? -%> -
-

Would you like to send your site name, - site url and a short description of your site for to a public list of Kete installations?

- - <% form_remote_tag ( :url => { :action => 'send_information' }, - :before => "Element.hide('form_fields');Element.show('data-spinner')", - :complete => "Element.hide('data-spinner')", - :href => url_for( :action => 'send_information' ) ) do %> -
-
-
-
- + +
+
+

+ Would you like to send your site name, site url and a short description of your site for to a public list of Kete installations? +

-
<%= submit_tag 'Send Information', :id => 'data-button' -%>
+ + <% form_remote_tag ( :url => { :action => 'send_information' }, + :before => "Element.hide('form_fields'); Element.show('spinner')", + :href => url_for( :action => 'send_information' ) ) do -%> +
+
+
+
+ +
+
<%= submit_tag 'Send Information', :id => 'data-button' -%>
+
+ <% end -%> +
+ +
+ + - <% end -%> -
- + <% else -%> -
- Kete.net.nz already lists the site. You can see details at - <%= link_to(@site_listing, @site_listing) -%>. -
+ +
+ Kete.net.nz already lists the site. You can see details at <%= link_to(@site_listing, @site_listing) -%>. +
+ <% end -%> diff --git a/app/views/importers/create.html.erb b/app/views/importers/create.html.erb index a8f5d2f8e..4847c7428 100644 --- a/app/views/importers/create.html.erb +++ b/app/views/importers/create.html.erb @@ -25,8 +25,7 @@
...in progress.
-<% # stop action broken because of bug in backgroundrb? %> -<%= button_to 'Stop Import Early', :action => 'stop', :id => @import, :worker_type => @worker_type %> + <%= button_to 'Stop Import Early', :action => 'stop', :id => @import, :worker_type => @worker_type %>
<%= render(:partial => "topics/content_wrapper_end" ) %> diff --git a/lib/site_registration.rb b/lib/site_registration.rb new file mode 100644 index 000000000..aa0d63070 --- /dev/null +++ b/lib/site_registration.rb @@ -0,0 +1,46 @@ +module SiteRegistration + unless included_modules.include? SiteRegistration + def set_kete_net_urls + @kete_net = "http://localhost:3000/site" + @kete_sites = "#{@kete_net}/kete_sites" + @kete_sites_register = "#{@kete_sites}/new" + end + + def check_nessesary_constants_set + raise "Pretty Site Name and Site URL constants are not set, are you sure you restarted your server after you configured your Kete site?" if SITE_URL.blank? || PRETTY_SITE_NAME.blank? + end + + def site_listing + check_nessesary_constants_set + set_kete_net_urls + @site_listing = RegisterSiteResource.find(:all, :params => { :url => SITE_URL }) + if @site_listing.blank? + @site_listing = '' + else + @site_listing = @site_listing.first.attributes + @site_listing = "#{@kete_sites}/#{@site_listing['id']}" + end + end + + def error_registering_site + set_kete_net_urls + top_message = "There was an error linking to your site. " + site_listing + if @site_listing.blank? + top_message += "You can do it manually at #{@kete_sites_register}." + else + top_message += "However, it appears that your site is now listed. Please check the listing to make sure it is correct at #{@site_listing}." + end + render :update do |page| + page.hide('spinner') + page.replace_html("top_message", top_message) + end + end + end +end + +class RegisterSiteResource < ActiveResource::Base + self.site = "http://localhost:3000/site/" + self.element_name = "kete_site" + self.timeout = 60 +end diff --git a/lib/workers/site_registration_worker.rb b/lib/workers/site_registration_worker.rb new file mode 100644 index 000000000..f7df36861 --- /dev/null +++ b/lib/workers/site_registration_worker.rb @@ -0,0 +1,49 @@ +class SiteRegistrationWorker < BackgrounDRb::MetaWorker + set_worker_name :site_registration_worker + set_no_auto_load true + + include SiteRegistration + + def create(args = nil) + results = { :registration_success => false, + :registration_validation_errors => Array.new, + :registration_complete => false } + + cache[:results] = results + end + + def do_work(args = nil) + @results = cache[:results] + params = args[:params] + + check_nessesary_constants_set + + begin + register = RegisterSiteResource.create(:name => PRETTY_SITE_NAME, :url => SITE_URL, :description => params[:site_description]) + rescue + register = nil + @kete_net_error = $! + end + + if !register.nil? && register && register.errors.empty? && register.id > 0 + @results[:registration_success] = true + elsif !register.nil? && !register.errors.empty? + @results[:registration_validation_errors] = register.errors + else + logger.error("Error linking from Kete.net.nz: " + @kete_net_error) if @kete_net_error + end + + @results[:registration_complete] = true + + cache[:results] = @results + end + + def reset_worker + results = { :registration_success => false, + :registration_validation_errors => Array.new, + :registration_complete => false } + + cache[:results] = results + end + +end