From d61fcff07112411a1e7c28984777480e0c0873aa Mon Sep 17 00:00:00 2001 From: Jonas Schnelli Date: Wed, 11 Nov 2015 10:10:48 +0100 Subject: [PATCH 1/3] don't enforce maxuploadtargets disconnect for whitelisted peers --- qa/rpc-tests/maxuploadtarget.py | 37 +++++++++++++++++++++++++++++++-- src/main.cpp | 3 ++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/qa/rpc-tests/maxuploadtarget.py b/qa/rpc-tests/maxuploadtarget.py index 148c5f37e..e714465db 100755 --- a/qa/rpc-tests/maxuploadtarget.py +++ b/qa/rpc-tests/maxuploadtarget.py @@ -195,7 +195,7 @@ class MaxUploadTest(BitcoinTestFramework): daily_buffer = 144 * 1000000 max_bytes_available = max_bytes_per_day - daily_buffer success_count = max_bytes_available / old_block_size - + # 144MB will be reserved for relaying new blocks, so expect this to # succeed for ~70 tries. for i in xrange(success_count): @@ -228,7 +228,7 @@ class MaxUploadTest(BitcoinTestFramework): test_nodes[1].send_message(getdata_request) test_nodes[1].wait_for_disconnect() assert_equal(len(self.nodes[0].getpeerinfo()), 1) - + print "Peer 1 disconnected after trying to download old block" print "Advancing system time on node to clear counters..." @@ -245,5 +245,38 @@ class MaxUploadTest(BitcoinTestFramework): [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__': MaxUploadTest().main() diff --git a/src/main.cpp b/src/main.cpp index 5208fbb03..4647112d4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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 + // never disconnect whitelisted nodes 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()); From 5760749ed8e244e0befab12434b1d8c9f6c8e90e Mon Sep 17 00:00:00 2001 From: Jonas Schnelli Date: Fri, 13 Nov 2015 21:10:51 +0100 Subject: [PATCH 2/3] [docs] rename reducetraffic.md to reduce-traffic.md --- doc/reducetraffic.md | 35 ----------------------------------- doc/release-notes.md | 3 +++ 2 files changed, 3 insertions(+), 35 deletions(-) delete mode 100644 doc/reducetraffic.md diff --git a/doc/reducetraffic.md b/doc/reducetraffic.md deleted file mode 100644 index a79571913..000000000 --- a/doc/reducetraffic.md +++ /dev/null @@ -1,35 +0,0 @@ -Reduce Traffic -============== - -Some node operators need to deal with bandwith caps imposed by their ISPs. - -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. - -The default settings can result in relatively significant traffic consumption. - -Ways to reduce traffic: - -## 1. Use `-maxuploadtarget=` - -A major component of the traffic is caused by serving historic blocks to other nodes -during the initial blocks download phase (syncing up a new node). -This option can be specified in MiB per day and is turned off by default. -This is *not* a hard limit; only a threshold to minimize the outbound -traffic. When the limit is about to be reached, the uploaded data is cut by no -longer serving historic blocks (blocks older than one week). -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 -per day)** - -## 2. Disable "listening" (`-listen=0`) - -Disabling listening will result in fewer nodes connected (remember the maximum of 8 -outbound peers). Fewer nodes will result in less traffic usage as you are relaying -blocks and transactions to fewer nodes. - -## 3. Reduce maximum connections (`-maxconnections=`) - -Reducing the maximum connected nodes to a miniumum could be desirable if traffic -limits are tiny. Keep in mind that bitcoin's trustless model works best if you are -connected to a handful of nodes. diff --git a/doc/release-notes.md b/doc/release-notes.md index 2e9cc1694..e4dcc60cf 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -184,6 +184,9 @@ This option can be specified in MiB per day and is turned off by default (`-maxuploadtarget=0`). 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 [/doc/reducetraffic.md](/doc/reducetraffic.md). From e495ed5f08fa9b62174c7f8f4636e0e5f63a1f4d Mon Sep 17 00:00:00 2001 From: Jonas Schnelli Date: Fri, 13 Nov 2015 21:12:23 +0100 Subject: [PATCH 3/3] add documentation for exluding whitelistes peer from maxuploadtarget --- doc/reduce-traffic.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 doc/reduce-traffic.md diff --git a/doc/reduce-traffic.md b/doc/reduce-traffic.md new file mode 100644 index 000000000..2d86588eb --- /dev/null +++ b/doc/reduce-traffic.md @@ -0,0 +1,38 @@ +Reduce Traffic +============== + +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 +which are outbound. You can therefore, have at most 117 inbound connections. + +The default settings can result in relatively significant traffic consumption. + +Ways to reduce traffic: + +## 1. Use `-maxuploadtarget=` + +A major component of the traffic is caused by serving historic blocks to other nodes +during the initial blocks download phase (syncing up a new node). +This option can be specified in MiB per day and is turned off by default. +This is *not* a hard limit; only a threshold to minimize the outbound +traffic. When the limit is about to be reached, the uploaded data is cut by no +longer serving historic blocks (blocks older than one week). +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 +per day)** + +Whitelisted peers will never be disconnected, although their traffic counts for +calculating the target. + +## 2. Disable "listening" (`-listen=0`) + +Disabling listening will result in fewer nodes connected (remember the maximum of 8 +outbound peers). Fewer nodes will result in less traffic usage as you are relaying +blocks and transactions to fewer nodes. + +## 3. Reduce maximum connections (`-maxconnections=`) + +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 +connected to a handful of nodes.