Make API and web roll back any open transactions on timeout
authorMatt Amos <zerebubuth@gmail.com>
Fri, 2 Dec 2016 09:31:45 +0000 (09:31 +0000)
committerTom Hughes <tom@compton.nu>
Fri, 2 Dec 2016 09:31:45 +0000 (09:31 +0000)
By default the exception thrown by Timeout::timeout is caught
using Kernel::catch so that it cannot be stopped by intermediate
exception handlers. The problem with that is that it stops any
database transactions that were in progress being rolled back
because they never see the exception.

Fortunately passing a class to Timeout::timeout changes it's
behaviour so that the exception is thrown and caught in the normal
way, allowing the database transactions to rollback.

app/controllers/application_controller.rb

index 0c50276b61ba040d7efb86843633f93e38a9dd31..a52c006faed8bde165c4d5df292e7be510c1de5c 100644 (file)
@@ -343,7 +343,7 @@ class ApplicationController < ActionController::Base
   ##
   # wrap an api call in a timeout
   def api_call_timeout
-    OSM::Timer.timeout(API_TIMEOUT) do
+    OSM::Timer.timeout(API_TIMEOUT, Timeout::Error) do
       yield
     end
   rescue Timeout::Error
@@ -353,7 +353,7 @@ class ApplicationController < ActionController::Base
   ##
   # wrap a web page in a timeout
   def web_timeout
-    OSM::Timer.timeout(WEB_TIMEOUT) do
+    OSM::Timer.timeout(WEB_TIMEOUT, Timeout::Error) do
       yield
     end
   rescue ActionView::Template::Error => ex