* Router: Prevent NCDFE after unzipping update file
This commit is contained in:
@ -191,7 +191,9 @@ public class Router {
|
|||||||
|
|
||||||
// This is here so that we can get the directory location from the context
|
// This is here so that we can get the directory location from the context
|
||||||
// for the ping file
|
// for the ping file
|
||||||
if (!beginMarkingLiveliness()) {
|
// Check for other router but do not start a thread yet so the update doesn't cause
|
||||||
|
// a NCDFE
|
||||||
|
if (!isOnlyRouterRunning()) {
|
||||||
System.err.println("ERROR: There appears to be another router already running!");
|
System.err.println("ERROR: There appears to be another router already running!");
|
||||||
System.err.println(" Please make sure to shut down old instances before starting up");
|
System.err.println(" Please make sure to shut down old instances before starting up");
|
||||||
System.err.println(" a new one. If you are positive that no other instance is running,");
|
System.err.println(" a new one. If you are positive that no other instance is running,");
|
||||||
@ -215,6 +217,11 @@ public class Router {
|
|||||||
// overwrite an existing running router's jar files. Other than ours.
|
// overwrite an existing running router's jar files. Other than ours.
|
||||||
installUpdates();
|
installUpdates();
|
||||||
|
|
||||||
|
// ********* Start no threads before here ********* //
|
||||||
|
//
|
||||||
|
// NOW we can start the ping file thread.
|
||||||
|
beginMarkingLiveliness();
|
||||||
|
|
||||||
// Apps may use this as an easy way to determine if they are in the router JVM
|
// Apps may use this as an easy way to determine if they are in the router JVM
|
||||||
// But context.isRouterContext() is even easier...
|
// But context.isRouterContext() is even easier...
|
||||||
// Both of these as of 0.7.9
|
// Both of these as of 0.7.9
|
||||||
@ -1163,8 +1170,19 @@ public class Router {
|
|||||||
// verify the whole thing first
|
// verify the whole thing first
|
||||||
// we could remember this fails, and not bother restarting, but who cares...
|
// we could remember this fails, and not bother restarting, but who cares...
|
||||||
boolean ok = FileUtil.verifyZip(updateFile);
|
boolean ok = FileUtil.verifyZip(updateFile);
|
||||||
if (ok)
|
if (ok) {
|
||||||
|
// This may be useful someday. First added in 0.8.2
|
||||||
|
// Moved above the extract so we don't NCDFE
|
||||||
|
_config.put("router.updateLastInstalled", "" + System.currentTimeMillis());
|
||||||
|
saveConfig();
|
||||||
ok = FileUtil.extractZip(updateFile, _context.getBaseDir());
|
ok = FileUtil.extractZip(updateFile, _context.getBaseDir());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Very important - we have now trashed our jars.
|
||||||
|
// After this point, do not use any new I2P classes, or they will fail to load
|
||||||
|
// and we will die with NCDFE.
|
||||||
|
// Ideally, do not use I2P classes at all, new or not.
|
||||||
|
try {
|
||||||
if (ok)
|
if (ok)
|
||||||
System.out.println("INFO: Update installed");
|
System.out.println("INFO: Update installed");
|
||||||
else
|
else
|
||||||
@ -1181,9 +1199,6 @@ public class Router {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ok) {
|
if (ok) {
|
||||||
// This may be useful someday. First added in 0.8.2
|
|
||||||
_config.put("router.updateLastInstalled", "" + System.currentTimeMillis());
|
|
||||||
saveConfig();
|
|
||||||
boolean deleted = updateFile.delete();
|
boolean deleted = updateFile.delete();
|
||||||
if (!deleted) {
|
if (!deleted) {
|
||||||
System.out.println("ERROR: Unable to delete the update file!");
|
System.out.println("ERROR: Unable to delete the update file!");
|
||||||
@ -1195,6 +1210,10 @@ public class Router {
|
|||||||
System.out.println("INFO: Restarting after update");
|
System.out.println("INFO: Restarting after update");
|
||||||
else
|
else
|
||||||
System.out.println("WARNING: Exiting after update, restart I2P");
|
System.out.println("WARNING: Exiting after update, restart I2P");
|
||||||
|
} catch (Throwable t) {
|
||||||
|
// hide the NCDFE
|
||||||
|
// hopefully the update file got deleted or we will loop
|
||||||
|
}
|
||||||
System.exit(EXIT_HARD_RESTART);
|
System.exit(EXIT_HARD_RESTART);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1230,13 +1249,14 @@ public class Router {
|
|||||||
static final long LIVELINESS_DELAY = 60*1000;
|
static final long LIVELINESS_DELAY = 60*1000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start a thread that will periodically update the file "router.ping", but if
|
* Check the file "router.ping", but if
|
||||||
* that file already exists and was recently written to, return false as there is
|
* that file already exists and was recently written to, return false as there is
|
||||||
* another instance running
|
* another instance running.
|
||||||
*
|
*
|
||||||
* @return true if the router is the only one running
|
* @return true if the router is the only one running
|
||||||
|
* @since 0.8.2
|
||||||
*/
|
*/
|
||||||
private boolean beginMarkingLiveliness() {
|
private boolean isOnlyRouterRunning() {
|
||||||
File f = getPingFile();
|
File f = getPingFile();
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
long lastWritten = f.lastModified();
|
long lastWritten = f.lastModified();
|
||||||
@ -1247,12 +1267,20 @@ public class Router {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start a thread that will periodically update the file "router.ping".
|
||||||
|
* isOnlyRouterRunning() MUST have been called previously.
|
||||||
|
*/
|
||||||
|
private void beginMarkingLiveliness() {
|
||||||
|
File f = getPingFile();
|
||||||
// not an I2PThread for context creation issues
|
// not an I2PThread for context creation issues
|
||||||
Thread t = new Thread(new MarkLiveliness(_context, this, f));
|
Thread t = new Thread(new MarkLiveliness(_context, this, f));
|
||||||
t.setName("Mark router liveliness");
|
t.setName("Mark router liveliness");
|
||||||
t.setDaemon(true);
|
t.setDaemon(true);
|
||||||
t.start();
|
t.start();
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final String PROP_BANDWIDTH_SHARE_PERCENTAGE = "router.sharePercentage";
|
public static final String PROP_BANDWIDTH_SHARE_PERCENTAGE = "router.sharePercentage";
|
||||||
|
Reference in New Issue
Block a user