[freenet-cvs] r20925 - in branches/db4o/freenet/src/freenet: clients/http node/fcp

toad at freenetproject.org toad at freenetproject.org
Wed Jul 2 13:16:57 UTC 2008


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;
 					}
 				}




More information about the cvs mailing list