mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 14:38:29 +01:00
Introduce -maxuploadtarget
* -maxuploadtarget can be set in MiB * if <limit> - ( time-left-in-24h-cycle / 600 * MAX_BLOCK_SIZE ) has reach, stop serve blocks older than one week and filtered blocks * no action if limit has reached, no guarantee that the target will not be surpassed * add outbound limit informations to rpc getnettotals
This commit is contained in:
committed by
Jonas Schnelli
parent
867d6c90b8
commit
872fee3fcc
94
src/net.cpp
94
src/net.cpp
@@ -12,6 +12,7 @@
|
||||
#include "addrman.h"
|
||||
#include "chainparams.h"
|
||||
#include "clientversion.h"
|
||||
#include "consensus/consensus.h"
|
||||
#include "crypto/common.h"
|
||||
#include "hash.h"
|
||||
#include "primitives/transaction.h"
|
||||
@@ -326,6 +327,11 @@ uint64_t CNode::nTotalBytesSent = 0;
|
||||
CCriticalSection CNode::cs_totalBytesRecv;
|
||||
CCriticalSection CNode::cs_totalBytesSent;
|
||||
|
||||
uint64_t CNode::nMaxOutboundLimit = 0;
|
||||
uint64_t CNode::nMaxOutboundTotalBytesSentInCycle = 0;
|
||||
uint64_t CNode::nMaxOutboundTimeframe = 60*60*24; //1 day
|
||||
uint64_t CNode::nMaxOutboundCycleStartTime = 0;
|
||||
|
||||
CNode* FindNode(const CNetAddr& ip)
|
||||
{
|
||||
LOCK(cs_vNodes);
|
||||
@@ -2083,6 +2089,94 @@ void CNode::RecordBytesSent(uint64_t bytes)
|
||||
{
|
||||
LOCK(cs_totalBytesSent);
|
||||
nTotalBytesSent += bytes;
|
||||
|
||||
uint64_t now = GetTime();
|
||||
if (nMaxOutboundCycleStartTime + nMaxOutboundTimeframe < now)
|
||||
{
|
||||
// timeframe expired, reset cycle
|
||||
nMaxOutboundCycleStartTime = now;
|
||||
nMaxOutboundTotalBytesSentInCycle = 0;
|
||||
}
|
||||
|
||||
// TODO, exclude whitebind peers
|
||||
nMaxOutboundTotalBytesSentInCycle += bytes;
|
||||
}
|
||||
|
||||
void CNode::SetMaxOutboundTarget(uint64_t limit)
|
||||
{
|
||||
LOCK(cs_totalBytesSent);
|
||||
uint64_t recommendedMinimum = (nMaxOutboundTimeframe / 600) * MAX_BLOCK_SIZE;
|
||||
nMaxOutboundLimit = limit;
|
||||
|
||||
if (limit < recommendedMinimum)
|
||||
LogPrintf("Max outbound target is very small (%s) and will be overshot. Recommended minimum is %s\n.", nMaxOutboundLimit, recommendedMinimum);
|
||||
}
|
||||
|
||||
uint64_t CNode::GetMaxOutboundTarget()
|
||||
{
|
||||
LOCK(cs_totalBytesSent);
|
||||
return nMaxOutboundLimit;
|
||||
}
|
||||
|
||||
uint64_t CNode::GetMaxOutboundTimeframe()
|
||||
{
|
||||
LOCK(cs_totalBytesSent);
|
||||
return nMaxOutboundTimeframe;
|
||||
}
|
||||
|
||||
uint64_t CNode::GetMaxOutboundTimeLeftInCycle()
|
||||
{
|
||||
LOCK(cs_totalBytesSent);
|
||||
if (nMaxOutboundLimit == 0)
|
||||
return 0;
|
||||
|
||||
if (nMaxOutboundCycleStartTime == 0)
|
||||
return nMaxOutboundTimeframe;
|
||||
|
||||
uint64_t cycleEndTime = nMaxOutboundCycleStartTime + nMaxOutboundTimeframe;
|
||||
uint64_t now = GetTime();
|
||||
return (cycleEndTime < now) ? 0 : cycleEndTime - GetTime();
|
||||
}
|
||||
|
||||
void CNode::SetMaxOutboundTimeframe(uint64_t timeframe)
|
||||
{
|
||||
LOCK(cs_totalBytesSent);
|
||||
if (nMaxOutboundTimeframe != timeframe)
|
||||
{
|
||||
// reset measure-cycle in case of changing
|
||||
// the timeframe
|
||||
nMaxOutboundCycleStartTime = GetTime();
|
||||
}
|
||||
nMaxOutboundTimeframe = timeframe;
|
||||
}
|
||||
|
||||
bool CNode::OutboundTargetReached(bool historicalBlockServingLimit)
|
||||
{
|
||||
LOCK(cs_totalBytesSent);
|
||||
if (nMaxOutboundLimit == 0)
|
||||
return false;
|
||||
|
||||
if (historicalBlockServingLimit)
|
||||
{
|
||||
// keep a large enought buffer to at least relay each block once
|
||||
uint64_t timeLeftInCycle = GetMaxOutboundTimeLeftInCycle();
|
||||
uint64_t buffer = timeLeftInCycle / 600 * MAX_BLOCK_SIZE;
|
||||
if (buffer >= nMaxOutboundLimit || nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit - buffer)
|
||||
return true;
|
||||
}
|
||||
else if (nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
uint64_t CNode::GetOutboundTargetBytesLeft()
|
||||
{
|
||||
LOCK(cs_totalBytesSent);
|
||||
if (nMaxOutboundLimit == 0)
|
||||
return 0;
|
||||
|
||||
return (nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit) ? 0 : nMaxOutboundLimit - nMaxOutboundTotalBytesSentInCycle;
|
||||
}
|
||||
|
||||
uint64_t CNode::GetTotalBytesRecv()
|
||||
|
||||
Reference in New Issue
Block a user