r26667 - trunk/freenet/src/freenet/node/fcp

[email protected]
Newsgroups gmane.network.freenet.cvs
Message-ID <[email protected]>
Author: toad
Date: 2009-04-08 23:24:51 +0000 (Wed, 08 Apr 2009)
New Revision: 26667

Modified:
   trunk/freenet/src/freenet/node/fcp/ClientGet.java
   trunk/freenet/src/freenet/node/fcp/ClientPut.java
   trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
   trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
   trunk/freenet/src/freenet/node/fcp/ClientRequest.java
   trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
   trunk/freenet/src/freenet/node/fcp/FCPServer.java
Log:
FCPClient's other than the global queue are not necessarily activated. Hence we need to run the constructors for ClientGet/Put/PutDir on the database thread, in order to activate them.


Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java	2009-04-08 22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java	2009-04-08 23:24:51 UTC (rev 26667)
@@ -82,10 +82,10 @@
 	public ClientGet(FCPClient globalClient, FreenetURI uri, boolean dsOnly, boolean ignoreDS,
 			int maxSplitfileRetries, int maxNonSplitfileRetries, long maxOutputLength,
 			short returnType, boolean persistRebootOnly, String identifier, int verbosity, short prioClass,
-			File returnFilename, File returnTempFilename, FCPServer server) throws IdentifierCollisionException, NotAllowedException, IOException {
+			File returnFilename, File returnTempFilename, FCPServer server, ObjectContainer container) throws IdentifierCollisionException, NotAllowedException, IOException {
 		super(uri, identifier, verbosity, null, globalClient, prioClass,
 				(persistRebootOnly ? ClientRequest.PERSIST_REBOOT : ClientRequest.PERSIST_FOREVER),
-				null, true);
+				null, true, container);
 
 		fctx = new FetchContext(server.defaultFetchContext, FetchContext.IDENTICAL_MASK, false, null);
 		fctx.eventProducer.addEventListener(this);
@@ -122,9 +122,9 @@
 					returnBucket, null);
 	}
 	
