feat(brahman-net+handshake): stop_providing automatico en cleanup
Cierra el pendiente conocido del DHT: hasta ahora cuando una sesion con outputs cerraba (Farewell, EOF, error), el record que la anunciaba en el DHT seguia vivo hasta su TTL natural (~24h en kad default). Consumers remotos podian descubrir un peer "vivo" que ya no servia nada. Cambios: - BrahmanNet::stop_providing(key) (nuevo): contraparte simetrica de start_providing. Manda Command::StopProviding al swarm que llama kad.stop_providing(&key). Borra el record local al instante; replicas remotas siguen expirando por TTL (kad no expone retraccion cross-peer, simetrico al hecho de que start_providing tambien propaga eventualmente). - brahman_handshake::network::withdraw_outputs(net, card) (nuevo): contraparte de announce_outputs. Itera card.flow.output y llama net.stop_providing(flow_dht_key(...)) por cada uno. - server::cleanup: extrae la ResolvedCard removida del registro de sesiones (en lugar de descartarla) y, si config.net esta set, llama withdraw_outputs(net, &card) antes de broadcast_match_diffs. Tests: nuevo E2E dht_discovery_withdraws_on_session_cleanup: 1. A registra Card con flow.output = monad-list:json. 2. B descubre a A via find_remote_providers (assert before contains a_peer). 3. Cliente local de A hace farewell -> cleanup -> withdraw_outputs. 4. Espera a que la sesion salga del registro + 100ms para que el swarm procese el Command. 5. Nueva query desde B: after NO debe contener a_peer. 3 tests verdes en network_discovery.rs (positivo, negativo, withdraw). 18 tests totales en handshake + net.
This commit is contained in:
@@ -84,6 +84,7 @@ enum Command {
|
||||
AddDhtPeer(PeerId, Multiaddr),
|
||||
FindClosestPeers(PeerId, oneshot::Sender<Vec<DiscoveredPeer>>),
|
||||
StartProviding(Vec<u8>),
|
||||
StopProviding(Vec<u8>),
|
||||
GetProviders(Vec<u8>, oneshot::Sender<Vec<PeerId>>),
|
||||
}
|
||||
|
||||
@@ -211,6 +212,18 @@ impl BrahmanNet {
|
||||
// conexión con nosotros.
|
||||
let _ = swarm.behaviour_mut().kad.start_providing(key.into());
|
||||
}
|
||||
Command::StopProviding(key) => {
|
||||
// Quitamos el record local del provider store.
|
||||
// Los peers cercanos eventualmente expiran su
|
||||
// copia replicada por TTL natural (~24h en
|
||||
// libp2p kad default); para retiro inmediato
|
||||
// habría que enviar un republish con sentinel,
|
||||
// pero kad no expone esa primitiva. Aceptable
|
||||
// para el caso "el provider local desapareció":
|
||||
// queries que pasen por nosotros dejan de
|
||||
// listarnos al instante.
|
||||
swarm.behaviour_mut().kad.stop_providing(&key.into());
|
||||
}
|
||||
Command::GetProviders(key, tx) => {
|
||||
let qid = swarm.behaviour_mut().kad.get_providers(key.into());
|
||||
pending_providers.insert(qid, (Vec::new(), tx));
|
||||
@@ -355,6 +368,16 @@ impl BrahmanNet {
|
||||
let _ = self.cmd_tx.send(Command::StartProviding(key.to_vec()));
|
||||
}
|
||||
|
||||
/// Retira el anuncio previo de [`start_providing`] para `key`.
|
||||
/// El record local se borra al instante (queries que lleguen a
|
||||
/// nosotros dejan de listarnos). Los records replicados en peers
|
||||
/// remotos viven hasta su TTL — kad no expone primitiva para
|
||||
/// retracción inmediata cross-peer. Aceptable: simétrico al
|
||||
/// caso "el provider apareció" (también propagación eventual).
|
||||
pub fn stop_providing(&self, key: &[u8]) {
|
||||
let _ = self.cmd_tx.send(Command::StopProviding(key.to_vec()));
|
||||
}
|
||||
|
||||
/// Consulta el DHT por peers que han anunciado proveer `key`.
|
||||
/// Devuelve la lista de `PeerId`s que se reportan como providers.
|
||||
/// Lista vacía si nadie anuncia.
|
||||
|
||||
Reference in New Issue
Block a user