* 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 processes0.6.0-stable
parent
c5a5555d4f
commit
0e7c4046d3
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue