TransactionError

Hi

Today I got an alert mail from my watcher script, telling me that there was no
Mongrel running, and that it started one (so the site was down for a few
seconds.)

This is the first time I got this error (AFAICS), but I'd like to resolve and
prevent it for the future.

From mongrel.log:

** Starting Mongrel listening at 0.0.0.0:foo
** Starting Rails with production environment...
** Rails loaded.
** Loading any Rails specific GemPlugins
** Signals ready. TERM => stop. USR2 => restart. INT => stop (no restart).
** Rails signals registered. HUP => reload (without restart). It might not work well.
** Mongrel available at 0.0.0.0:foo
** Writing PID file to
/home/foo/skatestuff_freebox/releases/20080319193713/tmp/pids/dispatch.foo.pid
/home/foo/skatestuff_freebox/releases/20080319193713/vendor/rails/activerecord/lib/active_record/transactions.rb:76:in `
transaction': Transaction aborted (ActiveRecord::Transactions::TransactionError)
        from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/configurator.rb:293:in `call'
        from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/configurator.rb:293:in `join'
        from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/configurator.rb:293:in `join'
        from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/configurator.rb:293:in `each'
        from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/configurator.rb:293:in `join'
        from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.0.1/bin/mongrel_rails:136:in `run'
        from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/command.rb:211:in `run'
        from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.0.1/bin/mongrel_rails:243
        from /usr/local/bin/mongrel_rails:16:in `load'
        from /usr/local/bin/mongrel_rails:16

"Transaction aborted" is in activerecord/lib/active_record/transactions.rb:

  module ClassMethods
    def transaction(&block)
      previous_handler = trap('TERM') { raise TransactionError, "Transaction aborted" }
      increment_open_transactions

      begin
        connection.transaction(Thread.current['start_db_transaction'], &block)
      ensure
        decrement_open_transactions
        trap('TERM', previous_handler)
      end
    end
  [...]

Above this, there's
"Both Base#save and Base#destroy come wrapped in a transaction [...]"
and
"Also have in mind that exceptions thrown within a transaction block will be
propagated [...], so you should be ready to catch those in your application
code."

The site is not public yet (there still is a site-wide password), so I can be
quite sure that there was no save or destroy called in my app code.

(By the way, in config/environments/production.rb I have

  config.log_level = :warn

but the error was not logged in log/production.log .

And in in config/environment.rb I have

  config.action_controller.session_store = :active_record_store
)

Could it be that the error occured when some session data was saved?

In actionpack/lib/action_controller/session/active_record_store.rb there is

  def update
    if @session
      ActiveRecord::Base.silence { @session.save }
    end
  end

The "silence" part would explain why there is no error message in
the production.log .

Not sure whether I'm on the right track ...

Anyways: How to prevent this error in the future?

Tobi

Hi

Any idea how to prevent this error?

Tobi

Hi

Any idea how to prevent this error?

Tobi

Hi

Today I got an alert mail from my watcher script, telling me that
there was no
Mongrel running, and that it started one (so the site was down for
a few
seconds.)

This is the first time I got this error (AFAICS), but I'd like to
resolve and
prevent it for the future.

Can you figure out from your logs what your server was doing when this
happened? Could anything else have sent a TERM signal to your mongel
(eg something that kills processes if they are using excessive memory?

Fred