message: Discard txn cache entries that were loaded for removed mempool txn
  >>> backports bitcoin/bitcoin@677aa3d88c018a235d5b6d929e82f7b16e4f3e41
diff: @@ -797,6 +797,17 @@ bool CheckFinalTx(const CTransaction& tx, int flags)
  return IsFinalTx(tx, nBlockHeight, nBlockTime);
  }
  +void LimitMempoolSize(CTxMemPool& pool, size_t limit, unsigned long age) {
  + int expired = pool.Expire(GetTime() - age);
  + if (expired != 0)
  + LogPrint(BCLog::MEMPOOL, "Expired %i transactions from the memory pool\n", expired);
  +
  + std::vector<uint256> vNoSpendsRemaining;
  + pool.TrimToSize(limit, &vNoSpendsRemaining);
  + for (const uint256& removed: vNoSpendsRemaining)
  + pcoinsTip->Uncache(removed);
  +}
  +
  CAmount GetMinRelayFee(const CTransaction& tx, const CTxMemPool& pool, unsigned int nBytes, bool fAllowFree)
  {
  uint256 hash = tx.GetHash();
  @@ -1086,12 +1097,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState& state, const CTransa
  // trim mempool and check if tx was trimmed
  if (!fOverrideMempoolLimit) {
  - int expired = pool.Expire(GetTime() - GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60);
  - if (expired != 0)
  - LogPrint(BCLog::MEMPOOL, "Expired %i transactions from the memory pool\n", expired);
  -
  - pool.TrimToSize(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000);
  - if (!pool.exists(tx.GetHash()))
  + LimitMempoolSize(pool, GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000, GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60);
  + if (!pool.exists(hash))
  return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "mempool full");
  }
  @@ -2971,7 +2978,7 @@ static bool ActivateBestChainStep(CValidationState& state, CBlockIndex* pindexMo
  if (fBlocksDisconnected) {
  mempool.removeForReorg(pcoinsTip, chainActive.Tip()->nHeight + 1, STANDARD_LOCKTIME_VERIFY_FLAGS);
  - mempool.TrimToSize(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000);
  + LimitMempoolSize(mempool, GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000, GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60);
  }
  mempool.check(pcoinsTip);
  @@ -3109,7 +3116,7 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex* pindex)
  }
  }
  - mempool.TrimToSize(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000);
  + LimitMempoolSize(mempool, GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000, GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60);
  // The resulting new best tip may not be in setBlockIndexCandidates anymore, so
  // add it again.
  