* 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

@ -236,7 +236,15 @@ namespace OpenSim.Region.Environment.Scenes
// Don't abort the whole update if one entity happens to give us an exception. // Don't abort the whole update if one entity happens to give us an exception.
try try
{ {
m_updateList[i].Update(); // 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) catch (Exception e)
{ {

View File

@ -2676,7 +2676,7 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
/// <param name="group"></param> /// <param name="group"></param>
public void DeleteSceneObjectGroup(SceneObjectGroup group) public void DeleteSceneObjectGroup(SceneObjectGroup group)
{ {
SceneObjectPart rootPart = (group).GetChildPart(group.UUID); SceneObjectPart rootPart = (group).GetChildPart(group.UUID);
if (rootPart.PhysActor != null) if (rootPart.PhysActor != null)
{ {
@ -2693,6 +2693,14 @@ namespace OpenSim.Region.Environment.Scenes
m_innerScene.RemoveAPrimCount(); m_innerScene.RemoveAPrimCount();
} }
group.DeleteParts(); 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> /// <summary>

View File

@ -128,7 +128,8 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if( m_rootPart == null ) 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; return m_rootPart.GroupPosition;
@ -164,7 +165,7 @@ namespace OpenSim.Region.Environment.Scenes
get { get {
if (m_rootPart == null) 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; return 0;
} }
@ -1948,7 +1949,7 @@ namespace OpenSim.Region.Environment.Scenes
/// Completely delete this group and tell all the scene presences about that deletion. /// Completely delete this group and tell all the scene presences about that deletion.
/// </summary> /// </summary>
public void DeleteGroup() public void DeleteGroup()
{ {
DetachFromBackup(this); DetachFromBackup(this);
lock (m_parts) lock (m_parts)