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) {
                        }
                }


Reply via email to