Skip to content

Commit e625cf0

Browse files
committed
fix: fix feeler flags fetch fail
1 parent c92c849 commit e625cf0

File tree

6 files changed

+97
-42
lines changed

6 files changed

+97
-42
lines changed

network/src/network.rs

+4-18
Original file line numberDiff line numberDiff line change
@@ -1531,27 +1531,13 @@ pub enum TransportType {
15311531
Wss,
15321532
}
15331533

1534-
impl<'a> From<TransportType> for p2p::multiaddr::Protocol<'a> {
1535-
fn from(value: TransportType) -> Self {
1536-
match value {
1537-
TransportType::Ws => Protocol::Ws,
1538-
TransportType::Wss => Protocol::Wss,
1539-
_ => unreachable!(),
1540-
}
1541-
}
1542-
}
1543-
15441534
pub(crate) fn find_type(addr: &Multiaddr) -> TransportType {
15451535
let mut iter = addr.iter();
15461536

1547-
iter.find_map(|proto| {
1548-
if let Protocol::Ws = proto {
1549-
Some(TransportType::Ws)
1550-
} else if let Protocol::Wss = proto {
1551-
Some(TransportType::Wss)
1552-
} else {
1553-
None
1554-
}
1537+
iter.find_map(|proto| match proto {
1538+
Protocol::Ws => Some(TransportType::Ws),
1539+
Protocol::Wss => Some(TransportType::Wss),
1540+
_ => None,
15551541
})
15561542
.unwrap_or(TransportType::Tcp)
15571543
}

network/src/peer_registry.rs

+21-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Peer registry
22
use crate::network_group::Group;
33
use crate::peer_store::PeerStore;
4+
use crate::Flags;
45
use crate::{
56
errors::{Error, PeerError},
67
extract_peer_id, Peer, PeerId, SessionType,
@@ -24,7 +25,7 @@ pub struct PeerRegistry {
2425
// Only whitelist peers or allow all peers.
2526
whitelist_only: bool,
2627
whitelist_peers: HashSet<PeerId>,
27-
feeler_peers: HashSet<PeerId>,
28+
feeler_peers: HashMap<PeerId, Flags>,
2829
}
2930

3031
/// Global network connection status
@@ -63,7 +64,7 @@ impl PeerRegistry {
6364
PeerRegistry {
6465
peers: HashMap::with_capacity_and_hasher(20, Default::default()),
6566
whitelist_peers: whitelist_peers.iter().filter_map(extract_peer_id).collect(),
66-
feeler_peers: HashSet::default(),
67+
feeler_peers: HashMap::default(),
6768
max_inbound,
6869
max_outbound,
6970
whitelist_only,
@@ -191,10 +192,26 @@ impl PeerRegistry {
191192
/// Add feeler dail task
192193
pub fn add_feeler(&mut self, addr: &Multiaddr) {
193194
if let Some(peer_id) = extract_peer_id(addr) {
194-
self.feeler_peers.insert(peer_id);
195+
self.feeler_peers.insert(peer_id, Flags::COMPATIBILITY);
195196
}
196197
}
197198

199+
/// Identify change feeler flags
200+
pub fn change_feeler_flags(&mut self, addr: &Multiaddr, flags: Flags) -> bool {
201+
if let Some(peer_id) = extract_peer_id(addr) {
202+
if let Some(i) = self.feeler_peers.get_mut(&peer_id) {
203+
*i = flags;
204+
return true;
205+
}
206+
}
207+
false
208+
}
209+
210+
/// Get feeler session flags
211+
pub fn feeler_flags(&self, addr: &Multiaddr) -> Option<Flags> {
212+
extract_peer_id(addr).and_then(|peer_id| self.feeler_peers.get(&peer_id).cloned())
213+
}
214+
198215
/// Remove feeler dail task on session disconnects or fails
199216
pub fn remove_feeler(&mut self, addr: &Multiaddr) {
200217
if let Some(peer_id) = extract_peer_id(addr) {
@@ -205,7 +222,7 @@ impl PeerRegistry {
205222
/// Whether this session is feeler session
206223
pub fn is_feeler(&self, addr: &Multiaddr) -> bool {
207224
extract_peer_id(addr)
208-
.map(|peer_id| self.feeler_peers.contains(&peer_id))
225+
.map(|peer_id| self.feeler_peers.contains_key(&peer_id))
209226
.unwrap_or_default()
210227
}
211228

network/src/peer_store/addr_manager.rs

+46-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
//! Address manager
22
use crate::peer_store::types::AddrInfo;
3-
use p2p::{multiaddr::Multiaddr, utils::multiaddr_to_socketaddr};
3+
use p2p::{
4+
multiaddr::{Multiaddr, Protocol},
5+
utils::multiaddr_to_socketaddr,
6+
};
47
use rand::Rng;
58
use std::collections::{HashMap, HashSet};
69

@@ -92,7 +95,20 @@ impl AddrManager {
9295

9396
/// Remove an address by ip and port
9497
pub fn remove(&mut self, addr: &Multiaddr) -> Option<AddrInfo> {
95-
self.addr_to_id.remove(addr).and_then(|id| {
98+
let base_addr = addr
99+
.iter()
100+
.filter_map(|p| {
101+
if matches!(
102+
p,
103+
Protocol::Ws | Protocol::Wss | Protocol::Memory(_) | Protocol::Tls(_)
104+
) {
105+
None
106+
} else {
107+
Some(p)
108+
}
109+
})
110+
.collect();
111+
self.addr_to_id.remove(&base_addr).and_then(|id| {
96112
let random_id_pos = self.id_to_info.get(&id).expect("exists").random_id_pos;
97113
// swap with last index, then remove the last index
98114
self.swap_random_id(random_id_pos, self.random_ids.len() - 1);
@@ -103,14 +119,40 @@ impl AddrManager {
103119

104120
/// Get an address information by ip and port
105121
pub fn get(&self, addr: &Multiaddr) -> Option<&AddrInfo> {
122+
let base_addr = addr
123+
.iter()
124+
.filter_map(|p| {
125+
if matches!(
126+
p,
127+
Protocol::Ws | Protocol::Wss | Protocol::Memory(_) | Protocol::Tls(_)
128+
) {
129+
None
130+
} else {
131+
Some(p)
132+
}
133+
})
134+
.collect();
106135
self.addr_to_id
107-
.get(addr)
136+
.get(&base_addr)
108137
.and_then(|id| self.id_to_info.get(id))
109138
}
110139

111140
/// Get a mutable address information by ip and port
112141
pub fn get_mut(&mut self, addr: &Multiaddr) -> Option<&mut AddrInfo> {
113-
if let Some(id) = self.addr_to_id.get(addr) {
142+
let base_addr = addr
143+
.iter()
144+
.filter_map(|p| {
145+
if matches!(
146+
p,
147+
Protocol::Ws | Protocol::Wss | Protocol::Memory(_) | Protocol::Tls(_)
148+
) {
149+
None
150+
} else {
151+
Some(p)
152+
}
153+
})
154+
.collect();
155+
if let Some(id) = self.addr_to_id.get(&base_addr) {
114156
self.id_to_info.get_mut(id)
115157
} else {
116158
None

network/src/protocols/feeler.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,8 @@ impl ServiceProtocol for Feeler {
3434
.remove(&session.address);
3535
} else if context.session.ty.is_outbound() {
3636
let flags = self.network_state.with_peer_registry(|reg| {
37-
if let Some(p) = reg.get_peer(session.id) {
38-
p.identify_info
39-
.as_ref()
40-
.map(|i| i.flags)
41-
.unwrap_or(Flags::COMPATIBILITY)
37+
if let Some(p) = reg.feeler_flags(&session.address) {
38+
p
4239
} else {
4340
Flags::COMPATIBILITY
4441
}

network/src/protocols/identify/mod.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -462,10 +462,9 @@ impl Callback for IdentifyCallback {
462462
});
463463
}
464464

465-
if self
466-
.network_state
467-
.with_peer_registry(|reg| reg.is_feeler(&context.session.address))
468-
{
465+
if self.network_state.with_peer_registry_mut(|reg| {
466+
reg.change_feeler_flags(&context.session.address, flags)
467+
}) {
469468
let _ = context
470469
.open_protocols(
471470
context.session.id,

network/src/services/outbound_peer.rs

+21-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ use ckb_logger::trace;
77
use ckb_systemtime::unix_time_as_millis;
88
use futures::{Future, StreamExt};
99
use p2p::runtime::{Interval, MissedTickBehavior};
10-
use p2p::{multiaddr::MultiAddr, service::ServiceControl};
10+
use p2p::{
11+
multiaddr::{MultiAddr, Protocol},
12+
service::ServiceControl,
13+
};
1114
use rand::prelude::IteratorRandom;
1215
use std::{
1316
pin::Pin,
@@ -71,8 +74,10 @@ impl OutboundPeerService {
7174

7275
for mut addr in attempt_peers.into_iter().map(|info| info.addr) {
7376
self.network_state.dial_feeler(&self.p2p_control, {
74-
if !matches!(self.transport_type, TransportType::Tcp) {
75-
addr.push(self.transport_type.into());
77+
match &self.transport_type {
78+
TransportType::Tcp => (),
79+
TransportType::Ws => addr.push(Protocol::Ws),
80+
TransportType::Wss => addr.push(Protocol::Wss),
7681
}
7782
addr
7883
});
@@ -145,17 +150,26 @@ impl OutboundPeerService {
145150

146151
for mut addr in peers {
147152
self.network_state.dial_identify(&self.p2p_control, {
148-
if !matches!(self.transport_type, TransportType::Tcp) {
149-
addr.push(self.transport_type.into());
153+
match &self.transport_type {
154+
TransportType::Tcp => (),
155+
TransportType::Ws => addr.push(Protocol::Ws),
156+
TransportType::Wss => addr.push(Protocol::Wss),
150157
}
151158
addr
152159
});
153160
}
154161
}
155162

156163
fn try_dial_whitelist(&self) {
157-
for addr in self.network_state.config.whitelist_peers() {
158-
self.network_state.dial_identify(&self.p2p_control, addr);
164+
for mut addr in self.network_state.config.whitelist_peers() {
165+
self.network_state.dial_identify(&self.p2p_control, {
166+
match &self.transport_type {
167+
TransportType::Tcp => (),
168+
TransportType::Ws => addr.push(Protocol::Ws),
169+
TransportType::Wss => addr.push(Protocol::Wss),
170+
}
171+
addr
172+
});
159173
}
160174
}
161175

0 commit comments

Comments
 (0)