Author: dbkr
Date: 2008-12-05 09:31:18 +0000 (Fri, 05 Dec 2008)
New Revision: 24062
Modified:
trunk/apps/Freemail/src/freemail/fcp/FCPConnection.java
trunk/apps/Freemail/src/freemail/fcp/FCPErrorMessage.java
trunk/apps/Freemail/src/freemail/fcp/FCPInsertErrorMessage.java
trunk/apps/Freemail/src/freemail/fcp/HighLevelFCPClient.java
Log:
Minor hack to time out requests, because Freenet seems to just forget all about
some requests, causing Freemail to lock up.
Modified: trunk/apps/Freemail/src/freemail/fcp/FCPConnection.java
===================================================================
--- trunk/apps/Freemail/src/freemail/fcp/FCPConnection.java 2008-12-05
07:04:42 UTC (rev 24061)
+++ trunk/apps/Freemail/src/freemail/fcp/FCPConnection.java 2008-12-05
09:31:18 UTC (rev 24062)
@@ -145,6 +145,17 @@
throw new NoNodeConnectionException(ioe.getMessage());
}
}
+
+ /**
+ * Give up on a request.
+ * This doesn't actually send a cancel command to the node
+ * (I don't think such a thing exists) but it does remove our
+ * request/client map entry. We need this for requests that never
+ * complete, so we don't leak memory.
+ */
+ public synchronized void cancelRequest(FCPMessage msg) {
+ this.clients.remove(msg.getId());
+ }
private void dispatch(FCPMessage msg) {
FCPClient cli = (FCPClient)this.clients.get(msg.getId());
Modified: trunk/apps/Freemail/src/freemail/fcp/FCPErrorMessage.java
===================================================================
--- trunk/apps/Freemail/src/freemail/fcp/FCPErrorMessage.java 2008-12-05
07:04:42 UTC (rev 24061)
+++ trunk/apps/Freemail/src/freemail/fcp/FCPErrorMessage.java 2008-12-05
09:31:18 UTC (rev 24062)
@@ -38,4 +38,9 @@
else
this.isFatal = false;
}
+
+ FCPErrorMessage(int code, boolean fatal) {
+ errorcode = code;
+ isFatal = fatal;
+ }
}
Modified: trunk/apps/Freemail/src/freemail/fcp/FCPInsertErrorMessage.java
===================================================================
--- trunk/apps/Freemail/src/freemail/fcp/FCPInsertErrorMessage.java
2008-12-05 07:04:42 UTC (rev 24061)
+++ trunk/apps/Freemail/src/freemail/fcp/FCPInsertErrorMessage.java
2008-12-05 09:31:18 UTC (rev 24062)
@@ -43,7 +43,14 @@
/* Cancelled by user */
public static final int CANCELLED = 10;
+ // we generate this error, not Freenet
+ public static final int TIMEOUT = 100;
+
FCPInsertErrorMessage(FCPMessage msg) {
super(msg);
}
+
+ FCPInsertErrorMessage(int code, boolean fatal) {
+ super(code, fatal);
+ }
}
Modified: trunk/apps/Freemail/src/freemail/fcp/HighLevelFCPClient.java
===================================================================
--- trunk/apps/Freemail/src/freemail/fcp/HighLevelFCPClient.java
2008-12-05 07:04:42 UTC (rev 24061)
+++ trunk/apps/Freemail/src/freemail/fcp/HighLevelFCPClient.java
2008-12-05 09:31:18 UTC (rev 24062)
@@ -33,6 +33,8 @@
public class HighLevelFCPClient implements FCPClient {
private static final int FCP_TOO_MANY_PATH_COMPONENTS = 11;
private static final int FCP_PERMANANT_REDIRECT = 27;
+ // wait 10 minutes before giving up on inserts
+ private static final int PUT_TIMEOUT = 10 * 60 * 1000;
private FCPConnection conn;
private FCPMessage donemsg;
@@ -134,9 +136,11 @@
msg.headers.put("Persistence", "connection");
msg.setData(data);
+ long startedAt = 0;
while (true) {
try {
this.conn.doRequest(this, msg);
+ startedAt = System.currentTimeMillis();
break;
} catch (NoNodeConnectionException nnce) {
try {
@@ -148,8 +152,15 @@
this.donemsg = null;
while (this.donemsg == null) {
+ if (System.currentTimeMillis() > startedAt +
PUT_TIMEOUT) {
+ Logger.error(this, "Put timed out after
"+PUT_TIMEOUT+"ms. That's not good!");
+ // 'cancel' the request, otherwise we'll leak
memory
+ this.conn.cancelRequest(msg);
+
+ return new
FCPInsertErrorMessage(FCPInsertErrorMessage.TIMEOUT, false);
+ }
try {
- this.wait();
+ this.wait(30000);
} catch (InterruptedException ie) {
}
}