Skip to content

Commit 12752af

Browse files
committed
net: don't run callbacks on nodes that haven't completed the version handshake
Since ForEach* are can be used to send messages to all nodes, the caller may end up sending a message before the version handshake is complete. To limit this, filter out these nodes. While we're at it, may as well filter out disconnected nodes as well. Delete unused methods rather than updating them.
1 parent 2046617 commit 12752af

File tree

2 files changed

+25
-57
lines changed

2 files changed

+25
-57
lines changed

src/net.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2630,6 +2630,11 @@ void CNode::AskFor(const CInv& inv)
26302630
mapAskFor.insert(std::make_pair(nRequestTime, inv));
26312631
}
26322632

2633+
bool CConnman::NodeFullyConnected(const CNode* pnode)
2634+
{
2635+
return pnode && pnode->fSuccessfullyConnected && !pnode->fDisconnect;
2636+
}
2637+
26332638
void CConnman::PushMessage(CNode* pnode, CSerializedNetMsg&& msg)
26342639
{
26352640
size_t nMessageSize = msg.data.size();
@@ -2680,7 +2685,7 @@ bool CConnman::ForNode(NodeId id, std::function<bool(CNode* pnode)> func)
26802685
break;
26812686
}
26822687
}
2683-
return found != nullptr && func(found);
2688+
return found != nullptr && NodeFullyConnected(found) && func(found);
26842689
}
26852690

26862691
int64_t PoissonNextSend(int64_t nNow, int average_interval_seconds) {

src/net.h

Lines changed: 19 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -161,85 +161,45 @@ class CConnman
161161

162162
void PushMessage(CNode* pnode, CSerializedNetMsg&& msg);
163163

164-
template<typename Callable>
165-
bool ForEachNodeContinueIf(Callable&& func)
166-
{
167-
LOCK(cs_vNodes);
168-
for (auto&& node : vNodes)
169-
if(!func(node))
170-
return false;
171-
return true;
172-
};
173-
174-
template<typename Callable>
175-
bool ForEachNodeContinueIf(Callable&& func) const
176-
{
177-
LOCK(cs_vNodes);
178-
for (const auto& node : vNodes)
179-
if(!func(node))
180-
return false;
181-
return true;
182-
};
183-
184-
template<typename Callable, typename CallableAfter>
185-
bool ForEachNodeContinueIfThen(Callable&& pre, CallableAfter&& post)
186-
{
187-
bool ret = true;
188-
LOCK(cs_vNodes);
189-
for (auto&& node : vNodes)
190-
if(!pre(node)) {
191-
ret = false;
192-
break;
193-
}
194-
post();
195-
return ret;
196-
};
197-
198-
template<typename Callable, typename CallableAfter>
199-
bool ForEachNodeContinueIfThen(Callable&& pre, CallableAfter&& post) const
200-
{
201-
bool ret = true;
202-
LOCK(cs_vNodes);
203-
for (const auto& node : vNodes)
204-
if(!pre(node)) {
205-
ret = false;
206-
break;
207-
}
208-
post();
209-
return ret;
210-
};
211-
212164
template<typename Callable>
213165
void ForEachNode(Callable&& func)
214166
{
215167
LOCK(cs_vNodes);
216-
for (auto&& node : vNodes)
217-
func(node);
168+
for (auto&& node : vNodes) {
169+
if (NodeFullyConnected(node))
170+
func(node);
171+
}
218172
};
219173

220174
template<typename Callable>
221175
void ForEachNode(Callable&& func) const
222176
{
223177
LOCK(cs_vNodes);
224-
for (const auto& node : vNodes)
225-
func(node);
178+
for (auto&& node : vNodes) {
179+
if (NodeFullyConnected(node))
180+
func(node);
181+
}
226182
};
227183

228184
template<typename Callable, typename CallableAfter>
229185
void ForEachNodeThen(Callable&& pre, CallableAfter&& post)
230186
{
231187
LOCK(cs_vNodes);
232-
for (auto&& node : vNodes)
233-
pre(node);
188+
for (auto&& node : vNodes) {
189+
if (NodeFullyConnected(node))
190+
pre(node);
191+
}
234192
post();
235193
};
236194

237195
template<typename Callable, typename CallableAfter>
238196
void ForEachNodeThen(Callable&& pre, CallableAfter&& post) const
239197
{
240198
LOCK(cs_vNodes);
241-
for (const auto& node : vNodes)
242-
pre(node);
199+
for (auto&& node : vNodes) {
200+
if (NodeFullyConnected(node))
201+
pre(node);
202+
}
243203
post();
244204
};
245205

@@ -372,6 +332,9 @@ class CConnman
372332
void RecordBytesRecv(uint64_t bytes);
373333
void RecordBytesSent(uint64_t bytes);
374334

335+
// Whether the node should be passed out in ForEach* callbacks
336+
static bool NodeFullyConnected(const CNode* pnode);
337+
375338
// Network usage totals
376339
CCriticalSection cs_totalBytesRecv;
377340
CCriticalSection cs_totalBytesSent;

0 commit comments

Comments
 (0)