From ab952b19496c9569059f2dbb2b1dacaf44e618a8 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Tue, 29 Jan 2019 10:05:30 -0800 Subject: Write update_last_write_timestamp after request We need to update using the timestamp from the end of the request, not the start. For example, if a request spends 5+ seconds writing, we still want to wait another 5 seconds for replication lag. Since we now run the update after we yield, we need to use ensure to make sure we update the timestamp even if there is an exception. --- .../lib/active_record/middleware/database_selector/resolver.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'activerecord/lib/active_record/middleware/database_selector/resolver.rb') diff --git a/activerecord/lib/active_record/middleware/database_selector/resolver.rb b/activerecord/lib/active_record/middleware/database_selector/resolver.rb index 1c056e2156..930ddf900e 100644 --- a/activerecord/lib/active_record/middleware/database_selector/resolver.rb +++ b/activerecord/lib/active_record/middleware/database_selector/resolver.rb @@ -64,8 +64,12 @@ module ActiveRecord def write_to_primary(&blk) ActiveRecord::Base.connected_to(role: :writing) do instrumenter.instrument("database_selector.active_record.wrote_to_primary") do - resolver.update_last_write_timestamp - yield + begin + ret = yield + ensure + resolver.update_last_write_timestamp + end + ret end end end -- cgit v1.2.3