MCPcopy Create free account
hub / github.com/ChainSafe/Delorean-Protocol / start_query

Method start_query

ipld/resolver/src/service.rs:474–507  ·  view source on GitHub ↗

Start a CID resolution.

(&mut self, cid: Cid, subnet_id: SubnetID, response_channel: ResponseChannel)

Source from the content-addressed store, hash-verified

472
473 /// Start a CID resolution.
474 fn start_query(&mut self, cid: Cid, subnet_id: SubnetID, response_channel: ResponseChannel) {
475 let mut peers = self.membership_mut().providers_of_subnet(&subnet_id);
476
477 stats::CONTENT_RESOLVE_PEERS.observe(peers.len() as f64);
478
479 if peers.is_empty() {
480 stats::CONTENT_RESOLVE_NO_PEERS.inc();
481 send_resolve_result(response_channel, Err(anyhow!(NoKnownPeers(subnet_id))));
482 } else {
483 // Connect to them in a random order, so as not to overwhelm any specific peer.
484 peers.shuffle(&mut rand::thread_rng());
485
486 // Prioritize peers we already have an established connection with.
487 let (connected, known) = peers
488 .into_iter()
489 .partition::<Vec<_>, _>(|id| self.swarm.is_connected(id));
490
491 stats::CONTENT_CONNECTED_PEERS.observe(connected.len() as f64);
492
493 let peers = [connected, known].into_iter().flatten().collect();
494 let (peers, fallback) = self.split_peers_for_query(peers);
495
496 let query = Query {
497 cid,
498 subnet_id,
499 response_channel,
500 fallback_peer_ids: fallback,
501 };
502
503 let query_id = self.content_mut().resolve(cid, peers);
504
505 self.queries.insert(query_id, query);
506 }
507 }
508
509 /// Handle the results from a resolve attempt. If it succeeded, notify the
510 /// listener. Otherwise if we have fallback peers to try, start another

Callers 1

handle_requestMethod · 0.80

Calls 10

send_resolve_resultFunction · 0.85
incMethod · 0.80
collectMethod · 0.80
split_peers_for_queryMethod · 0.80
providers_of_subnetMethod · 0.45
membership_mutMethod · 0.45
is_emptyMethod · 0.45
resolveMethod · 0.45
content_mutMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected