From toad at freenetproject.org Fri Feb 1 16:19:59 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Fri, 1 Feb 2008 16:19:59 +0000 (UTC) Subject: [freenet-cvs] r17456 - trunk/freenet/src/freenet/support Message-ID: <20080201161959.25829391C86@freenetproject.org> Author: toad Date: 2008-02-01 16:19:58 +0000 (Fri, 01 Feb 2008) New Revision: 17456 Modified: trunk/freenet/src/freenet/support/FileLoggerHook.java Log: \n at end of (null). Add (no stack trace)\n if no stack trace. Modified: trunk/freenet/src/freenet/support/FileLoggerHook.java =================================================================== --- trunk/freenet/src/freenet/support/FileLoggerHook.java 2008-01-31 23:27:50 UTC (rev 17455) +++ trunk/freenet/src/freenet/support/FileLoggerHook.java 2008-02-01 16:19:58 UTC (rev 17456) @@ -822,7 +822,9 @@ StackTraceElement[] trace = e.getStackTrace(); if(trace == null) - sb.append("(null)"); + sb.append("(null)\n"); + else if(trace.length == 0) + sb.append("(no stack trace)\n"); else { sb.append('\n'); for(int i=0;i Author: toad Date: 2008-02-01 16:27:02 +0000 (Fri, 01 Feb 2008) New Revision: 17457 Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java Log: logging Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java =================================================================== --- trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-02-01 16:19:58 UTC (rev 17456) +++ trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-02-01 16:27:02 UTC (rev 17457) @@ -288,6 +288,7 @@ if(logMINOR) Logger.minor(this, "Last detect failed less than 5 minutes ago"); return; } else { + if(logMINOR) Logger.minor(this, "Last detect failed, redetecting"); startDetect(); return; } @@ -346,6 +347,7 @@ int realDisconnected = 0; int recentlyConnected = 0; + if(logMINOR) Logger.minor(this, "Checking whether should detect with "+peers.length+" peers and "+conns.length+" conns, counting peers..."); for(int i=0;i Author: toad Date: 2008-02-01 16:27:52 +0000 (Fri, 01 Feb 2008) New Revision: 17458 Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java Log: Maybe fix NPE Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java =================================================================== --- trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-02-01 16:27:02 UTC (rev 17457) +++ trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-02-01 16:27:52 UTC (rev 17458) @@ -352,6 +352,8 @@ PeerNode p = peers[i]; if(p.isDisabled()) continue; // Don't count localhost, LAN addresses. + Peer peer = p.getPeer(); + if(peer == null) continue; FreenetInetAddress a = p.getPeer().getFreenetAddress(); if(a != null) { InetAddress addr = a.getAddress(false); From toad at freenetproject.org Fri Feb 1 16:28:32 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Fri, 1 Feb 2008 16:28:32 +0000 (UTC) Subject: [freenet-cvs] r17459 - trunk/freenet/src/freenet/node Message-ID: <20080201162832.BB61B392111@freenetproject.org> Author: toad Date: 2008-02-01 16:28:32 +0000 (Fri, 01 Feb 2008) New Revision: 17459 Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java Log: Trivial refactor Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java =================================================================== --- trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-02-01 16:27:52 UTC (rev 17458) +++ trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-02-01 16:28:32 UTC (rev 17459) @@ -355,7 +355,7 @@ Peer peer = p.getPeer(); if(peer == null) continue; FreenetInetAddress a = p.getPeer().getFreenetAddress(); - if(a != null) { + if(a == null) continue; // Not much chance of connecting. InetAddress addr = a.getAddress(false); if(addr != null) { if(!IPUtil.isValidAddress(addr, false)) continue; @@ -368,7 +368,6 @@ } } if(skip) continue; - } else continue; // Not much chance of connecting. if(p.isConnected()) realConnections++; else { From toad at freenetproject.org Fri Feb 1 16:28:50 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Fri, 1 Feb 2008 16:28:50 +0000 (UTC) Subject: [freenet-cvs] r17460 - trunk/freenet/src/freenet/node Message-ID: <20080201162850.D689A39226B@freenetproject.org> Author: toad Date: 2008-02-01 16:28:50 +0000 (Fri, 01 Feb 2008) New Revision: 17460 Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java Log: indent Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java =================================================================== --- trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-02-01 16:28:32 UTC (rev 17459) +++ trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-02-01 16:28:50 UTC (rev 17460) @@ -356,18 +356,18 @@ if(peer == null) continue; FreenetInetAddress a = p.getPeer().getFreenetAddress(); if(a == null) continue; // Not much chance of connecting. - InetAddress addr = a.getAddress(false); - if(addr != null) { - if(!IPUtil.isValidAddress(addr, false)) continue; + InetAddress addr = a.getAddress(false); + if(addr != null) { + if(!IPUtil.isValidAddress(addr, false)) continue; + } + boolean skip = false; + for(int j=0;j Author: toad Date: 2008-02-01 16:29:05 +0000 (Fri, 01 Feb 2008) New Revision: 17461 Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java Log: trivial Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java =================================================================== --- trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-02-01 16:28:50 UTC (rev 17460) +++ trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-02-01 16:29:05 UTC (rev 17461) @@ -354,7 +354,7 @@ // Don't count localhost, LAN addresses. Peer peer = p.getPeer(); if(peer == null) continue; - FreenetInetAddress a = p.getPeer().getFreenetAddress(); + FreenetInetAddress a = peer.getFreenetAddress(); if(a == null) continue; // Not much chance of connecting. InetAddress addr = a.getAddress(false); if(addr != null) { From robert at freenetproject.org Fri Feb 1 18:17:15 2008 From: robert at freenetproject.org (robert at freenetproject.org) Date: Fri, 1 Feb 2008 18:17:15 +0000 (UTC) Subject: [freenet-cvs] r17462 - trunk/freenet/src/freenet/node/simulator Message-ID: <20080201181715.D4F8C3909D1@freenetproject.org> Author: robert Date: 2008-02-01 18:17:15 +0000 (Fri, 01 Feb 2008) New Revision: 17462 Modified: trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java Log: logging, and try to fetch even if insert fails Modified: trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java =================================================================== --- trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java 2008-02-01 16:29:05 UTC (rev 17461) +++ trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java 2008-02-01 18:17:15 UTC (rev 17462) @@ -37,6 +37,8 @@ static final int NUMBER_OF_NODES = 10; static final short MAX_HTL = 5; + //static final int NUMBER_OF_NODES = 50; + //static final short MAX_HTL = 10; public static void main(String[] args) throws FSParseException, PeerParseException, CHKEncodeException, InvalidThresholdException, NodeInitException, ReferenceSignatureVerificationException { String wd = "realNodeRequestInsertTest"; @@ -44,8 +46,8 @@ //NOTE: globalTestInit returns in ignored random source NodeStarter.globalTestInit(wd); // Don't clobber nearby nodes! - Logger.setupStdoutLogging(Logger.DEBUG, "freenet.store:minor,freenet.node.Location:normal" /*"freenet.node.LocationManager:debug,freenet.node.FNPPacketManager:normal,freenet.io.comm.MessageCore:debug"*/); - Logger.globalSetThreshold(Logger.DEBUG); + Logger.setupStdoutLogging(Logger.ERROR, "freenet.node.Location:normal,freenet.node.simulator.RealNodeRoutingTest:normal" /*"freenet.store:minor,freenet.node.LocationManager:debug,freenet.node.FNPPacketManager:normal,freenet.io.comm.MessageCore:debug"*/); + Logger.globalSetThreshold(Logger.ERROR); System.out.println("Insert/retrieve test"); System.out.println(); DummyRandomSource random = new DummyRandomSource(); @@ -134,7 +136,7 @@ Node randomNode2 = randomNode; while(randomNode2 == randomNode) randomNode2 = nodes[random.nextInt(NUMBER_OF_NODES)]; - Logger.normal(RealNodeRoutingTest.class, "Pinging "+randomNode2.getDarknetPortNumber()+" from "+randomNode.getDarknetPortNumber()); + Logger.minor(RealNodeRoutingTest.class, "Pinging "+randomNode2.getDarknetPortNumber()+" from "+randomNode.getDarknetPortNumber()); double loc2 = randomNode2.getLocation(); int hopsTaken = randomNode.routedPing(loc2); pings++; @@ -165,6 +167,9 @@ int requestNumber = 0; RunningAverage requestsAvg = new SimpleRunningAverage(100, 0.0); String baseString = System.currentTimeMillis() + " "; + int insertAttempts = 0; + int insertSuccesses = 0; + int fetchSuccesses = 0; while(true) { try { requestNumber++; @@ -184,12 +189,18 @@ byte[] encData = block.getData(); byte[] encHeaders = block.getHeaders(); ClientCHKBlock newBlock = new ClientCHKBlock(encData, encHeaders, chk, true); - Logger.error(RealNodeRequestInsertTest.class, "Decoded: "+new String(newBlock.memoryDecode())); - Logger.error(RealNodeRequestInsertTest.class,"CHK: "+chk.getURI()); - Logger.error(RealNodeRequestInsertTest.class,"Headers: "+HexUtil.bytesToHex(block.getHeaders())); - randomNode.clientCore.realPut(block, true); - Logger.error(RealNodeRequestInsertTest.class, "Inserted to "+node1); - Logger.error(RealNodeRequestInsertTest.class, "Data: "+Fields.hashCode(encData)+", Headers: "+Fields.hashCode(encHeaders)); + Logger.minor(RealNodeRequestInsertTest.class, "Decoded: "+new String(newBlock.memoryDecode())); + Logger.normal(RealNodeRequestInsertTest.class,"CHK: "+chk.getURI()); + Logger.minor(RealNodeRequestInsertTest.class,"Headers: "+HexUtil.bytesToHex(block.getHeaders())); + try { + insertAttempts++; + randomNode.clientCore.realPut(block, true); + Logger.error(RealNodeRequestInsertTest.class, "Inserted to "+node1); + Logger.minor(RealNodeRequestInsertTest.class, "Data: "+Fields.hashCode(encData)+", Headers: "+Fields.hashCode(encHeaders)); + insertSuccesses++; + } catch (freenet.node.LowLevelPutException putEx) { + Logger.error(RealNodeRequestInsertTest.class, "Insert failed: "+ putEx); + } // Pick random node to request from int node2; do { @@ -198,13 +209,16 @@ Node fetchNode = nodes[node2]; block = (ClientCHKBlock) fetchNode.clientCore.realGetKey((ClientKey) chk, false, true, false); if(block == null) { - Logger.error(RealNodeRequestInsertTest.class, "Fetch FAILED from "+node2); + int percentSuccess=100*fetchSuccesses/insertAttempts; + Logger.error(RealNodeRequestInsertTest.class, "Fetch #"+requestNumber+" FAILED ("+percentSuccess+"%); from "+node2); requestsAvg.report(0.0); } else { byte[] results = block.memoryDecode(); requestsAvg.report(1.0); if(Arrays.equals(results, data)) { - Logger.error(RealNodeRequestInsertTest.class, "Fetch succeeded: "+new String(results)); + fetchSuccesses++; + int percentSuccess=100*fetchSuccesses/insertAttempts; + Logger.error(RealNodeRequestInsertTest.class, "Fetch #"+requestNumber+" succeeded ("+percentSuccess+"%): "+new String(results)); } else { Logger.error(RealNodeRequestInsertTest.class, "Returned invalid data!: "+new String(results)); } From robert at freenetproject.org Fri Feb 1 19:25:56 2008 From: robert at freenetproject.org (robert at freenetproject.org) Date: Fri, 1 Feb 2008 19:25:56 +0000 (UTC) Subject: [freenet-cvs] r17464 - trunk/freenet/src/freenet/support Message-ID: <20080201192556.B7108478989@freenetproject.org> Author: robert Date: 2008-02-01 19:25:56 +0000 (Fri, 01 Feb 2008) New Revision: 17464 Modified: trunk/freenet/src/freenet/support/BitArray.java trunk/freenet/src/freenet/support/Serializer.java Log: prevent arbitrary sizes in allocating BitArray's from the wire Modified: trunk/freenet/src/freenet/support/BitArray.java =================================================================== --- trunk/freenet/src/freenet/support/BitArray.java 2008-02-01 19:23:44 UTC (rev 17463) +++ trunk/freenet/src/freenet/support/BitArray.java 2008-02-01 19:25:56 UTC (rev 17464) @@ -30,11 +30,22 @@ private final int _size; private final byte[] _bits; + /** + * This constructor does not check for unacceptable sizes, and should only be used on trusted data. + */ public BitArray(DataInputStream dis) throws IOException { _size = dis.readInt(); _bits = new byte[(_size / 8) + (_size % 8 == 0 ? 0 : 1)]; dis.readFully(_bits); } + + public BitArray(DataInputStream dis, int maxSize) throws IOException { + _size = dis.readInt(); + if (_size<=0 || _size>maxSize) + throw new IOException("Unacceptable bitarray size: "+_size); + _bits = new byte[(_size / 8) + (_size % 8 == 0 ? 0 : 1)]; + dis.readFully(_bits); + } public BitArray(int size) { _size = size; Modified: trunk/freenet/src/freenet/support/Serializer.java =================================================================== --- trunk/freenet/src/freenet/support/Serializer.java 2008-02-01 19:23:44 UTC (rev 17463) +++ trunk/freenet/src/freenet/support/Serializer.java 2008-02-01 19:25:56 UTC (rev 17464) @@ -42,6 +42,7 @@ public class Serializer { public static final String VERSION = "$Id: Serializer.java,v 1.5 2005/09/15 18:16:04 amphibian Exp $"; + public static final int MAX_BITARRAY_SIZE = 128; public static List readListFromDataInputStream(Class elementType, DataInputStream dis) throws IOException { LinkedList ret = new LinkedList(); @@ -89,7 +90,7 @@ } else if (type.equals(Peer.class)) { return new Peer(dis); } else if (type.equals(BitArray.class)) { - return new BitArray(dis); + return new BitArray(dis, MAX_BITARRAY_SIZE); } else if (type.equals(NodeCHK.class)) { // Use Key.read(...) because write(...) writes the TYPE field. return Key.read(dis); From saces at freenetproject.org Fri Feb 1 20:53:20 2008 From: saces at freenetproject.org (saces at freenetproject.org) Date: Fri, 1 Feb 2008 20:53:20 +0000 (UTC) Subject: [freenet-cvs] r17465 - trunk/freenet/src/freenet/node/fcp Message-ID: <20080201205320.53B903A0729@freenetproject.org> Author: saces Date: 2008-02-01 20:53:20 +0000 (Fri, 01 Feb 2008) New Revision: 17465 Modified: trunk/freenet/src/freenet/node/fcp/GetPluginInfo.java Log: fix a typo #2063, thanks for reporting it. Modified: trunk/freenet/src/freenet/node/fcp/GetPluginInfo.java =================================================================== --- trunk/freenet/src/freenet/node/fcp/GetPluginInfo.java 2008-02-01 19:25:56 UTC (rev 17464) +++ trunk/freenet/src/freenet/node/fcp/GetPluginInfo.java 2008-02-01 20:53:20 UTC (rev 17465) @@ -44,7 +44,7 @@ PluginInfoWrapper pi = node.pluginManager.getFCPPluginInfo(plugname); if (pi == null) { - handler.outputHandler.queue(new ProtocolErrorMessage(ProtocolErrorMessage.NO_SUCH_PLUGIN, false, "Plugin '"+ plugname + "' does not exist or os not a FCP plugin", identifier, false)); + handler.outputHandler.queue(new ProtocolErrorMessage(ProtocolErrorMessage.NO_SUCH_PLUGIN, false, "Plugin '"+ plugname + "' does not exist or is not a FCP plugin", identifier, false)); } else { handler.outputHandler.queue(new PluginInfoMessage(pi, identifier, detailed)); } From toad at freenetproject.org Fri Feb 1 23:06:25 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Fri, 1 Feb 2008 23:06:25 +0000 (UTC) Subject: [freenet-cvs] r17466 - trunk/freenet/src/freenet/support Message-ID: <20080201230625.7F2AC3921FF@freenetproject.org> Author: toad Date: 2008-02-01 23:06:25 +0000 (Fri, 01 Feb 2008) New Revision: 17466 Modified: trunk/freenet/src/freenet/support/Serializer.java Log: Less aggressive size limit Modified: trunk/freenet/src/freenet/support/Serializer.java =================================================================== --- trunk/freenet/src/freenet/support/Serializer.java 2008-02-01 20:53:20 UTC (rev 17465) +++ trunk/freenet/src/freenet/support/Serializer.java 2008-02-01 23:06:25 UTC (rev 17466) @@ -42,7 +42,7 @@ public class Serializer { public static final String VERSION = "$Id: Serializer.java,v 1.5 2005/09/15 18:16:04 amphibian Exp $"; - public static final int MAX_BITARRAY_SIZE = 128; + public static final int MAX_BITARRAY_SIZE = 2048*8; public static List readListFromDataInputStream(Class elementType, DataInputStream dis) throws IOException { LinkedList ret = new LinkedList(); From toad at freenetproject.org Sat Feb 2 14:06:35 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 14:06:35 +0000 (UTC) Subject: [freenet-cvs] r17467 - trunk/freenet/src/freenet/client/async Message-ID: <20080202140635.BBE4D3909EE@freenetproject.org> Author: toad Date: 2008-02-02 14:06:35 +0000 (Sat, 02 Feb 2008) New Revision: 17467 Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java Log: SingleFileFetcher: Clear metadata so it can be GC'ed when fetching splitfiles and when fetching multi-level metadata. Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java =================================================================== --- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java 2008-02-01 23:06:25 UTC (rev 17466) +++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java 2008-02-02 14:06:35 UTC (rev 17467) @@ -375,6 +375,8 @@ // Fetch on a second SingleFileFetcher, like with archives. metadata.setSimpleRedirect(); final SingleFileFetcher f = new SingleFileFetcher(this, metadata, new MultiLevelMetadataCallback(), ctx); + // Clear our own metadata so it can be garbage collected, it will be replaced by whatever is fetched. + this.metadata = null; ctx.ticker.queueTimedJob(new Runnable() { public void run() { f.wrapHandleMetadata(true); @@ -508,6 +510,10 @@ parent.onTransition(this, sf); sf.scheduleOffThread(); rcb.onBlockSetFinished(this); + // Clear our own metadata, we won't need it any more. + // For multi-level metadata etc see above. + metadata = null; + // SplitFile will now run. // Then it will return data to rcd. // We are now out of the loop. Yay! From toad at freenetproject.org Sat Feb 2 15:31:37 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 15:31:37 +0000 (UTC) Subject: [freenet-cvs] r17468 - trunk/freenet/src/freenet/node Message-ID: <20080202153137.77CBE391C51@freenetproject.org> Author: toad Date: 2008-02-02 15:31:37 +0000 (Sat, 02 Feb 2008) New Revision: 17468 Modified: trunk/freenet/src/freenet/node/Version.java Log: 1108: (mandatory Tuesday) Startup performance: - Add some Thread.yield()s: sadly java doesn't use thread priorities on linux, and the important threads get starved of CPU by the splitfile restarts. :( Client layer: - Prevent IllegalArgumentException, log an error instead when getKey() is null in SendableGet. - SplitFileFetcherSubSegment: Cancel self in possiblyRemoveFromParent(). May help to fix key is null. - SplitFileFetcherSegment: Actually remove the sub-segments from the array in removeSubSegments() instead of killing them and keeping them. Saves memory, avoids problems. - Throw on adding blocks to a cancelled segment. - SingleFileFetcher: Clear metadata when fetching a splitfile or multi-level metadata. So the Metadata and keys hanging off it can be GC'ed when no longer used by the splitfile. Messaging: - Prevent double-notify race condition on disconnect. - Remove side-effect and just throw in anyConnectionsDropped(). - Improve synchronization in PeerNode. - Some paranoia. - Limit BitArray's to 2048 bytes to prevent garbage causing huge memory allocations. Web interface: - Increase priority of announcement notice. Load management: - Reduce ping time averager half-life to 4 minutes from 10. This should still be longer than an average request, but it should react faster. - Report correct stats for received bytes on SSK inserts. Connections page: - Trivial formatting fix in the congestion control column. Routing: - Optimise closerPeer(). - Make Location.distance(,,true) work well for invalid values used by e.g. probe requests. Swapping: - Make PeerNode.shouldRejectSwapRequest() non-probabilistic. - And actually record the time we last accepted a swap request. (Note that because of this it was always accepting before, now it will almost always accept). Probe requests: - Implement simple threaded probe requests using the current HTL and routing algorithm, close to Request*. IP detection logic: - Trivial code cleanups. - Minor refactoring. - Don't count localhost and LAN addresses, or nodes with the same IP address as one of ours, towards if-no-conns-we-must-detect. - If we have no connections, and have lost 3+ connections recently, we should do a detection immediately regardless of the 1 detection per hour limit (but only one, so don't do it if we've detected in the last 6 minutes). - Delete the fake-detection mechanism which never worked for its original purpose. The above takes its place. - Detect immediately (once) if behind a SNAT. - Clear the failed-to-detect flag after any successful detection. We were detecting every 5 minutes forever after any failed detection because of this bug. - maybeRun(): Don't waste time and don't detect twice. - Fake IP detection code: was kicking in when we have 1 or 2 connections which are either disconnected OR have received packets in last 5min. Should be if we have 1 or 2 conns and they are BOTH disconnected AND have received packets in last 5min. Web interface: - Update TUFI to edition 11. L10n etc: - French update (batosai). - German update (NEOatNHNG). - Italian update from _ph00. - Add Danish to the list of available translations even though it's incomplete. So's Polish. - Improve the wording of the warning at the bottom of the wizard page asking whether to turn on opennet. - Delete the confusing example of [14:56] from the friends page. FCP: - Revert an unnecessary code complication (r17325) related to closing connections. Dev stuff: - toString(). - Logging. - Logger: Indicate explicitly if no stack trace. Add missing \n if null stack trace. - Add shortToString() to PeerContext. - Change visibility of BaseSingleFileFetcher so can subclass in plugins. - Delete some dijjer cruft in RetrievalException. - Comments. - Rename InsertHandler to CHKInsertHandler. - Dead code deletion. - Remove constructors for dead old probe request messages. - Comments. Insert/Request Simulator: - Logging. - Try to request key even if the insert fails. XMLSpider: - Version 17: Split both by number of elements and by the size of the subindexes (and don't try to split for the latter below having 1 word in the index). Max subindex size 256k. batosai NEOatNHNG _ph00 robert saces toad Modified: trunk/freenet/src/freenet/node/Version.java =================================================================== --- trunk/freenet/src/freenet/node/Version.java 2008-02-02 14:06:35 UTC (rev 17467) +++ trunk/freenet/src/freenet/node/Version.java 2008-02-02 15:31:37 UTC (rev 17468) @@ -24,17 +24,17 @@ public static final String protocolVersion = "1.0"; /** The build number of the current revision */ - private static final int buildNumber = 1107; + private static final int buildNumber = 1108; /** Oldest build of Fred we will talk to */ private static final int oldLastGoodBuild = 1106; - private static final int newLastGoodBuild = 1107; + private static final int newLastGoodBuild = 1108; static final long transitionTime; static { final Calendar _cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); // year, month - 1 (or constant), day, hour, minute, second - _cal.set( 2008, Calendar.JANUARY, 30, 0, 0, 0 ); + _cal.set( 2008, Calendar.FEBRUARY, 5, 0, 0, 0 ); transitionTime = _cal.getTimeInMillis(); } From toad at freenetproject.org Sat Feb 2 15:55:37 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 15:55:37 +0000 (UTC) Subject: [freenet-cvs] r17469 - trunk/freenet/src/freenet/node Message-ID: <20080202155537.52EAF391D2D@freenetproject.org> Author: toad Date: 2008-02-02 15:55:37 +0000 (Sat, 02 Feb 2008) New Revision: 17469 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: && makes more sense - no point setting a timeout if there isn't a timeout to set Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-02 15:31:37 UTC (rev 17468) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-02 15:55:37 UTC (rev 17469) @@ -69,7 +69,7 @@ public void onFailure(short htl2, PeerNode[] requestors, PeerNode requested, int timeout, long now) { synchronized(this) { long newTimeoutTime = now + timeout; - if(now > timeoutTime /* has expired */ || newTimeoutTime > timeoutTime) { + if(now > timeoutTime /* has expired */ && newTimeoutTime > timeoutTime) { htl = htl2; timeoutTime = newTimeoutTime; } From toad at freenetproject.org Sat Feb 2 15:57:28 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 15:57:28 +0000 (UTC) Subject: [freenet-cvs] r17470 - trunk/freenet/src/freenet/node Message-ID: <20080202155728.729DA391D2D@freenetproject.org> Author: toad Date: 2008-02-02 15:57:28 +0000 (Sat, 02 Feb 2008) New Revision: 17470 Modified: trunk/freenet/src/freenet/node/FailureTable.java Log: Comments Modified: trunk/freenet/src/freenet/node/FailureTable.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 15:55:37 UTC (rev 17469) +++ trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 15:57:28 UTC (rev 17470) @@ -50,15 +50,15 @@ } /** - * Called when a key DNFs, or is killed by a RecentlyFailed message. Either way this can create a - * FailureTableEntry. + * Called when a node kills a request: the request DNFs, is killed by a RecentlyFailed message, + * times out or gets a local RejectedOverload. Either way this can create a FailureTableEntry. * @param key The key that was fetched. * @param htl The HTL it was fetched at. * @param requestors The nodes requesting it (if any). * @param requested The single node it was forwarded to, which DNFed. * @param now The time at which the request was sent. * @param timeout The number of millis from when the request was sent to when the failure block times out. - * I.e. between 0 and REJECT_TIME. + * I.e. between 0 and REJECT_TIME. -1 indicates a RejectedOverload or actual timeout. */ public void onFailure(Key key, short htl, PeerNode[] requestors, PeerNode requested, int timeout, long now) { FailureTableEntry entry; From toad at freenetproject.org Sat Feb 2 16:00:49 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 16:00:49 +0000 (UTC) Subject: [freenet-cvs] r17471 - trunk/freenet/src/freenet/node Message-ID: <20080202160049.95E65390AFE@freenetproject.org> Author: toad Date: 2008-02-02 16:00:49 +0000 (Sat, 02 Feb 2008) New Revision: 17471 Modified: trunk/freenet/src/freenet/node/FailureTable.java Log: More comments Modified: trunk/freenet/src/freenet/node/FailureTable.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 15:57:28 UTC (rev 17470) +++ trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 16:00:49 UTC (rev 17471) @@ -51,7 +51,7 @@ /** * Called when a node kills a request: the request DNFs, is killed by a RecentlyFailed message, - * times out or gets a local RejectedOverload. Either way this can create a FailureTableEntry. + * or times out. In any case this will create a FailureTableEntry. * @param key The key that was fetched. * @param htl The HTL it was fetched at. * @param requestors The nodes requesting it (if any). From toad at freenetproject.org Sat Feb 2 16:06:24 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 16:06:24 +0000 (UTC) Subject: [freenet-cvs] r17472 - trunk/freenet/src/freenet/node Message-ID: <20080202160624.A71D5391D38@freenetproject.org> Author: toad Date: 2008-02-02 16:06:24 +0000 (Sat, 02 Feb 2008) New Revision: 17472 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java trunk/freenet/src/freenet/node/Node.java trunk/freenet/src/freenet/node/RequestSender.java Log: ULPRs: Wire FailureTable into Node (onFound()) and RequestSender (onFailure()). FailureTable is untested code, we might be looking at memory leaks etc. Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-02 16:00:49 UTC (rev 17471) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-02 16:06:24 UTC (rev 17472) @@ -74,7 +74,8 @@ timeoutTime = newTimeoutTime; } addRequestors(requestors, now); - addRequestedFrom(new PeerNode[] { requested }, now); + if(requested != null) + addRequestedFrom(new PeerNode[] { requested }, now); } } Modified: trunk/freenet/src/freenet/node/Node.java =================================================================== --- trunk/freenet/src/freenet/node/Node.java 2008-02-02 16:00:49 UTC (rev 17471) +++ trunk/freenet/src/freenet/node/Node.java 2008-02-02 16:06:24 UTC (rev 17472) @@ -396,6 +396,9 @@ public final NodeClientCore clientCore; + // ULPRs, RecentlyFailed, per node failure tables, are all managed by FailureTable. + final FailureTable failureTable; + // The version we were before we restarted. public int lastVersion; @@ -861,6 +864,10 @@ peers.writePeers(); peers.updatePMUserAlert(); + // ULPRs + + failureTable = new FailureTable(peers, this); + // Opennet final SubConfig opennetConfig = new SubConfig("node.opennet", config); @@ -1979,6 +1986,7 @@ nodeStats.avgCacheLocation.report(loc); if(clientCore != null && clientCore.requestStarters != null) clientCore.requestStarters.chkFetchScheduler.tripPendingKey(block); + failureTable.onFound(block); } catch (IOException e) { Logger.error(this, "Cannot store data: "+e, e); } catch (OutOfMemoryError e) { @@ -2010,7 +2018,7 @@ cacheKey(((NodeSSK)block.getKey()).getPubKeyHash(), ((NodeSSK)block.getKey()).getPubKey(), deep); if(clientCore != null && clientCore.requestStarters != null) clientCore.requestStarters.sskFetchScheduler.tripPendingKey(block); - + failureTable.onFound(block); } catch (IOException e) { Logger.error(this, "Cannot store data: "+e, e); } catch (OutOfMemoryError e) { Modified: trunk/freenet/src/freenet/node/RequestSender.java =================================================================== --- trunk/freenet/src/freenet/node/RequestSender.java 2008-02-02 16:00:49 UTC (rev 17471) +++ trunk/freenet/src/freenet/node/RequestSender.java 2008-02-02 16:06:24 UTC (rev 17472) @@ -181,6 +181,7 @@ // This used to be RNF, I dunno why //???: finish(GENERATED_REJECTED_OVERLOAD, null); finish(DATA_NOT_FOUND, null); + node.failureTable.onFailure(key, htl, new PeerNode[] { source }, null, FailureTable.REJECT_TIME, System.currentTimeMillis()); return; } @@ -195,6 +196,7 @@ Logger.minor(this, "no more peers, but overloads ("+rejectOverloads+"/"+routeAttempts+" overloaded)"); // Backtrack finish(ROUTE_NOT_FOUND, null); + node.failureTable.onFailure(key, htl, new PeerNode[] { source }, null, -1, System.currentTimeMillis()); return; } @@ -346,6 +348,7 @@ next.localRejectedOverload("FatalTimeout"); forwardRejectedOverload(); finish(TIMED_OUT, next); + node.failureTable.onFailure(key, htl, new PeerNode[] { source }, next, -1, System.currentTimeMillis()); return; } @@ -356,6 +359,7 @@ if(msg.getSpec() == DMT.FNPDataNotFound) { next.successNotOverload(); finish(DATA_NOT_FOUND, next); + node.failureTable.onFailure(key, htl, new PeerNode[] { source }, next, FailureTable.REJECT_TIME, System.currentTimeMillis()); return; } @@ -417,6 +421,7 @@ // If there is, we will avoid sending requests for the specified period. // FIXME we need to create the FT entry. finish(RECENTLY_FAILED, next); + node.failureTable.onFailure(key, htl, new PeerNode[] { source }, next, timeLeft, System.currentTimeMillis()); return; } @@ -482,6 +487,7 @@ } catch (KeyVerifyException e1) { Logger.normal(this, "Got data but verify failed: "+e1, e1); finish(VERIFY_FAILURE, next); + node.failureTable.onFailure(key, htl, new PeerNode[] { source }, next, -1, System.currentTimeMillis()); return; } finish(SUCCESS, next); @@ -492,6 +498,7 @@ else Logger.error(this, "Transfer failed ("+e.getReason()+"/"+RetrievalException.getErrString(e.getReason())+"): "+e, e); finish(TRANSFER_FAILED, next); + node.failureTable.onFailure(key, htl, new PeerNode[] { source }, next, -1, System.currentTimeMillis()); return; } } finally { From toad at freenetproject.org Sat Feb 2 16:25:41 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 16:25:41 +0000 (UTC) Subject: [freenet-cvs] r17473 - trunk/freenet/src/freenet/node Message-ID: <20080202162541.99E5B391D51@freenetproject.org> Author: toad Date: 2008-02-02 16:25:41 +0000 (Sat, 02 Feb 2008) New Revision: 17473 Modified: trunk/freenet/src/freenet/node/RequestHandler.java Log: If a request takes so long that the predecessor times out, but we do eventually get the data, we need to offer it to the predecessor through ULPRs. Modified: trunk/freenet/src/freenet/node/RequestHandler.java =================================================================== --- trunk/freenet/src/freenet/node/RequestHandler.java 2008-02-02 16:06:24 UTC (rev 17472) +++ trunk/freenet/src/freenet/node/RequestHandler.java 2008-02-02 16:25:41 UTC (rev 17473) @@ -228,6 +228,8 @@ this.status=status; if (now > responseDeadline) { + // Offer the data if there is any. + node.failureTable.onFailure(key, htl, new PeerNode[] { source }, null, -1, System.currentTimeMillis()); Logger.error(this, "requestsender took too long to respond to requestor ("+TimeUtil.formatTime((now - searchStartTime), 2, true)+"/"+rs.getStatusString()+")"); applyByteCounts(); unregisterRequestHandlerWithNode(); From toad at freenetproject.org Sat Feb 2 16:40:52 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 16:40:52 +0000 (UTC) Subject: [freenet-cvs] r17474 - in trunk/freenet/src/freenet: io/comm node Message-ID: <20080202164052.AB7EA479EFF@freenetproject.org> Author: toad Date: 2008-02-02 16:40:52 +0000 (Sat, 02 Feb 2008) New Revision: 17474 Modified: trunk/freenet/src/freenet/io/comm/DMT.java trunk/freenet/src/freenet/node/PeerNode.java Log: Include an HMAC authenticator on FNPOfferKey so we don't have to remember what we've offered. Modified: trunk/freenet/src/freenet/io/comm/DMT.java =================================================================== --- trunk/freenet/src/freenet/io/comm/DMT.java 2008-02-02 16:25:41 UTC (rev 17473) +++ trunk/freenet/src/freenet/io/comm/DMT.java 2008-02-02 16:40:52 UTC (rev 17474) @@ -126,6 +126,7 @@ public static final String HASHES = "hashes"; public static final String REJECT_CODE = "rejectCode"; public static final String ROUTING_ENABLED = "routingEnabled"; + public static final String OFFER_AUTHENTICATOR = "offerAuthenticator"; /** Very urgent */ public static final short PRIORITY_NOW=-2; @@ -849,9 +850,10 @@ addField(KEY, Key.class); }}; - public static Message createFNPOfferKey(Key key) { + public static Message createFNPOfferKey(Key key, byte[] authenticator) { Message msg = new Message(FNPOfferKey); msg.set(KEY, key); + msg.set(OFFER_AUTHENTICATOR, authenticator); return msg; } Modified: trunk/freenet/src/freenet/node/PeerNode.java =================================================================== --- trunk/freenet/src/freenet/node/PeerNode.java 2008-02-02 16:25:41 UTC (rev 17473) +++ trunk/freenet/src/freenet/node/PeerNode.java 2008-02-02 16:40:52 UTC (rev 17474) @@ -10,6 +10,7 @@ import java.math.BigInteger; import java.net.MalformedURLException; import java.net.UnknownHostException; +import java.security.MessageDigest; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -30,6 +31,7 @@ import freenet.crypt.DSAGroup; import freenet.crypt.DSAPublicKey; import freenet.crypt.DSASignature; +import freenet.crypt.HMAC; import freenet.crypt.KeyAgreementSchemeContext; import freenet.crypt.SHA256; import freenet.crypt.UnsupportedCipherException; @@ -3078,7 +3080,10 @@ /** Offer a key to this node */ public void offer(Key key) { - Message msg = DMT.createFNPOfferKey(key); + byte[] keyBytes = key.getFullKey(); + HMAC hash = new HMAC(SHA256.getInstance()); + byte[] authenticator = hash.mac(node.failureTable.offerAuthenticatorKey, keyBytes, 32); + Message msg = DMT.createFNPOfferKey(key, authenticator); try { sendAsync(msg, null, 0, null); } catch(NotConnectedException e) { From toad at freenetproject.org Sat Feb 2 16:42:25 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 16:42:25 +0000 (UTC) Subject: [freenet-cvs] r17475 - trunk/freenet/src/freenet/io/comm Message-ID: <20080202164225.CB80447AEF6@freenetproject.org> Author: toad Date: 2008-02-02 16:42:25 +0000 (Sat, 02 Feb 2008) New Revision: 17475 Modified: trunk/freenet/src/freenet/io/comm/DMT.java Log: Doh - ShortBuffer! Modified: trunk/freenet/src/freenet/io/comm/DMT.java =================================================================== --- trunk/freenet/src/freenet/io/comm/DMT.java 2008-02-02 16:40:52 UTC (rev 17474) +++ trunk/freenet/src/freenet/io/comm/DMT.java 2008-02-02 16:42:25 UTC (rev 17475) @@ -848,12 +848,13 @@ public static MessageType FNPOfferKey = new MessageType("FNPOfferKey", PRIORITY_LOW) {{ addField(KEY, Key.class); + addField(OFFER_AUTHENTICATOR, ShortBuffer.class); }}; public static Message createFNPOfferKey(Key key, byte[] authenticator) { Message msg = new Message(FNPOfferKey); msg.set(KEY, key); - msg.set(OFFER_AUTHENTICATOR, authenticator); + msg.set(OFFER_AUTHENTICATOR, new ShortBuffer(authenticator)); return msg; } From toad at freenetproject.org Sat Feb 2 16:47:10 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 16:47:10 +0000 (UTC) Subject: [freenet-cvs] r17476 - trunk/freenet/src/freenet/node Message-ID: <20080202164710.0BEF547BC5D@freenetproject.org> Author: toad Date: 2008-02-02 16:47:09 +0000 (Sat, 02 Feb 2008) New Revision: 17476 Modified: trunk/freenet/src/freenet/node/FailureTable.java trunk/freenet/src/freenet/node/PeerNode.java Log: Missing files. Modified: trunk/freenet/src/freenet/node/FailureTable.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 16:42:25 UTC (rev 17475) +++ trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 16:47:09 UTC (rev 17476) @@ -41,12 +41,16 @@ static final int MAX_LIFETIME = 60*60*1000; /** Offers expire after 10 minutes */ static final int OFFER_EXPIRY_TIME = 10*60*1000; + /** HMAC key for the offer authenticator */ + final byte[] offerAuthenticatorKey; FailureTable(PeerManager peers, Node node) { entriesByKey = new LRUHashtable(); blockOfferListByKey = new LRUHashtable(); this.peers = peers; this.node = node; + offerAuthenticatorKey = new byte[32]; + node.random.nextBytes(offerAuthenticatorKey); } /** @@ -156,10 +160,13 @@ final long offeredTime; /** Either offered by or offered to this node */ final WeakReference nodeRef; + /** Authenticator */ + final byte[] authenticator; - BlockOffer(PeerNode pn, long now) { + BlockOffer(PeerNode pn, long now, byte[] authenticator) { this.nodeRef = pn.myRef; this.offeredTime = now; + this.authenticator = authenticator; } } @@ -183,9 +190,10 @@ * If it is a CHK, we will accept it if we want it. * @param key The key we are being offered. * @param peer The node offering it. + * @param authenticator */ - public void onOffer(Key key, PeerNode peer) { - if(wantOffer(key, peer)) { + public void onOffer(Key key, PeerNode peer, byte[] authenticator) { + if(wantOffer(key, peer, authenticator)) { // Okay, we want the offer. Now what? // Two ClientRequestScheduler's? Then you'd have to remove the key from two different RGA's :( // Anyway, we don't want a key to be requested just because another key in the same group has an offer. @@ -194,7 +202,7 @@ } } - boolean wantOffer(Key key, PeerNode peer) { + boolean wantOffer(Key key, PeerNode peer, byte[] authenticator) { FailureTableEntry entry; long now = System.currentTimeMillis(); synchronized(this) { @@ -242,7 +250,7 @@ // Add to offers list BlockOfferList bl = (BlockOfferList) blockOfferListByKey.get(key); - BlockOffer offer = new BlockOffer(peer, now); + BlockOffer offer = new BlockOffer(peer, now, authenticator); if(bl == null) { bl = new BlockOfferList(entry, offer); } Modified: trunk/freenet/src/freenet/node/PeerNode.java =================================================================== --- trunk/freenet/src/freenet/node/PeerNode.java 2008-02-02 16:42:25 UTC (rev 17475) +++ trunk/freenet/src/freenet/node/PeerNode.java 2008-02-02 16:47:09 UTC (rev 17476) @@ -3082,6 +3082,7 @@ public void offer(Key key) { byte[] keyBytes = key.getFullKey(); HMAC hash = new HMAC(SHA256.getInstance()); + // FIXME maybe the authenticator should be shorter than 32 bytes to save memory? byte[] authenticator = hash.mac(node.failureTable.offerAuthenticatorKey, keyBytes, 32); Message msg = DMT.createFNPOfferKey(key, authenticator); try { From toad at freenetproject.org Sat Feb 2 16:47:29 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 16:47:29 +0000 (UTC) Subject: [freenet-cvs] r17477 - trunk/freenet/src/freenet/node Message-ID: <20080202164729.DE5DF47BC13@freenetproject.org> Author: toad Date: 2008-02-02 16:47:29 +0000 (Sat, 02 Feb 2008) New Revision: 17477 Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java Log: Start to wire in FNPOfferKey Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java =================================================================== --- trunk/freenet/src/freenet/node/NodeDispatcher.java 2008-02-02 16:47:09 UTC (rev 17476) +++ trunk/freenet/src/freenet/node/NodeDispatcher.java 2008-02-02 16:47:29 UTC (rev 17477) @@ -6,12 +6,15 @@ import java.util.HashSet; import java.util.Hashtable; +import freenet.crypt.HMAC; +import freenet.crypt.SHA256; import freenet.io.comm.DMT; import freenet.io.comm.Dispatcher; import freenet.io.comm.Message; import freenet.io.comm.MessageType; import freenet.io.comm.NotConnectedException; import freenet.io.comm.Peer; +import freenet.keys.Key; import freenet.support.Fields; import freenet.support.Logger; import freenet.support.ShortBuffer; @@ -155,10 +158,19 @@ // return handleProbeRejected(m, source); // } else if(spec == DMT.FNPProbeTrace) { // return handleProbeTrace(m, source); + } else if(spec == DMT.FNPOfferKey) { + return handleOfferKey(m, source); } return false; } + private boolean handleOfferKey(Message m, PeerNode source) { + Key key = (Key) m.getObject(DMT.KEY); + byte[] authenticator = ((ShortBuffer) m.getObject(DMT.OFFER_AUTHENTICATOR)).getData(); + node.failureTable.onOffer(key, source, authenticator); + return true; + } + private void handleDisconnect(final Message m, final PeerNode source) { // Must run ON the packet sender thread as it sends a packet directly node.getTicker().queueTimedJob(new FastRunnable() { From toad at freenetproject.org Sat Feb 2 17:34:22 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 17:34:22 +0000 (UTC) Subject: [freenet-cvs] r17478 - trunk/freenet/src/freenet/node Message-ID: <20080202173422.621E2390061@freenetproject.org> Author: toad Date: 2008-02-02 17:34:22 +0000 (Sat, 02 Feb 2008) New Revision: 17478 Modified: trunk/freenet/src/freenet/node/FailureTable.java Log: Offers expire after OFFER_EXPIRY_TIME. Modified: trunk/freenet/src/freenet/node/FailureTable.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 16:47:29 UTC (rev 17477) +++ trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 17:34:22 UTC (rev 17478) @@ -145,7 +145,7 @@ for(int i=0;i last) last = offers[i].offeredTime; } - return last; + return last + OFFER_EXPIRY_TIME; } public boolean isEmpty(long now) { From toad at freenetproject.org Sat Feb 2 20:45:34 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 20:45:34 +0000 (UTC) Subject: [freenet-cvs] r17480 - in trunk/freenet/src/freenet: client/async node Message-ID: <20080202204534.05E873908F2@freenetproject.org> Author: toad Date: 2008-02-02 20:45:33 +0000 (Sat, 02 Feb 2008) New Revision: 17480 Modified: trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java trunk/freenet/src/freenet/client/async/SingleBlockInserter.java trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java trunk/freenet/src/freenet/client/async/USKChecker.java trunk/freenet/src/freenet/node/RequestStarter.java trunk/freenet/src/freenet/node/SendableGet.java trunk/freenet/src/freenet/node/SendableInsert.java trunk/freenet/src/freenet/node/SendableRequest.java trunk/freenet/src/freenet/node/SimpleSendableInsert.java Log: Refactor: use Object's not int's as tokens in the SendableRequest API. Modified: trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java =================================================================== --- trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java 2008-02-02 20:05:30 UTC (rev 17479) +++ trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java 2008-02-02 20:45:33 UTC (rev 17480) @@ -19,7 +19,7 @@ final int maxRetries; private int retryCount; final FetchContext ctx; - static final int[] keys = new int[] { 0 }; + static final Object[] keys = new Object[] { new Integer(0) }; protected BaseSingleFileFetcher(ClientKey key, int maxRetries, FetchContext ctx, ClientRequester parent) { super(parent); @@ -29,15 +29,15 @@ this.ctx = ctx; } - public int[] allKeys() { + public Object[] allKeys() { return keys; } - public int chooseKey() { - return 0; + public Object chooseKey() { + return keys[0]; } - public ClientKey getKey(int token) { + public ClientKey getKey(Object token) { return key; } @@ -111,7 +111,7 @@ } } try { - onSuccess(Key.createKeyBlock(this.key, block), false, 0); + onSuccess(Key.createKeyBlock(this.key, block), false, null); } catch (KeyVerifyException e) { Logger.error(this, "onGotKey("+key+","+block+") got "+e+" for "+this, e); // FIXME if we get rid of the direct route this must call onFailure() Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java =================================================================== --- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 20:05:30 UTC (rev 17479) +++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 20:45:33 UTC (rev 17480) @@ -198,9 +198,9 @@ SendableGet getter = (SendableGet)req; if(!getter.ignoreStore()) { boolean anyValid = false; - int[] keyTokens = getter.allKeys(); + Object[] keyTokens = getter.allKeys(); for(int i=0;i Author: bombe Date: 2008-02-02 21:21:16 +0000 (Sat, 02 Feb 2008) New Revision: 17481 Modified: trunk/apps/jSite/src/de/todesbaum/jsite/main/Version.java trunk/apps/jSite/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java Log: version 0.4.9.5: fix redirect inserting Modified: trunk/apps/jSite/src/de/todesbaum/jsite/main/Version.java =================================================================== --- trunk/apps/jSite/src/de/todesbaum/jsite/main/Version.java 2008-02-02 20:45:33 UTC (rev 17480) +++ trunk/apps/jSite/src/de/todesbaum/jsite/main/Version.java 2008-02-02 21:21:16 UTC (rev 17481) @@ -25,7 +25,7 @@ */ public class Version { - private static final String VERSION = "0.4.9.4"; + private static final String VERSION = "0.4.9.5"; public static final String getVersion() { return VERSION; Modified: trunk/apps/jSite/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java =================================================================== --- trunk/apps/jSite/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java 2008-02-02 20:45:33 UTC (rev 17480) +++ trunk/apps/jSite/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java 2008-02-02 21:21:16 UTC (rev 17481) @@ -1,5 +1,5 @@ /* - * todesbaum-lib - + * todesbaum-lib - * Copyright (C) 2006 David Roden * * This program is free software; you can redistribute it and/or modify @@ -34,7 +34,7 @@ /** * Implementation of the ClientPutComplexDir command. This * command can be used to insert directories that do not exist on disk. - * + * * @author David Roden <droden at gmail.com> * @version $Id$ */ @@ -42,13 +42,13 @@ /** The file entries of this directory. */ private List fileEntries = new ArrayList(); - + /** Whether this request has payload. */ private boolean hasPayload = false; - + /** The input streams for the payload. */ private File payloadFile; - + /** The total number of bytes of the payload. */ private long payloadLength = 0; @@ -66,31 +66,35 @@ * @param fileEntry The file entry to add to the directory */ public void addFileEntry(FileEntry fileEntry) { - if (payloadFile == null){ - try { - payloadFile = File.createTempFile("payload", ".dat"); - payloadFile.deleteOnExit(); - } catch (IOException e) { + if (fileEntry instanceof DirectFileEntry) { + if (payloadFile == null){ + try { + payloadFile = File.createTempFile("payload", ".dat"); + payloadFile.deleteOnExit(); + } catch (IOException e) { + } } - } - if (payloadFile != null) { - InputStream payloadInputStream = ((DirectFileEntry) fileEntry).getDataInputStream(); - FileOutputStream payloadOutputStream = null; - try { - payloadOutputStream = new FileOutputStream(payloadFile, true); - byte[] buffer = new byte[65536]; - int read = 0; - while ((read = payloadInputStream.read(buffer)) != -1) { - payloadOutputStream.write(buffer, 0, read); + if (payloadFile != null) { + InputStream payloadInputStream = ((DirectFileEntry) fileEntry).getDataInputStream(); + FileOutputStream payloadOutputStream = null; + try { + payloadOutputStream = new FileOutputStream(payloadFile, true); + byte[] buffer = new byte[65536]; + int read = 0; + while ((read = payloadInputStream.read(buffer)) != -1) { + payloadOutputStream.write(buffer, 0, read); + } + payloadOutputStream.flush(); + fileEntries.add(fileEntry); + } catch (IOException ioe1) { + /* hmm, ignore? */ + } finally { + Closer.close(payloadOutputStream); + Closer.close(payloadInputStream); } - payloadOutputStream.flush(); - fileEntries.add(fileEntry); - } catch (IOException ioe1) { - /* hmm, ignore? */ - } finally { - Closer.close(payloadOutputStream); - Closer.close(payloadInputStream); } + } else { + fileEntries.add(fileEntry); } } From toad at freenetproject.org Sat Feb 2 23:00:05 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 23:00:05 +0000 (UTC) Subject: [freenet-cvs] r17483 - trunk/freenet/src/freenet/client/async Message-ID: <20080202230005.28E693909EC@freenetproject.org> Author: toad Date: 2008-02-02 23:00:04 +0000 (Sat, 02 Feb 2008) New Revision: 17483 Added: trunk/freenet/src/freenet/client/async/OfferedKeysList.java Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java Log: Beginnings of client layer support Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java =================================================================== --- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 21:54:52 UTC (rev 17482) +++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 23:00:04 UTC (rev 17483) @@ -86,6 +86,7 @@ * To speed up fetching, a RGA or SVBN must only exist if it is non-empty. */ private final SortedVectorByNumber[] priorities; + private final OfferedKeysList[] offeredKeys; // we have one for inserts and one for requests final boolean isInsertScheduler; final boolean isSSKScheduler; @@ -178,6 +179,13 @@ new PrioritySchedulerCallback(this)); this.choosenPriorityScheduler = sc.getString(name+"_priority_policy"); + if(!forInserts) { + offeredKeys = new OfferedKeysList[RequestStarter.NUMBER_OF_PRIORITY_CLASSES]; + for(short i=0;i Author: toad Date: 2008-02-02 23:05:43 +0000 (Sat, 02 Feb 2008) New Revision: 17484 Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java trunk/freenet/src/freenet/client/async/OfferedKeysList.java Log: Wire in OfferedKeysList.onFound(). Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java =================================================================== --- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 23:00:04 UTC (rev 17483) +++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 23:05:43 UTC (rev 17484) @@ -572,6 +572,11 @@ } public void tripPendingKey(final KeyBlock block) { + if(offeredKeys != null) { + for(int i=0;i Author: toad Date: 2008-02-02 23:08:40 +0000 (Sat, 02 Feb 2008) New Revision: 17485 Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java trunk/freenet/src/freenet/client/async/OfferedKeysList.java Log: Remove also in removePendingKey(). Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java =================================================================== --- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 23:05:43 UTC (rev 17484) +++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 23:08:40 UTC (rev 17485) @@ -474,6 +474,7 @@ } public void removePendingKey(SendableGet getter, boolean complain, Key key) { + boolean dropped = false; synchronized(pendingKeys) { Object o = pendingKeys.get(key); if(o == null) { @@ -510,6 +511,7 @@ } if(newGets.length == 0) { pendingKeys.remove(key); + dropped = true; } else if(newGets.length == 1) { pendingKeys.put(key, newGets[0]); } else { @@ -517,6 +519,10 @@ } } } + if(dropped && offeredKeys != null) { + for(int i=0;i Author: toad Date: 2008-02-02 23:20:27 +0000 (Sat, 02 Feb 2008) New Revision: 17486 Modified: trunk/freenet/src/freenet/client/async/OfferedKeysList.java trunk/freenet/src/freenet/node/NodeClientCore.java Log: ClientKey's are optional. Start the request asynchronously without using one. Modified: trunk/freenet/src/freenet/client/async/OfferedKeysList.java =================================================================== --- trunk/freenet/src/freenet/client/async/OfferedKeysList.java 2008-02-02 23:08:40 UTC (rev 17485) +++ trunk/freenet/src/freenet/client/async/OfferedKeysList.java 2008-02-02 23:20:27 UTC (rev 17486) @@ -10,7 +10,6 @@ import freenet.crypt.RandomSource; import freenet.keys.ClientKey; import freenet.keys.Key; -import freenet.node.LowLevelGetException; import freenet.node.NodeClientCore; import freenet.node.RequestScheduler; import freenet.node.SendableRequest; @@ -65,9 +64,10 @@ public synchronized void onNoOffers(ClientKey key) { logMINOR = Logger.shouldLog(Logger.MINOR, this); if(logMINOR) Logger.minor(this, "No offers for "+key+" , removing it"); - keys.remove(key); - keysList.remove(key); - clientKeysByKey.remove(key.getNodeKey()); + Key k = key.getNodeKey(); + keys.remove(k); + keysList.remove(k); + clientKeysByKey.remove(k); } public synchronized boolean isEmpty() { @@ -82,10 +82,10 @@ public Object chooseKey() { // Pick a random key if(keysList.isEmpty()) return null; - ClientKey ck = (ClientKey) keysList.remove(random.nextInt(keysList.size())); - keys.remove(ck); - clientKeysByKey.remove(ck.getNodeKey()); - return ck; + Key k = (Key) keysList.remove(random.nextInt(keysList.size())); + keys.remove(k); + clientKeysByKey.remove(k); + return k; } public Object getClient() { @@ -110,13 +110,8 @@ } public boolean send(NodeClientCore node, RequestScheduler sched, Object keyNum) { - ClientKey key = (ClientKey) keyNum; - try { - core.realGetKey(key, false, true, // if it's not cached it won't propagate FIXME support =false?? - false); - } catch (LowLevelGetException e) { - Logger.minor(this, "Caught low level get exception "+e, e); - } + Key key = (Key) keyNum; + core.asyncGet(key, true);// Have to cache it in order to propagate it; FIXME return true; } Modified: trunk/freenet/src/freenet/node/NodeClientCore.java =================================================================== --- trunk/freenet/src/freenet/node/NodeClientCore.java 2008-02-02 23:08:40 UTC (rev 17485) +++ trunk/freenet/src/freenet/node/NodeClientCore.java 2008-02-02 23:20:27 UTC (rev 17486) @@ -436,6 +436,31 @@ } }, "Startup completion thread"); } + + /** + * Start an asynchronous fetch of the key in question, which will complete to the datastore. + * It will not decode the data because we don't provide a ClientKey. It will not return + * anything and will run asynchronously. + * @param key + */ + public void asyncGet(Key key, boolean cache) { + long uid = random.nextLong(); + if(!node.lockUID(uid, false, false, false)) { + Logger.error(this, "Could not lock UID just randomly generated: "+uid+" - probably indicates broken PRNG"); + return; + } + try { + Object o = node.makeRequestSender(key, node.maxHTL(), uid, null, node.getLocation(), false, false, cache, false); + if(o instanceof CHKBlock) { + return; // Already have it. + } + // Else it has started a request. + if(logMINOR) + Logger.minor(this, "Started "+o+" for "+uid+" for "+key); + } finally { + node.unlockUID(uid, false, false, true, false); + } + } public ClientKeyBlock realGetKey(ClientKey key, boolean localOnly, boolean cache, boolean ignoreStore) throws LowLevelGetException { if(key instanceof ClientCHK) From toad at freenetproject.org Sat Feb 2 23:38:44 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 23:38:44 +0000 (UTC) Subject: [freenet-cvs] r17487 - in trunk/freenet/src/freenet: client/async node Message-ID: <20080202233844.117EB47BBFC@freenetproject.org> Author: toad Date: 2008-02-02 23:38:43 +0000 (Sat, 02 Feb 2008) New Revision: 17487 Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java trunk/freenet/src/freenet/client/async/OfferedKeysList.java trunk/freenet/src/freenet/node/FailureTable.java trunk/freenet/src/freenet/node/NodeClientCore.java Log: Queue keys we want at the priority level we want them at. Queue keys other people want at IMMEDIATE_SPLITFILE_PRIORITY_CLASS. Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java =================================================================== --- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 23:20:27 UTC (rev 17486) +++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 23:38:43 UTC (rev 17487) @@ -612,4 +612,30 @@ return pendingKeys.get(key) != null; } } + + /** If we want the offered key, or if force is enabled, queue it */ + public void maybeQueueOfferedKey(Key key, boolean force) { + short priority = Short.MAX_VALUE; + synchronized(this) { + if(force) { + // FIXME what priority??? + priority = RequestStarter.IMMEDIATE_SPLITFILE_PRIORITY_CLASS; + } + Object o = pendingKeys.get(key); + if(o == null) { + // Blah + } else if(o instanceof SendableGet) { + short p = ((SendableGet)o).getPriorityClass(); + if(p < priority) priority = p; + } else { // if(o instanceof SendableGet[]) { + SendableGet[] gets = (SendableGet[]) o; + for(int i=0;i Author: toad Date: 2008-02-02 23:42:17 +0000 (Sat, 02 Feb 2008) New Revision: 17488 Modified: trunk/freenet/src/freenet/node/FailureTable.java Log: When we have deleted all the offers, delete the object containing the offers. Modified: trunk/freenet/src/freenet/node/FailureTable.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 23:38:43 UTC (rev 17487) +++ trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 23:42:17 UTC (rev 17488) @@ -165,7 +165,8 @@ return true; } - public synchronized void deleteOffer(BlockOffer offer) { + public void deleteOffer(BlockOffer offer) { + synchronized(this) { int idx = -1; for(int i=0;i Author: toad Date: 2008-02-02 23:42:40 +0000 (Sat, 02 Feb 2008) New Revision: 17489 Modified: trunk/freenet/src/freenet/node/FailureTable.java Log: indenting Modified: trunk/freenet/src/freenet/node/FailureTable.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 23:42:17 UTC (rev 17488) +++ trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 23:42:40 UTC (rev 17489) @@ -167,18 +167,18 @@ public void deleteOffer(BlockOffer offer) { synchronized(this) { - int idx = -1; - for(int i=0;i 0) + System.arraycopy(offers, 0, newOffers, 0, idx); + if(idx < newOffers.length) + System.arraycopy(offers, idx+1, newOffers, idx, offers.length-idx); + offers = newOffers; } - if(idx == -1) return; - BlockOffer[] newOffers = new BlockOffer[offers.length-1]; - if(idx > 0) - System.arraycopy(offers, 0, newOffers, 0, idx); - if(idx < newOffers.length) - System.arraycopy(offers, idx+1, newOffers, idx, offers.length-idx); - offers = newOffers; - } if(offers.length == 0) { synchronized(FailureTable.this) { blockOfferListByKey.removeKey(entry.key); From svn-build at freenetproject.org Sat Feb 2 23:44:21 2008 From: svn-build at freenetproject.org (svn-build at freenetproject.org) Date: Sat, 2 Feb 2008 23:44:21 +0000 (UTC) Subject: [freenet-cvs] Verification of r17489 on emu Message-ID: <20080202234421.42CD447AEC6@freenetproject.org> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 toad has declared that 17489 is an 'indent only' commit: That's TRUE. orig/FailureTable$BlockOffer.class : 1a19e251f097b7a8e24a2f9687c82cfb02825a38 orig/FailureTable$BlockOfferList.class : a061b5f5001d49c036ba777ba15e0b0eaf53bff6 orig/FailureTable.class : 354cfc2cc238a10ba0af124ee138c6180f538ab2 orig/FailureTable$OfferList.class : 01c924a4a2f6565fb7d459f3ca50c8edb600515e -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iQIVAwUBR6UAVViZGG6DH7hRAQJKyxAA0b1lhKyB1EuA71YxbJxe2NEH0eNTrzjd 8W9ClAOFTOq9271jI6EdvAce+C/hFNSUpNzg0TYyFQgx7iMocT7dckG62yYbKbil U2F+4OFiVDQZIH15CDpI7qbmIu6z1ZFAT/y8p3AvceYyyjJmQrjnDFBtqsXYw2DE tzsASfMuiHt+HMwKeXYCWjT3nGNebd6H5Vsd6WaeidUSUDzoyNtKoZ8h8sLOfcKl Gu1p17f2dkulZDeYh7At6JJQ1wgq4UBjtpaUOKjcnnIQHJQ0n8ZUHZu8HcuO4dl6 +dqdVtnVXZY4JEa486y4+Q7ATsYqXkSKLpwMSs2fWUawQUv1JDFJtBNOx3Yq+jp6 pk2LBsAZKBtb4WzvvIWl/ud8CU3n7QNczT9AXfX0KwqOyOho+wL8PtKOqXIs/N5S ZKuzhM3HSMG5jOo+U72HXN7PMWHDZANo1UpwY4s9rFgV+dU3T+bO5i/3k8n8vWdI Gz3+EvgCIuKzTuUUjMSUOzzph0vDyzIhrlhWiQaftVWY2k/IDVZyn/Fq4Tt42ciU Eqricz2SZWtt79eslXqgwVCchBLWEsHt79etVimLRtBCxyogl546ll2edmuAiAKK KX9Io8R4ERj4439ld+CPJU9Xf1o/HPBspSq0uQ4xtztbnC7GgtrOXgnnGtCiBfpX iibOLQPCnwQ= =zuGk -----END PGP SIGNATURE----- From toad at freenetproject.org Sat Feb 2 23:44:55 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 23:44:55 +0000 (UTC) Subject: [freenet-cvs] r17490 - in trunk/freenet/src/freenet: client/async node Message-ID: <20080202234455.1502947AEC6@freenetproject.org> Author: toad Date: 2008-02-02 23:44:54 +0000 (Sat, 02 Feb 2008) New Revision: 17490 Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java trunk/freenet/src/freenet/client/async/OfferedKeysList.java trunk/freenet/src/freenet/node/FailureTable.java trunk/freenet/src/freenet/node/NodeClientCore.java Log: Dequeue key when no longer any offers for it. Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java =================================================================== --- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 23:42:40 UTC (rev 17489) +++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java 2008-02-02 23:44:54 UTC (rev 17490) @@ -638,4 +638,10 @@ if(priority == Short.MAX_VALUE) return; offeredKeys[priority].queueKey(key); } + + public void dequeueOfferedKey(Key key) { + for(int i=0;i Author: toad Date: 2008-02-02 23:50:17 +0000 (Sat, 02 Feb 2008) New Revision: 17491 Modified: trunk/freenet/src/freenet/node/RequestSender.java Log: Fix NPE Modified: trunk/freenet/src/freenet/node/RequestSender.java =================================================================== --- trunk/freenet/src/freenet/node/RequestSender.java 2008-02-02 23:44:54 UTC (rev 17490) +++ trunk/freenet/src/freenet/node/RequestSender.java 2008-02-02 23:50:17 UTC (rev 17491) @@ -187,6 +187,7 @@ OfferList offers = node.failureTable.getOffers(key); + if(offers != null) { while(true) { // Fetches valid offers, then expired ones. Expired offers don't count towards failures, // but they're still worth trying. @@ -367,6 +368,7 @@ // We don't remove the offer in that case. Otherwise we do, even if it fails. // FNPGetOfferedKeyInvalid is also possible. } + } int routeAttempts=0; int rejectOverloads=0; From toad at freenetproject.org Sat Feb 2 23:52:50 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 23:52:50 +0000 (UTC) Subject: [freenet-cvs] r17492 - trunk/freenet/src/freenet/node Message-ID: <20080202235250.B2E4647B766@freenetproject.org> Author: toad Date: 2008-02-02 23:52:50 +0000 (Sat, 02 Feb 2008) New Revision: 17492 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: Fix an NPE. Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-02 23:50:17 UTC (rev 17491) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-02 23:52:50 UTC (rev 17492) @@ -49,10 +49,16 @@ requestorNodes = new WeakReference[requestors.length]; requestorTimes = new long[requestors.length]; requestorBootIDs = new long[requestors.length]; - for(int i=0;i Author: toad Date: 2008-02-02 23:54:47 +0000 (Sat, 02 Feb 2008) New Revision: 17493 Modified: trunk/freenet/src/freenet/node/FailureTable.java Log: Push the BlockOfferList, not the BlockOffer! Modified: trunk/freenet/src/freenet/node/FailureTable.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 23:52:50 UTC (rev 17492) +++ trunk/freenet/src/freenet/node/FailureTable.java 2008-02-02 23:54:47 UTC (rev 17493) @@ -301,7 +301,7 @@ } else { bl.addOffer(offer); } - blockOfferListByKey.push(key, offer); + blockOfferListByKey.push(key, bl); trimOffersList(now); } From toad at freenetproject.org Sat Feb 2 23:56:51 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sat, 2 Feb 2008 23:56:51 +0000 (UTC) Subject: [freenet-cvs] r17494 - trunk/freenet/src/freenet/node Message-ID: <20080202235651.9CB45391E8C@freenetproject.org> Author: toad Date: 2008-02-02 23:56:51 +0000 (Sat, 02 Feb 2008) New Revision: 17494 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: Fix NPE Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-02 23:54:47 UTC (rev 17493) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-02 23:56:51 UTC (rev 17494) @@ -60,9 +60,15 @@ requestorTimes = new long[0]; requestorBootIDs = new long[0]; } - requestedNodes = new WeakReference[] { requested.myRef }; - requestedLocs = new double[] { requested.getLocation() }; - requestedBootIDs = new long[] { requested.getBootID() }; + if(requested != null) { + requestedNodes = new WeakReference[] { requested.myRef }; + requestedLocs = new double[] { requested.getLocation() }; + requestedBootIDs = new long[] { requested.getBootID() }; + } else { + requestedNodes = new WeakReference[0]; + requestedLocs = new double[0]; + requestedBootIDs = new long[0]; + } } /** From toad at freenetproject.org Sun Feb 3 00:00:20 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sun, 3 Feb 2008 00:00:20 +0000 (UTC) Subject: [freenet-cvs] r17495 - trunk/freenet/src/freenet/node Message-ID: <20080203000020.ADB434796E3@freenetproject.org> Author: toad Date: 2008-02-03 00:00:19 +0000 (Sun, 03 Feb 2008) New Revision: 17495 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: Fix another NPE. Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-02 23:56:51 UTC (rev 17494) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:00:19 UTC (rev 17495) @@ -64,10 +64,12 @@ requestedNodes = new WeakReference[] { requested.myRef }; requestedLocs = new double[] { requested.getLocation() }; requestedBootIDs = new long[] { requested.getBootID() }; + requestedTimes = new long[] { System.currentTimeMillis() }; } else { requestedNodes = new WeakReference[0]; requestedLocs = new double[0]; requestedBootIDs = new long[0]; + requestedTimes = new long[0]; } } From toad at freenetproject.org Sun Feb 3 00:04:47 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sun, 3 Feb 2008 00:04:47 +0000 (UTC) Subject: [freenet-cvs] r17496 - trunk/freenet/src/freenet/node Message-ID: <20080203000447.6066A391DDA@freenetproject.org> Author: toad Date: 2008-02-03 00:04:44 +0000 (Sun, 03 Feb 2008) New Revision: 17496 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: Fix ArrayIndexOutOfBounds Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:00:19 UTC (rev 17495) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:04:44 UTC (rev 17496) @@ -237,8 +237,8 @@ long[] newRequestedTimes = new long[requestedNodes.length+notIncluded-nulls]; int toIndex = 0; - for(int i=0;i Author: toad Date: 2008-02-03 00:10:40 +0000 (Sun, 03 Feb 2008) New Revision: 17497 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: Clarify Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:04:44 UTC (rev 17496) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:10:40 UTC (rev 17497) @@ -101,9 +101,10 @@ synchronized void addRequestors(PeerNode[] requestors, long now) { receivedTime = now; + /** The number of new requestor elements. These are moved to the beginning and the + * rest is nulled out. */ int notIncluded = 0; int nulls = 0; - int ptr = 0; for(int i=0;i Author: toad Date: 2008-02-03 00:11:02 +0000 (Sun, 03 Feb 2008) New Revision: 17498 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: comments Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:10:40 UTC (rev 17497) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:11:02 UTC (rev 17498) @@ -102,7 +102,8 @@ synchronized void addRequestors(PeerNode[] requestors, long now) { receivedTime = now; /** The number of new requestor elements. These are moved to the beginning and the - * rest is nulled out. */ + * rest is nulled out. So this is also the index of the first non-null element in + * requestors. */ int notIncluded = 0; int nulls = 0; for(int i=0;i Author: toad Date: 2008-02-03 00:12:44 +0000 (Sun, 03 Feb 2008) New Revision: 17499 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: Same clarifications to other function Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:11:02 UTC (rev 17498) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:12:44 UTC (rev 17499) @@ -191,9 +191,11 @@ private synchronized void addRequestedFrom(PeerNode[] requestedFrom, long now) { sentTime = now; + /** The number of new requestedFrom elements. These are moved to the beginning and the + * rest is nulled out. So this is also the index of the first non-null element in + * requestedFrom. */ int notIncluded = 0; int nulls = 0; - int ptr = 0; for(int i=0;i Author: toad Date: 2008-02-03 00:17:28 +0000 (Sun, 03 Feb 2008) New Revision: 17500 Modified: trunk/freenet/src/freenet/node/RequestHandler.java trunk/freenet/src/freenet/node/RequestSender.java Log: Prevent NPE Modified: trunk/freenet/src/freenet/node/RequestHandler.java =================================================================== --- trunk/freenet/src/freenet/node/RequestHandler.java 2008-02-03 00:12:44 UTC (rev 17499) +++ trunk/freenet/src/freenet/node/RequestHandler.java 2008-02-03 00:17:28 UTC (rev 17500) @@ -229,7 +229,7 @@ if (now > responseDeadline) { // Offer the data if there is any. - node.failureTable.onFailure(key, htl, new PeerNode[] { source }, null, -1, System.currentTimeMillis()); + node.failureTable.onFailure(key, htl, sourceAsArray(), null, -1, System.currentTimeMillis()); Logger.error(this, "requestsender took too long to respond to requestor ("+TimeUtil.formatTime((now - searchStartTime), 2, true)+"/"+rs.getStatusString()+")"); applyByteCounts(); unregisterRequestHandlerWithNode(); @@ -331,7 +331,12 @@ } } - /** + private PeerNode[] sourceAsArray() { + if(source == null) return null; + else return new PeerNode[] { source }; + } + + /** * Return data from the datastore. * @param block The block we found in the datastore. * @throws NotConnectedException If we lose the connected to the request source. Modified: trunk/freenet/src/freenet/node/RequestSender.java =================================================================== --- trunk/freenet/src/freenet/node/RequestSender.java 2008-02-03 00:12:44 UTC (rev 17499) +++ trunk/freenet/src/freenet/node/RequestSender.java 2008-02-03 00:17:28 UTC (rev 17500) @@ -271,7 +271,7 @@ } catch (KeyVerifyException e1) { Logger.normal(this, "Got data but verify failed: "+e1, e1); finish(GET_OFFER_VERIFY_FAILURE, pn, true); - node.failureTable.onFailure(key, htl, new PeerNode[] { source }, pn, -1, System.currentTimeMillis()); + node.failureTable.onFailure(key, htl, sourceAsArray(), pn, -1, System.currentTimeMillis()); offers.deleteLastOffer(); return; } @@ -283,7 +283,7 @@ else Logger.error(this, "Transfer failed ("+e.getReason()+"/"+RetrievalException.getErrString(e.getReason())+"): "+e, e); finish(GET_OFFER_TRANSFER_FAILED, pn, true); - node.failureTable.onFailure(key, htl, new PeerNode[] { source }, pn, -1, System.currentTimeMillis()); + node.failureTable.onFailure(key, htl, sourceAsArray(), pn, -1, System.currentTimeMillis()); offers.deleteLastOffer(); return; } @@ -380,7 +380,7 @@ // This used to be RNF, I dunno why //???: finish(GENERATED_REJECTED_OVERLOAD, null); finish(DATA_NOT_FOUND, null, false); - node.failureTable.onFailure(key, htl, new PeerNode[] { source }, null, FailureTable.REJECT_TIME, System.currentTimeMillis()); + node.failureTable.onFailure(key, htl, sourceAsArray(), null, FailureTable.REJECT_TIME, System.currentTimeMillis()); return; } @@ -395,7 +395,7 @@ Logger.minor(this, "no more peers, but overloads ("+rejectOverloads+"/"+routeAttempts+" overloaded)"); // Backtrack finish(ROUTE_NOT_FOUND, null, false); - node.failureTable.onFailure(key, htl, new PeerNode[] { source }, null, -1, System.currentTimeMillis()); + node.failureTable.onFailure(key, htl, sourceAsArray(), null, -1, System.currentTimeMillis()); return; } @@ -547,7 +547,7 @@ next.localRejectedOverload("FatalTimeout"); forwardRejectedOverload(); finish(TIMED_OUT, next, false); - node.failureTable.onFailure(key, htl, new PeerNode[] { source }, next, -1, System.currentTimeMillis()); + node.failureTable.onFailure(key, htl, sourceAsArray(), next, -1, System.currentTimeMillis()); return; } @@ -558,7 +558,7 @@ if(msg.getSpec() == DMT.FNPDataNotFound) { next.successNotOverload(); finish(DATA_NOT_FOUND, next, false); - node.failureTable.onFailure(key, htl, new PeerNode[] { source }, next, FailureTable.REJECT_TIME, System.currentTimeMillis()); + node.failureTable.onFailure(key, htl, sourceAsArray(), next, FailureTable.REJECT_TIME, System.currentTimeMillis()); return; } @@ -620,7 +620,7 @@ // If there is, we will avoid sending requests for the specified period. // FIXME we need to create the FT entry. finish(RECENTLY_FAILED, next, false); - node.failureTable.onFailure(key, htl, new PeerNode[] { source }, next, timeLeft, System.currentTimeMillis()); + node.failureTable.onFailure(key, htl, sourceAsArray(), next, timeLeft, System.currentTimeMillis()); return; } @@ -686,7 +686,7 @@ } catch (KeyVerifyException e1) { Logger.normal(this, "Got data but verify failed: "+e1, e1); finish(VERIFY_FAILURE, next, false); - node.failureTable.onFailure(key, htl, new PeerNode[] { source }, next, -1, System.currentTimeMillis()); + node.failureTable.onFailure(key, htl, sourceAsArray(), next, -1, System.currentTimeMillis()); return; } finish(SUCCESS, next, false); @@ -697,7 +697,7 @@ else Logger.error(this, "Transfer failed ("+e.getReason()+"/"+RetrievalException.getErrString(e.getReason())+"): "+e, e); finish(TRANSFER_FAILED, next, false); - node.failureTable.onFailure(key, htl, new PeerNode[] { source }, next, -1, System.currentTimeMillis()); + node.failureTable.onFailure(key, htl, sourceAsArray(), next, -1, System.currentTimeMillis()); return; } } finally { @@ -759,7 +759,12 @@ } } - /** + private PeerNode[] sourceAsArray() { + if(source == null) return null; + else return new PeerNode[] { source }; + } + + /** * Finish fetching an SSK. We must have received the data, the headers and the pubkey by this point. * @param next The node we received the data from. */ From toad at freenetproject.org Sun Feb 3 00:19:02 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Sun, 3 Feb 2008 00:19:02 +0000 (UTC) Subject: [freenet-cvs] r17501 - trunk/freenet/src/freenet/node Message-ID: <20080203001902.A6940391EAC@freenetproject.org> Author: toad Date: 2008-02-03 00:19:02 +0000 (Sun, 03 Feb 2008) New Revision: 17501 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: Doh - another NPE Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:17:28 UTC (rev 17500) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:19:02 UTC (rev 17501) @@ -46,10 +46,10 @@ creationTime = now; receivedTime = now; sentTime = now; - requestorNodes = new WeakReference[requestors.length]; - requestorTimes = new long[requestors.length]; - requestorBootIDs = new long[requestors.length]; if(requestors != null) { + requestorNodes = new WeakReference[requestors.length]; + requestorTimes = new long[requestors.length]; + requestorBootIDs = new long[requestors.length]; for(int i=0;i Author: toad Date: 2008-02-03 00:20:53 +0000 (Sun, 03 Feb 2008) New Revision: 17502 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: and another NPE Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:19:02 UTC (rev 17501) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 00:20:53 UTC (rev 17502) @@ -87,7 +87,8 @@ htl = htl2; timeoutTime = newTimeoutTime; } - addRequestors(requestors, now); + if(requestors != null) + addRequestors(requestors, now); if(requested != null) addRequestedFrom(new PeerNode[] { requested }, now); } From toad at freenetproject.org Mon Feb 4 14:24:53 2008 From: toad at freenetproject.org (toad at freenetproject.org) Date: Mon, 4 Feb 2008 14:24:53 +0000 (UTC) Subject: [freenet-cvs] r17504 - trunk/freenet/src/freenet/node Message-ID: <20080204142453.1FBCF3C061B@freenetproject.org> Author: toad Date: 2008-02-04 14:24:52 +0000 (Mon, 04 Feb 2008) New Revision: 17504 Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java Log: logging Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java =================================================================== --- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-03 14:42:33 UTC (rev 17503) +++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-04 14:24:52 UTC (rev 17504) @@ -6,6 +6,7 @@ import java.lang.ref.WeakReference; import freenet.keys.Key; +import freenet.support.Logger; class FailureTableEntry { @@ -35,11 +36,14 @@ long[] requestedBootIDs; long[] requestedTimes; + static boolean logMINOR; + /** We remember that a node has asked us for a key for up to an hour; after that, we won't offer the key, and * if we receive an offer from that node, we will reject it */ static final int MAX_TIME_BETWEEN_REQUEST_AND_OFFER = 60 * 60 * 1000; FailureTableEntry(Key key2, short htl2, PeerNode[] requestors, PeerNode requested) { + logMINOR = Logger.shouldLog(Logger.MINOR, this); long now = System.currentTimeMillis(); this.key = key2; this.htl = htl2; @@ -101,6 +105,7 @@ // Note also this will generate some churn... synchronized void addRequestors(PeerNode[] requestors, long now) { + if(logMINOR) Logger.minor(this, "Adding requestors: "+requestors+" at "+now); receivedTime = now; /** The number of new requestor elements. These are moved to the beginning and the * rest is nulled out. So this is also the index of the first non-null element in @@ -133,6 +138,7 @@ } // if it's new, keep it in requestors } for(int i=notIncluded;i