diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index d72b5af3ea..aa0c810ff3 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -209,7 +209,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule foreach (string bucketName in m_propertyBucketNames) { //if (m_isSyncRelay || part.HasPropertyUpdatedLocallyInGivenBucket(bucketName)) - if(HaveUpdatesToSendoutForSync(part, bucketName)) + if(!part.ParentGroup.IsDeleted && HaveUpdatesToSendoutForSync(part, bucketName)) { lock (m_primUpdateLocks[bucketName]) { @@ -236,7 +236,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { if (!IsSyncingWithOtherActors()) { - //no SyncConnector connected. Do nothing. + //no SyncConnector connected. clear update queues and return. + foreach (string bucketName in m_propertyBucketNames) + { + m_primUpdates[bucketName].Clear(); + } return; } @@ -256,14 +260,26 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { if (m_primUpdates[bucketName].Count > 0) { - //m_log.Debug(m_primUpdates[bucketName].Count + " updated parts in bucket " + bucketName); + //m_log.DebugFormat(m_primUpdates[bucketName].Count + " to send {0} updated parts in bucket {1}", m_primUpdates[bucketName].Count, bucketName); + lock (m_primUpdateLocks[bucketName]) { updated = true; - primUpdates.Add(bucketName, new List(m_primUpdates[bucketName].Values)); - + //primUpdates.Add(bucketName, new List(m_primUpdates[bucketName].Values)); + + //copy the update list + List updateList = new List(); + foreach (SceneObjectPart part in m_primUpdates[bucketName].Values) + { + if (!part.ParentGroup.IsDeleted) + { + //m_log.DebugFormat("include {0},{1} in update list", part.Name, part.UUID); + updateList.Add(part); + } + } + primUpdates.Add(bucketName, updateList); + m_primUpdates[bucketName].Clear(); - } } } @@ -298,6 +314,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { //m_log.Debug(LogHeader + " calling update sender for bucket " + bucketName); m_primUpdatesPerBucketSender[bucketName](bucketName, primUpdates[bucketName]); + primUpdates[bucketName].Clear(); } } foreach (ScenePresence presence in presenceUpdates) @@ -382,7 +399,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //no SyncConnector connected. Do nothing. return; } - //m_log.DebugFormat(LogHeader + "SendNewObject called for object {0}, {1}", sog.Name, sog.UUID); + + /* + //m_log.DebugFormat(LogHeader + " SendNewObject called for object {0}, {1}", sog.Name, sog.UUID); //This is a new object (newly rezzed). Send out updates for all properties. //For now, a complete list of object properties include properties @@ -399,6 +418,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //string sogxml = SceneObjectSerializer.ToXml2Format(sog); SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.NewObject, OSDParser.SerializeJsonString(data)); + * */ + + SymmetricSyncMessage rsm = CreateNewObjectMessage(sog); + //SendObjectUpdateToRelevantSyncConnectors(sog, rsm); SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, sog); } @@ -748,6 +771,48 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_log.Warn("[REGION SYNC MODULE]: StatsTimerElapsed -- NOT yet implemented."); } + private SymmetricSyncMessage CreateNewObjectMessage(SceneObjectGroup sog) + { + OSDMap data = new OSDMap(); + string sogxml = SceneObjectSerializer.ToXml2Format(sog); + data["sogxml"] = OSD.FromString(sogxml); + OSDArray partArray = new OSDArray(); + foreach (SceneObjectPart part in sog.Parts) + { + OSDMap partData = PhysicsBucketPropertiesEncoder(m_physicsBucketName, part); + partArray.Add(partData); + } + data["partPhysicsProperties"] = partArray; + //string sogxml = SceneObjectSerializer.ToXml2Format(sog); + SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.NewObject, OSDParser.SerializeJsonString(data)); + + return rsm; + } + + private void HandleGetTerrainRequest(SyncConnector connector) + { + string msgData = m_scene.Heightmap.SaveToXmlString(); + long lastUpdateTimeStamp; + string lastUpdateActorID; + m_scene.RequestModuleInterface().GetSyncInfo(out lastUpdateTimeStamp, out lastUpdateActorID); + + OSDMap data = new OSDMap(3); + data["terrain"] = OSD.FromString(msgData); + data["actorID"] = OSD.FromString(lastUpdateActorID); + data["timeStamp"] = OSD.FromLong(lastUpdateTimeStamp); + + SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.Terrain, OSDParser.SerializeJsonString(data)); + connector.Send(syncMsg); + } + + private void HandleGetObjectRequest(SyncConnector connector, SceneObjectGroup sog) + { + SymmetricSyncMessage syncMsg = CreateNewObjectMessage(sog); + + //SendToSyncConnector(connector, sog, syncMsg); + connector.EnqueueOutgoingUpdate(sog.UUID, syncMsg.ToBytes()); + } + //Read in configuration for which property-bucket each property belongs to, and the description of each bucket private void PopulatePropertyBucketMap(IConfig config) { @@ -765,7 +830,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule Dictionary updatedObjects = new Dictionary(); foreach (SceneObjectPart part in primUpdates) { - updatedObjects[part.ParentGroup.UUID] = part.ParentGroup; + if(!part.ParentGroup.IsDeleted) + updatedObjects[part.ParentGroup.UUID] = part.ParentGroup; } long timeStamp = DateTime.Now.Ticks; foreach (SceneObjectGroup sog in updatedObjects.Values) @@ -785,6 +851,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } lock (m_stats) m_statSOGBucketOut++; + + //m_log.DebugFormat(LogHeader + " calling SendObjectUpdateToRelevantSyncConnectors for general bucket for sog {0},{1}", sog.Name, sog.UUID); + SendObjectUpdateToRelevantSyncConnectors(sog, syncMsg); //clear the taints @@ -819,6 +888,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { foreach (SceneObjectPart updatedPart in primUpdates) { + if (updatedPart.ParentGroup.IsDeleted) + continue; + updatedPart.UpdateTaintedBucketSyncInfo(bucketName, DateTime.Now.Ticks); //string partPhysicsBucketEncoding = PhysicsBucketPropertiesEncoder(bucketName, updatedPart); @@ -1598,7 +1670,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// /// /// ActorID of the sender - public void HandleIncomingMessage(SymmetricSyncMessage msg, string senderActorID) + public void HandleIncomingMessage(SymmetricSyncMessage msg, string senderActorID, SyncConnector syncConnector) { lock (m_stats) m_statMsgsIn++; //Added senderActorID, so that we don't have to include actorID in sync messages -- TODO @@ -1607,7 +1679,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule case SymmetricSyncMessage.MsgType.GetTerrain: { //SendSyncMessage(SymmetricSyncMessage.MsgType.Terrain, m_scene.Heightmap.SaveToXmlString()); - SendTerrainUpdateMessage(); + //SendTerrainUpdateMessage(); + HandleGetTerrainRequest(syncConnector); return; } case SymmetricSyncMessage.MsgType.Terrain: @@ -1631,7 +1704,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //string sogxml = SceneObjectSerializer.ToXml2Format((SceneObjectGroup)e); //SendSyncMessage(SymmetricSyncMessage.MsgType.NewObject, sogxml); SceneObjectGroup sog = (SceneObjectGroup)e; - SendNewObject(sog); + HandleGetObjectRequest(syncConnector, sog); } } return; @@ -1723,6 +1796,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule SceneObjectGroup sog = SceneObjectSerializer.FromXml2Format(sogxml); //Scene.ObjectUpdateResult updateResult = m_scene.AddOrUpdateObjectBySynchronization(sog); + //m_log.DebugFormat("{0}: received NewObject sync message from {1}, for object {1}, {2}", LogHeader, senderActorID, sog.Name, sog.UUID); + Scene.ObjectUpdateResult updateResult = m_scene.AddNewSceneObjectBySync(sog); //if this is a relay node, forward the event @@ -1749,7 +1824,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_scene.UpdateObjectPartBucketProperties(bucketName, partUUID, data, rBucketSyncInfo); } - //m_log.DebugFormat("{0}: received NewObject sync message from {1}, for object {1}, {2}", LogHeader, senderActorID, sog.Name, sog.UUID); + //m_log.DebugFormat("{0}: after processing NewObject sync message from {1}, for object {1}, {2}", LogHeader, senderActorID, sog.Name, sog.UUID); } private void HandleUpdateObjectBySynchronization(SymmetricSyncMessage msg, string senderActorID) @@ -1758,7 +1833,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule SceneObjectGroup sog = SceneObjectSerializer.FromXml2Format(sogxml); lock (m_stats) m_statSOGBucketIn++; - if (sog.IsDeleted) + if (sog.IsDeleted) { SymmetricSyncMessage.HandleTrivial(LogHeader, msg, String.Format("Ignoring update on deleted object, UUID: {0}.", sog.UUID)); return; @@ -1773,6 +1848,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } } + //m_log.Debug(LogHeader + "HandleUpdateObjectBySynchronization: sog " + sog.Name + "," + sog.UUID); + Scene.ObjectUpdateResult updateResult = m_scene.UpdateObjectBySynchronization(sog); switch (updateResult) diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SyncConnector.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SyncConnector.cs index 2ae9608991..ce9bddfc34 100755 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SyncConnector.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SyncConnector.cs @@ -299,7 +299,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //For any other messages, we simply deliver the message to RegionSyncModule for now. //Later on, we may deliver messages to different modules, say sync message to RegionSyncModule and event message to ActorSyncModule. - m_regionSyncModule.HandleIncomingMessage(msg, m_syncOtherSideActorID); + m_regionSyncModule.HandleIncomingMessage(msg, m_syncOtherSideActorID, this); } public string StatisticIdentifier() diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 54478ee046..12a31b5f56 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -817,7 +817,12 @@ namespace OpenSim.Region.Framework.Scenes } //m_log.Debug("to link part " + part.DebugObjectPartProperties()); - m_log.Debug("LinkObjectBySync: " + part.Name + "," + part.UUID + " with root "+root.Name+","+root.UUID+"; its SOG has " + part.ParentGroup.Parts + " parts"); + string partNames = ""; + foreach (SceneObjectPart child in part.ParentGroup.Parts) + { + partNames += "(" + child.Name + "," + child.UUID + ")"; + } + m_log.Debug("LinkObjectBySync: " + part.Name + "," + part.UUID + " with root "+root.Name+","+root.UUID+"; its SOG has " + part.ParentGroup.Parts.Length + " parts : "+partNames); children.Add(part); } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 06dd420676..d8249c975a 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -5569,7 +5569,7 @@ namespace OpenSim.Region.Framework.Scenes //m_log.Debug("Received Physics Bucket updates for " + localPart.Name + ","+localPart.UUID // + ". GroupPosition: " + data["GroupPosition"].AsVector3().ToString()); - if (pa != null) + if (pa != null && data.ContainsKey("PA_Acceleration")) { pa.Size = data["Size"].AsVector3(); pa.Position = data["Position"].AsVector3();