Skip to content
This repository was archived by the owner on May 17, 2021. It is now read-only.

Commit 193f9ff

Browse files
authored
feat: add saving last seen topology description COMPASS-4568 (#291)
1 parent fd89905 commit 193f9ff

File tree

2 files changed

+53
-8
lines changed

2 files changed

+53
-8
lines changed

lib/data-service.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ class DataService extends EventEmitter {
1515
*/
1616
constructor(model) {
1717
super();
18+
19+
// Stores the most recent topology description from
20+
// the server's SDAM events:
21+
// https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring-monitoring.rst#events
22+
this.lastSeenTopology = null;
23+
1824
this.client = null;
1925
const NativeClient = require('./native-client');
2026
this.client = new NativeClient(model)
@@ -24,7 +30,10 @@ class DataService extends EventEmitter {
2430
.on('serverClosed', (evt) => this.emit('serverClosed', evt))
2531
.on('topologyOpening', (evt) => this.emit('topologyOpening', evt))
2632
.on('topologyClosed', (evt) => this.emit('topologyClosed', evt))
27-
.on('topologyDescriptionChanged', (evt) => this.emit('topologyDescriptionChanged', evt));
33+
.on('topologyDescriptionChanged', (evt) => {
34+
this.lastSeenTopology = evt.newDescription;
35+
this.emit('topologyDescriptionChanged', evt);
36+
});
2837
}
2938

3039
getConnectionOptions() {
@@ -470,6 +479,16 @@ class DataService extends EventEmitter {
470479
this.client.currentOp(includeAll, callback);
471480
}
472481

482+
/**
483+
* Returns the most recent topology description from the server's SDAM events.
484+
* https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring-monitoring.rst#events
485+
*
486+
* @returns {null | TopologyDescription} If the data service is connected to a mongos.
487+
*/
488+
getLastSeenTopology() {
489+
return this.lastSeenTopology;
490+
}
491+
473492
/**
474493
* Returns the result of serverStats.
475494
*

test/data-service.test.js

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
var helper = require('./helper');
1+
const helper = require('./helper');
22

3-
var assert = helper.assert;
4-
var expect = helper.expect;
5-
var eventStream = helper.eventStream;
6-
var ObjectId = require('bson').ObjectId;
3+
const assert = helper.assert;
4+
const expect = helper.expect;
5+
const eventStream = helper.eventStream;
6+
const ObjectId = require('bson').ObjectId;
77

8-
var DataService = require('../lib/data-service');
8+
const DataService = require('../lib/data-service');
99

1010
describe('DataService', function() {
1111
this.slow(10000);
1212
this.timeout(20000);
13-
var service = new DataService(helper.connection);
13+
const service = new DataService(helper.connection);
1414

1515
before(function(done) {
1616
service.connect(done);
@@ -756,6 +756,32 @@ describe('DataService', function() {
756756
});
757757
});
758758

759+
describe('#getLastSeenTopology', function() {
760+
it('returns the server\'s toplogy description', function() {
761+
const topology = service.getLastSeenTopology();
762+
763+
expect(topology.servers.has('127.0.0.1:27018')).to.equal(true);
764+
765+
expect(topology).to.deep.include({
766+
compatibilityError: null,
767+
compatible: true,
768+
heartbeatFrequencyMS: 10000,
769+
localThresholdMS: 15,
770+
logicalSessionTimeoutMinutes: 30,
771+
maxElectionId: null,
772+
maxSetVersion: null,
773+
stale: false,
774+
type: 'Single',
775+
setName: null
776+
});
777+
});
778+
779+
it('it returns null when a topology description event hasn\'t yet occured', function() {
780+
const testService = new DataService(helper.connection);
781+
expect(testService.getLastSeenTopology()).to.equal(null);
782+
});
783+
});
784+
759785
describe('#updateMany', function() {
760786
after(function(done) {
761787
helper.deleteTestDocuments(service.client, function() {

0 commit comments

Comments
 (0)