Class IterativeSearchJob

  • All Implemented Interfaces:
    Job

    public class IterativeSearchJob
    extends FloodSearchJob
    A traditional Kademlia search that continues to search when the initial lookup fails, by iteratively searching the closer-to-the-key peers returned by the query in a DSRM. Unlike traditional Kad, it doesn't stop when there are no closer keys, it keeps going until the timeout or max number of searches is reached. Differences from FloodOnlySearchJob: Chases peers in DSRM's immediately. FOSJ searches the two closest in parallel and then stops. There is no per-search timeout, only a total timeout. Here, we search one at a time, and must have a separate per-search timeout. Advantages: Much more robust than FOSJ, especially in a large network where not all floodfills are known. Longer total timeout. Halves search traffic for successful searches, as this doesn't do two sesarches in parallel like FOSJ does. Public only for JobQueue, not a public API, not for external use.
    Since:
    0.8.9
    • Field Detail

      • DEFAULT_ENCRYPT_RI

        public static final boolean DEFAULT_ENCRYPT_RI
        only on fast boxes, for now
    • Constructor Detail

      • IterativeSearchJob

        public IterativeSearchJob​(RouterContext ctx,
                                  FloodfillNetworkDatabaseFacade facade,
                                  Hash key,
                                  Job onFind,
                                  Job onFailed,
                                  int timeoutMs,
                                  boolean isLease,
                                  Hash fromLocalDest)
        Lookup using the client's tunnels. Do not use for RI lookups down client tunnels, as the response will be dropped in InboundMessageDistributor.
        Parameters:
        fromLocalDest - use these tunnels for the lookup, or null for exploratory
        Since:
        0.9.10
    • Method Detail

      • failed

        void failed​(Hash peer,
                    boolean timedOut)
        Note that the peer did not respond with a DSM (either a DSRM, timeout, or failure). This is not necessarily a total failure of the search.
        Parameters:
        timedOut - if true, will blame the peer's profile
      • newPeerToTry

        void newPeerToTry​(Hash peer)
        A new (floodfill) peer was discovered that may have the answer.
        Parameters:
        peer - may not actually be new
      • getFromHash

        public Hash getFromHash()
        Hash of the dest this query is from
        Returns:
        null for router
        Since:
        0.9.13
      • wasQueried

        public boolean wasQueried​(Hash peer)
        Did we send a request to this peer?
        Since:
        0.9.13
      • timeSent

        long timeSent​(Hash peer)
        When did we send the query to the peer?
        Returns:
        context time, or -1 if never sent
      • dropped

        public void dropped()
        Dropped by the job queue
        Specified by:
        dropped in interface Job
        Overrides:
        dropped in class JobImpl
        Since:
        0.9.31