diff --git a/src/net_processing.cpp b/src/net_processing.cpp --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -1994,11 +1994,15 @@ { LOCK(cs_main); + // Process as many TX items from the front of the getdata queue as + // possible, since they're common and it's efficient to batch process + // them. while (it != pfrom.vRecvGetData.end() && it->type == MSG_TX) { if (interruptMsgProc) { return; } - // Don't bother if send buffer is too full to respond anyway. + // The send buffer provides backpressure. If there's no space in + // the buffer, pause processing until the next call. if (pfrom.fPauseSend) { break; } @@ -2047,6 +2051,8 @@ } } // release cs_main + // Only process one BLOCK item per call, since they're uncommon and can be + // expensive to process. if (it != pfrom.vRecvGetData.end() && !pfrom.fPauseSend) { const CInv &inv = *it++; if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK ||