change JobEngine stop code and add a extra check for thread removed on watchdog timeout checks

LSLKeyTest
UbitUmarov 2015-11-27 13:28:10 +00:00
parent 3029080d9b
commit baf8e762a6
2 changed files with 78 additions and 88 deletions

View File

@ -40,6 +40,8 @@ namespace OpenSim.Framework.Monitoring
public int LogLevel { get; set; }
private object JobLock = new object();
public string Name { get; private set; }
public string LoggingName { get; private set; }
@ -95,7 +97,7 @@ namespace OpenSim.Framework.Monitoring
public void Start()
{
lock (this)
lock (JobLock)
{
if (IsRunning)
return;
@ -119,43 +121,22 @@ namespace OpenSim.Framework.Monitoring
public void Stop()
{
lock (this)
lock (JobLock)
{
try
{
if (!IsRunning)
return;
m_log.DebugFormat("[JobEngine] Stopping {0}", Name);
IsRunning = false;
int requestsLeft = m_jobQueue.Count;
if (requestsLeft <= 0)
{
m_finishedProcessingAfterStop.Reset();
if(m_jobQueue.Count <= 0)
m_cancelSource.Cancel();
}
else
{
m_log.InfoFormat("[{0}]: Waiting to write {1} events after stop.", LoggingName, requestsLeft);
while (requestsLeft > 0)
{
if (!m_finishedProcessingAfterStop.WaitOne(RequestProcessTimeoutOnStop))
{
// After timeout no events have been written
if (requestsLeft == m_jobQueue.Count)
{
m_log.WarnFormat(
"[{0}]: No requests processed after {1} ms wait. Discarding remaining {2} requests",
LoggingName, RequestProcessTimeoutOnStop, requestsLeft);
break;
}
}
requestsLeft = m_jobQueue.Count;
}
}
m_finishedProcessingAfterStop.WaitOne(RequestProcessTimeoutOnStop);
}
finally
{
@ -243,8 +224,6 @@ namespace OpenSim.Framework.Monitoring
}
private void ProcessRequests()
{
try
{
while(IsRunning || m_jobQueue.Count > 0)
{
@ -259,6 +238,14 @@ namespace OpenSim.Framework.Monitoring
if(IsRunning)
throw e;
else
{
m_log.DebugFormat("[JobEngine] {0} stopping ignoring {1} jobs in queue",
Name,m_jobQueue.Count);
break;
}
}
catch(OperationCanceledException)
{
break;
}
@ -281,11 +268,8 @@ namespace OpenSim.Framework.Monitoring
CurrentJob = null;
}
}
catch (OperationCanceledException)
{
}
Watchdog.RemoveThread(false);
m_finishedProcessingAfterStop.Set();
}

View File

@ -333,12 +333,19 @@ namespace OpenSim.Framework.Monitoring
{
List<ThreadWatchdogInfo> callbackInfos = null;
lock (m_threads)
{
// get a copy since we may change m_threads
List<ThreadWatchdogInfo> threadsInfo = m_threads.Values.ToList();
List<ThreadWatchdogInfo> threadsInfo;
lock (m_threads)
threadsInfo = m_threads.Values.ToList();
foreach (ThreadWatchdogInfo threadInfo in threadsInfo)
{
lock (m_threads)
{
if(!m_threads.ContainsValue(threadInfo))
continue;
}
if(threadInfo.Thread.ThreadState == ThreadState.Stopped)
{
RemoveThread(threadInfo.Thread.ManagedThreadId);
@ -363,7 +370,6 @@ namespace OpenSim.Framework.Monitoring
}
}
}
}
if(callbackInfos != null)
foreach (ThreadWatchdogInfo callbackInfo in callbackInfos)