Corrupted index preventing save

Hi, I’m using Rails/AAF with Ferret 0.10.11, and my index occasionally
(every few weeks, roughly) becomes corrupted.

If the index is busted, until I rebuild it our users are unable to save
anything. I get errors like the one below, and the save rolls back.

My question is, is there any way to catch the error, and continue with
the save even if the model isn’t indexed? What would be ideal is if i
could have a catch the error, and have it send me a notification, which
would solve two problems: the save would still happen so our users
wouldn’t be impacted, and I would know exactly when the index had become
corrupted, and could rebuild it.

TIA for any help,
John

here’s the error i’m getting:

Processing UserController#signup (for 72.227.101.170 at 2006-10-31
11:23:06) [POST]
Session ID: 7f854fa9eaf95becbb9723a9bd48f9c2
Parameters: {“user”=>{“subscribe_to_newsletter”=>“0”,
“password_confirmation”=>"[FILTERED]", “terms”=>“1”,
“password”=>"[FILTERED]", “login”=>“jmcgrath”,
“email”=>“[email protected]”}, “commit”=>“Sign Up”, “action”=>“signup”,
“controller”=>“user”}
Unable to send confirmation E-Mail:
Lock Error occured at <except.c>:103 in xpop_context
Error occured in index.c:5371 - iw_open
Couldn’t obtain write lock when opening IndexWriter

On 31.10.2006, at 18:02, John Mcgrath wrote:

Hi, I’m using Rails/AAF with Ferret 0.10.11, and my index occasionally
(every few weeks, roughly) becomes corrupted.

If the index is busted, until I rebuild it our users are unable to
save
anything. I get errors like the one below, and the save rolls back.

The acts_as_ferret plugin employs ActiveRecord callbacks such as
after_update to index the models. If an exception is thrown inside a
callback method, the action is rolled back.

My question is, is there any way to catch the error, and continue with
the save even if the model isn’t indexed?

Several ways. You could overwrite the save mehtod (either on a per-
model-basis or for ActiveRecord::Base) to read:

def save
begin
create_or_update
rescue => any_exception
# deal with exceptions you can handle or re-raise
end
end

Or, even better, you could patch the acts_as_ferret code to resort to
a callback such as “rescue_error_in_ferret”. See the ‘ferret_create’
method of ‘acts_as_ferret/lib/instance_methods.rb’. You’d basically
wrap the method in a begin/rescue block and see if the model
respond_to? :rescue_error_in_ferret. If it does, call that method or
else re-raise the exception.

Cheers,
Andy

On Tue, Oct 31, 2006 at 07:47:30PM +0100, Andreas K. wrote:

The acts_as_ferret plugin employs ActiveRecord callbacks such as
begin
respond_to? :rescue_error_in_ferret. If it does, call that method or
else re-raise the exception.

overwriting the callback handlers in your model would be another
possibility:

class MyModel < AR::Base

acts_as_ferret …

ferret_create is declared by aaf, and used for before_update and

before_create events.

alias :old_ferret_create :ferret_create
def ferret_create
old_ferret_create
rescue
# handle the error…
true # tell AR everything is fine
end

end

Jens


webit! Gesellschaft für neue Medien mbH www.webit.de
Dipl.-Wirtschaftsingenieur Jens Krämer [email protected]
Schnorrstraße 76 Tel +49 351 46766 0
D-01069 Dresden Fax +49 351 46766 66