[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r11435: improved error message when trying to start nodes with an in (puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl)



Author: kloesing
Date: 2007-09-12 13:58:35 -0400 (Wed, 12 Sep 2007)
New Revision: 11435

Modified:
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java
Log:
improved error message when trying to start nodes with an incorrect configuration

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java	2007-09-12 17:33:23 UTC (rev 11434)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java	2007-09-12 17:58:35 UTC (rev 11435)
@@ -150,4 +150,30 @@
 		// log exiting
 		this.logger.exiting(this.getClass().getName(), "writeApprovedRouters");
 	}
+
+	public synchronized String determineFingerprint()
+			throws TorProcessException {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "determineFingerprint");
+
+		// check if the fingerprint has not been determined before
+		if (this.fingerprint == null) {
+
+			// create an empty approved-routers file to make Tor happy
+			try {
+				new File(this.workingDir.getAbsolutePath() + File.separator
+						+ "approved-routers").createNewFile();
+			} catch (IOException e) {
+				TorProcessException ex = new TorProcessException(
+						"Could not write empty approved-routers file!", e);
+				this.logger.throwing(this.getClass().getName(),
+						"determineFingerprint", ex);
+				throw ex;
+			}
+		}
+
+		// invoke overwritten method
+		return super.determineFingerprint();
+	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java	2007-09-12 17:33:23 UTC (rev 11434)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java	2007-09-12 17:58:35 UTC (rev 11435)
@@ -595,6 +595,69 @@
 		this.logger.exiting(this.getClass().getName(), "shutdown");
 	}
 
+	/**
+	 * Helper thread that waits for a given time for a given process to
+	 * potentially terminate in order to find out if there are problems. If
+	 * either the process terminates cleanly within this timeout, or does not
+	 * terminate, the exit value will be 0; otherwise it will contain the exit
+	 * code of the terminated process. This functionality is added, because it
+	 * is not provided by Process.
+	 */
+	private class ProcessWaiter extends Thread {
+
+		/** The process to wait for. */
+		private Process process;
+
+		/** Did we finish waiting? */
+		private boolean finishedWaiting;
+
+		/** The exit value or 0 if the process is still running. */
+		private int exitValue;
+
+		/**
+		 * Creates a new <code>ProcessWaiter</code> for process
+		 * <code>process</code>, but does not start it, yet.
+		 * 
+		 * @param process
+		 *            The process to wait for.
+		 */
+		ProcessWaiter(Process process) {
+			this.process = process;
+		}
+
+		@Override
+		public void run() {
+			try {
+				this.exitValue = process.waitFor();
+				synchronized (this) {
+					notifyAll();
+				}
+			} catch (InterruptedException e) {
+			}
+		}
+
+		/**
+		 * Causes the current thread to wait until the process has terminated or
+		 * the <code>timeoutInMillis</code> has expired. This method returns
+		 * immediately if the subprocess has already terminated.
+		 * 
+		 * @param timeoutInMillis
+		 *            The maximum time to wait for the process to terminate.
+		 * @return The exit value of the terminated process or 0 if the process
+		 *         is still running.
+		 */
+		public synchronized int waitFor(long timeoutInMillis) {
+			if (!finishedWaiting) {
+				try {
+					wait(timeoutInMillis);
+				} catch (InterruptedException e) {
+				}
+			}
+			this.interrupt();
+			return this.exitValue;
+		}
+	}
+
 	public synchronized boolean startNode(long maximumTimeToWaitInMillis)
 			throws TorProcessException {
 
@@ -683,6 +746,24 @@
 				"Started shutdown hook that will destroy the Tor process on "
 						+ "JVM exit!");
 
+		// wait to see if the process is started or exited immediately; wait for
+		// one second to be sure that Tor terminates if there is an error,
+		// especially if the computer is very busy and many nodes are created
+		ProcessWaiter waiter = new ProcessWaiter(this.torProcess);
+		waiter.start();
+		int exitValue = waiter.waitFor(1000);
+		if (exitValue != 0) {
+			// Tor did not manage to start correctly
+			this.logger.log(Level.WARNING, "Could not start Tor process! Tor "
+					+ "exited with exit value " + exitValue
+					+ "! Please go check the config options in "
+					+ this.configFile + " manually!");
+
+			// log exiting
+			this.logger.exiting(this.getClass().getName(), "startNode", false);
+			return false;
+		}
+
 		// wait for Tor to open the control port
 		this.logger.log(Level.FINER,
 				"Waiting for Tor to open its control port...");
@@ -702,13 +783,6 @@
 				"Tor has successfully opened its control port and told us "
 						+ "about that!");
 
-		// be sure that Tor is ready, especially if computer is very busy and
-		// many nodes are created
-		try {
-			Thread.sleep(1000);
-		} catch (InterruptedException e2) {
-		}
-
 		// connect to the controller
 		this.logger.log(Level.FINER, "Connecting to control port...");
 		try {

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java	2007-09-12 17:33:23 UTC (rev 11434)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java	2007-09-12 17:58:35 UTC (rev 11435)
@@ -251,16 +251,28 @@
 		outputThread.setDaemon(true);
 		outputThread.start();
 
-		// wait for process to terminate
-		// TODO should limit waiting to a certain time?!
+		// wait for process to terminate (should be quite fast)
+		int exitValue = 0;
 		try {
-			tmpProcess.waitFor();
+			exitValue = tmpProcess.waitFor();
 		} catch (InterruptedException e) {
 			// TODO how to handle?
 			this.logger.log(Level.WARNING,
 					"Temporary Tor process was interrupted!", e);
 		}
 
+		if (exitValue != 0) {
+			TorProcessException ex = new TorProcessException(
+					"Could not start Tor process temporarily with "
+							+ "--list-fingerprint option! Tor exited with "
+							+ "exit value " + exitValue
+							+ "! Please go check the config options in "
+							+ this.tempConfigFile + " manually!");
+			this.logger.throwing(this.getClass().getName(),
+					"determineFingerprint", ex);
+			throw ex;
+		}
+
 		// read fingerprint from file
 		this.readFingerprintFromFile();