From cb6630aa354ae9e9c47496077967d99b8ec9a632 Mon Sep 17 00:00:00 2001 From: "Huaiyu (Kitty) Liu" Date: Fri, 22 Apr 2011 16:57:22 -0700 Subject: [PATCH] For functions in PrimSyncInfo that access per property sync info, adding checking of if m_propertiesSyncInfo[property] exists before accessing it. --- .../SymmetricSync/RegionSyncModule.cs | 115 ++++++++++++++---- .../Framework/Scenes/SceneObjectPart.cs | 12 ++ 2 files changed, 104 insertions(+), 23 deletions(-) diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index 9331dc1fa6..1271c8de08 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -3654,15 +3654,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule HashSet updatedProperties = updatedPrimProperties.Value; SendPrimPropertyUpdates(primUUID, updatedProperties); - /* - OSDMap syncData = m_primSyncInfoManager.EncodePrimProperties(primUUID, updatedProperties); - - if (syncData.Count > 0) - { - SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedObject, OSDParser.SerializeJsonString(syncData)); - SendPrimUpdateToRelevantSyncConnectors(primUUID, syncMsg); - } - * */ } // Indicate that the current batch of updates has been completed @@ -3682,7 +3673,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule if (sop == null || sop.ParentGroup.IsDeleted) return; - OSDMap syncData = m_primSyncInfoManager.EncodePrimProperties(primUUID, updatedProperties); + OSDMap syncData = m_primSyncInfoManager.EncodePrimProperties(sop, updatedProperties); if (syncData.Count > 0) { @@ -3751,7 +3742,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //This should not happen, but we deal with it by inserting a newly created PrimSynInfo m_primSyncInfoManager.InsertPrimSyncInfo(sog.RootPart, DateTime.Now.Ticks, m_syncID); } - data["RootPart"] = m_primSyncInfoManager.EncodePrimProperties(sog.RootPart.UUID, fullPropertyList); + data["RootPart"] = m_primSyncInfoManager.EncodePrimProperties(sog.RootPart, fullPropertyList); //int otherPartsCount = sog.Parts.Length - 1; @@ -3767,7 +3758,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //This should not happen, but we deal with it by inserting a newly created PrimSynInfo m_primSyncInfoManager.InsertPrimSyncInfo(part, DateTime.Now.Ticks, m_syncID); } - OSDMap partData = m_primSyncInfoManager.EncodePrimProperties(part.UUID, fullPropertyList); + OSDMap partData = m_primSyncInfoManager.EncodePrimProperties(part, fullPropertyList); otherPartsArray.Add(partData); } } @@ -4824,6 +4815,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private Object m_primSyncInfoLock = new Object(); private static HashSet FullSetPrimProperties = SceneObjectPart.GetAllPrimProperties(); private static HashSet PrimPhysActorProperties = SceneObjectPart.GetAllPhysActorProperties(); + private static HashSet PrimNonPhysActorProperties = SceneObjectPart.GetAllPrimNonPhysActorProperties(); private static HashSet GroupProperties = SceneObjectPart.GetGroupProperties(); #endregion //Members @@ -4902,7 +4894,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule case SceneObjectPartSyncProperties.FullUpdate: //Caller indicated many properties have changed. We need to //compare and update all properties - propertiesToBeSynced = FullSetPrimProperties; + if (part.PhysActor == null) + propertiesToBeSynced = PrimNonPhysActorProperties; + else + propertiesToBeSynced = FullSetPrimProperties; break; //return propertiesToBeSynced; case SceneObjectPartSyncProperties.None: @@ -5006,14 +5001,24 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { foreach (SceneObjectPartSyncProperties property in FullSetPrimProperties) { - propertyData.Add(property.ToString(), m_propertiesSyncInfo[property].ToOSDMap()); + if (m_propertiesSyncInfo.ContainsKey(property)) + propertyData.Add(property.ToString(), m_propertiesSyncInfo[property].ToOSDMap()); + else + { + DebugLog.WarnFormat("PrimSyncInfo: property {0} not in sync cache", property); + } } } else { foreach (SceneObjectPartSyncProperties property in propertiesToSync) { - propertyData.Add(property.ToString(), m_propertiesSyncInfo[property].ToOSDMap()); + if (m_propertiesSyncInfo.ContainsKey(property)) + propertyData.Add(property.ToString(), m_propertiesSyncInfo[property].ToOSDMap()); + else + { + DebugLog.WarnFormat("PrimSyncInfo: property {0} not in sync cache", property); + } } } } @@ -5056,7 +5061,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule SetSOPPropertyValue(sop, property); else { - DebugLog.WarnFormat("PrimSyncInfoToSOP -- property {0} not in record.", property); + //This might just be fine. For phantom objects, they don't have + //PhysActor properties, and those properties would end up here. + + //DebugLog.WarnFormat("PrimSyncInfoToSOP -- property {0} not in record.", property); } } return sop; @@ -5081,7 +5089,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private void InitPropertiesSyncInfo(SceneObjectPart part, long initUpdateTimestamp, string syncID) { m_propertiesSyncInfo.Clear(); - foreach (SceneObjectPartSyncProperties property in FullSetPrimProperties) + HashSet initPrimProperties; + + if (part.PhysActor == null) + initPrimProperties = PrimNonPhysActorProperties; + else + initPrimProperties = FullSetPrimProperties; + + foreach (SceneObjectPartSyncProperties property in initPrimProperties) { Object initValue = GetSOPPropertyValue(part, property); PropertySyncInfo syncInfo = new PropertySyncInfo(property, initValue, initUpdateTimestamp, syncID); @@ -5106,7 +5121,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } else { - DebugLog.WarnFormat("InitPropertiesSyncInfoFromOSDMap: Property {0} not included in the given OSDMap", property); + //For Phantom prims, they don't have PhysActor properties. So this branch could happen. + //DebugLog.WarnFormat("InitPropertiesSyncInfoFromOSDMap: Property {0} not included in the given OSDMap", property); } } } @@ -5115,6 +5131,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private bool CompareHashedValue_UpdateByLocal(SceneObjectPart part, SceneObjectPartSyncProperties property, long lastUpdateTS, string syncID) { bool updated = false; + if (!m_propertiesSyncInfo.ContainsKey(property)) + { + Object initValue = GetSOPPropertyValue(part, property); + PropertySyncInfo syncInfo = new PropertySyncInfo(property, initValue, lastUpdateTS, syncID); + m_propertiesSyncInfo.Add(property, syncInfo); + return true; + } switch (property) { case SceneObjectPartSyncProperties.Shape: @@ -5186,7 +5209,15 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private bool CompareValue_UpdateByLocal(SceneObjectPart part, SceneObjectPartSyncProperties property, long lastUpdateByLocalTS, string syncID) { bool propertyUpdatedByLocal = false; - + + if (!m_propertiesSyncInfo.ContainsKey(property)) + { + Object initValue = GetSOPPropertyValue(part, property); + PropertySyncInfo syncInfo = new PropertySyncInfo(property, initValue, lastUpdateByLocalTS, syncID); + m_propertiesSyncInfo.Add(property, syncInfo); + return true; + } + //First, check if the value maintained here is different from that //in SOP's. If different, next check if the timestamp in SyncInfo is //bigger (newer) than lastUpdateByLocalTS; if so (although ideally @@ -6260,7 +6291,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } return true; } - + private Object GetSOPPropertyValue(SceneObjectPart part, SceneObjectPartSyncProperties property) { if (part == null) return null; @@ -6392,30 +6423,56 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //PhysActor properties /////////////////////// case SceneObjectPartSyncProperties.Buoyancy: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.Buoyancy; case SceneObjectPartSyncProperties.Flying: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.Flying; case SceneObjectPartSyncProperties.Force: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.Force; case SceneObjectPartSyncProperties.IsColliding: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.IsColliding; case SceneObjectPartSyncProperties.CollidingGround: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.CollidingGround; case SceneObjectPartSyncProperties.IsPhysical: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.IsPhysical; case SceneObjectPartSyncProperties.Kinematic: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.Kinematic; case SceneObjectPartSyncProperties.Orientation: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.Orientation; case SceneObjectPartSyncProperties.PA_Acceleration: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.Acceleration; case SceneObjectPartSyncProperties.Position: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.Position; case SceneObjectPartSyncProperties.RotationalVelocity: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.RotationalVelocity; case SceneObjectPartSyncProperties.Size: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.Size; case SceneObjectPartSyncProperties.Torque: + if (part.PhysActor == null) + return null; return (Object)part.PhysActor.Torque; /////////////////////// @@ -6438,7 +6495,15 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { if (part == null) return; if (!m_propertiesSyncInfo.ContainsKey(property)){ - DebugLog.WarnFormat("SetSOPPropertyValue: property {0} not in record.", property.ToString()); + //DebugLog.WarnFormat("SetSOPPropertyValue: property {0} not in record.", property.ToString()); + //For phantom prims, they don't have physActor properties, + //so for those properties, simply return + return; + } + + if (!m_propertiesSyncInfo.ContainsKey(property)) + { + DebugLog.WarnFormat("PrimSyncInfo: property {0} not in sync cache", property); return; } PropertySyncInfo pSyncInfo = m_propertiesSyncInfo[property]; @@ -6897,9 +6962,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } } - public OSDMap EncodePrimProperties(UUID primUUID, HashSet updatedProperties) + public OSDMap EncodePrimProperties(SceneObjectPart sop, HashSet updatedProperties) { OSDMap data = new OSDMap(); + UUID primUUID = sop.UUID; if (!m_primsInSync.ContainsKey(primUUID)) { DebugLog.WarnFormat("EncodePrimProperties: {0} not in RegionSyncModule's PrimSyncInfo list yet", primUUID); @@ -6913,7 +6979,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule HashSet propertiesToEncoded = updatedProperties; if (updatedProperties.Contains(SceneObjectPartSyncProperties.FullUpdate)) { - propertiesToEncoded = SceneObjectPart.GetAllPrimProperties(); + if (sop.PhysActor != null) + propertiesToEncoded = SceneObjectPart.GetAllPrimProperties(); + else + propertiesToEncoded = SceneObjectPart.GetAllPrimNonPhysActorProperties(); } OSDMap propertyData = m_primsInSync[primUUID].EncodePropertiesSyncInfo(propertiesToEncoded); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 4eed75ea6f..5573df2301 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -5452,6 +5452,18 @@ namespace OpenSim.Region.Framework.Scenes return allProperties; } + public static HashSet GetAllNonPhysActorProperties() + { + HashSet allProperties = GetAllPrimProperties(); + HashSet physActorProperties = GetAllPhysActorProperties(); + + foreach (SceneObjectPartSyncProperties pProperty in physActorProperties) + { + allProperties.Remove(pProperty); + } + return allProperties; + } + public static HashSet GetGroupProperties() { HashSet allProperties = new HashSet(){SceneObjectPartSyncProperties.IsSelected};