* Nasty hack to reduce the incidence of spurious exceptions where a user deletes a newly rezzed object before the persistence thread gets to it from its queue.

* This should greatly reduce but not eliminate the problem - elimination probably requires a redesign of the prim persistence processes
0.6.0-stable
Justin Clarke Casey 2008-04-07 17:28:02 +00:00
parent c5a5555d4f
commit 0e7c4046d3
3 changed files with 22 additions and 5 deletions

View File

@ -235,9 +235,17 @@ namespace OpenSim.Region.Environment.Scenes
// Don't abort the whole update if one entity happens to give us an exception.
try
{
// A null name signals that this group was deleted before the scheduled update
// FIXME: This is merely a temporary measure to reduce the incidence of failure, when
// an object has been deleted from a scene before update was processed.
// A more fundamental overhaul of the update mechanism is required to eliminate all
// the race conditions.
if (entity.Name != null)
{
m_updateList[i].Update();
}
}
catch (Exception e)
{
m_log.ErrorFormat("[INNER SCENE]: Failed to update {0}, - {1}", entity.Name, e);//entity.m_uuid

View File

@ -2693,6 +2693,14 @@ namespace OpenSim.Region.Environment.Scenes
m_innerScene.RemoveAPrimCount();
}
group.DeleteParts();
// In case anybody else retains a reference to this group, signal deletion by changing the name
// to null. We can't zero out the UUID because this is taken from the root part, which has already
// been removed.
// FIXME: This is a really poor temporary solution, since it still leaves plenty of scope for race
// conditions where a user deletes an entity while it is being stored. Really, the update
// code needs a redesign.
group.Name = null;
}
/// <summary>

View File

@ -128,7 +128,8 @@ namespace OpenSim.Region.Environment.Scenes
{
if( m_rootPart == null )
{
throw new NullReferenceException(string.Format("Object {0} has no root part.", m_uuid));
throw new NullReferenceException(
string.Format("[SCENE OBJECT GROUP]: Object {0} has no root part.", m_uuid));
}
return m_rootPart.GroupPosition;
@ -164,7 +165,7 @@ namespace OpenSim.Region.Environment.Scenes
get {
if (m_rootPart == null)
{
m_log.Error("[PRIMGROUP]: Unable to find the rootpart for a LocalId Request!");
m_log.Error("[SCENE OBJECT GROUP]: Unable to find the rootpart for a LocalId Request!");
return 0;
}