Skip to content

Commit d446be5

Browse files
committed
fix: used weighted RTT calculation for server selection
1 parent 33a56cf commit d446be5

File tree

2 files changed

+8
-3
lines changed

2 files changed

+8
-3
lines changed

lib/core/sdam/server.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ class Server extends EventEmitter {
142142
this.emit(
143143
'descriptionReceived',
144144
new ServerDescription(this.description.address, null, {
145-
roundTripTime: event.duration,
145+
roundTripTime: calculateRoundTripTime(this.description.roundTripTime, event.duration),
146146
error: event.failure
147147
})
148148
);
@@ -157,7 +157,7 @@ class Server extends EventEmitter {
157157
this.emit(
158158
'descriptionReceived',
159159
new ServerDescription(this.description.address, event.reply, {
160-
roundTripTime: event.duration
160+
roundTripTime: calculateRoundTripTime(this.description.roundTripTime, event.duration)
161161
})
162162
);
163163

@@ -450,6 +450,11 @@ Object.defineProperty(Server.prototype, 'clusterTime', {
450450
}
451451
});
452452

453+
function calculateRoundTripTime(oldRtt, duration) {
454+
const alpha = 0.2;
455+
return alpha * duration + (1 - alpha) * oldRtt;
456+
}
457+
453458
function basicReadValidations(server, options) {
454459
if (options.readPreference && !(options.readPreference instanceof ReadPreference)) {
455460
return new MongoError('readPreference must be an instance of ReadPreference');

lib/core/sdam/server_description.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class ServerDescription {
6969

7070
this.address = address;
7171
this.error = options.error || null;
72-
this.roundTripTime = options.roundTripTime || 0;
72+
this.roundTripTime = options.roundTripTime || -1;
7373
this.lastUpdateTime = Date.now();
7474
this.lastWriteDate = ismaster.lastWrite ? ismaster.lastWrite.lastWriteDate : null;
7575
this.opTime = ismaster.lastWrite ? ismaster.lastWrite.opTime : null;

0 commit comments

Comments
 (0)