Skip to content

Commit 55203ef

Browse files
fix(NODE-5818): Add feature flagging to server selection logging (#3974)
Co-authored-by: Durran Jordan <[email protected]>
1 parent ecfc615 commit 55203ef

File tree

2 files changed

+157
-64
lines changed

2 files changed

+157
-64
lines changed

Diff for: src/sdam/topology.ts

+116-63
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import {
3131
MongoTopologyClosedError
3232
} from '../error';
3333
import type { MongoClient, ServerApi } from '../mongo_client';
34-
import { MongoLoggableComponent, type MongoLogger } from '../mongo_logger';
34+
import { MongoLoggableComponent, type MongoLogger, SeverityLevel } from '../mongo_logger';
3535
import { TypedEventEmitter } from '../mongo_types';
3636
import { ReadPreference, type ReadPreferenceLike } from '../read_preference';
3737
import type { ClientSession } from '../sessions';
@@ -568,25 +568,36 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
568568
}
569569

570570
options = { serverSelectionTimeoutMS: this.s.serverSelectionTimeoutMS, ...options };
571-
this.client.mongoLogger?.debug(
572-
MongoLoggableComponent.SERVER_SELECTION,
573-
new ServerSelectionStartedEvent(selector, this.description, options.operationName)
574-
);
571+
if (
572+
this.client.mongoLogger?.willLog(MongoLoggableComponent.SERVER_SELECTION, SeverityLevel.DEBUG)
573+
) {
574+
this.client.mongoLogger?.debug(
575+
MongoLoggableComponent.SERVER_SELECTION,
576+
new ServerSelectionStartedEvent(selector, this.description, options.operationName)
577+
);
578+
}
575579

576580
const isSharded = this.description.type === TopologyType.Sharded;
577581
const session = options.session;
578582
const transaction = session && session.transaction;
579583

580584
if (isSharded && transaction && transaction.server) {
581-
this.client.mongoLogger?.debug(
582-
MongoLoggableComponent.SERVER_SELECTION,
583-
new ServerSelectionSucceededEvent(
584-
selector,
585-
this.description,
586-
transaction.server.pool.address,
587-
options.operationName
585+
if (
586+
this.client.mongoLogger?.willLog(
587+
MongoLoggableComponent.SERVER_SELECTION,
588+
SeverityLevel.DEBUG
588589
)
589-
);
590+
) {
591+
this.client.mongoLogger?.debug(
592+
MongoLoggableComponent.SERVER_SELECTION,
593+
new ServerSelectionSucceededEvent(
594+
selector,
595+
this.description,
596+
transaction.server.pool.address,
597+
options.operationName
598+
)
599+
);
600+
}
590601
callback(undefined, transaction.server);
591602
return;
592603
}
@@ -611,15 +622,22 @@ export class Topology extends TypedEventEmitter<TopologyEvents> {
611622
`Server selection timed out after ${options.serverSelectionTimeoutMS} ms`,
612623
this.description
613624
);
614-
this.client.mongoLogger?.debug(
615-
MongoLoggableComponent.SERVER_SELECTION,
616-
new ServerSelectionFailedEvent(
617-
selector,
618-
this.description,
619-
timeoutError,
620-
options.operationName
625+
if (
626+
this.client.mongoLogger?.willLog(
627+
MongoLoggableComponent.SERVER_SELECTION,
628+
SeverityLevel.DEBUG
621629
)
622-
);
630+
) {
631+
this.client.mongoLogger?.debug(
632+
MongoLoggableComponent.SERVER_SELECTION,
633+
new ServerSelectionFailedEvent(
634+
selector,
635+
this.description,
636+
timeoutError,
637+
options.operationName
638+
)
639+
);
640+
}
623641
waitQueueMember.callback(timeoutError);
624642
});
625643

