message: Remove NOTFOUND transactions from in-flight data structures
  This prevents a bug where the in-flight queue for our peers will not be
  drained, resulting in not downloading any new transactions from our peers.
  Thanks to ajtowns for reporting this bug.
diff: @@ -3120,8 +3120,27 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
  }
  if (strCommand == NetMsgType::NOTFOUND) {
  - // We do not care about the NOTFOUND message, but logging an Unknown Command
  - // message would be undesirable as we transmit it ourselves.
  + // Remove the NOTFOUND transactions from the peer
  + LOCK(cs_main);
  + CNodeState *state = State(pfrom->GetId());
  + std::vector<CInv> vInv;
  + vRecv >> vInv;
  + if (vInv.size() <= MAX_PEER_TX_IN_FLIGHT + MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
  + for (CInv &inv : vInv) {
  + if (inv.type == MSG_TX || inv.type == MSG_WITNESS_TX) {
  + // If we receive a NOTFOUND message for a txid we requested, erase
  + // it from our data structures for this peer.
  + auto in_flight_it = state->m_tx_download.m_tx_in_flight.find(inv.hash);
  + if (in_flight_it == state->m_tx_download.m_tx_in_flight.end()) {
  + // Skip any further work if this is a spurious NOTFOUND
  + // message.
  + continue;
  + }
  + state->m_tx_download.m_tx_in_flight.erase(in_flight_it);
  + state->m_tx_download.m_tx_announced.erase(inv.hash);
  + }
  + }
  + }
  return true;
  }
  