Skip to content

Commit fafb68a

Browse files
author
MarcoFalke
committed
refactor: Add and use EnsureConnman in rpc code
1 parent faabeb8 commit fafb68a

File tree

4 files changed

+70
-51
lines changed

4 files changed

+70
-51
lines changed

src/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ BITCOIN_CORE_H = \
199199
rpc/blockchain.h \
200200
rpc/client.h \
201201
rpc/mining.h \
202+
rpc/net.h \
202203
rpc/protocol.h \
203204
rpc/rawtransaction_util.h \
204205
rpc/register.h \

src/rpc/mining.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <pow.h>
1919
#include <rpc/blockchain.h>
2020
#include <rpc/mining.h>
21+
#include <rpc/net.h>
2122
#include <rpc/server.h>
2223
#include <rpc/util.h>
2324
#include <script/descriptor.h>
@@ -671,11 +672,9 @@ static RPCHelpMan getblocktemplate()
671672
if (strMode != "template")
672673
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
673674

674-
if(!node.connman)
675-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
676-
677675
if (!Params().IsTestChain()) {
678-
if (node.connman->GetNodeCount(ConnectionDirection::Both) == 0) {
676+
const CConnman& connman = EnsureConnman(node);
677+
if (connman.GetNodeCount(ConnectionDirection::Both) == 0) {
679678
throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, PACKAGE_NAME " is not connected!");
680679
}
681680

src/rpc/net.cpp

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,22 @@ const std::vector<std::string> CONNECTION_TYPE_DOC{
3939
"feeler (short-lived automatic connection for testing addresses)"
4040
};
4141

42+
CConnman& EnsureConnman(const NodeContext& node)
43+
{
44+
if (!node.connman) {
45+
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
46+
}
47+
return *node.connman;
48+
}
49+
50+
PeerManager& EnsurePeerman(const NodeContext& node)
51+
{
52+
if (!node.peerman) {
53+
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
54+
}
55+
return *node.peerman;
56+
}
57+
4258
static RPCHelpMan getconnectioncount()
4359
{
4460
return RPCHelpMan{"getconnectioncount",
@@ -54,10 +70,9 @@ static RPCHelpMan getconnectioncount()
5470
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
5571
{
5672
NodeContext& node = EnsureAnyNodeContext(request.context);
57-
if(!node.connman)
58-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
73+
const CConnman& connman = EnsureConnman(node);
5974

60-
return (int)node.connman->GetNodeCount(ConnectionDirection::Both);
75+
return (int)connman.GetNodeCount(ConnectionDirection::Both);
6176
},
6277
};
6378
}
@@ -77,12 +92,10 @@ static RPCHelpMan ping()
7792
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
7893
{
7994
NodeContext& node = EnsureAnyNodeContext(request.context);
80-
if (!node.peerman) {
81-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
82-
}
95+
PeerManager& peerman = EnsurePeerman(node);
8396

8497
// Request that each node send a ping during next message processing pass
85-
node.peerman->SendPings();
98+
peerman.SendPings();
8699
return NullUniValue;
87100
},
88101
};
@@ -166,19 +179,18 @@ static RPCHelpMan getpeerinfo()
166179
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
167180
{
168181
NodeContext& node = EnsureAnyNodeContext(request.context);
169-
if(!node.connman || !node.peerman) {
170-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
171-
}
182+
const CConnman& connman = EnsureConnman(node);
183+
const PeerManager& peerman = EnsurePeerman(node);
172184

173185
std::vector<CNodeStats> vstats;
174-
node.connman->GetNodeStats(vstats);
186+
connman.GetNodeStats(vstats);
175187

176188
UniValue ret(UniValue::VARR);
177189

178190
for (const CNodeStats& stats : vstats) {
179191
UniValue obj(UniValue::VOBJ);
180192
CNodeStateStats statestats;
181-
bool fStateStats = node.peerman->GetNodeStateStats(stats.nodeid, statestats);
193+
bool fStateStats = peerman.GetNodeStateStats(stats.nodeid, statestats);
182194
obj.pushKV("id", stats.nodeid);
183195
obj.pushKV("addr", stats.addrName);
184196
if (stats.addrBind.IsValid()) {
@@ -286,27 +298,28 @@ static RPCHelpMan addnode()
286298
}
287299

288300
NodeContext& node = EnsureAnyNodeContext(request.context);
289-
if(!node.connman)
290-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
301+
CConnman& connman = EnsureConnman(node);
291302

292303
std::string strNode = request.params[0].get_str();
293304

294305
if (strCommand == "onetry")
295306
{
296307
CAddress addr;
297-
node.connman->OpenNetworkConnection(addr, false, nullptr, strNode.c_str(), ConnectionType::MANUAL);
308+
connman.OpenNetworkConnection(addr, false, nullptr, strNode.c_str(), ConnectionType::MANUAL);
298309
return NullUniValue;
299310
}
300311

301312
if (strCommand == "add")
302313
{
303-
if(!node.connman->AddNode(strNode))
314+
if (!connman.AddNode(strNode)) {
304315
throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: Node already added");
316+
}
305317
}
306318
else if(strCommand == "remove")
307319
{
308-
if(!node.connman->RemoveAddedNode(strNode))
320+
if (!connman.RemoveAddedNode(strNode)) {
309321
throw JSONRPCError(RPC_CLIENT_NODE_NOT_ADDED, "Error: Node could not be removed. It has not been added previously.");
322+
}
310323
}
311324

312325
return NullUniValue;
@@ -351,11 +364,9 @@ static RPCHelpMan addconnection()
351364
}
352365

353366
NodeContext& node = EnsureAnyNodeContext(request.context);
354-
if (!node.connman) {
355-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled.");
356-
}
367+
CConnman& connman = EnsureConnman(node);
357368

358-
const bool success = node.connman->AddConnection(address, conn_type);
369+
const bool success = connman.AddConnection(address, conn_type);
359370
if (!success) {
360371
throw JSONRPCError(RPC_CLIENT_NODE_CAPACITY_REACHED, "Error: Already at capacity for specified connection type.");
361372
}
@@ -389,20 +400,19 @@ static RPCHelpMan disconnectnode()
389400
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
390401
{
391402
NodeContext& node = EnsureAnyNodeContext(request.context);
392-
if(!node.connman)
393-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
403+
CConnman& connman = EnsureConnman(node);
394404

395405
bool success;
396406
const UniValue &address_arg = request.params[0];
397407
const UniValue &id_arg = request.params[1];
398408

399409
if (!address_arg.isNull() && id_arg.isNull()) {
400410
/* handle disconnect-by-address */
401-
success = node.connman->DisconnectNode(address_arg.get_str());
411+
success = connman.DisconnectNode(address_arg.get_str());
402412
} else if (!id_arg.isNull() && (address_arg.isNull() || (address_arg.isStr() && address_arg.get_str().empty()))) {
403413
/* handle disconnect-by-id */
404414
NodeId nodeid = (NodeId) id_arg.get_int64();
405-
success = node.connman->DisconnectNode(nodeid);
415+
success = connman.DisconnectNode(nodeid);
406416
} else {
407417
throw JSONRPCError(RPC_INVALID_PARAMS, "Only one of address and nodeid should be provided.");
408418
}
@@ -449,10 +459,9 @@ static RPCHelpMan getaddednodeinfo()
449459
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
450460
{
451461
NodeContext& node = EnsureAnyNodeContext(request.context);
452-
if(!node.connman)
453-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
462+
const CConnman& connman = EnsureConnman(node);
454463

455-
std::vector<AddedNodeInfo> vInfo = node.connman->GetAddedNodeInfo();
464+
std::vector<AddedNodeInfo> vInfo = connman.GetAddedNodeInfo();
456465

457466
if (!request.params[0].isNull()) {
458467
bool found = false;
@@ -520,21 +529,20 @@ static RPCHelpMan getnettotals()
520529
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
521530
{
522531
NodeContext& node = EnsureAnyNodeContext(request.context);
523-
if(!node.connman)
524-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
532+
const CConnman& connman = EnsureConnman(node);
525533

526534
UniValue obj(UniValue::VOBJ);
527-
obj.pushKV("totalbytesrecv", node.connman->GetTotalBytesRecv());
528-
obj.pushKV("totalbytessent", node.connman->GetTotalBytesSent());
535+
obj.pushKV("totalbytesrecv", connman.GetTotalBytesRecv());
536+
obj.pushKV("totalbytessent", connman.GetTotalBytesSent());
529537
obj.pushKV("timemillis", GetTimeMillis());
530538

531539
UniValue outboundLimit(UniValue::VOBJ);
532-
outboundLimit.pushKV("timeframe", count_seconds(node.connman->GetMaxOutboundTimeframe()));
533-
outboundLimit.pushKV("target", node.connman->GetMaxOutboundTarget());
534-
outboundLimit.pushKV("target_reached", node.connman->OutboundTargetReached(false));
535-
outboundLimit.pushKV("serve_historical_blocks", !node.connman->OutboundTargetReached(true));
536-
outboundLimit.pushKV("bytes_left_in_cycle", node.connman->GetOutboundTargetBytesLeft());
537-
outboundLimit.pushKV("time_left_in_cycle", count_seconds(node.connman->GetMaxOutboundTimeLeftInCycle()));
540+
outboundLimit.pushKV("timeframe", count_seconds(connman.GetMaxOutboundTimeframe()));
541+
outboundLimit.pushKV("target", connman.GetMaxOutboundTarget());
542+
outboundLimit.pushKV("target_reached", connman.OutboundTargetReached(false));
543+
outboundLimit.pushKV("serve_historical_blocks", !connman.OutboundTargetReached(true));
544+
outboundLimit.pushKV("bytes_left_in_cycle", connman.GetOutboundTargetBytesLeft());
545+
outboundLimit.pushKV("time_left_in_cycle", count_seconds(connman.GetMaxOutboundTimeLeftInCycle()));
538546
obj.pushKV("uploadtarget", outboundLimit);
539547
return obj;
540548
},
@@ -826,13 +834,11 @@ static RPCHelpMan setnetworkactive()
826834
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
827835
{
828836
NodeContext& node = EnsureAnyNodeContext(request.context);
829-
if (!node.connman) {
830-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
831-
}
837+
CConnman& connman = EnsureConnman(node);
832838

833-
node.connman->SetNetworkActive(request.params[0].get_bool());
839+
connman.SetNetworkActive(request.params[0].get_bool());
834840

835-
return node.connman->GetNetworkActive();
841+
return connman.GetNetworkActive();
836842
},
837843
};
838844
}
@@ -864,15 +870,13 @@ static RPCHelpMan getnodeaddresses()
864870
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
865871
{
866872
NodeContext& node = EnsureAnyNodeContext(request.context);
867-
if (!node.connman) {
868-
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
869-
}
873+
const CConnman& connman = EnsureConnman(node);
870874

871875
const int count{request.params[0].isNull() ? 1 : request.params[0].get_int()};
872876
if (count < 0) throw JSONRPCError(RPC_INVALID_PARAMETER, "Address count out of range");
873877

874878
// returns a shuffled list of CAddress
875-
const std::vector<CAddress> vAddr{node.connman->GetAddresses(count, /* max_pct */ 0)};
879+
const std::vector<CAddress> vAddr{connman.GetAddresses(count, /* max_pct */ 0)};
876880
UniValue ret(UniValue::VARR);
877881

878882
for (const CAddress& addr : vAddr) {

src/rpc/net.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright (c) 2021 The Bitcoin Core developers
2+
// Distributed under the MIT software license, see the accompanying
3+
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
#ifndef BITCOIN_RPC_NET_H
6+
#define BITCOIN_RPC_NET_H
7+
8+
class CConnman;
9+
class PeerManager;
10+
struct NodeContext;
11+
12+
CConnman& EnsureConnman(const NodeContext& node);
13+
PeerManager& EnsurePeerman(const NodeContext& node);
14+
15+
#endif // BITCOIN_RPC_NET_H

0 commit comments

Comments
 (0)