Author: toad
Date: 2008-06-17 18:17:29 +0000 (Tue, 17 Jun 2008)
New Revision: 20410
Modified:
branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java
branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
Log:
Rewrite the /queue/<URI> handling.
Modified: branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
2008-06-17 18:03:30 UTC (rev 20409)
+++ branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
2008-06-17 18:17:29 UTC (rev 20410)
@@ -29,6 +29,7 @@
import com.db4o.ObjectContainer;
import freenet.client.DefaultMIMETypes;
+import freenet.client.FetchResult;
import freenet.client.HighLevelSimpleClient;
import freenet.client.MetadataUnresolvedException;
import freenet.client.async.ClientContext;
@@ -447,20 +448,13 @@
FreenetURI key = new FreenetURI(requestPath);
/* locate request */
- ClientRequest[] clientRequests =
fcp.getGlobalRequests();
- for (int requestIndex = 0, requestCount =
clientRequests.length; requestIndex < requestCount; requestIndex++) {
- ClientRequest clientRequest =
clientRequests[requestIndex];
- if (clientRequest.hasFinished() &&
(clientRequest instanceof ClientGet)) {
- ClientGet clientGet =
(ClientGet) clientRequest;
- if
(clientGet.getURI().equals(key)) {
- Bucket data =
clientGet.getBucket();
- String mimeType =
clientGet.getMIMEType();
- String
requestedMimeType = request.getParam("type", null);
- String forceString =
request.getParam("force");
-
FProxyToadlet.handleDownload(ctx, data, ctx.getBucketFactory(), mimeType,
requestedMimeType, forceString, request.isParameterSet("forcedownload"),
"/queue/", key, "", "/queue/", false, ctx);
- return;
- }
- }
+ FetchResult result =
fcp.getCompletedRequestBlocking(key);
+ if(result != null) {
+ Bucket data = result.asBucket();
+ String mimeType = result.getMimeType();
+ String requestedMimeType =
request.getParam("type", null);
+ String forceString =
request.getParam("force");
+ FProxyToadlet.handleDownload(ctx, data,
ctx.getBucketFactory(), mimeType, requestedMimeType, forceString,
request.isParameterSet("forcedownload"), "/queue/", key, "", "/queue/", false,
ctx);
}
} catch (MalformedURLException mue1) {
}
Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java 2008-06-17
18:03:30 UTC (rev 20409)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java 2008-06-17
18:17:29 UTC (rev 20410)
@@ -11,6 +11,7 @@
import freenet.client.async.ClientContext;
import freenet.client.async.DBJob;
import freenet.client.async.DBJobRunner;
+import freenet.keys.FreenetURI;
import freenet.node.RequestClient;
import freenet.support.Logger;
import freenet.support.io.NativeThread;
@@ -361,4 +362,13 @@
req.delete(container);
}
}
+
+ public ClientGet getCompletedRequest(FreenetURI key, ObjectContainer
container) {
+ // FIXME speed this up with another hashmap or something.
+ for(int i=0;i<completedUnackedRequests.size();i++) {
+ ClientGet getter = (ClientGet)
completedUnackedRequests.get(i);
+ if(getter.getURI().equals(key)) return getter;
+ }
+ return null;
+ }
}
Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java 2008-06-17
18:03:30 UTC (rev 20409)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java 2008-06-17
18:17:29 UTC (rev 20410)
@@ -25,8 +25,10 @@
import com.db4o.ObjectContainer;
+import freenet.client.ClientMetadata;
import freenet.client.DefaultMIMETypes;
import freenet.client.FetchContext;
+import freenet.client.FetchResult;
import freenet.client.HighLevelSimpleClient;
import freenet.client.InsertContext;
import freenet.client.async.ClientContext;
@@ -931,4 +933,53 @@
}
}
+ public FetchResult getCompletedRequestBlocking(final FreenetURI key) {
+ ClientGet get = globalRebootClient.getCompletedRequest(key,
null);
+ if(get != null) {
+ // FIXME race condition with free() - arrange
refcounting for the data to prevent this
+ return new FetchResult(new
ClientMetadata(get.getMIMEType()), get.getBucket());
+ }
+
+ class OutputWrapper {
+ FetchResult result;
+ boolean done;
+ }
+
+ final OutputWrapper ow = new OutputWrapper();
+
+ core.clientContext.jobRunner.queue(new DBJob() {
+
+ public void run(ObjectContainer container,
ClientContext context) {
+ FetchResult result = null;
+ try {
+ ClientGet get =
globalForeverClient.getCompletedRequest(key, container);
+ if(get != null) {
+ result = new FetchResult(new
ClientMetadata(get.getMIMEType()), get.getBucket());
+ }
+ } finally {
+ synchronized(ow) {
+ ow.result = result;
+ ow.done = true;
+ ow.notifyAll();
+ }
+ }
+ }
+
+ }, NativeThread.HIGH_PRIORITY, false);
+
+ synchronized(ow) {
+ while(true) {
+ if(ow.done) {
+ return ow.result;
+ } else {
+ try {
+ ow.wait();
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ }
+ }
+ }
+ }
+
}