aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--spec/controllers/admin_incoming_message_controller_spec.rb11
-rw-r--r--spec/models/xapian_spec.rb23
-rw-r--r--spec/spec_helper.rb19
-rw-r--r--vendor/plugins/acts_as_xapian/lib/acts_as_xapian.rb2
4 files changed, 35 insertions, 20 deletions
diff --git a/spec/controllers/admin_incoming_message_controller_spec.rb b/spec/controllers/admin_incoming_message_controller_spec.rb
index b969a8a3f..21c744e5b 100644
--- a/spec/controllers/admin_incoming_message_controller_spec.rb
+++ b/spec/controllers/admin_incoming_message_controller_spec.rb
@@ -50,6 +50,17 @@ describe AdminIncomingMessageController, "when administering incoming messages"
:url_title => destination_info_request.url_title
end
+ it 'should succeed, even if a duplicate xapian indexing job is created' do
+
+ with_duplicate_xapian_job_creation do
+ current_info_request = info_requests(:fancy_dog_request)
+ destination_info_request = info_requests(:naughty_chicken_request)
+ incoming_message = incoming_messages(:useless_incoming_message)
+ post :redeliver, :redeliver_incoming_message_id => incoming_message.id,
+ :url_title => destination_info_request.url_title
+ end
+
+ end
end
diff --git a/spec/models/xapian_spec.rb b/spec/models/xapian_spec.rb
index c7c21e3a0..3c9fff784 100644
--- a/spec/models/xapian_spec.rb
+++ b/spec/models/xapian_spec.rb
@@ -406,28 +406,13 @@ describe InfoRequestEvent, " when faced with a race condition during xapian_mark
before(:each) do
load_raw_emails_data
get_fixtures_xapian_index
- # Use the before create job hook to simulate a race condition with another process
- # by creating an acts_as_xapian_job record for the same model
- class InfoRequestEvent
- def xapian_before_create_job_hook(action, model, model_id)
- ActsAsXapian::ActsAsXapianJob.create!(:model => model,
- :model_id => model_id,
- :action => action)
- end
- end
- end
-
- after(:each) do
- # Reset the before create job hook
- class InfoRequestEvent
- def xapian_before_create_job_hook(action, model, model_id)
- end
- end
end
it 'should not raise an error but should fail silently' do
- ir = info_requests(:naughty_chicken_request)
- ir.reindex_request_events
+ with_duplicate_xapian_job_creation do
+ ir = info_requests(:naughty_chicken_request)
+ ir.reindex_request_events
+ end
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 0d8f8fac5..6e65018f1 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -125,6 +125,25 @@ Spork.prefork do
rebuild_xapian_index
end
+ # Use the before create job hook to simulate a race condition with
+ # another process by creating an acts_as_xapian_job record for the
+ # same model:
+ def with_duplicate_xapian_job_creation
+ InfoRequestEvent.module_eval do
+ def xapian_before_create_job_hook(action, model, model_id)
+ ActsAsXapian::ActsAsXapianJob.create!(:model => model,
+ :model_id => model_id,
+ :action => action)
+ end
+ end
+ yield
+ ensure
+ InfoRequestEvent.module_eval do
+ def xapian_before_create_job_hook(action, model, model_id)
+ end
+ end
+ end
+
def with_env_tz(new_tz = 'US/Eastern')
old_tz, ENV['TZ'] = ENV['TZ'], new_tz
yield
diff --git a/vendor/plugins/acts_as_xapian/lib/acts_as_xapian.rb b/vendor/plugins/acts_as_xapian/lib/acts_as_xapian.rb
index fcf7a778d..2e486f328 100644
--- a/vendor/plugins/acts_as_xapian/lib/acts_as_xapian.rb
+++ b/vendor/plugins/acts_as_xapian/lib/acts_as_xapian.rb
@@ -928,7 +928,7 @@ module ActsAsXapian
def xapian_create_job(action, model, model_id)
begin
- ActiveRecord::Base.transaction do
+ ActiveRecord::Base.transaction(:requires_new => true) do
ActsAsXapianJob.delete_all([ "model = ? and model_id = ?", model, model_id])
xapian_before_create_job_hook(action, model, model_id)
ActsAsXapianJob.create!(:model => model,