/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.node; import freenet.support.LogThresholdCallback; import freenet.support.Logger; import freenet.support.Logger.LogLevel; /** * @author amphibian * * Thread that does DNS queries for unconnected peers */ public class DNSRequester implements Runnable { final Node node; private long lastLogTime; // Only set when doing simulations. static boolean DISABLE = false; private static volatile boolean logMINOR; static { Logger.registerLogThresholdCallback(new LogThresholdCallback() { @Override public void shouldUpdate() { logMINOR = Logger.shouldLog(LogLevel.MINOR, this); } }); } DNSRequester(Node node) { this.node = node; } void start() { Logger.normal(this, "Starting DNSRequester"); System.out.println("Starting DNSRequester"); node.executor.execute(this, "DNSRequester thread for "+node.getDarknetPortNumber()); } @Override public void run() { freenet.support.Logger.OSThread.logPID(this); while(true) { try { realRun(); } catch (Throwable t) { Logger.error(this, "Caught in DNSRequester: "+t, t); } } } private void realRun() { PeerNode[] nodes = node.peers.myPeers(); long now = System.currentTimeMillis(); if((now - lastLogTime) > 1000) { if(logMINOR) Logger.minor(this, "Processing DNS Requests (log rate-limited)"); lastLogTime = now; } for(PeerNode pn: nodes) { //Logger.minor(this, "Node: "+pn); if(!pn.isConnected()) { // Not connected // Try new DNS lookup //Logger.minor(this, "Doing lookup on "+pn+" of "+nodes.length); pn.maybeUpdateHandshakeIPs(false); } } try { synchronized(this) { wait(10000); // sleep 10s ... } } catch (InterruptedException e) { // Ignore, just wake up. Just sleeping to not busy wait anyway } } public void forceRun() { synchronized(this) { notifyAll(); } } }