Hi Emmett,

 I've think I've seen the problem you've described when using acts_as_ferret
+ ferret DRb server (though I'll assume you aren't actually using ferret --
as the inimitable Engine Yard guys pointed out this weekend during one of
their talks, ferret is a common cause of problems for their users.  I
haven't played with ferret in months btw, so this example might be outdated,
but this example illustrates a more general problem, I think).     in this
ferret case, the problem, I believe, is that when you have some model Foo
that uses acts_as_ferret and you call foo.save, the COMMIT on the save
transaction occurs *after* the ferret after_create/after_update hooks.  So
the COMMIT occurs *after* the call to the ferret DRb server.  Normally this
is ok, but if you are indexing large amounts of text (e.g.) or the DRb
server gets busy for whatever reason, we saw that the save transactions can
suddenly take a long time.


The example above illustrates a more general point, I think -- be careful
with what you're doing in your AR hooks.   Again, the problem is that when
you save your AR object, that save is wrapped in a transaction, and the
commit on that transaction occurs after the AR hooks like after_create.


To verify this, here's a simple example:

# script/generate model foo && rake db:migrate

class Foo < ActiveRecord::Base

  after_create  { sleep 10 }

end


# then from script/console

foo = Foo.create


# now watch your database -- the transaction begins, but the COMMIT doesn't
occur until after the 10 seconds of sleep.


So what plugins are you using?   And are you using any interesting AR hooks
that could potentially take a long time (like talking to a DRb server or
uploading files to s3 as an after_create, for example)?


Best,


Tikhon Bernstam

Co-founder, Scribd.com
_______________________________________________
Mongrel-users mailing list
Mongrel-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-users

Reply via email to