Skip to content

Commit 6446249

Browse files
committed
fix: make record optional in InboundRequest
Signed-off-by: supercmmetry <vishaals2000@gmail.com>
1 parent f8e521b commit 6446249

2 files changed

Lines changed: 80 additions & 35 deletions

File tree

protocols/kad/src/behaviour.rs

Lines changed: 62 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ pub enum KademliaStoreInserts {
147147
/// Whenever a (provider) record is received,
148148
/// the record is forwarded immediately to the [`RecordStore`].
149149
Unfiltered,
150+
/// Whenever a (provider) record is received, an event is emitted.
151+
/// Provider records generate a [`InboundRequest::AddProvider`] under [`KademliaEvent::InboundRequest`],
152+
/// normal records generate a [`InboundRequest::PutRecord`] under [`KademliaEvent::InboundRequest`].
153+
///
150154
/// When deemed valid, a (provider) record needs to be explicitly stored in
151155
/// the [`RecordStore`] via [`RecordStore::put`] or [`RecordStore::add_provider`],
152156
/// whichever is applicable. A mutable reference to the [`RecordStore`] can
@@ -1621,11 +1625,23 @@ where
16211625
// is a waste of resources.
16221626
match self.record_filtering {
16231627
KademliaStoreInserts::Unfiltered => match self.store.put(record.clone()) {
1624-
Ok(()) => debug!(
1625-
"Record stored: {:?}; {} bytes",
1626-
record.key,
1627-
record.value.len()
1628-
),
1628+
Ok(()) => {
1629+
debug!(
1630+
"Record stored: {:?}; {} bytes",
1631+
record.key,
1632+
record.value.len()
1633+
);
1634+
self.queued_events
1635+
.push_back(NetworkBehaviourAction::GenerateEvent(
1636+
KademliaEvent::InboundRequest {
1637+
request: InboundRequest::PutRecord {
1638+
source,
1639+
connection,
1640+
record: None,
1641+
},
1642+
},
1643+
));
1644+
}
16291645
Err(e) => {
16301646
info!("Record not stored: {:?}", e);
16311647
self.queued_events
@@ -1634,22 +1650,23 @@ where
16341650
handler: NotifyHandler::One(connection),
16351651
event: KademliaHandlerIn::Reset(request_id),
16361652
});
1653+
16371654
return;
16381655
}
16391656
},
1640-
KademliaStoreInserts::FilterBoth => {}
1657+
KademliaStoreInserts::FilterBoth => {
1658+
self.queued_events
1659+
.push_back(NetworkBehaviourAction::GenerateEvent(
1660+
KademliaEvent::InboundRequest {
1661+
request: InboundRequest::PutRecord {
1662+
source,
1663+
connection,
1664+
record: Some(record.clone()),
1665+
},
1666+
},
1667+
));
1668+
}
16411669
}
1642-
1643-
self.queued_events
1644-
.push_back(NetworkBehaviourAction::GenerateEvent(
1645-
KademliaEvent::InboundRequest {
1646-
request: InboundRequest::PutRecord {
1647-
source,
1648-
connection,
1649-
record: record.clone(),
1650-
},
1651-
},
1652-
));
16531670
}
16541671

16551672
// The remote receives a [`KademliaHandlerIn::PutRecordRes`] even in the
@@ -1686,16 +1703,25 @@ where
16861703
info!("Provider record not stored: {:?}", e);
16871704
return;
16881705
}
1706+
1707+
self.queued_events
1708+
.push_back(NetworkBehaviourAction::GenerateEvent(
1709+
KademliaEvent::InboundRequest {
1710+
request: InboundRequest::AddProvider { record: None },
1711+
},
1712+
));
1713+
}
1714+
KademliaStoreInserts::FilterBoth => {
1715+
self.queued_events
1716+
.push_back(NetworkBehaviourAction::GenerateEvent(
1717+
KademliaEvent::InboundRequest {
1718+
request: InboundRequest::AddProvider {
1719+
record: Some(record),
1720+
},
1721+
},
1722+
));
16891723
}
1690-
KademliaStoreInserts::FilterBoth => {}
16911724
}
1692-
1693-
self.queued_events
1694-
.push_back(NetworkBehaviourAction::GenerateEvent(
1695-
KademliaEvent::InboundRequest {
1696-
request: InboundRequest::AddProvider { record },
1697-
},
1698-
));
16991725
}
17001726
}
17011727

@@ -2437,18 +2463,25 @@ pub enum InboundRequest {
24372463
num_closer_peers: usize,
24382464
num_provider_peers: usize,
24392465
},
2440-
/// Request to store a peer as a provider.
2441-
AddProvider { record: ProviderRecord },
2466+
/// A peer sent a [`KademliaHandlerIn::AddProvider`] request.
2467+
/// If filtering [`KademliaStoreInserts::FilterBoth`] is enabled, the [`ProviderRecord`] is
2468+
/// included.
2469+
///
2470+
/// See [`KademliaStoreInserts`] and [`KademliaConfig::set_record_filtering`] for details..
2471+
AddProvider { record: Option<ProviderRecord> },
24422472
/// Request to retrieve a record.
24432473
GetRecord {
24442474
num_closer_peers: usize,
24452475
present_locally: bool,
24462476
},
2447-
/// Request to store a record.
2477+
/// A peer sent a [`KademliaHandlerIn::PutRecord`] request.
2478+
/// If filtering [`KademliaStoreInserts::FilterBoth`] is enabled, the [`Record`] is included.
2479+
///
2480+
/// See [`KademliaStoreInserts`] and [`KademliaConfig::set_record_filtering`].
24482481
PutRecord {
24492482
source: PeerId,
24502483
connection: ConnectionId,
2451-
record: Record,
2484+
record: Option<Record>,
24522485
},
24532486
}
24542487

protocols/kad/src/behaviour/test.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
use super::*;
2424

25+
use crate::behaviour::KademliaStoreInserts::Unfiltered;
2526
use crate::kbucket::Distance;
2627
use crate::record::{store::MemoryStore, Key};
2728
use crate::K_VALUE;
@@ -607,12 +608,23 @@ fn put_record() {
607608
},
608609
))) => {
609610
if !drop_records {
610-
// Accept the record
611-
swarm
612-
.behaviour_mut()
613-
.store_mut()
614-
.put(record)
615-
.expect("record is stored");
611+
if let Some(record) = record {
612+
assert_eq!(
613+
swarm.behaviour().record_filtering,
614+
KademliaStoreInserts::FilterBoth
615+
);
616+
// Accept the record
617+
swarm
618+
.behaviour_mut()
619+
.store_mut()
620+
.put(record)
621+
.expect("record is stored");
622+
} else {
623+
assert_eq!(
624+
swarm.behaviour().record_filtering,
625+
KademliaStoreInserts::Unfiltered
626+
);
627+
}
616628
}
617629
}
618630
// Ignore any other event.

0 commit comments

Comments
 (0)