@@ -731,48 +731,55 @@ where
731731 } ) ;
732732
733733 if full_kademlia_support {
734- //TODO: Consider restoring obsolete address removal
735- // let old_addresses = kademlia
736- // .kbucket(peer_id)
737- // .and_then(|peers| {
738- // let key = peer_id.into();
739- // peers.iter().find_map(|peer| {
740- // (peer.node.key == &key).then_some(
741- // peer.node
742- // .value
743- // .iter()
744- // .filter(|address| info.listen_addrs.contains(address))
745- // .cloned()
746- // .collect::<Vec<_>>(),
747- // )
748- // })
749- // })
750- // .unwrap_or_default();
751-
752- // for old_address in old_addresses {
753- // trace!(
754- // %local_peer_id,
755- // %peer_id,
756- // %old_address,
757- // "Removing old self-reported address from Kademlia DHT",
758- // );
759- //
760- // kademlia.remove_address(&peer_id, &old_address);
761- // }
734+ let received_addresses = info
735+ . listen_addrs
736+ . into_iter ( )
737+ . filter ( |address| {
738+ if self . allow_non_global_addresses_in_dht
739+ || is_global_address_or_dns ( address)
740+ {
741+ true
742+ } else {
743+ trace ! (
744+ %local_peer_id,
745+ %peer_id,
746+ %address,
747+ "Ignoring self-reported non-global address" ,
748+ ) ;
762749
763- for address in info. listen_addrs {
764- if !self . allow_non_global_addresses_in_dht
765- && !is_global_address_or_dns ( & address)
766- {
767- trace ! (
768- %local_peer_id,
769- %peer_id,
770- %address,
771- "Ignoring self-reported non-global address" ,
772- ) ;
773- continue ;
774- }
750+ false
751+ }
752+ } )
753+ . collect :: < Vec < _ > > ( ) ;
754+ let received_address_strings = received_addresses
755+ . iter ( )
756+ . map ( ToString :: to_string)
757+ . collect :: < Vec < _ > > ( ) ;
758+ let old_addresses = kademlia
759+ . kbucket ( peer_id)
760+ . and_then ( |peers| {
761+ let key = peer_id. into ( ) ;
762+ peers. iter ( ) . find_map ( |peer| {
763+ ( peer. node . key == & key) . then_some (
764+ peer. node
765+ . value
766+ . iter ( )
767+ . filter ( |existing_address| {
768+ let existing_address = existing_address. to_string ( ) ;
769+
770+ !received_address_strings. iter ( ) . any ( |received_address| {
771+ received_address. starts_with ( & existing_address)
772+ || existing_address. starts_with ( received_address)
773+ } )
774+ } )
775+ . cloned ( )
776+ . collect :: < Vec < _ > > ( ) ,
777+ )
778+ } )
779+ } )
780+ . unwrap_or_default ( ) ;
775781
782+ for address in received_addresses {
776783 debug ! (
777784 %local_peer_id,
778785 %peer_id,
@@ -783,6 +790,17 @@ where
783790
784791 kademlia. add_address ( & peer_id, address) ;
785792 }
793+
794+ for old_address in old_addresses {
795+ trace ! (
796+ %local_peer_id,
797+ %peer_id,
798+ %old_address,
799+ "Removing old self-reported address from Kademlia DHT" ,
800+ ) ;
801+
802+ kademlia. remove_address ( & peer_id, & old_address) ;
803+ }
786804 } else {
787805 debug ! (
788806 %local_peer_id,
0 commit comments