Skip to content

Commit 0751030

Browse files
Feature flagging done
Sinon stub issue with testing, almost ready for review added test, ready for review Removed extranous changes from other PR lint fix made all mongoLogger accesses in topology.ts be conditional
1 parent a63fbc2 commit 0751030

File tree

3 files changed

+158
-65
lines changed

3 files changed

+158
-65
lines changed

src/mongo_logger.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ export function createStdioLogger(stream: {
222222
write: promisify((log: Log, cb: (error?: Error) => void): unknown => {
223223
stream.write(inspect(log, { compact: true, breakLength: Infinity }), 'utf-8', cb);
224224
return;
225-
})
225+
}
226226
};
227227
}
228228

src/sdam/topology.ts

Lines changed: 116 additions & 63 deletions
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(SeverityLevel.DEBUG, MongoLoggableComponent.SERVER_SELECTION)
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+
SeverityLevel.DEBUG,
588+
MongoLoggableComponent.SERVER_SELECTION
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+
SeverityLevel.DEBUG,
628+
MongoLoggableComponent.SERVER_SELECTION
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+
SeverityLevel.DEBUG,
920+
MongoLoggableComponent.SERVER_SELECTION
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+
SeverityLevel.DEBUG,
974+
MongoLoggableComponent.SERVER_SELECTION
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+
SeverityLevel.INFORMATIONAL,
997+
MongoLoggableComponent.SERVER_SELECTION
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+
SeverityLevel.DEBUG,
1037+
MongoLoggableComponent.SERVER_SELECTION
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+
SeverityLevel.DEBUG,
1063+
MongoLoggableComponent.SERVER_SELECTION
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

test/unit/sdam/server_selection.test.ts

Lines changed: 41 additions & 1 deletion
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)