Merge pull request #6984
e495ed5
add documentation for exluding whitelistes peer from maxuploadtarget (Jonas Schnelli)5760749
[docs] rename reducetraffic.md to reduce-traffic.md (Jonas Schnelli)d61fcff
don't enforce maxuploadtargets disconnect for whitelisted peers (Jonas Schnelli)
This commit is contained in:
commit
9ffc687288
|
@ -1,7 +1,7 @@
|
||||||
Reduce Traffic
|
Reduce Traffic
|
||||||
==============
|
==============
|
||||||
|
|
||||||
Some node operators need to deal with bandwith caps imposed by their ISPs.
|
Some node operators need to deal with bandwidth caps imposed by their ISPs.
|
||||||
|
|
||||||
By default, bitcoin-core allows up to 125 connections to different peers, 8 of
|
By default, bitcoin-core allows up to 125 connections to different peers, 8 of
|
||||||
which are outbound. You can therefore, have at most 117 inbound connections.
|
which are outbound. You can therefore, have at most 117 inbound connections.
|
||||||
|
@ -22,6 +22,9 @@ Keep in mind that new nodes require other nodes that are willing to serve
|
||||||
historic blocks. **The recommended minimum is 144 blocks per day (max. 144MB
|
historic blocks. **The recommended minimum is 144 blocks per day (max. 144MB
|
||||||
per day)**
|
per day)**
|
||||||
|
|
||||||
|
Whitelisted peers will never be disconnected, although their traffic counts for
|
||||||
|
calculating the target.
|
||||||
|
|
||||||
## 2. Disable "listening" (`-listen=0`)
|
## 2. Disable "listening" (`-listen=0`)
|
||||||
|
|
||||||
Disabling listening will result in fewer nodes connected (remember the maximum of 8
|
Disabling listening will result in fewer nodes connected (remember the maximum of 8
|
||||||
|
@ -30,6 +33,6 @@ blocks and transactions to fewer nodes.
|
||||||
|
|
||||||
## 3. Reduce maximum connections (`-maxconnections=<num>`)
|
## 3. Reduce maximum connections (`-maxconnections=<num>`)
|
||||||
|
|
||||||
Reducing the maximum connected nodes to a miniumum could be desirable if traffic
|
Reducing the maximum connected nodes to a minimum could be desirable if traffic
|
||||||
limits are tiny. Keep in mind that bitcoin's trustless model works best if you are
|
limits are tiny. Keep in mind that bitcoin's trustless model works best if you are
|
||||||
connected to a handful of nodes.
|
connected to a handful of nodes.
|
|
@ -184,6 +184,9 @@ This option can be specified in MiB per day and is turned off by default
|
||||||
(`-maxuploadtarget=0`).
|
(`-maxuploadtarget=0`).
|
||||||
The recommended minimum is 144 * MAX_BLOCK_SIZE (currently 144MB) per day.
|
The recommended minimum is 144 * MAX_BLOCK_SIZE (currently 144MB) per day.
|
||||||
|
|
||||||
|
Whitelisted peers will never be disconnected, although their traffic counts for
|
||||||
|
calculating the target.
|
||||||
|
|
||||||
A more detailed documentation about keeping traffic low can be found in
|
A more detailed documentation about keeping traffic low can be found in
|
||||||
[/doc/reducetraffic.md](/doc/reducetraffic.md).
|
[/doc/reducetraffic.md](/doc/reducetraffic.md).
|
||||||
|
|
||||||
|
|
|
@ -195,7 +195,7 @@ class MaxUploadTest(BitcoinTestFramework):
|
||||||
daily_buffer = 144 * 1000000
|
daily_buffer = 144 * 1000000
|
||||||
max_bytes_available = max_bytes_per_day - daily_buffer
|
max_bytes_available = max_bytes_per_day - daily_buffer
|
||||||
success_count = max_bytes_available / old_block_size
|
success_count = max_bytes_available / old_block_size
|
||||||
|
|
||||||
# 144MB will be reserved for relaying new blocks, so expect this to
|
# 144MB will be reserved for relaying new blocks, so expect this to
|
||||||
# succeed for ~70 tries.
|
# succeed for ~70 tries.
|
||||||
for i in xrange(success_count):
|
for i in xrange(success_count):
|
||||||
|
@ -228,7 +228,7 @@ class MaxUploadTest(BitcoinTestFramework):
|
||||||
test_nodes[1].send_message(getdata_request)
|
test_nodes[1].send_message(getdata_request)
|
||||||
test_nodes[1].wait_for_disconnect()
|
test_nodes[1].wait_for_disconnect()
|
||||||
assert_equal(len(self.nodes[0].getpeerinfo()), 1)
|
assert_equal(len(self.nodes[0].getpeerinfo()), 1)
|
||||||
|
|
||||||
print "Peer 1 disconnected after trying to download old block"
|
print "Peer 1 disconnected after trying to download old block"
|
||||||
|
|
||||||
print "Advancing system time on node to clear counters..."
|
print "Advancing system time on node to clear counters..."
|
||||||
|
@ -245,5 +245,38 @@ class MaxUploadTest(BitcoinTestFramework):
|
||||||
|
|
||||||
[c.disconnect_node() for c in connections]
|
[c.disconnect_node() for c in connections]
|
||||||
|
|
||||||
|
#stop and start node 0 with 1MB maxuploadtarget, whitelist 127.0.0.1
|
||||||
|
print "Restarting nodes with -whitelist=127.0.0.1"
|
||||||
|
stop_node(self.nodes[0], 0)
|
||||||
|
self.nodes[0] = start_node(0, self.options.tmpdir, ["-debug", "-whitelist=127.0.0.1", "-maxuploadtarget=1", "-blockmaxsize=999000"])
|
||||||
|
|
||||||
|
#recreate/reconnect 3 test nodes
|
||||||
|
test_nodes = []
|
||||||
|
connections = []
|
||||||
|
|
||||||
|
for i in xrange(3):
|
||||||
|
test_nodes.append(TestNode())
|
||||||
|
connections.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test_nodes[i]))
|
||||||
|
test_nodes[i].add_connection(connections[i])
|
||||||
|
|
||||||
|
NetworkThread().start() # Start up network handling in another thread
|
||||||
|
[x.wait_for_verack() for x in test_nodes]
|
||||||
|
|
||||||
|
#retrieve 20 blocks which should be enough to break the 1MB limit
|
||||||
|
getdata_request.inv = [CInv(2, big_new_block)]
|
||||||
|
for i in xrange(20):
|
||||||
|
test_nodes[1].send_message(getdata_request)
|
||||||
|
test_nodes[1].sync_with_ping()
|
||||||
|
assert_equal(test_nodes[1].block_receive_map[big_new_block], i+1)
|
||||||
|
|
||||||
|
getdata_request.inv = [CInv(2, big_old_block)]
|
||||||
|
test_nodes[1].send_message(getdata_request)
|
||||||
|
test_nodes[1].wait_for_disconnect()
|
||||||
|
assert_equal(len(self.nodes[0].getpeerinfo()), 3) #node is still connected because of the whitelist
|
||||||
|
|
||||||
|
print "Peer 1 still connected after trying to download old block (whitelisted)"
|
||||||
|
|
||||||
|
[c.disconnect_node() for c in connections]
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
MaxUploadTest().main()
|
MaxUploadTest().main()
|
||||||
|
|
|
@ -3867,8 +3867,9 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// disconnect node in case we have reached the outbound limit for serving historical blocks
|
// disconnect node in case we have reached the outbound limit for serving historical blocks
|
||||||
|
// never disconnect whitelisted nodes
|
||||||
static const int nOneWeek = 7 * 24 * 60 * 60; // assume > 1 week = historical
|
static const int nOneWeek = 7 * 24 * 60 * 60; // assume > 1 week = historical
|
||||||
if (send && CNode::OutboundTargetReached(true) && ( ((pindexBestHeader != NULL) && (pindexBestHeader->GetBlockTime() - mi->second->GetBlockTime() > nOneWeek)) || inv.type == MSG_FILTERED_BLOCK) )
|
if (send && CNode::OutboundTargetReached(true) && ( ((pindexBestHeader != NULL) && (pindexBestHeader->GetBlockTime() - mi->second->GetBlockTime() > nOneWeek)) || inv.type == MSG_FILTERED_BLOCK) && !pfrom->fWhitelisted)
|
||||||
{
|
{
|
||||||
LogPrint("net", "historical block serving limit reached, disconnect peer=%d\n", pfrom->GetId());
|
LogPrint("net", "historical block serving limit reached, disconnect peer=%d\n", pfrom->GetId());
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue