mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-15 11:01:21 +00:00
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:
@ -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`.
|
||||||
|
|
||||||
|
@ -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 }
|
||||||
|
@ -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"
|
||||||
|
@ -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())
|
||||||
|
@ -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]
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
Reference in New Issue
Block a user