Skip to content
This repository was archived by the owner on Feb 4, 2022. It is now read-only.

Commit 5763f5c

Browse files
daprahamianmbroadst
authored andcommitted
fix(secondaries): fixes connection with secondary readPreference
Ensures that when readPreference is `secondary`, the `connect` event is not triggered until connection has been established with a secondary. Backport of NODE-1089 to 2.0
1 parent fd543eb commit 5763f5c

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

lib/topologies/replset.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,26 @@ function applyAuthenticationContexts(self, server, callback) {
669669
applyAuth(authContexts, server, callback);
670670
}
671671

672+
function shouldTriggerConnect(self) {
673+
var secondaryReadPreferenceString = ReadPreference.secondary.preference || ReadPreference.secondary.mode;
674+
var currentReadPreferenceString = self.s.connectOptions.readPreference && (
675+
self.s.connectOptions.readPreference.preference ||
676+
self.s.connectOptions.readPreference.mode
677+
);
678+
679+
var isConnecting = self.state === CONNECTING;
680+
var hasPrimary = self.s.replicaSetState.hasPrimary();
681+
var hasSecondary = self.s.replicaSetState.hasSecondary();
682+
var secondaryOnlyConnectionAllowed = self.s.options.secondaryOnlyConnectionAllowed;
683+
var readPreferenceSecondary = secondaryReadPreferenceString === currentReadPreferenceString;
684+
685+
return (
686+
(isConnecting &&
687+
((readPreferenceSecondary && hasSecondary) || (!readPreferenceSecondary && hasPrimary))) ||
688+
(hasSecondary && secondaryOnlyConnectionAllowed)
689+
);
690+
}
691+
672692
function handleInitialConnectEvent(self, event) {
673693
return function() {
674694
var _this = this;
@@ -716,8 +736,7 @@ function handleInitialConnectEvent(self, event) {
716736
_this.on('parseError', handleEvent(self, 'parseError'));
717737

718738
// Do we have a primary or primaryAndSecondary
719-
if(self.state === CONNECTING && self.s.replicaSetState.hasPrimary()
720-
|| (self.s.replicaSetState.hasSecondary() && self.s.options.secondaryOnlyConnectionAllowed)) {
739+
if(shouldTriggerConnect(self)) {
721740
// We are connected
722741
self.state = CONNECTED;
723742

0 commit comments

Comments
 (0)