@@ -142,6 +142,9 @@ public struct ServerDescription {
142142 /// The duration in milliseconds of the server's last "hello" call.
143143 public let roundTripTime : Int ?
144144
145+ /// The average duration in milliseconds of the server's "hello" calls.
146+ internal var averageRoundTripTimeMS : Double ?
147+
145148 /// The date of the most recent write operation seen by this server.
146149 public var lastWriteDate : Date ?
147150
@@ -194,6 +197,9 @@ public struct ServerDescription {
194197 self . address = ServerAddress ( mongoc_server_description_host ( description) )
195198 self . serverId = mongoc_server_description_id ( description)
196199 self . roundTripTime = Int ( mongoc_server_description_round_trip_time ( description) )
200+ // averageRoundTripTimeMS is an internally-calculated value used for server selection. Because we still rely
201+ // upon libmongoc for server selection, this value is not relevant.
202+ self . averageRoundTripTimeMS = nil
197203 self . lastUpdateTime = Date ( msSinceEpoch: mongoc_server_description_last_update_time ( description) )
198204 self . type = ServerType ( rawValue: String ( cString: mongoc_server_description_type ( description) ) ) ?? . unknown
199205
@@ -233,6 +239,7 @@ public struct ServerDescription {
233239 // these fields are not used by the server selection tests
234240 self . serverId = 0
235241 self . roundTripTime = 0
242+ self . averageRoundTripTimeMS = nil
236243 self . lastUpdateTime = Date ( )
237244 self . lastWriteDate = nil
238245 self . minWireVersion = 0
@@ -247,6 +254,31 @@ public struct ServerDescription {
247254 self . passives = [ ]
248255 self . arbiters = [ ]
249256 }
257+
258+ // Used for RTT calculation tests.
259+ internal init ( averageRoundTripTimeMS: Double ? ) {
260+ self . averageRoundTripTimeMS = averageRoundTripTimeMS
261+
262+ // these fields are not used by the RTT calculation tests
263+ self . address = ServerAddress ( host: " test " , port: 0 )
264+ self . type = . unknown
265+ self . tags = [ : ]
266+ self . serverId = 0
267+ self . roundTripTime = nil
268+ self . lastWriteDate = nil
269+ self . minWireVersion = 0
270+ self . maxWireVersion = 0
271+ self . me = nil
272+ self . hosts = [ ]
273+ self . arbiters = [ ]
274+ self . passives = [ ]
275+ self . setName = nil
276+ self . setVersion = nil
277+ self . electionID = nil
278+ self . primary = nil
279+ self . lastUpdateTime = Date ( )
280+ self . logicalSessionTimeoutMinutes = nil
281+ }
250282}
251283
252284extension ServerDescription : Equatable {
@@ -447,3 +479,14 @@ extension TopologyDescription {
447479 return [ ]
448480 }
449481}
482+
483+ extension ServerDescription {
484+ internal mutating func updateAverageRoundTripTime( roundTripTime: Double ) {
485+ if let oldAverageRTT = self . averageRoundTripTimeMS {
486+ let alpha = 0.2
487+ self . averageRoundTripTimeMS = alpha * roundTripTime + ( 1 - alpha) * oldAverageRTT
488+ } else {
489+ self . averageRoundTripTimeMS = roundTripTime
490+ }
491+ }
492+ }
0 commit comments