-	public ClientGet(FCPConnectionHandler handler, ClientGetMessage message, FCPServer server) throws IdentifierCollisionException, MessageInvalidException {
+	public ClientGet(FCPConnectionHandler handler, ClientGetMessage message, FCPServer server, ObjectContainer container) throws IdentifierCollisionException, MessageInvalidException {
 		super(message.uri, message.identifier, message.verbosity, handler, message.priorityClass,
-				message.persistenceType, message.clientToken, message.global);
+				message.persistenceType, message.clientToken, message.global, container);
 		// Create a Fetcher directly in order to get more fine-grained control,
 		// since the client may override a few context elements.
 		fctx = new FetchContext(server.defaultFetchContext, FetchContext.IDENTICAL_MASK, false, null);

Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java	2009-04-08 22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java	2009-04-08 23:24:51 UTC (rev 26667)
@@ -103,8 +103,8 @@
 	public ClientPut(FCPClient globalClient, FreenetURI uri, String identifier, int verbosity, 
 			short priorityClass, short persistenceType, String clientToken, boolean getCHKOnly,
 			boolean dontCompress, int maxRetries, short uploadFromType, File origFilename, String contentType,
-			Bucket data, FreenetURI redirectTarget, String targetFilename, boolean earlyEncode, FCPServer server) throws IdentifierCollisionException, NotAllowedException, FileNotFoundException, MalformedURLException, MetadataUnresolvedException {
-		super(uri, identifier, verbosity, null, globalClient, priorityClass, persistenceType, null, true, getCHKOnly, dontCompress, maxRetries, earlyEncode, server);
+			Bucket data, FreenetURI redirectTarget, String targetFilename, boolean earlyEncode, FCPServer server, ObjectContainer container) throws IdentifierCollisionException, NotAllowedException, FileNotFoundException, MalformedURLException, MetadataUnresolvedException {
+		super(uri, identifier, verbosity, null, globalClient, priorityClass, persistenceType, null, true, getCHKOnly, dontCompress, maxRetries, earlyEncode, server, container);
 		if(uploadFromType == ClientPutMessage.UPLOAD_FROM_DISK) {
 			if(!server.core.allowUploadFrom(origFilename))
 				throw new NotAllowedException();
@@ -145,10 +145,10 @@
 				null, targetFilename, binaryBlob);
 	}
 	
-	public ClientPut(FCPConnectionHandler handler, ClientPutMessage message, FCPServer server) throws IdentifierCollisionException, MessageInvalidException, MalformedURLException {
+	public ClientPut(FCPConnectionHandler handler, ClientPutMessage message, FCPServer server, ObjectContainer container) throws IdentifierCollisionException, MessageInvalidException, MalformedURLException {
 		super(message.uri, message.identifier, message.verbosity, handler, 
 				message.priorityClass, message.persistenceType, message.clientToken, message.global,
-				message.getCHKOnly, message.dontCompress, message.maxRetries, message.earlyEncode, server);
+				message.getCHKOnly, message.dontCompress, message.maxRetries, message.earlyEncode, server, container);
 		String salt = null;
 		byte[] saltedHash = null;
 		binaryBlob = message.binaryBlob;

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutBase.java	2009-04-08 22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutBase.java	2009-04-08 23:24:51 UTC (rev 26667)
@@ -62,8 +62,8 @@
 
 	public ClientPutBase(FreenetURI uri, String identifier, int verbosity, FCPConnectionHandler handler, 
 			short priorityClass, short persistenceType, String clientToken, boolean global, boolean getCHKOnly,
-			boolean dontCompress, int maxRetries, boolean earlyEncode, FCPServer server) throws MalformedURLException {
-		super(uri, identifier, verbosity, handler, priorityClass, persistenceType, clientToken, global);
+			boolean dontCompress, int maxRetries, boolean earlyEncode, FCPServer server, ObjectContainer container) throws MalformedURLException {
+		super(uri, identifier, verbosity, handler, priorityClass, persistenceType, clientToken, global, container);
 		this.getCHKOnly = getCHKOnly;
 		ctx = new InsertContext(server.defaultInsertContext, new SimpleEventProducer());
 		ctx.dontCompress = dontCompress;
@@ -75,8 +75,8 @@
 
 	public ClientPutBase(FreenetURI uri, String identifier, int verbosity, FCPConnectionHandler handler,
 			FCPClient client, short priorityClass, short persistenceType, String clientToken, boolean global,
-			boolean getCHKOnly, boolean dontCompress, int maxRetries, boolean earlyEncode, FCPServer server) throws MalformedURLException {
-		super(uri, identifier, verbosity, handler, client, priorityClass, persistenceType, clientToken, global);
+			boolean getCHKOnly, boolean dontCompress, int maxRetries, boolean earlyEncode, FCPServer server, ObjectContainer container) throws MalformedURLException {
+		super(uri, identifier, verbosity, handler, client, priorityClass, persistenceType, clientToken, global, container);
 		this.getCHKOnly = getCHKOnly;
 		ctx = new InsertContext(server.defaultInsertContext, new SimpleEventProducer());
 		ctx.dontCompress = dontCompress;

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java	2009-04-08 22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java	2009-04-08 23:24:51 UTC (rev 26667)
@@ -56,10 +56,10 @@
 	}
 	
 	public ClientPutDir(FCPConnectionHandler handler, ClientPutDirMessage message, 
-			HashMap<String, Object> manifestElements, boolean wasDiskPut, FCPServer server) throws IdentifierCollisionException, MalformedURLException {
+			HashMap<String, Object> manifestElements, boolean wasDiskPut, FCPServer server, ObjectContainer container) throws IdentifierCollisionException, MalformedURLException {
 		super(message.uri, message.identifier, message.verbosity, handler,
 				message.priorityClass, message.persistenceType, message.clientToken, message.global,
-				message.getCHKOnly, message.dontCompress, message.maxRetries, message.earlyEncode, server);
+				message.getCHKOnly, message.dontCompress, message.maxRetries, message.earlyEncode, server, container);
 		logMINOR = Logger.shouldLog(Logger.MINOR, this);
 		this.wasDiskPut = wasDiskPut;
 		
@@ -88,8 +88,8 @@
 	*	Puts a disk dir
 	 * @throws InsertException 
 	*/
-	public ClientPutDir(FCPClient client, FreenetURI uri, String identifier, int verbosity, short priorityClass, short persistenceType, String clientToken, boolean getCHKOnly, boolean dontCompress, int maxRetries, File dir, String defaultName, boolean allowUnreadableFiles, boolean global, boolean earlyEncode, FCPServer server) throws FileNotFoundException, IdentifierCollisionException, MalformedURLException {
-		super(uri, identifier, verbosity , null, client, priorityClass, persistenceType, clientToken, global, getCHKOnly, dontCompress, maxRetries, earlyEncode, server);
+	public ClientPutDir(FCPClient client, FreenetURI uri, String identifier, int verbosity, short priorityClass, short persistenceType, String clientToken, boolean getCHKOnly, boolean dontCompress, int maxRetries, File dir, String defaultName, boolean allowUnreadableFiles, boolean global, boolean earlyEncode, FCPServer server, ObjectContainer container) throws FileNotFoundException, IdentifierCollisionException, MalformedURLException {
+		super(uri, identifier, verbosity , null, client, priorityClass, persistenceType, clientToken, global, getCHKOnly, dontCompress, maxRetries, earlyEncode, server, container);
 
 		wasDiskPut = true;
 		logMINOR = Logger.shouldLog(Logger.MINOR, this);

Modified: trunk/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientRequest.java	2009-04-08 22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/ClientRequest.java	2009-04-08 23:24:51 UTC (rev 26667)
@@ -73,7 +73,7 @@
 	}
 	
 	public ClientRequest(FreenetURI uri2, String identifier2, int verbosity2, FCPConnectionHandler handler, 
-			FCPClient client, short priorityClass2, short persistenceType2, String clientToken2, boolean global) {
+			FCPClient client, short priorityClass2, short persistenceType2, String clientToken2, boolean global, ObjectContainer container) {
 		int hash = super.hashCode();
 		if(hash == 0) hash = 1;
 		hashCode = hash;
@@ -104,6 +104,10 @@
 			this.client = null;
 		} else {
 			origHandler = null;
+			if(persistenceType == PERSIST_FOREVER) {
+				container.activate(client, 1);
+				client.init(container);
+			}
 			this.client = client;
 			if(client != null)
 				assert(client.persistenceType == persistenceType);
@@ -113,7 +117,7 @@
 	}
 
 	public ClientRequest(FreenetURI uri2, String identifier2, int verbosity2, FCPConnectionHandler handler, 
-			short priorityClass2, short persistenceType2, String clientToken2, boolean global) {
+			short priorityClass2, short persistenceType2, String clientToken2, boolean global, ObjectContainer container) {
 		int hash = super.hashCode();
 		if(hash == 0) hash = 1;
 		hashCode = hash;
@@ -148,7 +152,7 @@
 			client = persistenceType == PERSIST_FOREVER ? handler.server.globalForeverClient : handler.server.globalRebootClient;
 		} else {
 			assert(!handler.server.core.clientDatabaseExecutor.onThread());
-			client = persistenceType == PERSIST_FOREVER ? handler.getForeverClient(null) : handler.getRebootClient();
+			client = persistenceType == PERSIST_FOREVER ? handler.getForeverClient(container) : handler.getRebootClient();
 		}
 		lowLevelClient = client.lowLevelClient;
 		if(lowLevelClient == null)

Modified: trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java	2009-04-08 22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java	2009-04-08 23:24:51 UTC (rev 26667)
@@ -226,11 +226,13 @@
 		return clientName;
 	}
 
+	// FIXME next 3 methods are in need of refactoring!
+	
 	/**
 	 * Start a ClientGet. If there is an identifier collision, queue an IdentifierCollisionMessage.
 	 * Hence, we can run stuff on other threads if we need to, as long as we send the right messages.
 	 */
-	public void startClientGet(ClientGetMessage message) {
+	public void startClientGet(final ClientGetMessage message) {
 		final String id = message.identifier;
 		final boolean global = message.global;
 		ClientGet cg = null;
@@ -245,15 +247,27 @@
 				success = !requestsByIdentifier.containsKey(id);
 			if(success) {
 				try {
-					cg = new ClientGet(this, message, server);
-					if(!persistent)
+					
+					if(!persistent) {
+						cg = new ClientGet(this, message, server, null);
 						requestsByIdentifier.put(id, cg);
-					else if(message.persistenceType == ClientRequest.PERSIST_FOREVER) {
-						final ClientGet getter = cg;
+					} else if(message.persistenceType == ClientRequest.PERSIST_FOREVER) {
 						server.core.clientContext.jobRunner.queue(new DBJob() {
 
 							public void run(ObjectContainer container, ClientContext context) {
+								ClientGet getter;
 								try {
+									getter = new ClientGet(FCPConnectionHandler.this, message, server, container);
+								} catch (IdentifierCollisionException e1) {
+									Logger.normal(this, "Identifier collision on "+this);
+									FCPMessage msg = new IdentifierCollisionMessage(id, message.global);
+									outputHandler.queue(msg);
+									return;
+								} catch (MessageInvalidException e1) {
+									outputHandler.queue(new ProtocolErrorMessage(e1.protocolCode, false, e1.getMessage(), e1.ident, e1.global));
+									return;
+								}
+								try {
 									getter.register(container, false, false);
 									container.store(getter);
 								} catch (IdentifierCollisionException e) {
@@ -268,6 +282,8 @@
 							
 						}, NativeThread.HIGH_PRIORITY-1, false); // user wants a response soon... but doesn't want it to block the queue page etc
 						return; // Don't run the start() below
+					} else {
+						cg = new ClientGet(this, message, server, null);
 					}
 				} catch (IdentifierCollisionException e) {
 					success = false;
@@ -310,24 +326,38 @@
 			else
 				success = !requestsByIdentifier.containsKey(id);
 			if(success) {
-				try {
-					cp = new ClientPut(this, message, server);
-				} catch (IdentifierCollisionException e) {
-					success = false;
-				} catch (MessageInvalidException e) {
-					outputHandler.queue(new ProtocolErrorMessage(e.protocolCode, false, e.getMessage(), e.ident, e.global));
-					return;
-				} catch (MalformedURLException e) {
-					failedMessage = new ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null, id, message.global);
-				}
-				if(cp != null && !persistent)
+				if(cp != null && !persistent) {
+					try {
+						cp = new ClientPut(this, message, server, null);
+					} catch (IdentifierCollisionException e) {
+						success = false;
+					} catch (MessageInvalidException e) {
+						outputHandler.queue(new ProtocolErrorMessage(e.protocolCode, false, e.getMessage(), e.ident, e.global));
+						return;
+					} catch (MalformedURLException e) {
+						failedMessage = new ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null, id, message.global);
+					}
 					requestsByIdentifier.put(id, cp);
-				else if(cp != null && message.persistenceType == ClientRequest.PERSIST_FOREVER) {
-					final ClientPut putter = cp;
+				} else if(cp != null && message.persistenceType == ClientRequest.PERSIST_FOREVER) {
 					server.core.clientContext.jobRunner.queue(new DBJob() {
 
 						public void run(ObjectContainer container, ClientContext context) {
+							ClientPut putter;
 							try {
+								putter = new ClientPut(FCPConnectionHandler.this, message, server, container);
+							} catch (IdentifierCollisionException e) {
+								Logger.normal(this, "Identifier collision on "+this);
+								FCPMessage msg = new IdentifierCollisionMessage(id, message.global);
+								outputHandler.queue(msg);
+								return;
+							} catch (MessageInvalidException e) {
+								outputHandler.queue(new ProtocolErrorMessage(e.protocolCode, false, e.getMessage(), e.ident, e.global));
+								return;
+							} catch (MalformedURLException e) {
+								outputHandler.queue(new ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null, id, message.global));
+								return;
+							}
+							try {
 								putter.register(container, false, false);
 								container.store(putter);
 							} catch (IdentifierCollisionException e) {
@@ -342,6 +372,17 @@
 						
 					}, NativeThread.HIGH_PRIORITY-1, false); // user wants a response soon... but doesn't want it to block the queue page etc
 					return; // Don't run the start() below
+				} else {
+					try {
+						cp = new ClientPut(this, message, server, null);
+					} catch (IdentifierCollisionException e) {
+						success = false;
+					} catch (MessageInvalidException e) {
+						outputHandler.queue(new ProtocolErrorMessage(e.protocolCode, false, e.getMessage(), e.ident, e.global));
+						return;
+					} catch (MalformedURLException e) {
+						failedMessage = new ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null, id, message.global);
+					}
 				}
 			}
 			if(!success) {
@@ -383,7 +424,7 @@
 		}
 	}
 
-	public void startClientPutDir(ClientPutDirMessage message, HashMap<String, Object> buckets, boolean wasDiskPut) {
+	public void startClientPutDir(final ClientPutDirMessage message, final HashMap<String, Object> buckets, final boolean wasDiskPut) {
 		if(logMINOR)
 			Logger.minor(this, "Start ClientPutDir");
 		final String id = message.identifier;
@@ -401,24 +442,35 @@
 				success = !requestsByIdentifier.containsKey(id);
 		}
 		if(success) {
-			try {
-				cp = new ClientPutDir(this, message, buckets, wasDiskPut, server);
-			} catch (IdentifierCollisionException e) {
-				success = false;
-			} catch (MalformedURLException e) {
-				failedMessage = new ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null, id, message.global);
-			}
 			if(cp != null && !persistent) {
-				synchronized(this) {
-					requestsByIdentifier.put(id, cp);
+				try {
+					cp = new ClientPutDir(this, message, buckets, wasDiskPut, server, null);
+					synchronized(this) {
+						requestsByIdentifier.put(id, cp);
+					}
+				} catch (IdentifierCollisionException e) {
+					success = false;
+				} catch (MalformedURLException e) {
+					failedMessage = new ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null, id, message.global);
 				}
 				// FIXME register non-persistent requests in the constructors also, we already register persistent ones...
 			} else if(cp != null && message.persistenceType == ClientRequest.PERSIST_FOREVER) {
-				final ClientPutDir putter = cp;
 				server.core.clientContext.jobRunner.queue(new DBJob() {
 
 					public void run(ObjectContainer container, ClientContext context) {
+						ClientPutDir putter;
 						try {
+							putter = new ClientPutDir(FCPConnectionHandler.this, message, buckets, wasDiskPut, server, container);
+						} catch (IdentifierCollisionException e) {
+							Logger.normal(this, "Identifier collision on "+this);
+							FCPMessage msg = new IdentifierCollisionMessage(id, message.global);
+							outputHandler.queue(msg);
+							return;
+						} catch (MalformedURLException e) {
+							outputHandler.queue(new ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null, id, message.global));
+							return;
+						}
+						try {
 							putter.register(container, false, false);
 							container.store(putter);
 						} catch (IdentifierCollisionException e) {
@@ -434,6 +486,14 @@
 				}, NativeThread.HIGH_PRIORITY-1, false); // user wants a response soon... but doesn't want it to block the queue page etc
 				return; // Don't run the start() below
 				
+			} else {
+				try {
+					cp = new ClientPutDir(this, message, buckets, wasDiskPut, server, null);
+				} catch (IdentifierCollisionException e) {
+					success = false;
+				} catch (MalformedURLException e) {
+					failedMessage = new ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null, id, message.global);
+				}
 			}
 			if(!success) {
 				Logger.normal(this, "Identifier collision on "+this);
@@ -466,20 +526,12 @@
 
 	public FCPClient getForeverClient(ObjectContainer container) {
 		synchronized(this) {
-			if(foreverClient != null)
-				return foreverClient;
-			if(container == null) {
-				while(foreverClient == null && (!failedGetForever) && (!isClosed)) {
-					try {
-						wait();
-					} catch (InterruptedException e) {
-						// Ignore
-					}
-				}
-				return foreverClient;
-			} else {
-				return createForeverClient(clientName, container);
+			if(foreverClient == null) {
+				foreverClient = createForeverClient(clientName, container);
 			}
+			container.activate(foreverClient, 1);
+			foreverClient.init(container);
+			return foreverClient;
 		}
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPServer.java	2009-04-08 22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/FCPServer.java	2009-04-08 23:24:51 UTC (rev 26667)
@@ -889,7 +889,7 @@
 			new ClientGet(persistRebootOnly ? globalRebootClient : globalForeverClient, fetchURI, defaultFetchContext.localRequestOnly, 
 					defaultFetchContext.ignoreStore, QUEUE_MAX_RETRIES, QUEUE_MAX_RETRIES,
 					QUEUE_MAX_DATA_SIZE, returnType, persistRebootOnly, id, Integer.MAX_VALUE,
-					RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS, returnFilename, returnTempFilename, this);
+					RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS, returnFilename, returnTempFilename, this, container);
 		cg.register(container, false, false);
 		cg.start(container, core.clientContext);
 	}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.