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); }