bitcoinj/bitcoinj — pull request #218 by mackler (2014-09-09 13:33:41+00:00)
Title: Take only as much time as necessary to open Tor circuits for peer-IP DNS lookups

This patch addresses two suboptimal behaviors in the `TorDiscovery` class:

1. Currently it uses [the DNS-lookup timeout](https://github.com/bitcoinj/bitcoinj/blob/master/core/src/main/java/com/google/bitcoin/net/discovery/TorDiscovery.java#L163) as the timeout for opening circuits as well as for actually looking up the IP numbers. It may be this timeout value, [which is five seconds hard-coded into the `PeerGroup` class](https://github.com/bitcoinj/bitcoinj/blob/master/core/src/main/java/com/google/bitcoin/core/PeerGroup.java#L649), was not intended for this purpose. Moreover, the `TorConfig` class [has a value, circuitBuildTimeout](https://github.com/bitcoinj/bitcoinj/blob/master/orchid/src/com/subgraph/orchid/TorConfig.java#L23), apparently for this purpose; at least its default of 60 seconds may be more appropriate for this purpose than the five-second lookup timeout.

2. Currently, the process of opening circuits for the DNS lookups will take exactly as long as the timeout value, no more, no less, which practically guarantees that the client will either wait longer than necessary, or else experience timeout errors that could have been avoided by waiting a bit longer.

The changes herein use the return value of`TorConfig.getCircuitBuildTimeout()` as the timeout for opening circuits, rather than using the DNS lookup timeout value that is passed by `PeerGroup` as an argument to `PeerDiscovery.getPeers()`. Moreover, as soon as a circuit has either been opened or failed to be opened for each router, the DNS lookups then begin without waiting for the timeout time to elapse.

Notes:

1. There are no tests with these changes. There don't seem to be any tests for the `TorDiscovery` class. There probably ought to be.

2. The `TorDiscovery` class's DNS lookup procedure [has the same timeout characteristic as the one this patch removes from the circuit-opening procedure](https://github.com/bitcoinj/bitcoinj/blob/master/core/src/main/java/com/google/bitcoin/net/discovery/TorDiscovery.java#L203), namely it waits for as long as the timeout value, no more no less. If the changes proposed in this patch are acceptable, I would consider making the same change to the process of looking up the peer IP numbers.