diff --git a/router/java/src/net/i2p/router/MultiRouter.java b/router/java/src/net/i2p/router/MultiRouter.java index 3d29d1342..144c4e1db 100644 --- a/router/java/src/net/i2p/router/MultiRouter.java +++ b/router/java/src/net/i2p/router/MultiRouter.java @@ -51,9 +51,12 @@ public class MultiRouter { return; } _defaultContext = new I2PAppContext(getEnv(args[0])); + _log = _defaultContext.logManager().getLog(MultiRouter.class); try { Thread.sleep(5*1000); } catch (InterruptedException ie) {} + _defaultContext.clock().setOffset(0); + Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { Thread.currentThread().setName("Router* Shutdown"); @@ -71,8 +74,13 @@ public class MultiRouter { } for (int i = 0; i < _routers.size(); i++) { - ((Router)_routers.get(i)).runRouter(); - _log.info("Router " + i + " started"); + Router r = (Router)_routers.get(i); + long offset = r.getContext().random().nextLong(Router.CLOCK_FUDGE_FACTOR/2); + if (r.getContext().random().nextBoolean()) + offset = 0 - offset; + r.getContext().clock().setOffset(offset, true); + r.runRouter(); + _log.info("Router " + i + " started with clock offset " + offset); try { Thread.sleep(2*1000 + new java.util.Random().nextInt(2)*1000); } catch (InterruptedException ie) {} } _log.info("All " + _routers.size() + " routers started up"); @@ -83,6 +91,7 @@ public class MultiRouter { Properties props = new Properties(); try { props.load(new FileInputStream(filename)); + props.setProperty("time.disabled", "true"); return props; } catch (IOException ioe) { ioe.printStackTrace(); diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index bf267b657..becfc5d62 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -152,6 +152,8 @@ public class Router { /** wall clock uptime */ public long getUptime() { return _context.clock().now() - _context.clock().getOffset() - _started; } + public RouterContext getContext() { return _context; } + void runRouter() { _isAlive = true; _started = _context.clock().now(); @@ -705,7 +707,7 @@ public class Router { } /** update the router.info file whenever its, er, updated */ - private class PersistRouterInfoJob extends JobImpl { + private class PersistRouterInfoJob extends JobImpl { public PersistRouterInfoJob() { super(Router.this._context); } public String getName() { return "Persist Updated Router Information"; } public void runJob() { diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java index 71cc41890..d5ab9c98c 100644 --- a/router/java/src/net/i2p/router/client/ClientManager.java +++ b/router/java/src/net/i2p/router/client/ClientManager.java @@ -187,7 +187,7 @@ public class ClientManager { public void requestLeaseSet(Destination dest, LeaseSet set, long timeout, Job onCreateJob, Job onFailedJob) { ClientConnectionRunner runner = getRunner(dest); if (runner == null) { - if (_log.shouldLog(Log.WARN)) + if (_log.shouldLog(Log.ERROR)) _log.warn("Cannot request the lease set, as we can't find a client runner for " + dest.calculateHash().toBase64() + ". disconnected?"); _context.jobQueue().addJob(onFailedJob); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index 21dfc9d1a..74e5de6b0 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -462,7 +462,12 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public void publish(LeaseSet localLeaseSet) { if (!_initialized) return; Hash h = localLeaseSet.getDestination().calculateHash(); - store(h, localLeaseSet); + try { + store(h, localLeaseSet); + } catch (IllegalArgumentException iae) { + _log.error("wtf, locally published leaseSet is not valid?", iae); + return; + } synchronized (_explicitSendKeys) { _explicitSendKeys.add(h); } diff --git a/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java b/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java index 0fd4397c5..857b8aa85 100644 --- a/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/tcp/RestrictiveTCPConnection.java @@ -117,7 +117,10 @@ class RestrictiveTCPConnection extends TCPConnection { long diff = now.getTime() - theirNow.getTime(); if ( (diff > Router.CLOCK_FUDGE_FACTOR) || (diff < (0-Router.CLOCK_FUDGE_FACTOR)) ) { if (_log.shouldLog(Log.ERROR)) - _log.error("Peer is out of time sync! They think it is " + theirNow + ": " + _remoteIdentity.getHash(), new Exception("Time sync error - please make sure your clock is correct!")); + _log.error("Peer is out of time sync by " + DataHelper.formatDuration(diff) + + "! They think it is " + theirNow + ", we think it is " + + new Date(_context.clock().now()) + ": " + _remoteIdentity.getHash(), + new Exception("Time sync error - please make sure your clock is correct!")); return false; } else { if (_log.shouldLog(Log.DEBUG)) diff --git a/router/java/src/net/i2p/router/tunnelmanager/ClientLeaseSetManagerJob.java b/router/java/src/net/i2p/router/tunnelmanager/ClientLeaseSetManagerJob.java index a6161d5f0..7b97d11bc 100644 --- a/router/java/src/net/i2p/router/tunnelmanager/ClientLeaseSetManagerJob.java +++ b/router/java/src/net/i2p/router/tunnelmanager/ClientLeaseSetManagerJob.java @@ -216,7 +216,8 @@ class ClientLeaseSetManagerJob extends JobImpl { _lastCreated = ctx.clock().now(); _currentLeaseSet = ls; } else { - _log.error("New lease set created, but not found locally? wtf?!"); + _log.error("New lease set created, but not found locally? wtf?! client=" + + _pool.getDestination().calculateHash().toBase64()); } } }