
[debug.log.txt](https://github.com/bitcoin/bitcoin/files/592002/debug.log.txt)

My node is being swamped with cmpctblocks from nodes, when as far as I understood it, only 3 nodes at a time were supposed to be announcing via cmpctblocks. Not only this, but many of the cmpctblocks arrive quite a while after I have received the block from other nodes, so surely my node should be requesting the announcement via cmpctblocks stops, or disconnecting the nodes that continue to announce via cmpctblocks after they've been requested not to.

As a bolt-on question: why is the contents of every cmpctblock received different?
std::vector<CBlock> headers;
                headers.push_back(cmpctblock.header);
                CDataStream vHeadersMsg(SER_NETWORK, PROTOCOL_VERSION);
                vHeadersMsg << headers;
                return ProcessMessage(pfrom, NetMsgType::HEADERS, vHeadersMsg, nTimeReceived, chainparams, connman);
            }
        }
    }
    else if (strCommand == NetMsgType::BLOCKTXN && !fImporting && !fReindex) 
    {
        BlockTransactions resp;
        vRecv >> resp;
        CBlock block;
        bool fBlockRead = false;
        {
            LOCK(cs_main);
            map<uint256, pair<NodeId, list<QueuedBlock>::iterator> >::iterator it = mapBlocksInFlight.find(resp.blockhash);
            if (it == mapBlocksInFlight.end() || !it->second.second->partialBlock ||
                    it->second.first != pfrom->GetId()) {
                LogPrint("net", "Peer %d sent us block transactions for block we weren't expecting\n", pfrom->id);
                return true;
            }
            PartiallyDownloadedBlock& partialBlock = *it->second.second->partialBlock;
            ReadStatus status = partialBlock.FillBlock(block, resp.txn);
            if (status == READ_STATUS_INVALID) {
                MarkBlockAsReceived(resp.blockhash); 
                Misbehaving(pfrom->GetId(), 100);
                LogPrintf("Peer %d sent us invalid compact block/non-matching block transactions\n", pfrom->id);
                return true;
            } else if (status == READ_STATUS_FAILED) {