From 23011b90150ac93d74877bc00f938de117400b72 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 23 May 2014 07:46:32 +0000
Subject: [PATCH] Code cleanup.
---
opends/src/server/org/opends/server/core/ServerShutdownMonitor.java | 132 +++++++++++++++-----------------------------
1 files changed, 45 insertions(+), 87 deletions(-)
diff --git a/opends/src/server/org/opends/server/core/ServerShutdownMonitor.java b/opends/src/server/org/opends/server/core/ServerShutdownMonitor.java
index 78a5e69..c7fe4f2 100644
--- a/opends/src/server/org/opends/server/core/ServerShutdownMonitor.java
+++ b/opends/src/server/org/opends/server/core/ServerShutdownMonitor.java
@@ -22,31 +22,30 @@
*
*
* Copyright 2006-2009 Sun Microsystems, Inc.
- * Portions copyright 2012 ForgeRock AS.
+ * Portions copyright 2012-2014 ForgeRock AS.
*/
package org.opends.server.core;
-
-
-import org.opends.server.api.DirectoryThread;
import java.util.Iterator;
import java.util.LinkedList;
-
+import org.opends.server.api.DirectoryThread;
+import org.opends.server.util.StaticUtils;
/**
* This class defines a daemon thread that will be used to monitor the server
* shutdown process and may help nudge it along if it appears to get hung.
*/
-public class ServerShutdownMonitor
- extends DirectoryThread
+public class ServerShutdownMonitor extends DirectoryThread
{
- // Indicates whether the monitor has completed and the shutdown may be
- // finalized with a call to System.exit;
+ /**
+ * Indicates whether the monitor has completed and the shutdown may be
+ * finalized with a call to {@link System#exit()}.
+ */
private volatile boolean monitorDone;
- // The list of threads that need to be monitored.
- private LinkedList<Thread> threadList;
+ /** The list of threads that need to be monitored. */
+ private final LinkedList<Thread> threadList;
@@ -78,8 +77,7 @@
for (int i=0; i < numThreads; i++)
{
Thread t = threadArray[i];
-
- if (t.isAlive() && (! t.isDaemon()) && (t.getId() != currentThreadID))
+ if (t.isAlive() && !t.isDaemon() && t.getId() != currentThreadID)
{
threadList.add(t);
}
@@ -95,6 +93,7 @@
* milestones, if there are threads still running then it will attempt to
* get them to stop.
*/
+ @Override
public void run()
{
monitorDone = false;
@@ -103,58 +102,24 @@
{
// First, check to see if we need to do anything at all. If all threads
// are stopped, then we don't have a problem.
- Iterator<Thread> iterator = threadList.iterator();
- while (iterator.hasNext())
- {
- Thread t = iterator.next();
- if (! t.isAlive())
- {
- iterator.remove();
- }
- }
-
+ removeDeadThreads();
if (threadList.isEmpty())
{
return;
}
-
// For the first milestone, we'll run for up to 30 seconds just checking
// to see whether all threads have stopped yet.
- long stopTime = System.currentTimeMillis() + 30000;
- while (System.currentTimeMillis() < stopTime)
+ if (waitAllThreadsDied(30000))
{
- iterator = threadList.iterator();
- while (iterator.hasNext())
- {
- Thread t = iterator.next();
- if (! t.isAlive())
- {
- iterator.remove();
- }
- }
-
- if (threadList.isEmpty())
- {
- return;
- }
- else
- {
- try
- {
- Thread.sleep(10);
- } catch (Exception e) {}
- }
+ return;
}
-
// Now we're at the second milestone, where we'll interrupt all threads
// that are still running and then wait for up to 30 more seconds for them
// to stop.
- iterator = threadList.iterator();
- while (iterator.hasNext())
+ for (Thread t : threadList)
{
- Thread t = iterator.next();
try
{
if (t.isAlive())
@@ -164,38 +129,11 @@
} catch (Exception e) {}
}
- if (threadList.isEmpty())
+ if (waitAllThreadsDied(30000))
{
return;
}
- stopTime = System.currentTimeMillis() + 30000;
- while (System.currentTimeMillis() < stopTime)
- {
- iterator = threadList.iterator();
- while (iterator.hasNext())
- {
- Thread t = iterator.next();
- if (! t.isAlive())
- {
- iterator.remove();
- }
- }
-
- if (threadList.isEmpty())
- {
- return;
- }
- else
- {
- try
- {
- Thread.sleep(10);
- } catch (Exception e) {}
- }
- }
-
-
// At this time, we could try to stop or destroy any remaining threads,
// but we won't do that because we'll use a System.exit in the thread that
// initiated a shutdown and it should take care of anything else that
@@ -205,10 +143,8 @@
System.err.println("WARNING: The following threads were still active " +
"after waiting up to 60 seconds for them to stop:");
- iterator = threadList.iterator();
- while (iterator.hasNext())
+ for (Thread t : threadList)
{
- Thread t = iterator.next();
System.err.println("Thread Name: " + t.getName());
System.err.println("Stack Trace:");
@@ -237,7 +173,33 @@
}
}
+ private boolean waitAllThreadsDied(final long maxWaitMillis)
+ {
+ final long stopTime = System.currentTimeMillis() + maxWaitMillis;
+ while (System.currentTimeMillis() < stopTime)
+ {
+ removeDeadThreads();
+ if (threadList.isEmpty())
+ {
+ return true;
+ }
+ StaticUtils.sleep(10);
+ }
+ return false;
+ }
+
+ private void removeDeadThreads()
+ {
+ for (Iterator<Thread> iter = threadList.iterator(); iter.hasNext();)
+ {
+ final Thread t = iter.next();
+ if (!t.isAlive())
+ {
+ iter.remove();
+ }
+ }
+ }
/**
* Waits for the monitor thread to complete any necessary processing. This
@@ -247,11 +209,7 @@
{
while (! monitorDone)
{
- try
- {
- Thread.sleep(10);
- } catch (Exception e) {}
+ StaticUtils.sleep(10);
}
}
}
-
--
Gitblit v1.10.0