Finally hunted down the Parallel deadlock. Packets were being handled asynchronously (filling up the threadpool with handlers), which would turn around and try to do parallel operations on the starved threadpool. The solution for now is to disable Parallel.cs operations until we can gracefully handle parallel operations with a potentially starved threadpool

0.6.8-post-fixes
John Hurliman 2009-10-27 02:36:57 -07:00
parent b498693cff
commit 3a1ee79ee4
2 changed files with 10 additions and 7 deletions

View File

@ -120,7 +120,7 @@ namespace OpenSim.Region.Framework.Scenes
private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing
private int m_incrementsof15seconds; private int m_incrementsof15seconds;
private volatile bool m_backingup; private volatile bool m_backingup;
private bool m_useAsyncWhenPossible = true; private bool m_useAsyncWhenPossible;
private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>(); private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>();
private Dictionary<UUID, SceneObjectGroup> m_groupsWithTargets = new Dictionary<UUID, SceneObjectGroup>(); private Dictionary<UUID, SceneObjectGroup> m_groupsWithTargets = new Dictionary<UUID, SceneObjectGroup>();
@ -480,7 +480,7 @@ namespace OpenSim.Region.Framework.Scenes
IConfig startupConfig = m_config.Configs["Startup"]; IConfig startupConfig = m_config.Configs["Startup"];
// Should we try to run loops synchronously or asynchronously? // Should we try to run loops synchronously or asynchronously?
m_useAsyncWhenPossible = startupConfig.GetBoolean("use_async_when_possible", true); m_useAsyncWhenPossible = startupConfig.GetBoolean("use_async_when_possible", false);
//Animation states //Animation states
m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
@ -4261,10 +4261,13 @@ namespace OpenSim.Region.Framework.Scenes
public void ForEachClient(Action<IClientAPI> action, bool doAsynchronous) public void ForEachClient(Action<IClientAPI> action, bool doAsynchronous)
{ {
if (doAsynchronous) // FIXME: Asynchronous iteration is disabled until we have a threading model that
m_clientManager.ForEach(action); // can support calling this function from an async packet handler without
else // potentially deadlocking
m_clientManager.ForEachSync(action); //if (doAsynchronous)
// m_clientManager.ForEach(action);
//else
// m_clientManager.ForEachSync(action);
} }
public bool TryGetClient(UUID avatarID, out IClientAPI client) public bool TryGetClient(UUID avatarID, out IClientAPI client)

View File

@ -49,7 +49,7 @@
; in parallel. Running in parallel should increase performance ; in parallel. Running in parallel should increase performance
; on a multi-core system, but will make debugging more ; on a multi-core system, but will make debugging more
; difficult if something deadlocks or times out ; difficult if something deadlocks or times out
use_async_when_possible = true use_async_when_possible = false
; Max threads to allocate on the FireAndForget thread pool ; Max threads to allocate on the FireAndForget thread pool
; when running with the SmartThreadPool option above ; when running with the SmartThreadPool option above