Author: toad
Date: 2005-11-12 02:35:45 +0000 (Sat, 12 Nov 2005)
New Revision: 7535
Modified:
trunk/freenet/src/freenet/client/BlockInserter.java
trunk/freenet/src/freenet/client/RetryTracker.java
trunk/freenet/src/freenet/io/comm/DummyPeerContext.java
trunk/freenet/src/freenet/io/comm/PeerContext.java
trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java
trunk/freenet/src/freenet/node/FNPPacketMangler.java
trunk/freenet/src/freenet/node/InsertHandler.java
trunk/freenet/src/freenet/node/InsertSender.java
trunk/freenet/src/freenet/node/KeyTracker.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/Version.java
trunk/freenet/src/freenet/support/DoublyLinkedList.java
trunk/freenet/src/freenet/support/DoublyLinkedListImpl.java
trunk/freenet/src/freenet/support/UpdatableSortedLinkedList.java
Log:
174:
More work on splitfiles.
Has exposed some serious underlying bugs.
DOES NOT WORK!
Modified: trunk/freenet/src/freenet/client/BlockInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/BlockInserter.java 2005-11-12 00:58:36 UTC
(rev 7534)
+++ trunk/freenet/src/freenet/client/BlockInserter.java 2005-11-12 02:35:45 UTC
(rev 7535)
@@ -51,6 +51,7 @@
public void run() {
try {
+ Logger.minor(this, "Running "+this);
if(fetchedData == null)
throw new NullPointerException();
realRun();
Modified: trunk/freenet/src/freenet/client/RetryTracker.java
===================================================================
--- trunk/freenet/src/freenet/client/RetryTracker.java 2005-11-12 00:58:36 UTC
(rev 7534)
+++ trunk/freenet/src/freenet/client/RetryTracker.java 2005-11-12 02:35:45 UTC
(rev 7535)
@@ -209,6 +209,11 @@
", running: "+runningBlocks.size()+", levels:
"+levels.size()+", finishOnEmpty: "+finishOnEmpty);
if(runningBlocks.size() == 1)
Logger.minor(this, "Only block running:
"+runningBlocks.toArray()[0]);
+ else if(levels.isEmpty()) {
+ for(Iterator i=runningBlocks.iterator();i.hasNext();) {
+ Logger.minor(this, "Still running: "+i.next());
+ }
+ }
if((succeededBlocks.size() >= targetSuccesses)
|| (runningBlocks.isEmpty() && levels.isEmpty()
&& finishOnEmpty)) {
killed = true;
Modified: trunk/freenet/src/freenet/io/comm/DummyPeerContext.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/DummyPeerContext.java 2005-11-12
00:58:36 UTC (rev 7534)
+++ trunk/freenet/src/freenet/io/comm/DummyPeerContext.java 2005-11-12
02:35:45 UTC (rev 7535)
@@ -22,4 +22,8 @@
// Do nothing
}
+ public boolean isConnected() {
+ return false;
+ }
+
}
Modified: trunk/freenet/src/freenet/io/comm/PeerContext.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/PeerContext.java 2005-11-12 00:58:36 UTC
(rev 7534)
+++ trunk/freenet/src/freenet/io/comm/PeerContext.java 2005-11-12 02:35:45 UTC
(rev 7535)
@@ -12,4 +12,7 @@
/** Force the peer to disconnect */
void forceDisconnect();
+
+ /** Is the peer connected? If we can't tell, return true. */
+ boolean isConnected();
}
Modified: trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java
===================================================================
--- trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java 2005-11-12
00:58:36 UTC (rev 7534)
+++ trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java 2005-11-12
02:35:45 UTC (rev 7535)
@@ -62,12 +62,14 @@
public boolean send() {
final PacketThrottle throttle =
PacketThrottle.getThrottle(_destination.getPeer(), _prb._packetSize);
_receiverThread = Thread.currentThread();
- _senderThread = new Thread() {
+ _senderThread = new Thread("_senderThread for "+_uid) {
public void run() {
int sentSinceLastPing = 0;
while (!_sendComplete) {
- long waitUntil =
System.currentTimeMillis() + throttle.getDelay();
+ long delay =
throttle.getDelay();
+ long waitUntil =
System.currentTimeMillis() + delay;
+ Logger.minor(this, "Waiting for
"+delay+" ms for "+_uid+" : "+throttle);
try {
while (waitUntil >
System.currentTimeMillis()) {
if(_sendComplete) return;
@@ -136,6 +138,7 @@
_sendComplete = true;
return false;
}
+ if(_sendComplete || !_destination.isConnected()) return
false;
if (msg == null) {
if (getNumSent() == _prb.getNumPackets()) {
_sendComplete = true;
Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java 2005-11-12
00:58:36 UTC (rev 7534)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java 2005-11-12
02:35:45 UTC (rev 7535)
@@ -811,7 +811,7 @@
pn.requeueMessageItems(messages, i, messages.length-i,
false);
return;
} catch (Throwable e) {
- Logger.error(this, "Caught "+e+" while sending messages,
requeueing");
+ Logger.error(this, "Caught "+e+" while sending messages,
requeueing", e);
// Requeue
pn.requeueMessageItems(messages, i, messages.length-i,
false);
return;
Modified: trunk/freenet/src/freenet/node/InsertHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/InsertHandler.java 2005-11-12 00:58:36 UTC
(rev 7534)
+++ trunk/freenet/src/freenet/node/InsertHandler.java 2005-11-12 02:35:45 UTC
(rev 7535)
@@ -155,7 +155,10 @@
continue;
}
- if(status == InsertSender.REJECTED_OVERLOAD) {
+ // Internal error counts as overload. It'd only create a timeout
otherwise, which is the same thing anyway.
+ // We *really* need a good way to deal with nodes that constantly
R_O!
+ if(status == InsertSender.REJECTED_OVERLOAD ||
+ status == InsertSender.INTERNAL_ERROR) {
msg = DMT.createFNPRejectedOverload(uid);
source.send(msg);
return;
Modified: trunk/freenet/src/freenet/node/InsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/InsertSender.java 2005-11-12 00:58:36 UTC
(rev 7534)
+++ trunk/freenet/src/freenet/node/InsertSender.java 2005-11-12 02:35:45 UTC
(rev 7535)
@@ -54,6 +54,7 @@
static final int SUCCESS = 0;
static final int ROUTE_NOT_FOUND = 1;
static final int REJECTED_OVERLOAD = 2;
+ static final int INTERNAL_ERROR = 3;
public String toString() {
return super.toString()+" for "+uid;
@@ -261,6 +262,7 @@
}
} catch (Throwable t) {
Logger.error(this, "Caught "+t, t);
+ finish(INTERNAL_ERROR);
} finally {
node.completed(uid);
node.removeInsertSender(myKey, origHTL, this);
@@ -317,6 +319,8 @@
return "REJECTED: OVERLOAD";
if(status == NOT_FINISHED)
return "NOT FINISHED";
+ if(status == INTERNAL_ERROR)
+ return "INTERNAL ERROR";
return "UNKNOWN STATUS CODE: "+status;
}
}
Modified: trunk/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- trunk/freenet/src/freenet/node/KeyTracker.java 2005-11-12 00:58:36 UTC
(rev 7534)
+++ trunk/freenet/src/freenet/node/KeyTracker.java 2005-11-12 02:35:45 UTC
(rev 7535)
@@ -185,6 +185,18 @@
prev = i;
return old;
}
+
+ private DoublyLinkedList parent;
+
+ public DoublyLinkedList getParent() {
+ return parent;
+ }
+
+ public DoublyLinkedList setParent(DoublyLinkedList l) {
+ DoublyLinkedList old = parent;
+ parent = l;
+ return old;
+ }
}
private abstract class BaseQueuedResend extends PacketActionItem
implements IndexableUpdatableSortedLinkedListItem {
@@ -249,6 +261,18 @@
public Object indexValue() {
return packetNumberAsInteger;
}
+
+ private DoublyLinkedList parent;
+
+ public DoublyLinkedList getParent() {
+ return parent;
+ }
+
+ public DoublyLinkedList setParent(DoublyLinkedList l) {
+ DoublyLinkedList old = parent;
+ parent = l;
+ return old;
+ }
}
private class QueuedResendRequest extends BaseQueuedResend {
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2005-11-12 00:58:36 UTC (rev
7534)
+++ trunk/freenet/src/freenet/node/Node.java 2005-11-12 02:35:45 UTC (rev
7535)
@@ -437,6 +437,8 @@
throw new
LowLevelPutException(LowLevelPutException.REJECTED_OVERLOAD);
case InsertSender.ROUTE_NOT_FOUND:
throw new
LowLevelPutException(LowLevelPutException.ROUTE_NOT_FOUND);
+ case InsertSender.INTERNAL_ERROR:
+ throw new
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
default:
Logger.error(this, "Unknown InsertSender code in
putCHK: "+is.getStatus()+" on "+is);
throw new
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2005-11-12 00:58:36 UTC (rev
7534)
+++ trunk/freenet/src/freenet/node/Version.java 2005-11-12 02:35:45 UTC (rev
7535)
@@ -20,10 +20,10 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- public static final int buildNumber = 171;
+ public static final int buildNumber = 174;
/** Oldest build of Fred we will talk to */
- public static final int lastGoodBuild = 171;
+ public static final int lastGoodBuild = 174;
/** The highest reported build of fred */
public static int highestSeenBuild = buildNumber;
Modified: trunk/freenet/src/freenet/support/DoublyLinkedList.java
===================================================================
--- trunk/freenet/src/freenet/support/DoublyLinkedList.java 2005-11-12
00:58:36 UTC (rev 7534)
+++ trunk/freenet/src/freenet/support/DoublyLinkedList.java 2005-11-12
02:35:45 UTC (rev 7535)
@@ -15,6 +15,9 @@
Item setNext(Item i);
Item getPrev();
Item setPrev(Item i);
+ // Strictly for sanity checking
+ DoublyLinkedList getParent();
+ DoublyLinkedList setParent(DoublyLinkedList l);
}
void clear();
Modified: trunk/freenet/src/freenet/support/DoublyLinkedListImpl.java
===================================================================
--- trunk/freenet/src/freenet/support/DoublyLinkedListImpl.java 2005-11-12
00:58:36 UTC (rev 7534)
+++ trunk/freenet/src/freenet/support/DoublyLinkedListImpl.java 2005-11-12
02:35:45 UTC (rev 7535)
@@ -217,6 +217,8 @@
* @return this item, or null if the item was not in the list
*/
public DoublyLinkedList.Item remove(DoublyLinkedList.Item i) {
+ if (i.getParent() != this)
+ throw new PromiscuousItemException(i);
DoublyLinkedList.Item next = i.getNext(), prev = i.getPrev();
if (next == null || prev == null) return null; // not in the list
prev.setNext(next);
@@ -231,6 +233,10 @@
* Inserts item J before item I (going from head to tail).
*/
public void insertPrev(DoublyLinkedList.Item i, DoublyLinkedList.Item j) {
+ if (i.getParent() != this)
+ throw new PromiscuousItemException(i);
+ if (j.getParent() != null)
+ throw new PromiscuousItemException(j);
if (j.getNext() != null || j.getPrev() != null)
throw new PromiscuousItemException(j);
DoublyLinkedList.Item prev = i.getPrev();
@@ -255,6 +261,10 @@
* Inserts item J after item I (going from head to tail).
*/
public void insertNext(DoublyLinkedList.Item i, DoublyLinkedList.Item j) {
+ if (i.getParent() != this)
+ throw new PromiscuousItemException(i);
+ if (j.getParent() != null)
+ throw new PromiscuousItemException(j);
if (j.getNext() != null || j.getPrev() != null)
throw new PromiscuousItemException(j);
DoublyLinkedList.Item next = i.getNext();
@@ -390,6 +400,7 @@
public static class Item implements DoublyLinkedList.Item {
private DoublyLinkedList.Item next, prev;
+ private DoublyLinkedList list;
public Object clone() {
if(getClass() != Item.class)
throw new RuntimeException("Must implement clone() for
"+getClass());
@@ -411,6 +422,14 @@
prev = i;
return old;
}
+ public DoublyLinkedList getParent() {
+ return list;
+ }
+ public DoublyLinkedList setParent(DoublyLinkedList l) {
+ DoublyLinkedList old = list;
+ list = l;
+ return old;
+ }
}
}
Modified: trunk/freenet/src/freenet/support/UpdatableSortedLinkedList.java
===================================================================
--- trunk/freenet/src/freenet/support/UpdatableSortedLinkedList.java
2005-11-12 00:58:36 UTC (rev 7534)
+++ trunk/freenet/src/freenet/support/UpdatableSortedLinkedList.java
2005-11-12 02:35:45 UTC (rev 7535)
@@ -131,7 +131,7 @@
/**
* @return The number of items in the list.
*/
- public int size() {
+ public synchronized int size() {
return list.size();
}
@@ -140,6 +140,9 @@
*/
public synchronized UpdatableSortedLinkedListItem[] toArray() {
int size = list.size();
+ if(size < 0)
+ throw new IllegalStateException("list.size() = "+size+" for
"+this);
+
UpdatableSortedLinkedListItem[] output =
new UpdatableSortedLinkedListItem[size];
int i=0;