diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs
index f17d63d307..6a89b8e94c 100644
--- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs
+++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs
@@ -569,13 +569,32 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
OSDMap encodedSOG = SceneObjectEncoder(sog);
SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.NewObject, OSDParser.SerializeJsonString(encodedSOG));
- //SendObjectUpdateToRelevantSyncConnectors(sog, rsm);
- //SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, sog);
SendSpecialObjectUpdateToRelevantSyncConnectors(m_actorID, sog, syncMsg);
}
public void SyncDeleteObject(SceneObjectGroup sog, bool softDelete)
{
+ //First, remove from PrimSyncInfoManager's record.
+ foreach (SceneObjectPart part in sog.Parts)
+ {
+ m_primSyncInfoManager.RemovePrimSyncInfo(part);
+ }
+
+ if (!IsSyncingWithOtherSyncNodes())
+ {
+ //no SyncConnector connected. Do nothing.
+ return;
+ }
+
+ OSDMap data = new OSDMap();
+ data["UUID"] = OSD.FromUUID(sog.UUID);
+ //TODO: need to put in SyncID instead of ActorID here.
+ //For now, keep it the same for simple debugging
+ data["actorID"] = OSD.FromString(m_actorID);
+ data["softDelete"] = OSD.FromBoolean(softDelete);
+
+ SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.RemovedObject, OSDParser.SerializeJsonString(data));
+ SendSpecialObjectUpdateToRelevantSyncConnectors(m_actorID, sog, rsm);
}
#endregion //IRegionSyncModule
@@ -2445,6 +2464,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
if (!softDelete)
{
//m_log.DebugFormat("{0}: hard delete object {1}", LogHeader, sog.UUID);
+ foreach (SceneObjectPart part in sog.Parts)
+ {
+ m_primSyncInfoManager.RemovePrimSyncInfo(part);
+ }
m_scene.DeleteSceneObjectBySynchronization(sog);
}
else
@@ -3123,9 +3146,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
///
public void ProcessAndEnqueuePrimUpdatesByLocal(SceneObjectPart part, List updatedProperties)
{
- m_log.DebugFormat("ProcessAndEnqueuePrimUpdatesByLocal called. Simply return for now. More testing later.");
- return;
-
//Sync values with SOP's data and update timestamp according, to
//obtain the list of properties that really have been updated
//and should be propogated to other sync nodes.
@@ -3386,6 +3406,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
}
}
+ foreach (SceneObjectPart part in sog.Parts)
+ {
+ partsPrimSyncInfo[part.UUID].SetGroupProperties(part);
+ }
+
//Convert the coordinates if necessary
/*
Vector3 globalPos;
@@ -4501,7 +4526,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
public void SetGroupProperties(SceneObjectPart sop)
{
-
+ foreach (SceneObjectPartSyncProperties property in GroupProperties)
+ {
+ SetSOPPropertyValue(sop, property);
+ }
}
private void InitPropertiesSyncInfo(SceneObjectPart part, long initUpdateTimestamp, string syncID)
@@ -6280,6 +6308,22 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
}
}
+ public bool RemovePrimSyncInfo(SceneObjectPart part)
+ {
+ if (!m_primsInSync.ContainsKey(part.UUID))
+ {
+ return false;
+ }
+ lock (m_primsInSyncLock)
+ {
+ Dictionary newPrimsInSync = new Dictionary(m_primsInSync);
+ newPrimsInSync.Remove(part.UUID);
+
+ m_primsInSync = newPrimsInSync;
+ }
+ return true;
+ }
+
public PrimSyncInfo GetPrimSyncInfo(UUID primUUID)
{
if (m_primsInSync.ContainsKey(primUUID))
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 70e60c489f..07d9eb87d9 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -709,9 +709,6 @@ namespace OpenSim.Region.Framework.Scenes
//Similar to DeleteSceneObject, except that this does not change LastUpdateActorID and LastUpdateTimeStamp
public void DeleteSceneObjectBySynchronization(SceneObjectGroup group)
{
- // m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID);
-
- //SceneObjectPart rootPart = group.GetChildPart(group.UUID);
// Serialise calls to RemoveScriptInstances to avoid
// deadlocking on m_parts inside SceneObjectGroup
@@ -2593,16 +2590,18 @@ namespace OpenSim.Region.Framework.Scenes
EventManager.TriggerParcelPrimCountTainted();
}
- group.DeleteGroupFromScene(silent);
-
-// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID);
-
+ //DSG SYNC
//Propagate the RemovedObject message
if (RegionSyncModule != null)
{
- RegionSyncModule.SendDeleteObject(group, false);
+ //RegionSyncModule.SendDeleteObject(group, false);
+ RegionSyncModule.SyncDeleteObject(group, false);
}
- //end of SYMMETRIC SYNC
+ //end of DSG SYNC
+
+ group.DeleteGroupFromScene(silent);
+
+// m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID);
}