diff --git a/packages/beacon-node/src/network/gossip/gossipsub.ts b/packages/beacon-node/src/network/gossip/gossipsub.ts index 06740c7e7829..32a6f471da7d 100644 --- a/packages/beacon-node/src/network/gossip/gossipsub.ts +++ b/packages/beacon-node/src/network/gossip/gossipsub.ts @@ -405,15 +405,19 @@ export class Eth2Gossipsub extends GossipSub implements GossipBeaconNode { // Get seenTimestamp before adding the message to the queue or add async delays const seenTimestampSec = Date.now() / 1000; - // Emit message to network processor - this.events.emit(NetworkEvent.pendingGossipsubMessage, { - topic, - msg, - msgId, - propagationSource, - seenTimestampSec, - startProcessUnixSec: null, - }); + // Emit message to network processor, use setTimeout to yield to the macro queue + // This is mostly due to too many attestation messages, and a gossipsub RPC may + // contain multiple of them. This helps avoid the I/O lag issue. + setTimeout(() => { + this.events.emit(NetworkEvent.pendingGossipsubMessage, { + topic, + msg, + msgId, + propagationSource, + seenTimestampSec, + startProcessUnixSec: null, + }); + }, 0); } private onValidationResult(msgId: string, propagationSource: PeerId, acceptance: TopicValidatorResult): void { diff --git a/packages/beacon-node/src/network/processor/worker.ts b/packages/beacon-node/src/network/processor/worker.ts index 64edfbf37077..dc8fb82a6d34 100644 --- a/packages/beacon-node/src/network/processor/worker.ts +++ b/packages/beacon-node/src/network/processor/worker.ts @@ -47,6 +47,18 @@ export class NetworkWorker { ); } - this.events.emit(NetworkEvent.gossipMessageValidationResult, message.msgId, message.propagationSource, acceptance); + // Use setTimeout to yield to the macro queue + // This is mostly due to too many attestation messages, and a gossipsub RPC may + // contain multiple of them. This helps avoid the I/O lag issue. + setTimeout( + () => + this.events.emit( + NetworkEvent.gossipMessageValidationResult, + message.msgId, + message.propagationSource, + acceptance + ), + 0 + ); } }