diff --git a/lib/mongo/server/description.rb b/lib/mongo/server/description.rb index a549588456..e615643c2b 100644 --- a/lib/mongo/server/description.rb +++ b/lib/mongo/server/description.rb @@ -189,10 +189,7 @@ class Description # call took to complete. # # @since 2.0.0 - def initialize(address, config = {}, average_round_trip_time = 0) - if average_round_trip_time.nil? - raise ArgumentError, 'Average round trip time cannot be nil' - end + def initialize(address, config = {}, average_round_trip_time = nil) @address = address @config = config unless unknown? diff --git a/lib/mongo/server/round_trip_time_averager.rb b/lib/mongo/server/round_trip_time_averager.rb index 057a7b1505..f6734b274a 100644 --- a/lib/mongo/server/round_trip_time_averager.rb +++ b/lib/mongo/server/round_trip_time_averager.rb @@ -36,9 +36,15 @@ def measure rv = yield rescue Exception => exc end - @last_round_trip_time = Time.now - start + last_round_trip_time = Time.now - start - update_average_round_trip_time + # If ismaster fails, we need to return the last round trip time + # because it is used in the heartbeat failed SDAM event, + # but we must not update the round trip time recorded in the server. + unless exc + @last_round_trip_time = last_round_trip_time + update_average_round_trip_time + end [rv, exc, last_round_trip_time, average_round_trip_time] end diff --git a/spec/mongo/server/description_spec.rb b/spec/mongo/server/description_spec.rb index e38e673535..a573d290fb 100644 --- a/spec/mongo/server/description_spec.rb +++ b/spec/mongo/server/description_spec.rb @@ -327,8 +327,8 @@ described_class.new(address, { 'secondary' => false }, 4.5) end - it 'defaults to 0' do - expect(described_class.new(address).average_round_trip_time).to eq(0) + it 'defaults to nil' do + expect(described_class.new(address).average_round_trip_time).to be nil end it 'can be set via the constructor' do diff --git a/spec/mongo/server/round_trip_time_averager_spec.rb b/spec/mongo/server/round_trip_time_averager_spec.rb index a87c2ad1e6..811cb434d8 100644 --- a/spec/mongo/server/round_trip_time_averager_spec.rb +++ b/spec/mongo/server/round_trip_time_averager_spec.rb @@ -21,4 +21,23 @@ end end end + + describe '#measure' do + context 'block does not raise' do + it 'updates average rtt' do + expect(averager).to receive(:update_average_round_trip_time) + averager.measure do + end + end + end + + context 'block raises' do + it 'does not update average rtt' do + expect(averager).not_to receive(:update_average_round_trip_time) + averager.measure do + raise "Problem" + end + end + end + end end