diff options
author | Gavin Andresen <gavinandresen@gmail.com> | 2011-03-13 14:38:07 -0400 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2011-03-13 14:38:07 -0400 |
commit | 88abf70386f18020bb624bca4a4cb7900ce47d0c (patch) | |
tree | 34bcd67c93c94797a23e223dd66cf34af7d138de /main.cpp | |
parent | 5de8b54c5138e47b6df40d31f282fb45243b29bf (diff) |
Make sure rate-limiting code is thread-safe
Diffstat (limited to 'main.cpp')
-rw-r--r-- | main.cpp | 27 |
1 files changed, 17 insertions, 10 deletions
@@ -739,21 +739,28 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi return error("AcceptToMemoryPool() : not enough fees"); // Continuously rate-limit free transactions + // This mitigates 'penny-flooding' -- sending thousands of free transactions just to + // be annoying or make other's transactions take longer to confirm. if (nFees < CENT) { + static CCriticalSection cs; static double dFreeCount; static int64 nLastTime; int64 nNow = GetTime(); - // Use an exponentially decaying ~10-minute window: - dFreeCount *= pow(1.0 - 1.0/600.0, (double)(nNow - nLastTime)); - nLastTime = nNow; - // -limitfreerelay unit is thousand-bytes-per-minute - // At default rate it would take over a month to fill 1GB - if (dFreeCount > GetArg("-limitfreerelay", 15)*10*1000 && !IsFromMe()) - return error("AcceptToMemoryPool() : free transaction rejected by rate limiter"); - if (fDebug) - printf("Rate limit dFreeCount: %g => %g\n", dFreeCount, dFreeCount+nSize); - dFreeCount += nSize; + + CRITICAL_BLOCK(cs) + { + // Use an exponentially decaying ~10-minute window: + dFreeCount *= pow(1.0 - 1.0/600.0, (double)(nNow - nLastTime)); + nLastTime = nNow; + // -limitfreerelay unit is thousand-bytes-per-minute + // At default rate it would take over a month to fill 1GB + if (dFreeCount > GetArg("-limitfreerelay", 15)*10*1000 && !IsFromMe()) + return error("AcceptToMemoryPool() : free transaction rejected by rate limiter"); + if (fDebug) + printf("Rate limit dFreeCount: %g => %g\n", dFreeCount, dFreeCount+nSize); + dFreeCount += nSize; + } } } |