Author: toad
Date: 2008-07-02 13:16:57 +0000 (Wed, 02 Jul 2008)
New Revision: 20925

Modified:
   branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
   branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
   branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
Log:
Don't forget to register() persistent puts and putdirs from the queue page.

Modified: branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java    
2008-07-02 12:52:21 UTC (rev 20924)
+++ branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java    
2008-07-02 13:16:57 UTC (rev 20925)
@@ -265,7 +265,13 @@
                                        // FIXME should this be a proper 
localised message? It shouldn't happen... but we'd like to get reports if it 
does.
                                }
                                if(clientPut != null)
-                                       fcp.startBlocking(clientPut);
+                                       try {
+                                               fcp.startBlocking(clientPut);
+                                       } catch (IdentifierCollisionException 
e) {
+                                               Logger.error(this, "Cannot put 
same file twice in same millisecond");
+                                               writePermanentRedirect(ctx, 
"Done", "/queue/");
+                                               return;
+                                       }
                                writePermanentRedirect(ctx, "Done", "/queue/");
                                return;
                        } else if (request.isPartSet("insert-local-file")) {
@@ -310,7 +316,14 @@
                                        return;
                                        // FIXME should this be a proper 
localised message? It shouldn't happen... but we'd like to get reports if it 
does.
                                }
-                               fcp.startBlocking(clientPut);
+                               if(clientPut != null)
+                                       try {
+                                               fcp.startBlocking(clientPut);
+                                       } catch (IdentifierCollisionException 
e) {
+                                               Logger.error(this, "Cannot put 
same file twice in same millisecond");
+                                               writePermanentRedirect(ctx, 
"Done", "/queue/");
+                                               return;
+                                       }
                                writePermanentRedirect(ctx, "Done", "/queue/");
                                return;
                        } else if (request.isPartSet("insert-local-dir")) {
@@ -343,7 +356,14 @@
                                        
this.writeError(L10n.getString("QueueToadlet.errorNoFileOrCannotRead"), 
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" }, 
new String[]{ file.toString() }), ctx);
                                        return;
                                }
-                               fcp.startBlocking(clientPutDir);
+                               if(clientPutDir != null)
+                                       try {
+                                               fcp.startBlocking(clientPutDir);
+                                       } catch (IdentifierCollisionException 
e) {
+                                               Logger.error(this, "Cannot put 
same file twice in same millisecond");
+                                               writePermanentRedirect(ctx, 
"Done", "/queue/");
+                                               return;
+                                       }
                                writePermanentRedirect(ctx, "Done", "/queue/");
                                return;
                        }

Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java       
2008-07-02 12:52:21 UTC (rev 20924)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java       
2008-07-02 13:16:57 UTC (rev 20925)
@@ -206,6 +206,8 @@
                        return null;
                }
        }
+       
+       abstract void register(ObjectContainer container, boolean lazyResume, 
boolean noTags) throws IdentifierCollisionException;

        public void cancel(ObjectContainer container, ClientContext context) {
                ClientRequester cr = getClientRequest();

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java   2008-07-02 
12:52:21 UTC (rev 20924)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java   2008-07-02 
13:16:57 UTC (rev 20925)
@@ -931,12 +931,13 @@
                        Logger.error(this, "Replacing request completion 
callback "+cb, new Exception("error"));
        }

-       public void startBlocking(final ClientRequest req) {
+       public void startBlocking(final ClientRequest req) throws 
IdentifierCollisionException {
                if(req.persistenceType == ClientRequest.PERSIST_REBOOT) {
                        req.start(null, core.clientContext);
                } else {
                        class OutputWrapper {
                                boolean done;
+                               IdentifierCollisionException collided;
                        }
                        final OutputWrapper ow = new OutputWrapper();
                        core.clientContext.jobRunner.queue(new DBJob() {
@@ -944,7 +945,10 @@
                                public void run(ObjectContainer container, 
ClientContext context) {
                                        container.activate(req, 1);
                                        try {
+                                               req.register(container, false, 
false);
                                                req.start(container, context);
+                                       } catch (IdentifierCollisionException 
e) {
+                                               ow.collided = e;
                                        } finally {
                                                synchronized(ow) {
                                                        ow.done = true;
@@ -964,6 +968,8 @@
                                                        // Ignore
                                                }
                                        } else {
+                                               if(ow.collided != null)
+                                                       throw ow.collided;
                                                return;
                                        }
                                }


Reply via email to