Allow subclasses to override the default warning times.

git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6657 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Andrzej Kapolka
2011-06-14 19:57:49 +00:00
parent 87d9137cf8
commit 004bd2b516
@@ -139,8 +139,9 @@ public abstract class RebootManager
// see if the reboot is happening within the time specified by the // see if the reboot is happening within the time specified by the
// longest warning; if so, issue the appropriate warning // longest warning; if so, issue the appropriate warning
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
for (int ii = WARNINGS.length - 1; ii >= 0; ii--) { int[] warnings = getWarnings();
long warnTime = WARNINGS[ii] * 60 * 1000; for (int ii = warnings.length - 1; ii >= 0; ii--) {
long warnTime = warnings[ii] * 60 * 1000;
if (now + warnTime >= _nextReboot) { if (now + warnTime >= _nextReboot) {
doWarning(ii); doWarning(ii);
return; return;
@@ -150,7 +151,7 @@ public abstract class RebootManager
// otherwise, it's further off; schedule an interval to wake up when we // otherwise, it's further off; schedule an interval to wake up when we
// should issue the first pre-reboot warning // should issue the first pre-reboot warning
_rebootSoon = false; _rebootSoon = false;
long firstWarnTime = (_nextReboot - (WARNINGS[0] * 60 * 1000)) - now; long firstWarnTime = (_nextReboot - (warnings[0] * 60 * 1000)) - now;
(_interval = _omgr.newInterval(new Runnable() { (_interval = _omgr.newInterval(new Runnable() {
public void run () { public void run () {
doWarning(0); doWarning(0);
@@ -241,7 +242,8 @@ public abstract class RebootManager
protected void doWarning (final int level) protected void doWarning (final int level)
{ {
_rebootSoon = true; _rebootSoon = true;
if (level == WARNINGS.length) { int[] warnings = getWarnings();
if (level == warnings.length) {
if (checkLocks()) { if (checkLocks()) {
return; return;
} }
@@ -260,10 +262,10 @@ public abstract class RebootManager
} }
// issue the warning // issue the warning
int minutes = WARNINGS[level]; int minutes = warnings[level];
broadcast(getRebootMessage("m.reboot_warning", minutes)); broadcast(getRebootMessage("m.reboot_warning", minutes));
if (level < WARNINGS.length - 1) { if (level < warnings.length - 1) {
minutes -= WARNINGS[level + 1]; minutes -= warnings[level + 1];
} }
// schedule the next warning // schedule the next warning
@@ -289,7 +291,7 @@ public abstract class RebootManager
broadcast("m.reboot_delayed"); broadcast("m.reboot_delayed");
(_interval = _omgr.newInterval(new Runnable() { (_interval = _omgr.newInterval(new Runnable() {
public void run () { public void run () {
doWarning(WARNINGS.length); doWarning(getWarnings().length);
} }
})).schedule(60 * 1000); })).schedule(60 * 1000);
return true; return true;
@@ -300,8 +302,9 @@ public abstract class RebootManager
*/ */
protected void notifyObservers (int level) protected void notifyObservers (int level)
{ {
final int warningsLeft = WARNINGS.length - level - 1; int[] warnings = getWarnings();
final long msLeft = 1000L * 60L * WARNINGS[level]; final int warningsLeft = warnings.length - level - 1;
final long msLeft = 1000L * 60L * warnings[level];
_observers.apply(new ObserverList.ObserverOp<PendingShutdownObserver>() { _observers.apply(new ObserverList.ObserverOp<PendingShutdownObserver>() {
public boolean apply (PendingShutdownObserver observer) { public boolean apply (PendingShutdownObserver observer) {
observer.shutdownPlanned(warningsLeft, msLeft); observer.shutdownPlanned(warningsLeft, msLeft);
@@ -310,6 +313,16 @@ public abstract class RebootManager
}); });
} }
/**
* Returns the minutes at which we give warnings. The last value is also the minimum time at
* which we can possibly reboot after the value of the nextReboot field is changed, to prevent
* accidentally causing instant server reboots.
*/
protected int[] getWarnings ()
{
return DEFAULT_WARNINGS;
}
/** The server that we're going to reboot. */ /** The server that we're going to reboot. */
protected PresentsServer _server; protected PresentsServer _server;
@@ -337,11 +350,8 @@ public abstract class RebootManager
/** Things that can delay the reboot. */ /** Things that can delay the reboot. */
protected HashIntMap<String> _rebootLocks = new HashIntMap<String>(); protected HashIntMap<String> _rebootLocks = new HashIntMap<String>();
/** The minutes at which we give warnings. The last value is also the /** The default warning times. */
* minimum time at which we can possibly reboot after the value of the public static final int[] DEFAULT_WARNINGS = { 30, 20, 15, 10, 5, 2 };
* nextReboot field is changed, to prevent accidentally causing instant
* server reboots. */
public static final int[] WARNINGS = { 30, 20, 15, 10, 5, 2 };
protected static final String AUTOMATIC_INITIATOR = "automatic"; protected static final String AUTOMATIC_INITIATOR = "automatic";
} }