From 8b03371e106a52a20971cc8ab6535de93ece692e Mon Sep 17 00:00:00 2001 From: Matt Amos Date: Fri, 2 Dec 2016 09:31:45 +0000 Subject: [PATCH 1/1] Make API and web roll back any open transactions on timeout 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 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0c50276b6..a52c006fa 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -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 -- 2.43.2