Skip to content

Commit 415e90c

Browse files
committed
more logs
1 parent 5d017eb commit 415e90c

3 files changed

Lines changed: 30 additions & 14 deletions

File tree

lib/control-connection.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ const schemaChangeTypes = {
4444
const supportedProductTypeKey = 'PRODUCT_TYPE';
4545
const supportedDbaas = 'DATASTAX_APOLLO';
4646

47+
// Process-wide counter used to give each ControlConnection a stable id for log correlation
48+
let controlConnectionCounter = 0;
49+
4750
/**
4851
* Represents a connection used by the driver to receive events and to check the status of the cluster.
4952
* <p>It uses an existing connection from the hosts' connection pool to maintain the driver metadata up-to-date.</p>
@@ -92,7 +95,8 @@ class ControlConnection extends events.EventEmitter {
9295

9396
// Reference to the encoder of the last valid connection
9497
this._encoder = null;
95-
this._debouncer = new EventDebouncer(options.refreshSchemaDelay, this.log.bind(this));
98+
this._id = ++controlConnectionCounter;
99+
this._debouncer = new EventDebouncer(options.refreshSchemaDelay, this.log.bind(this), this._id);
96100
this._profileManager = profileManager;
97101
this._triedHosts = null;
98102
this._resolvedContactPoints = new Map();
@@ -579,6 +583,7 @@ class ControlConnection extends events.EventEmitter {
579583
this.connection.on('nodeTopologyChange', this._nodeTopologyChangeHandler.bind(this));
580584
this.connection.on('nodeStatusChange', this._nodeStatusChangeHandler.bind(this));
581585
this.connection.on('nodeSchemaChange', this._nodeSchemaChangeHandler.bind(this));
586+
console.log(`[cc ${this._id}] Listener count on ${this.connection.endpointFriendlyName}: ${this.connection.listenerCount('nodeSchemaChange')}`);
582587
const request = new requests.RegisterRequest(['TOPOLOGY_CHANGE', 'STATUS_CHANGE', 'SCHEMA_CHANGE']);
583588
await this.connection.send(request, null);
584589
}
@@ -633,7 +638,7 @@ class ControlConnection extends events.EventEmitter {
633638
* Handles a SCHEMA_CHANGE event
634639
*/
635640
_nodeSchemaChangeHandler(event) {
636-
this.log('info', 'Schema change', event);
641+
this.log('info', `[cc ${this._id}] Schema change`, event);
637642
if (!this.options.isMetadataSyncEnabled) {
638643
return;
639644
}
@@ -659,10 +664,10 @@ class ControlConnection extends events.EventEmitter {
659664
delete self.metadata.keyspaces[event.keyspace];
660665
};
661666

662-
return this._scheduleObjectRefresh(handler, event.keyspace, null, processNow);
667+
return this._scheduleObjectRefresh(handler, event.keyspace, null, processNow, event);
663668
}
664669

665-
return this._scheduleKeyspaceRefresh(event.keyspace, processNow);
670+
return this._scheduleKeyspaceRefresh(event.keyspace, processNow, event);
666671
}
667672

668673
const ksInfo = this.metadata.keyspaces[event.keyspace];
@@ -713,19 +718,20 @@ class ControlConnection extends events.EventEmitter {
713718
* @param {Boolean} processNow
714719
* @returns {Promise<void>}
715720
*/
716-
_scheduleObjectRefresh(handler, keyspace, cqlObject, processNow) {
717-
return this._debouncer.eventReceived({ handler, keyspace, cqlObject }, processNow);
721+
_scheduleObjectRefresh(handler, keyspace, cqlObject, processNow, event = null) {
722+
return this._debouncer.eventReceived({ handler, keyspace, cqlObject, event}, processNow);
718723
}
719724

720725
/**
721726
* @param {String} keyspace
722727
* @param {Boolean} processNow
723728
* @returns {Promise<void>}
724729
*/
725-
_scheduleKeyspaceRefresh(keyspace, processNow) {
730+
_scheduleKeyspaceRefresh(keyspace, processNow, event = null) {
726731
return this._debouncer.eventReceived({
727732
handler: () => this.metadata.refreshKeyspace(keyspace),
728-
keyspace
733+
keyspace,
734+
event
729735
}, processNow);
730736
}
731737

lib/metadata/event-debouncer.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@ class EventDebouncer {
3535
* @param {Number} delay
3636
* @param {Function} logger
3737
*/
38-
constructor(delay, logger) {
38+
constructor(delay, logger, id) {
3939
this._delay = delay;
4040
this._logger = logger;
4141
this._queue = null;
4242
this._timeout = null;
43+
// Identifier used to correlate debouncer log lines with the owning ControlConnection
44+
this._id = id;
4345
}
4446

4547
/**
@@ -92,7 +94,7 @@ class EventDebouncer {
9294
const q = self._queue;
9395
self._queue = null;
9496
self._timeout = null;
95-
processQueue(q);
97+
processQueue(q, self._id);
9698
}
9799
if (delay === 0) {
98100
// no delay, process immediately
@@ -129,7 +131,7 @@ class EventDebouncer {
129131
* @param {{callbacks: Array, keyspaces: Object, mainEvent: Object}} q
130132
* @private
131133
*/
132-
function processQueue (q) {
134+
function processQueue (q, id) {
133135
if (q.mainEvent) {
134136
// refresh all by invoking 1 handler and invoke all pending callbacks
135137
return promiseUtils.toCallback(q.mainEvent.handler(), (err) => {
@@ -141,14 +143,16 @@ function processQueue (q) {
141143

142144
utils.each(Object.keys(q.keyspaces), function eachKeyspace(name, next) {
143145
const keyspaceEvents = q.keyspaces[name];
146+
console.log(`[deb ${id}] Current queue: ${JSON.stringify(q)}`);
144147
if (keyspaceEvents.mainEvent) {
145148
// refresh a keyspace
146149
return promiseUtils.toCallback(keyspaceEvents.mainEvent.handler(), function mainEventCallback(err) {
150+
console.log(`[deb ${id}] Processed main event ${JSON.stringify(keyspaceEvents.mainEvent)}`);
147151
for (let i = 0; i < keyspaceEvents.events.length; i++) {
148152
// log if not main event so this event is getting dropped
149153
if (keyspaceEvents.events[i] !== keyspaceEvents.mainEvent) {
150154
// eslint-disable-next-line
151-
console.log(util.format('Event for %s.%s is being dropped because a full refresh of the keyspace is scheduled', name, JSON.stringify(keyspaceEvents.events[i])));
155+
console.log(util.format('[deb %s] Event for %s.%s is being dropped because a full refresh of the keyspace is scheduled', id, name, JSON.stringify(keyspaceEvents.events[i])));
152156
}
153157
keyspaceEvents.events[i].callback(err);
154158
}

test/integration/short/control-connection-tests.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ describe('ControlConnection', function () {
4343
options.refreshSchemaDelay = 100;
4444

4545
const cc = newInstance(options);
46-
const otherClient = new Client(helper.baseOptions);
46+
const otherClient = new Client(utils.extend({}, helper.baseOptions, {
47+
logEmitter: (event, level, className, message, furtherInfo) =>
48+
// eslint-disable-next-line
49+
console.log(`${new Date().toISOString()} [otherClient][${level}] ${className}: ${message}`, furtherInfo || '')
50+
}));
4751

4852
helper.afterThisTest(() => otherClient.shutdown());
4953
disposeAfter(cc);
@@ -160,7 +164,9 @@ describe('ControlConnection', function () {
160164
});
161165

162166
it('should not break when refreshing concurrently', async () => {
163-
const cc = newInstance();
167+
const cc = newInstance({logEmitter: (event, level, className, message, furtherInfo) =>
168+
// eslint-disable-next-line
169+
console.log(`${new Date().toISOString()} [${level}] ${className}: ${message}`, furtherInfo || '')});
164170
cc.options.policies.loadBalancing = new policies.loadBalancing.RoundRobinPolicy();
165171
disposeAfter(cc);
166172

0 commit comments

Comments
 (0)