aboutsummaryrefslogtreecommitdiffstats
path: root/vendor
diff options
context:
space:
mode:
Diffstat (limited to 'vendor')
-rw-r--r--vendor/plugins/acts_as_xapian/lib/acts_as_xapian.rb42
-rw-r--r--vendor/plugins/acts_as_xapian/lib/tasks/xapian.rake1
2 files changed, 35 insertions, 8 deletions
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 70605ad04..98ec93a14 100644
--- a/vendor/plugins/acts_as_xapian/lib/acts_as_xapian.rb
+++ b/vendor/plugins/acts_as_xapian/lib/acts_as_xapian.rb
@@ -30,14 +30,19 @@ module ActsAsXapian
class NoXapianRubyBindingsError < StandardError
end
- # XXX global class intializers here get loaded more than once, don't know why. Protect them.
- if not $acts_as_xapian_class_var_init
- @@db = nil
- @@db_path = nil
- @@writable_db = nil
- @@init_values = []
+ @@db = nil
+ @@db_path = nil
+ @@writable_db = nil
+ @@init_values = []
+
+ # There used to be a problem with this module being loaded more than once.
+ # Keep a check here, so we can tell if the problem recurs.
+ if $acts_as_xapian_class_var_init
+ raise "The acts_as_xapian module has already been loaded"
+ else
$acts_as_xapian_class_var_init = true
end
+
def ActsAsXapian.db
@@db
end
@@ -248,6 +253,8 @@ module ActsAsXapian
end
end
+ MSET_MAX_TRIES = 5
+ MSET_MAX_DELAY = 5
# Set self.query before calling this
def initialize_query(options)
#raise options.to_yaml
@@ -278,7 +285,28 @@ module ActsAsXapian
ActsAsXapian.enquire.collapse_key = value
end
- self.matches = ActsAsXapian.enquire.mset(offset, limit, 100)
+ tries = 0
+ delay = 1
+ begin
+ self.matches = ActsAsXapian.enquire.mset(offset, limit, 100)
+ rescue IOError => e
+ if e.message =~ /DatabaseModifiedError: /
+ # This should be a transient error, so back off and try again, up to a point
+ if tries > MSET_MAX_TRIES
+ raise "Received DatabaseModifiedError from Xapian even after retrying #{MAX_TRIES} times"
+ else
+ sleep delay
+ end
+ tries += 1
+ delay *= 2
+ delay = MSET_MAX_DELAY if delay > MSET_MAX_DELAY
+
+ @@db.reopen()
+ retry
+ else
+ raise
+ end
+ end
self.cached_results = nil
}
end
diff --git a/vendor/plugins/acts_as_xapian/lib/tasks/xapian.rake b/vendor/plugins/acts_as_xapian/lib/tasks/xapian.rake
index 470016420..c1986ce1e 100644
--- a/vendor/plugins/acts_as_xapian/lib/tasks/xapian.rake
+++ b/vendor/plugins/acts_as_xapian/lib/tasks/xapian.rake
@@ -2,7 +2,6 @@ require 'rubygems'
require 'rake'
require 'rake/testtask'
require 'active_record'
-require File.dirname(__FILE__) + '/../acts_as_xapian.rb'
namespace :xapian do
# Parameters - specify "flush=true" to save changes to the Xapian database