@@ -896,15 +914,22 @@ function drainWaitQueue(queue: List<ServerSelectionRequest>, err?: MongoDriverEr
896914

897915
if (!waitQueueMember[kCancelled]) {
898916
if (err) {
899-
waitQueueMember.mongoLogger?.debug(
900-
MongoLoggableComponent.SERVER_SELECTION,
901-
new ServerSelectionFailedEvent(
902-
waitQueueMember.serverSelector,
903-
waitQueueMember.topologyDescription,
904-
err,
905-
waitQueueMember.operationName
917+
if (
918+
waitQueueMember.mongoLogger?.willLog(
919+
MongoLoggableComponent.SERVER_SELECTION,
920+
SeverityLevel.DEBUG
906921
)
907-
);
922+
) {
923+
waitQueueMember.mongoLogger?.debug(
924+
MongoLoggableComponent.SERVER_SELECTION,
925+
new ServerSelectionFailedEvent(
926+
waitQueueMember.serverSelector,
927+
waitQueueMember.topologyDescription,
928+
err,
929+
waitQueueMember.operationName
930+
)
931+
);
932+
}
908933
}
909934
waitQueueMember.callback(err);
910935
}
@@ -943,33 +968,47 @@ function processWaitQueue(topology: Topology) {
943968
: serverDescriptions;
944969
} catch (e) {
945970
waitQueueMember.timeoutController.clear();
946-
topology.client.mongoLogger?.debug(
947-
MongoLoggableComponent.SERVER_SELECTION,
948-
new ServerSelectionFailedEvent(
949-
waitQueueMember.serverSelector,
950-
topology.description,
951-
e,
952-
waitQueueMember.operationName
971+
if (
972+
topology.client.mongoLogger?.willLog(
973+
MongoLoggableComponent.SERVER_SELECTION,
974+
SeverityLevel.DEBUG
953975
)
954-
);
976+
) {
977+
topology.client.mongoLogger?.debug(
978+
MongoLoggableComponent.SERVER_SELECTION,
979+
new ServerSelectionFailedEvent(
980+
waitQueueMember.serverSelector,
981+
topology.description,
982+
e,
983+
waitQueueMember.operationName
984+
)
985+
);
986+
}
955987
waitQueueMember.callback(e);
956988
continue;
957989
}
958990

959991
let selectedServer: Server | undefined;
960992
if (selectedDescriptions.length === 0) {
961993
if (!waitQueueMember.waitingLogged) {
962-
topology.client.mongoLogger?.info(
963-
MongoLoggableComponent.SERVER_SELECTION,
964-
new WaitingForSuitableServerEvent(
965-
waitQueueMember.serverSelector,
966-
topology.description,
967-
topology.s.serverSelectionTimeoutMS !== 0
968-
? topology.s.serverSelectionTimeoutMS - (now() - waitQueueMember.startTime)
969-
: -1,
970-
waitQueueMember.operationName
994+
if (
995+
topology.client.mongoLogger?.willLog(
996+
MongoLoggableComponent.SERVER_SELECTION,
997+
SeverityLevel.INFORMATIONAL
971998
)
972-
);
999+
) {
1000+
topology.client.mongoLogger?.info(
1001+
MongoLoggableComponent.SERVER_SELECTION,
1002+
new WaitingForSuitableServerEvent(
1003+
waitQueueMember.serverSelector,
1004+
topology.description,
1005+
topology.s.serverSelectionTimeoutMS !== 0
1006+
? topology.s.serverSelectionTimeoutMS - (now() - waitQueueMember.startTime)
1007+
: -1,
1008+
waitQueueMember.operationName
1009+
)
1010+
);
1011+
}
9731012
waitQueueMember.waitingLogged = true;
9741013
}
9751014
topology[kWaitQueue].push(waitQueueMember);
@@ -992,15 +1031,22 @@ function processWaitQueue(topology: Topology) {
9921031
'server selection returned a server description but the server was not found in the topology',
9931032
topology.description
9941033
);
995-
topology.client.mongoLogger?.debug(
996-
MongoLoggableComponent.SERVER_SELECTION,
997-
new ServerSelectionFailedEvent(
998-
waitQueueMember.serverSelector,
999-
topology.description,
1000-
error,
1001-
waitQueueMember.operationName
1034+
if (
1035+
topology.client.mongoLogger?.willLog(
1036+
MongoLoggableComponent.SERVER_SELECTION,
1037+
SeverityLevel.DEBUG
10021038
)
1003-
);
1039+
) {
1040+
topology.client.mongoLogger?.debug(
1041+
MongoLoggableComponent.SERVER_SELECTION,
1042+
new ServerSelectionFailedEvent(
1043+
waitQueueMember.serverSelector,
1044+
topology.description,
1045+
error,
1046+
waitQueueMember.operationName
1047+
)
1048+
);
1049+
}
10041050
waitQueueMember.callback(error);
10051051
return;
10061052
}
@@ -1011,15 +1057,22 @@ function processWaitQueue(topology: Topology) {
10111057

10121058
waitQueueMember.timeoutController.clear();
10131059

1014-
topology.client.mongoLogger?.debug(
1015-
MongoLoggableComponent.SERVER_SELECTION,
1016-
new ServerSelectionSucceededEvent(
1017-
waitQueueMember.serverSelector,
1018-
waitQueueMember.topologyDescription,
1019-
selectedServer.pool.address,
1020-
waitQueueMember.operationName
1060+
if (
1061+
topology.client.mongoLogger?.willLog(
1062+
MongoLoggableComponent.SERVER_SELECTION,
1063+
SeverityLevel.DEBUG
10211064
)
1022-
);
1065+
) {
1066+
topology.client.mongoLogger?.debug(
1067+
MongoLoggableComponent.SERVER_SELECTION,
1068+
new ServerSelectionSucceededEvent(
1069+
waitQueueMember.serverSelector,
1070+
waitQueueMember.topologyDescription,
1071+
selectedServer.pool.address,
1072+
waitQueueMember.operationName
1073+
)
1074+
);
1075+
}
10231076
waitQueueMember.callback(undefined, selectedServer);
10241077
}
10251078

Diff for: test/unit/sdam/server_selection.test.ts

+41-1
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@ import * as sinon from 'sinon';
33

44
import {
55
MIN_SECONDARY_WRITE_WIRE_VERSION,
6+
MongoLogger,
67
ObjectId,
78
ReadPreference,
89
readPreferenceServerSelector,
910
sameServerSelector,
1011
secondaryWritableServerSelector,
1112
ServerDescription,
13+
ServerSelectionEvent,
1214
TopologyDescription,
1315
TopologyType
1416
} from '../../mongodb';
17+
import * as mock from '../../tools/mongodb-mock/index';
18+
import { topologyWithPlaceholderClient } from '../../tools/utils';
1519

16-
describe('server selection', function () {
20+
describe('server selection', async function () {
1721
const primary = new ServerDescription('127.0.0.1:27017', {
1822
setName: 'test',
1923
isWritablePrimary: true,
@@ -605,4 +609,40 @@ describe('server selection', function () {
605609
});
606610
});
607611
});
612+
613+
describe('server selection logging feature flagging', async function () {
614+
const topologyDescription = sinon.stub();
615+
616+
let mockServer;
617+
let topology;
618+
619+
beforeEach(async () => {
620+
mockServer = await mock.createServer();
621+
topology = topologyWithPlaceholderClient(mockServer.hostAddress(), {});
622+
});
623+
624+
afterEach(async () => {
625+
await mock.cleanup();
626+
});
627+
628+
context('when willLog returns false', function () {
629+
const original = Object.getPrototypeOf(ServerSelectionEvent);
630+
let serverSelectionEventStub;
631+
beforeEach(async () => {
632+
sinon.stub(MongoLogger.prototype, 'willLog').callsFake((_v, _w) => false);
633+
serverSelectionEventStub = sinon.stub();
634+
Object.setPrototypeOf(ServerSelectionEvent, serverSelectionEventStub);
635+
});
636+
637+
afterEach(async () => {
638+
sinon.restore();
639+
Object.setPrototypeOf(ServerSelectionEvent, original);
640+
});
641+
642+
it('should not create server selection event instances', function () {
643+
topology?.selectServer(topologyDescription, { operationName: 'test' }, v => v);
644+
expect(serverSelectionEventStub.getCall(0)).to.be.null;
645+
});
646+
});
647+
});
608648
});

0 commit comments

Comments
 (0)