From a06ddb9e88bb6e524be1cffd3f671389a08b59a7 Mon Sep 17 00:00:00 2001 From: "Huaiyu (Kitty) Liu" Date: Fri, 8 Apr 2011 17:10:09 -0700 Subject: [PATCH] Started to link RegionSyncModule.RecordPrimUpdatesByLocal with functions in PrimSyncInfoManager. To to finished. --- .../SymmetricSync/RegionSyncModule.cs | 139 +++++++++++++----- 1 file changed, 104 insertions(+), 35 deletions(-) diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index 10ef34f665..07da4b866f 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -100,6 +100,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule SyncStatisticCollector.LogInterval = m_sysConfig.GetInt("SyncLogInterval", 5000); SyncStatisticCollector.LogMaxFileTimeMin = m_sysConfig.GetInt("SyncLogMaxFileTimeMin", 5); SyncStatisticCollector.LogFileHeader = m_sysConfig.GetString("SyncLogFileHeader", "sync-"); + + //initialize PrimSyncInfoManager + int syncInfoAgeOutSeconds = m_sysConfig.GetInt("PrimSyncInfoAgeOutSeconds", 300); //unit of seconds + TimeSpan tSpan = new TimeSpan(0, 0, syncInfoAgeOutSeconds); + m_primSyncInfoManager = new PrimSyncInfoManager(this, tSpan.Ticks, m_log); } //Called after Initialise() @@ -3014,9 +3019,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule #endregion //Remote Event handlers #region Per Property SyncInfo management + + private PrimSyncInfoManager m_primSyncInfoManager; public void RecordPrimUpdatesByLocal(SceneObjectPart part, List updatedProperties) { + List propertiesWithSyncInfoUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoByLocal(part, updatedProperties); + OSDMap propertiesToSync = m_primSyncInfoManager.EncodePrimProperties(part, propertiesWithSyncInfoUpdated); + //TODO: Send out sync message with propertiesToSync } #endregion //Per Property SyncInfo management @@ -3170,8 +3180,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule public class PropertySyncInfo { - private ulong m_lastUpdateTimeStamp; - public ulong LastUpdateTimeStamp + private long m_lastUpdateTimeStamp; + public long LastUpdateTimeStamp { get { return m_lastUpdateTimeStamp; } } @@ -3201,8 +3211,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// Record the time the last sync message about this property is received. /// This value is only meaninful when m_lastUpdateSource==BySync /// - private ulong m_lastSyncUpdateRecvTime; - public ulong LastSyncUpdateRecvTime + private long m_lastSyncUpdateRecvTime; + public long LastSyncUpdateRecvTime { get { return m_lastSyncUpdateRecvTime; } set { m_lastSyncUpdateRecvTime = value; } @@ -3216,6 +3226,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private Object m_syncInfoLock = new Object(); + public PropertySyncInfo(Object initValue, long initTS, string syncID) + { + m_lastUpdateValue = initValue; + m_lastUpdateTimeStamp = initTS; + m_lastUpdateSyncID = syncID; + //m_lastSyncUpdateRecvTime == ?? + } + /// /// Update SyncInfo when the property is updated locally. This interface /// is for complex properties that need hashValue for fast comparison, @@ -3226,7 +3244,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// /// This is only meaningful for complex properties: /// Shape & TaskInventory. For other properties, it is ignore. - public void UpdateSyncInfoByLocal(ulong ts, string syncID, Object pValue, string pHashedValue) + public void UpdateSyncInfoByLocal(long ts, string syncID, Object pValue, string pHashedValue) { lock (m_syncInfoLock) { @@ -3245,7 +3263,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// /// /// - public void UpdateSyncInfoByLocal(ulong ts, string syncID, Object pValue) + public void UpdateSyncInfoByLocal(long ts, string syncID, Object pValue) { lock (m_syncInfoLock) { @@ -3262,7 +3280,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// /// /// - public void UpdateSyncInfoBySync(ulong ts, string syncID, ulong recvTS, Object pValue) + public void UpdateSyncInfoBySync(long ts, string syncID, long recvTS, Object pValue) { lock (m_syncInfoLock) { @@ -3296,8 +3314,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule get { return m_propertiesSyncInfo; } } - private ulong m_PrimLastUpdateTime; - public ulong PrimLastUpdateTime + private long m_PrimLastUpdateTime; + public long PrimLastUpdateTime { get { return m_PrimLastUpdateTime; } } @@ -3308,30 +3326,26 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule #endregion //Members #region Constructors - public PrimSyncInfo() - { - InitPropertiesSyncInfo(); - } - public PrimSyncInfo(ILog log) + public PrimSyncInfo(SceneObjectPart part, long initUpdateTimestamp, string syncID, ILog log) { - InitPropertiesSyncInfo(); + InitPropertiesSyncInfo(part, initUpdateTimestamp, syncID); m_log = log; } #endregion //Constructors - public void UpdatePropertySyncInfoByLocal(SceneObjectPartProperties property, ulong lastUpdateTS, string syncID, Object pValue, string pHashedValue) + public void UpdatePropertySyncInfoByLocal(SceneObjectPartProperties property, long lastUpdateTS, string syncID, Object pValue, string pHashedValue) { m_propertiesSyncInfo[property].UpdateSyncInfoByLocal(lastUpdateTS, syncID, pValue, pHashedValue); } - public void UpdatePropertySyncInfoByLocal(SceneObjectPartProperties property, ulong lastUpdateTS, string syncID, Object pValue) + public void UpdatePropertySyncInfoByLocal(SceneObjectPartProperties property, long lastUpdateTS, string syncID, Object pValue) { m_propertiesSyncInfo[property].UpdateSyncInfoByLocal(lastUpdateTS, syncID, pValue); } - public void UpdatePropertySyncInfoBySync(SceneObjectPartProperties property, ulong lastUpdateTS, string syncID, Object pValue, Object pHashedValue, ulong recvTS) + public void UpdatePropertySyncInfoBySync(SceneObjectPartProperties property, long lastUpdateTS, string syncID, Object pValue, Object pHashedValue, long recvTS) { m_propertiesSyncInfo[property].UpdateSyncInfoBySync(lastUpdateTS, syncID, recvTS, pValue); } @@ -3339,17 +3353,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //Triggered when a set of local writes just happened, and ScheduleFullUpdate //or ScheduleTerseUpdate has been called. /// - /// Update copies of the given list of properties in this SyncModule, - /// by copying property values from SOP's data and set the timestamp - /// and syncID. + /// Update copies of the given list of properties in the prim's SyncInfo. /// /// /// /// /// - public void UpdatePropertiesByLocal(SceneObjectPart part, List updatedProperties, ulong lastUpdateTS, string syncID) + public List UpdatePropertiesByLocal(SceneObjectPart part, List updatedProperties, long lastUpdateTS, string syncID) { - if (part == null) return; + List propertiesWithSyncInfoUpdated = new List(); + if (part == null) return propertiesWithSyncInfoUpdated; //first, see if there are physics properties updated but PhysActor //does not exist @@ -3373,7 +3386,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule if (part.PhysActor == null) { m_log.WarnFormat("PrimSyncInfo: Informed some physics property in SOP updated, yet SOP's PhysActor no longer exsits."); - return; + return propertiesWithSyncInfoUpdated; } break; case SceneObjectPartProperties.FullUpdate: @@ -3382,7 +3395,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //compare and update all properties - return; + return propertiesWithSyncInfoUpdated; case SceneObjectPartProperties.None: //do nothing break; @@ -3410,22 +3423,29 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule updated = CompareAndUpdateValueByLocal(part, property, lastUpdateTS, syncID); break; } + + if (updated) + { + propertiesWithSyncInfoUpdated.Add(property); + } } } + return propertiesWithSyncInfoUpdated; } - private void InitPropertiesSyncInfo() + private void InitPropertiesSyncInfo(SceneObjectPart part, long initUpdateTimestamp, string syncID) { m_propertiesSyncInfo = new Dictionary(); foreach (SceneObjectPartProperties property in Enum.GetValues(typeof(SceneObjectPartProperties))) { - PropertySyncInfo syncInfo = new PropertySyncInfo(); + Object initValue = GetSOPPropertyValue(part, property); + PropertySyncInfo syncInfo = new PropertySyncInfo(initValue, initUpdateTimestamp, syncID); m_propertiesSyncInfo.Add(property, syncInfo); } } - private bool CompareAndUpdateHashedValueByLocal(SceneObjectPart part, SceneObjectPartProperties property, ulong lastUpdateTS, string syncID) + private bool CompareAndUpdateHashedValueByLocal(SceneObjectPart part, SceneObjectPartProperties property, long lastUpdateTS, string syncID) { bool updated = false; switch (property) @@ -3535,7 +3555,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// /// Return true if the property's value maintained in this /// RegionSyncModule is replaced by SOP's data. - private bool CompareAndUpdateValueByLocal(SceneObjectPart part, SceneObjectPartProperties property, ulong lastUpdateByLocalTS, string syncID) + private bool CompareAndUpdateValueByLocal(SceneObjectPart part, SceneObjectPartProperties property, long lastUpdateByLocalTS, string syncID) { bool propertyUpdatedByLocal = false; @@ -4600,10 +4620,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { case SceneObjectPartProperties.Shape: return (Object)SerializePrimPropertyShape(part); - break; case SceneObjectPartProperties.TaskInventory: return (Object)SerializePrimPropertyTaskInventory(part); - break; /////////////////////// //SOP properties @@ -4680,7 +4698,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule case SceneObjectPartProperties.OwnershipCost: return (Object)part.OwnershipCost; case SceneObjectPartProperties.ParticleSystem: - return ByteArrayEquals(part.ParticleSystem, (Byte[])m_propertiesSyncInfo[property].LastUpdateValue); + //byte[], return a cloned copy + return (Object)part.ParticleSystem.Clone(); case SceneObjectPartProperties.PassTouches: return (Object)part.PassTouches; case SceneObjectPartProperties.RotationOffset: @@ -4710,7 +4729,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule case SceneObjectPartProperties.Text: return (Object)part.Text; case SceneObjectPartProperties.TextureAnimation: - return ByteArrayEquals(part.TextureAnimation, (Byte[])m_propertiesSyncInfo[property].LastUpdateValue); + //byte[], return a cloned copy + return part.TextureAnimation.Clone(); case SceneObjectPartProperties.TouchName: return (Object)part.TouchName; case SceneObjectPartProperties.UpdateFlag: @@ -4762,19 +4782,68 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule public class PrimSyncInfoManager { private Dictionary m_primsInSync; + private RegionSyncModule m_regionSyncModule; + private ILog m_log; + + + /// + /// The max time for a SOP's SyncInfo to sit in record + /// w/o being updated either locally or bySync. + /// + private long m_ageOutThreshold; + public Dictionary PrimsInSync { get { return m_primsInSync; } } - public PrimSyncInfoManager() + public PrimSyncInfoManager(RegionSyncModule syncModule, long ageOutTh, ILog log) { m_primsInSync = new Dictionary(); + m_regionSyncModule = syncModule; + m_ageOutThreshold = ageOutTh; + m_log = log; } - public void UpdatePrimSyncInfo(SceneObjectPart part, List updatedProperties) + /// + /// For each property in updatedProperties, (1) if the value in SOP's + /// data is different than that in PrimSyncInfo, and what's in PrimSyncInfo + /// has an older timestamp, then update that property's value and syncInfo + /// in PrimSyncInfo; (2) otherwise, skip the property and do nothing. + /// + /// + /// + /// The list properties among updatedProperties whose value + /// have been copied over to PrimSyncInfo. + public List UpdatePrimSyncInfoByLocal(SceneObjectPart part, List updatedProperties) { + long currentTime = DateTime.Now.Ticks; + if (m_primsInSync.ContainsKey(part.UUID)) + { + return m_primsInSync[part.UUID].UpdatePropertiesByLocal(part, updatedProperties, currentTime, m_regionSyncModule.SyncID); + } + else + { + //The SOP's SyncInfo is no longer in my record, may due to + //TimeOut or something. Add it back. Assume the properties + //were "AgeOut" seconds old. + PrimSyncInfo primSyncInfo = new PrimSyncInfo(part, currentTime, m_regionSyncModule.SyncID, m_log); + m_primsInSync.Add(part.UUID, primSyncInfo); + return updatedProperties; + } + } + + public OSDMap EncodePrimProperties(SceneObjectPart part, List updatedProperties) + { + OSDMap data = new OSDMap(); + data["primUUID"] = OSDMap.FromUUID(part.UUID); + foreach (SceneObjectPartProperties property in updatedProperties) + { + // data[property.ToString()] = + } + + return data; } }