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