protocols/kad: Refactor KademliaEvent (#2321)

Rename `KademliaEvent::InboundRequestServed` to `KademliaEvent::InboundRequest` and move
`InboundPutRecordRequest` into `InboundRequest::PutRecord` and `InboundAddProviderRequest` into
`InboundRequest::AddProvider`.

Co-authored-by: supercmmetry <vishaals2000@gmail.com>
This commit is contained in:
Max Inden
2021-10-30 15:50:45 +02:00
committed by GitHub
parent ff5d455ccf
commit 06c339c141
8 changed files with 89 additions and 64 deletions

View File

@ -45,6 +45,7 @@
## Version 0.41.0 [unreleased] ## Version 0.41.0 [unreleased]
- Update individual crates. - Update individual crates.
- `libp2p-kad`
- `libp2p-websocket` - `libp2p-websocket`
- Forward `wasm-bindgen` feature to `futures-timer`, `instant`, `parking_lot`, `getrandom/js` and `rand/wasm-bindgen`. - Forward `wasm-bindgen` feature to `futures-timer`, `instant`, `parking_lot`, `getrandom/js` and `rand/wasm-bindgen`.

View File

@ -75,7 +75,7 @@ libp2p-core = { version = "0.30.0-rc.2", path = "core", default-features = fals
libp2p-floodsub = { version = "0.31.0-rc.1", path = "protocols/floodsub", optional = true } libp2p-floodsub = { version = "0.31.0-rc.1", path = "protocols/floodsub", optional = true }
libp2p-gossipsub = { version = "0.33.0-rc.1", path = "./protocols/gossipsub", optional = true } libp2p-gossipsub = { version = "0.33.0-rc.1", path = "./protocols/gossipsub", optional = true }
libp2p-identify = { version = "0.31.0-rc.2", path = "protocols/identify", optional = true } libp2p-identify = { version = "0.31.0-rc.2", path = "protocols/identify", optional = true }
libp2p-kad = { version = "0.32.0-rc.2", path = "protocols/kad", optional = true } libp2p-kad = { version = "0.33.0", path = "protocols/kad", optional = true }
libp2p-metrics = { version = "0.1.0-rc.1", path = "misc/metrics", optional = true } libp2p-metrics = { version = "0.1.0-rc.1", path = "misc/metrics", optional = true }
libp2p-mplex = { version = "0.30.0-rc.1", path = "muxers/mplex", optional = true } libp2p-mplex = { version = "0.30.0-rc.1", path = "muxers/mplex", optional = true }
libp2p-noise = { version = "0.33.0-rc.1", path = "transports/noise", optional = true } libp2p-noise = { version = "0.33.0-rc.1", path = "transports/noise", optional = true }

View File

@ -17,7 +17,7 @@ ping = ["libp2p-ping"]
[dependencies] [dependencies]
libp2p-core= { version = "0.30.0-rc.1", path = "../../core" } libp2p-core= { version = "0.30.0-rc.1", path = "../../core" }
libp2p-identify = { version = "0.31.0-rc.1", path = "../../protocols/identify", optional = true } libp2p-identify = { version = "0.31.0-rc.1", path = "../../protocols/identify", optional = true }
libp2p-kad = { version = "0.32.0-rc.1", path = "../../protocols/kad", optional = true } libp2p-kad = { version = "0.33.0", path = "../../protocols/kad", optional = true }
libp2p-ping = { version = "0.31.0-rc.1", path = "../../protocols/ping", optional = true } libp2p-ping = { version = "0.31.0-rc.1", path = "../../protocols/ping", optional = true }
libp2p-swarm = { version = "0.31.0-rc.1", path = "../../swarm" } libp2p-swarm = { version = "0.31.0-rc.1", path = "../../swarm" }
open-metrics-client = "0.12.0" open-metrics-client = "0.12.0"

View File

@ -258,7 +258,7 @@ impl super::Recorder<libp2p_kad::KademliaEvent> for super::Metrics {
} }
} }
libp2p_kad::KademliaEvent::InboundRequestServed { request } => { libp2p_kad::KademliaEvent::InboundRequest { request } => {
self.kad self.kad
.inbound_requests .inbound_requests
.get_or_create(&request.into()) .get_or_create(&request.into())

View File

@ -1,8 +1,13 @@
# 0.32.1 [unreleased] # 0.33.0 [unreleased]
- Use `instant` and `futures-timer` instead of `wasm-timer` (see [PR 2245]). - Use `instant` and `futures-timer` instead of `wasm-timer` (see [PR 2245]).
- Rename `KademliaEvent::InboundRequestServed` to `KademliaEvent::InboundRequest` and move
`InboundPutRecordRequest` into `InboundRequest::PutRecord` and `InboundAddProviderRequest` into
`InboundRequest::AddProvider` (see [PR 2297]).
[PR 2245]: https://github.com/libp2p/rust-libp2p/pull/2245 [PR 2245]: https://github.com/libp2p/rust-libp2p/pull/2245
[PR 2297]: https://github.com/libp2p/rust-libp2p/pull/2297
# 0.32.0-rc.2 [2021-10-15] # 0.32.0-rc.2 [2021-10-15]

View File

@ -2,7 +2,7 @@
name = "libp2p-kad" name = "libp2p-kad"
edition = "2018" edition = "2018"
description = "Kademlia protocol for libp2p" description = "Kademlia protocol for libp2p"
version = "0.32.1" version = "0.33.0"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
license = "MIT" license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p" repository = "https://github.com/libp2p/rust-libp2p"

View File

@ -148,8 +148,8 @@ pub enum KademliaStoreInserts {
/// the record is forwarded immediately to the [`RecordStore`]. /// the record is forwarded immediately to the [`RecordStore`].
Unfiltered, Unfiltered,
/// Whenever a (provider) record is received, an event is emitted. /// Whenever a (provider) record is received, an event is emitted.
/// Provider records generate a [`KademliaEvent::InboundAddProviderRequest`], /// Provider records generate a [`InboundRequest::AddProvider`] under [`KademliaEvent::InboundRequest`],
/// normal records generate a [`KademliaEvent::InboundPutRecordRequest`]. /// normal records generate a [`InboundRequest::PutRecord`] under [`KademliaEvent::InboundRequest`].
/// ///
/// When deemed valid, a (provider) record needs to be explicitly stored in /// When deemed valid, a (provider) record needs to be explicitly stored in
/// the [`RecordStore`] via [`RecordStore::put`] or [`RecordStore::add_provider`], /// the [`RecordStore`] via [`RecordStore::put`] or [`RecordStore::add_provider`],
@ -1625,11 +1625,23 @@ where
// is a waste of resources. // is a waste of resources.
match self.record_filtering { match self.record_filtering {
KademliaStoreInserts::Unfiltered => match self.store.put(record.clone()) { KademliaStoreInserts::Unfiltered => match self.store.put(record.clone()) {
Ok(()) => debug!( Ok(()) => {
"Record stored: {:?}; {} bytes", debug!(
record.key, "Record stored: {:?}; {} bytes",
record.value.len() record.key,
), record.value.len()
);
self.queued_events
.push_back(NetworkBehaviourAction::GenerateEvent(
KademliaEvent::InboundRequest {
request: InboundRequest::PutRecord {
source,
connection,
record: None,
},
},
));
}
Err(e) => { Err(e) => {
info!("Record not stored: {:?}", e); info!("Record not stored: {:?}", e);
self.queued_events self.queued_events
@ -1638,16 +1650,19 @@ where
handler: NotifyHandler::One(connection), handler: NotifyHandler::One(connection),
event: KademliaHandlerIn::Reset(request_id), event: KademliaHandlerIn::Reset(request_id),
}); });
return; return;
} }
}, },
KademliaStoreInserts::FilterBoth => { KademliaStoreInserts::FilterBoth => {
self.queued_events self.queued_events
.push_back(NetworkBehaviourAction::GenerateEvent( .push_back(NetworkBehaviourAction::GenerateEvent(
KademliaEvent::InboundPutRecordRequest { KademliaEvent::InboundRequest {
source, request: InboundRequest::PutRecord {
connection, source,
record: record.clone(), connection,
record: Some(record.clone()),
},
}, },
)); ));
} }
@ -1686,12 +1701,24 @@ where
KademliaStoreInserts::Unfiltered => { KademliaStoreInserts::Unfiltered => {
if let Err(e) = self.store.add_provider(record) { if let Err(e) = self.store.add_provider(record) {
info!("Provider record not stored: {:?}", e); info!("Provider record not stored: {:?}", e);
return;
} }
self.queued_events
.push_back(NetworkBehaviourAction::GenerateEvent(
KademliaEvent::InboundRequest {
request: InboundRequest::AddProvider { record: None },
},
));
} }
KademliaStoreInserts::FilterBoth => { KademliaStoreInserts::FilterBoth => {
self.queued_events self.queued_events
.push_back(NetworkBehaviourAction::GenerateEvent( .push_back(NetworkBehaviourAction::GenerateEvent(
KademliaEvent::InboundAddProviderRequest { record }, KademliaEvent::InboundRequest {
request: InboundRequest::AddProvider {
record: Some(record),
},
},
)); ));
} }
} }
@ -1951,7 +1978,7 @@ where
self.queued_events self.queued_events
.push_back(NetworkBehaviourAction::GenerateEvent( .push_back(NetworkBehaviourAction::GenerateEvent(
KademliaEvent::InboundRequestServed { KademliaEvent::InboundRequest {
request: InboundRequest::FindNode { request: InboundRequest::FindNode {
num_closer_peers: closer_peers.len(), num_closer_peers: closer_peers.len(),
}, },
@ -1982,7 +2009,7 @@ where
self.queued_events self.queued_events
.push_back(NetworkBehaviourAction::GenerateEvent( .push_back(NetworkBehaviourAction::GenerateEvent(
KademliaEvent::InboundRequestServed { KademliaEvent::InboundRequest {
request: InboundRequest::GetProvider { request: InboundRequest::GetProvider {
num_closer_peers: closer_peers.len(), num_closer_peers: closer_peers.len(),
num_provider_peers: provider_peers.len(), num_provider_peers: provider_peers.len(),
@ -2039,13 +2066,6 @@ where
} }
self.provider_received(key, provider); self.provider_received(key, provider);
self.queued_events
.push_back(NetworkBehaviourAction::GenerateEvent(
KademliaEvent::InboundRequestServed {
request: InboundRequest::AddProvider {},
},
));
} }
KademliaHandlerEvent::GetRecord { key, request_id } => { KademliaHandlerEvent::GetRecord { key, request_id } => {
@ -2066,7 +2086,7 @@ where
self.queued_events self.queued_events
.push_back(NetworkBehaviourAction::GenerateEvent( .push_back(NetworkBehaviourAction::GenerateEvent(
KademliaEvent::InboundRequestServed { KademliaEvent::InboundRequest {
request: InboundRequest::GetRecord { request: InboundRequest::GetRecord {
num_closer_peers: closer_peers.len(), num_closer_peers: closer_peers.len(),
present_locally: record.is_some(), present_locally: record.is_some(),
@ -2150,13 +2170,6 @@ where
KademliaHandlerEvent::PutRecord { record, request_id } => { KademliaHandlerEvent::PutRecord { record, request_id } => {
self.record_received(source, connection, request_id, record); self.record_received(source, connection, request_id, record);
self.queued_events
.push_back(NetworkBehaviourAction::GenerateEvent(
KademliaEvent::InboundRequestServed {
request: InboundRequest::PutRecord {},
},
));
} }
KademliaHandlerEvent::PutRecordRes { user_data, .. } => { KademliaHandlerEvent::PutRecordRes { user_data, .. } => {
@ -2371,26 +2384,12 @@ pub struct PeerRecord {
/// See [`NetworkBehaviour::poll`]. /// See [`NetworkBehaviour::poll`].
#[derive(Debug)] #[derive(Debug)]
pub enum KademliaEvent { pub enum KademliaEvent {
/// A peer sent a [`KademliaHandlerIn::PutRecord`] request and filtering is enabled.
///
/// See [`KademliaStoreInserts`] and [`KademliaConfig::set_record_filtering`].
InboundPutRecordRequest {
source: PeerId,
connection: ConnectionId,
record: Record,
},
/// A peer sent a [`KademliaHandlerIn::AddProvider`] request and filtering [`KademliaStoreInserts::FilterBoth`] is enabled.
///
/// See [`KademliaStoreInserts`] and [`KademliaConfig::set_record_filtering`] for details..
InboundAddProviderRequest { record: ProviderRecord },
/// An inbound request has been received and handled. /// An inbound request has been received and handled.
// //
// Note on the difference between 'request' and 'query': A request is a // Note on the difference between 'request' and 'query': A request is a
// single request-response style exchange with a single remote peer. A query // single request-response style exchange with a single remote peer. A query
// is made of multiple requests across multiple remote peers. // is made of multiple requests across multiple remote peers.
InboundRequestServed { request: InboundRequest }, InboundRequest { request: InboundRequest },
/// An outbound query has produced a result. /// An outbound query has produced a result.
OutboundQueryCompleted { OutboundQueryCompleted {
@ -2464,15 +2463,26 @@ pub enum InboundRequest {
num_closer_peers: usize, num_closer_peers: usize,
num_provider_peers: usize, num_provider_peers: usize,
}, },
/// Request to store a peer as a provider. /// A peer sent a [`KademliaHandlerIn::AddProvider`] request.
AddProvider {}, /// If filtering [`KademliaStoreInserts::FilterBoth`] is enabled, the [`ProviderRecord`] is
/// included.
///
/// See [`KademliaStoreInserts`] and [`KademliaConfig::set_record_filtering`] for details..
AddProvider { record: Option<ProviderRecord> },
/// Request to retrieve a record. /// Request to retrieve a record.
GetRecord { GetRecord {
num_closer_peers: usize, num_closer_peers: usize,
present_locally: bool, present_locally: bool,
}, },
/// Request to store a record. /// A peer sent a [`KademliaHandlerIn::PutRecord`] request.
PutRecord {}, /// If filtering [`KademliaStoreInserts::FilterBoth`] is enabled, the [`Record`] is included.
///
/// See [`KademliaStoreInserts`] and [`KademliaConfig::set_record_filtering`].
PutRecord {
source: PeerId,
connection: ConnectionId,
record: Option<Record>,
},
} }
/// The results of Kademlia queries. /// The results of Kademlia queries.

View File

@ -602,19 +602,28 @@ fn put_record() {
} }
} }
Poll::Ready(Some(SwarmEvent::Behaviour( Poll::Ready(Some(SwarmEvent::Behaviour(
KademliaEvent::InboundPutRecordRequest { record, .. }, KademliaEvent::InboundRequest {
request: InboundRequest::PutRecord { record, .. },
},
))) => { ))) => {
assert_ne!(
swarm.behaviour().record_filtering,
KademliaStoreInserts::Unfiltered
);
if !drop_records { if !drop_records {
// Accept the record if let Some(record) = record {
swarm assert_eq!(
.behaviour_mut() swarm.behaviour().record_filtering,
.store_mut() KademliaStoreInserts::FilterBoth
.put(record) );
.expect("record is stored"); // Accept the record
swarm
.behaviour_mut()
.store_mut()
.put(record)
.expect("record is stored");
} else {
assert_eq!(
swarm.behaviour().record_filtering,
KademliaStoreInserts::Unfiltered
);
}
} }
} }
// Ignore any other event. // Ignore any other event.