* Remove a bug I created in r5171 where taking an object would terminate the client session

* change code to use an explicit state variable instead of using SOG.Name = null to signal deletion
0.6.0-stable
Justin Clarke Casey 2008-06-21 19:56:19 +00:00
parent ff56cb730b
commit b290ce405f
6 changed files with 40 additions and 14 deletions

View File

@ -31,6 +31,7 @@ using OpenSim.Region.Environment.Modules.World.Serialiser;
using System;
using System.IO;
using System.Reflection;
using System.Xml;
using libsecondlife;
using log4net;
@ -101,6 +102,20 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
m_log.InfoFormat("[ARCHIVER]: Loading prim data");
IRegionSerialiser serialiser = m_scene.RequestModuleInterface<IRegionSerialiser>();
// Temporary code to read each sog in the file separately, pending actually having these in separate files
// XmlTextReader xtr = new XmlTextReader(new StringReader(serializedPrims));
// XmlDocument doc = new XmlDocument();
// reader.WhitespaceHandling = WhitespaceHandling.None;
// doc.Load(xtr);
// xtr.Close();
// XmlNode sceneNode = doc.FirstChild;
//
// foreach (XmlNode objectNode in sceneNode.ChildNodes)
// {
// CreatePrimFromXml2(m_scene, objectNode.OuterXml);
// }
serialiser.LoadPrimsFromXml2(m_scene, new StringReader(serializedPrims));
}
}

View File

@ -114,6 +114,7 @@ namespace OpenSim.Region.Environment.Scenes
doc.Load(reader);
reader.Close();
rootNode = doc.FirstChild;
foreach (XmlNode aPrimNode in rootNode.ChildNodes)
{
CreatePrimFromXml2(scene, aPrimNode.OuterXml);

View File

@ -63,6 +63,15 @@ namespace OpenSim.Region.Environment.Scenes
get { return m_name; }
set { m_name = value; }
}
/// <summary>
/// Signals whether this group was in a scene but has since been deleted from it.
/// </summary>
public bool IsDeleted
{
get { return m_isDeleted; }
}
protected bool m_isDeleted;
protected LLVector3 m_pos;

View File

@ -293,21 +293,23 @@ 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
// Check that the group was not 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)
if (!entity.IsDeleted)
{
m_updateList[i].Update();
}
}
catch (Exception e)
{
m_log.ErrorFormat("[INNER SCENE]: Failed to update {0}, - {1}", entity.Name, e);//entity.m_uuid
m_log.ErrorFormat(
"[INNER SCENE]: Failed to update {0}, {1} - {2}", entity.Name, entity.UUID, e);
}
}
m_updateList.Clear();
}
}

View File

@ -1665,7 +1665,7 @@ namespace OpenSim.Region.Environment.Scenes
}
/// <summary>
/// Delete this object from the scene.
/// Delete the given object from the scene.
/// </summary>
/// <param name="group"></param>
public void DeleteSceneObject(SceneObjectGroup group)
@ -1686,14 +1686,6 @@ namespace OpenSim.Region.Environment.Scenes
group.DeleteGroup();
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

@ -124,7 +124,7 @@ namespace OpenSim.Region.Environment.Scenes
{
get { return RootPart.Name; }
set { RootPart.Name = value; }
}
}
/// <summary>
/// Added because the Parcel code seems to use it
@ -921,10 +921,16 @@ namespace OpenSim.Region.Environment.Scenes
}
/// <summary>
/// Completely delete this group and tell all the scene presences about that deletion.
/// Delete this group from its scene and tell all the scene presences about that deletion.
/// </summary>
public void DeleteGroup()
{
// We need to keep track of this state in case this group is still queued for backup.
// FIXME: This is a 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.
m_isDeleted = true;
DetachFromBackup(this);
lock (m_parts)
@ -944,6 +950,7 @@ namespace OpenSim.Region.Environment.Scenes
}
}
}
public void FakeDeleteGroup()
{
foreach (SceneObjectPart part in m_parts.Values)