fix: increase the maxlisteners for timeout controllers (#1065)

We use timeout controllers to ensure we're not dialling peers forever but we can end up registering lots of listeners for the `abort` event when peers have a lot of addresses.

In node this means we see an unhelpful `MaxListenersExceededWarning` in the console warning of a potential memory leak.

Increase the max number of listeners on the signal to silence the warning.
This commit is contained in:
Alex Potsides 2021-12-18 07:34:27 +01:00 committed by GitHub
parent a642ad2a03
commit 09a0f940df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 2 deletions

View File

@ -9,7 +9,8 @@ const { Multiaddr } = require('multiaddr')
const { TimeoutController } = require('timeout-abort-controller') const { TimeoutController } = require('timeout-abort-controller')
const { AbortError } = require('abortable-iterator') const { AbortError } = require('abortable-iterator')
const { anySignal } = require('any-signal') const { anySignal } = require('any-signal')
// @ts-expect-error setMaxListeners is missing from the types
const { setMaxListeners } = require('events')
const DialRequest = require('./dial-request') const DialRequest = require('./dial-request')
const { publicAddressesFirst } = require('libp2p-utils/src/address-sort') const { publicAddressesFirst } = require('libp2p-utils/src/address-sort')
const getPeer = require('../get-peer') const getPeer = require('../get-peer')
@ -253,6 +254,10 @@ class Dialer {
// Combine the timeout signal and options.signal, if provided // Combine the timeout signal and options.signal, if provided
const timeoutController = new TimeoutController(this.timeout) const timeoutController = new TimeoutController(this.timeout)
// this controller will potentially be used while dialing lots of
// peers so prevent MaxListenersExceededWarning appearing in the console
setMaxListeners && setMaxListeners(Infinity, timeoutController.signal)
const signals = [timeoutController.signal] const signals = [timeoutController.signal]
options.signal && signals.push(options.signal) options.signal && signals.push(options.signal)
const signal = anySignal(signals) const signal = anySignal(signals)

View File

@ -24,6 +24,8 @@ const {
// @ts-ignore module with no types // @ts-ignore module with no types
} = require('set-delayed-interval') } = require('set-delayed-interval')
const { DHTPeerRouting } = require('./dht/dht-peer-routing') const { DHTPeerRouting } = require('./dht/dht-peer-routing')
// @ts-expect-error setMaxListeners is missing from the types
const { setMaxListeners } = require('events')
/** /**
* @typedef {import('peer-id')} PeerId * @typedef {import('peer-id')} PeerId
@ -149,7 +151,12 @@ class PeerRouting {
} }
if (options.timeout) { if (options.timeout) {
options.signal = new TimeoutController(options.timeout).signal const controller = new TimeoutController(options.timeout)
// this controller will potentially be used while dialing lots of
// peers so prevent MaxListenersExceededWarning appearing in the console
setMaxListeners && setMaxListeners(Infinity, controller.signal)
options.signal = controller.signal
} }
yield * pipe( yield * pipe(