Starting add SetXXX() functions to SceneObjectPart, where XXX is each property's name. Also fixed some bugs in InitializeBucketSyncInfo

dsg
Huaiyu (Kitty) Liu 2011-02-02 15:46:12 -08:00
parent ce4c8e4b6f
commit 9ca061b25a
4 changed files with 186 additions and 28 deletions

View File

@ -19,6 +19,8 @@ using System.Net.Sockets;
using System.Threading; using System.Threading;
using System.Text; using System.Text;
using System.IO;
using System.Xml;
using Mono.Addins; using Mono.Addins;
using OpenMetaverse.StructuredData; using OpenMetaverse.StructuredData;
@ -198,7 +200,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
private Dictionary<UUID, SceneObjectGroup> m_primUpdates = new Dictionary<UUID, SceneObjectGroup>(); private Dictionary<UUID, SceneObjectGroup> m_primUpdates = new Dictionary<UUID, SceneObjectGroup>();
private object m_updateScenePresenceLock = new object(); private object m_updateScenePresenceLock = new object();
private Dictionary<UUID, ScenePresence> m_presenceUpdates = new Dictionary<UUID, ScenePresence>(); private Dictionary<UUID, ScenePresence> m_presenceUpdates = new Dictionary<UUID, ScenePresence>();
private int m_sendingUpdates; private int m_sendingUpdates=0;
private int m_maxNumOfPropertyBuckets; private int m_maxNumOfPropertyBuckets;
@ -242,16 +244,21 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
case "IsPhysical": case "IsPhysical":
case "Flying": case "Flying":
case "Buoyancy": case "Buoyancy":
m_primPropertyBucketMap.Add(pName, generalBucketName); m_primPropertyBucketMap.Add(pName, physicsBucketName);
break; break;
default: default:
//all other properties belong to the "General" bucket. //all other properties belong to the "General" bucket.
m_primPropertyBucketMap.Add(pName, physicsBucketName); m_primPropertyBucketMap.Add(pName, generalBucketName);
break; break;
} }
} }
} }
private bool IsSyncingWithOtherActors()
{
return (m_syncConnectors.Count > 0);
}
public void QueueSceneObjectPartForUpdate(SceneObjectPart part) public void QueueSceneObjectPartForUpdate(SceneObjectPart part)
{ {
//if the last update of the prim is caused by this actor itself, or if the actor is a relay node, then enqueue the update //if the last update of the prim is caused by this actor itself, or if the actor is a relay node, then enqueue the update
@ -275,6 +282,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//SendSceneUpdates put each update into an outgoing queue of each SyncConnector //SendSceneUpdates put each update into an outgoing queue of each SyncConnector
public void SendSceneUpdates() public void SendSceneUpdates()
{ {
if (!IsSyncingWithOtherActors())
{
//no SyncConnector connected. Do nothing.
return;
}
// Existing value of 1 indicates that updates are currently being sent so skip updates this pass // Existing value of 1 indicates that updates are currently being sent so skip updates this pass
if (Interlocked.Exchange(ref m_sendingUpdates, 1) == 1) if (Interlocked.Exchange(ref m_sendingUpdates, 1) == 1)
{ {
@ -389,6 +402,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
public void SendTerrainUpdates(string lastUpdateActorID) public void SendTerrainUpdates(string lastUpdateActorID)
{ {
if (!IsSyncingWithOtherActors())
{
//no SyncConnector connected. Do nothing.
return;
}
if(m_isSyncRelay || m_actorID.Equals(lastUpdateActorID)) if(m_isSyncRelay || m_actorID.Equals(lastUpdateActorID))
{ {
//m_scene.Heightmap should have been updated already by the caller, send it out //m_scene.Heightmap should have been updated already by the caller, send it out
@ -406,7 +424,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//private void RegionSyncModule_OnObjectBeingRemovedFromScene(SceneObjectGroup sog) //private void RegionSyncModule_OnObjectBeingRemovedFromScene(SceneObjectGroup sog)
public void SendDeleteObject(SceneObjectGroup sog, bool softDelete) public void SendDeleteObject(SceneObjectGroup sog, bool softDelete)
{ {
m_log.DebugFormat("SendDeleteObject called for object {0}", sog.UUID); if (!IsSyncingWithOtherActors())
{
//no SyncConnector connected. Do nothing.
return;
}
m_log.DebugFormat(LogHeader+"SendDeleteObject called for object {0}", sog.UUID);
//Only send the message out if this is a relay node for sync messages, or this actor caused deleting the object //Only send the message out if this is a relay node for sync messages, or this actor caused deleting the object
//if (m_isSyncRelay || CheckObjectForSendingUpdate(sog)) //if (m_isSyncRelay || CheckObjectForSendingUpdate(sog))
@ -428,6 +452,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
{ {
if(children.Count==0) return; if(children.Count==0) return;
if (!IsSyncingWithOtherActors())
{
//no SyncConnector connected. Do nothing.
return;
}
OSDMap data = new OSDMap(); OSDMap data = new OSDMap();
string sogxml = SceneObjectSerializer.ToXml2Format(linkedGroup); string sogxml = SceneObjectSerializer.ToXml2Format(linkedGroup);
data["linkedGroup"]=OSD.FromString(sogxml); data["linkedGroup"]=OSD.FromString(sogxml);
@ -449,6 +479,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
{ {
if (prims.Count==0 || beforeDelinkGroups.Count==0) return; if (prims.Count==0 || beforeDelinkGroups.Count==0) return;
if (!IsSyncingWithOtherActors())
{
//no SyncConnector connected. Do nothing.
return;
}
OSDMap data = new OSDMap(); OSDMap data = new OSDMap();
data["partCount"] = OSD.FromInteger(prims.Count); data["partCount"] = OSD.FromInteger(prims.Count);
int partNum = 0; int partNum = 0;
@ -486,6 +522,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
public void PublishSceneEvent(EventManager.EventNames ev, Object[] evArgs) public void PublishSceneEvent(EventManager.EventNames ev, Object[] evArgs)
{ {
if (!IsSyncingWithOtherActors())
{
//no SyncConnector connected. Do nothing.
return;
}
switch (ev) switch (ev)
{ {
case EventManager.EventNames.NewScript: case EventManager.EventNames.NewScript:
@ -566,9 +608,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
Command cmdSyncStatus = new Command("status", CommandIntentions.COMMAND_HAZARDOUS, SyncStatus, "Displays synchronization status."); Command cmdSyncStatus = new Command("status", CommandIntentions.COMMAND_HAZARDOUS, SyncStatus, "Displays synchronization status.");
//for debugging purpose
Command cmdSyncDebug = new Command("debug", CommandIntentions.COMMAND_HAZARDOUS, SyncDebug, "Trigger some debugging functions");
m_commander.RegisterCommand("start", cmdSyncStart); m_commander.RegisterCommand("start", cmdSyncStart);
m_commander.RegisterCommand("stop", cmdSyncStop); m_commander.RegisterCommand("stop", cmdSyncStop);
m_commander.RegisterCommand("status", cmdSyncStatus); m_commander.RegisterCommand("status", cmdSyncStatus);
m_commander.RegisterCommand("debug", cmdSyncDebug);
lock (m_scene) lock (m_scene)
{ {
@ -794,7 +840,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
} }
//Start symmetric synchronization initialization automatically //Start symmetric synchronization initialization automatically
SyncStart(null); //SyncStart(null);
} }
private void StartLocalSyncListener() private void StartLocalSyncListener()
@ -930,6 +976,38 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_log.Warn("[REGION SYNC MODULE]: SyncStatus() TO BE IMPLEMENTED !!!"); m_log.Warn("[REGION SYNC MODULE]: SyncStatus() TO BE IMPLEMENTED !!!");
} }
private void SyncDebug(Object[] args)
{
if (m_scene != null)
{
EntityBase[] entities = m_scene.GetEntities();
foreach (EntityBase entity in entities)
{
if (entity is SceneObjectGroup)
{
//first test serialization
StringWriter sw = new StringWriter();
XmlTextWriter writer = new XmlTextWriter(sw);
Dictionary<string, BucketSyncInfo> bucketSyncInfoList = new Dictionary<string,BucketSyncInfo>();
BucketSyncInfo generalBucket = new BucketSyncInfo(DateTime.Now.Ticks, m_actorID, "General");
bucketSyncInfoList.Add("General", generalBucket);
BucketSyncInfo physicsBucket = new BucketSyncInfo(DateTime.Now.Ticks, m_actorID, "Physics");
bucketSyncInfoList.Add("Physics", physicsBucket);
SceneObjectSerializer.WriteBucketSyncInfo(writer, bucketSyncInfoList);
string xmlString = sw.ToString();
m_log.Debug("Serialized xml string: " + xmlString);
//second, test de-serialization
XmlTextReader reader = new XmlTextReader(new StringReader(xmlString));
SceneObjectPart part = new SceneObjectPart();
SceneObjectSerializer.ProcessBucketSyncInfo(part, reader);
break;
}
}
}
}
//Start connections to each remote listener. //Start connections to each remote listener.
//For now, there is only one remote listener. //For now, there is only one remote listener.
private bool StartSyncConnections() private bool StartSyncConnections()

View File

@ -581,7 +581,7 @@ namespace OpenSim.Region.Framework.Scenes
//ScheduleGroupForFullUpdate(); //ScheduleGroupForFullUpdate();
//SYMMETRIC SYNC //SYMMETRIC SYNC
if (m_scene.RegionSyncClientModule != null) if (m_scene.RegionSyncModule != null)
{ {
foreach (SceneObjectPart part in Parts) foreach (SceneObjectPart part in Parts)
{ {

View File

@ -186,9 +186,13 @@ namespace OpenSim.Region.Framework.Scenes
set set
{ {
m_allowedDrop = value; m_allowedDrop = value;
UpdateBucketSyncInfo("AllowedDrop"); //UpdateBucketSyncInfo("AllowedDrop");
} }
} }
public void SetAllowedDrop(bool value)
{
m_allowedDrop = value;
}
public bool DIE_AT_EDGE; public bool DIE_AT_EDGE;
@ -793,6 +797,10 @@ namespace OpenSim.Region.Framework.Scenes
} }
set set
{ {
//SetGroupPosition(value);
//UpdateBucketSyncInfo("GroupPosition");
//Legacy Opensim code
m_groupPosition = value; m_groupPosition = value;
PhysicsActor actor = PhysActor; PhysicsActor actor = PhysActor;
@ -833,8 +841,54 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
} }
} }
} }
//SYMMETRIC SYNC
public void SetGroupPosition(Vector3 value)
{
m_groupPosition = value;
PhysicsActor actor = PhysActor;
if (actor != null)
{
try
{
// Root prim actually goes at Position
if (_parentID == 0)
{
actor.Position = value;
}
else
{
// To move the child prim in respect to the group position and rotation we have to calculate
actor.Position = GetWorldPosition();
actor.Orientation = GetWorldRotation();
}
// Tell the physics engines that this prim changed.
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
}
catch (Exception e)
{
m_log.Error("[SCENEOBJECTPART]: GROUP POSITION. " + e.Message);
}
}
// TODO if we decide to do sitting in a more SL compatible way (multiple avatars per prim), this has to be fixed, too
if (m_sitTargetAvatar != UUID.Zero)
{
if (m_parentGroup != null) // TODO can there be a SOP without a SOG?
{
ScenePresence avatar;
if (m_parentGroup.Scene.TryGetScenePresence(m_sitTargetAvatar, out avatar))
{
avatar.ParentPosition = GetWorldPosition();
}
}
}
}
public Vector3 OffsetPosition public Vector3 OffsetPosition
{ {
@ -5108,7 +5162,7 @@ namespace OpenSim.Region.Framework.Scenes
/*
private Object propertyUpdateLock = new Object(); private Object propertyUpdateLock = new Object();
//!!!!!! -- TODO: //!!!!!! -- TODO:
@ -5236,7 +5290,7 @@ namespace OpenSim.Region.Framework.Scenes
return partUpdateResult; return partUpdateResult;
} }
*/
private bool UpdateCollisionSound(UUID updatedCollisionSound) private bool UpdateCollisionSound(UUID updatedCollisionSound)
@ -5294,7 +5348,7 @@ namespace OpenSim.Region.Framework.Scenes
//The following variables should be initialized when this SceneObjectPart is added into the local Scene. //The following variables should be initialized when this SceneObjectPart is added into the local Scene.
//private List<BucketSyncInfo> SynchronizeUpdatesToScene = null; //private List<BucketSyncInfo> SynchronizeUpdatesToScene = null;
//public List<BucketSyncInfo> BucketSyncInfoList //public List<BucketSyncInfo> BucketSyncInfoList
private Dictionary<string, BucketSyncInfo> m_bucketSyncInfoList = null; private Dictionary<string, BucketSyncInfo> m_bucketSyncInfoList = new Dictionary<string, BucketSyncInfo>();
public Dictionary<string, BucketSyncInfo> BucketSyncInfoList public Dictionary<string, BucketSyncInfo> BucketSyncInfoList
{ {
get { return m_bucketSyncInfoList; } get { return m_bucketSyncInfoList; }
@ -5309,7 +5363,7 @@ namespace OpenSim.Region.Framework.Scenes
private static Dictionary<string, Object> m_bucketUpdateLocks = new Dictionary<string, object>(); private static Dictionary<string, Object> m_bucketUpdateLocks = new Dictionary<string, object>();
private static string m_localActorID = ""; private static string m_localActorID = "";
private static int m_bucketCount = 0; //private static int m_bucketCount = 0;
//private delegate void BucketUpdateProcessor(int bucketIndex); //private delegate void BucketUpdateProcessor(int bucketIndex);
private delegate void BucketUpdateProcessor(string bucketName); private delegate void BucketUpdateProcessor(string bucketName);
@ -5320,7 +5374,7 @@ namespace OpenSim.Region.Framework.Scenes
m_primPropertyBucketMap = propertyBucketMap; m_primPropertyBucketMap = propertyBucketMap;
m_propertyBucketNames = bucketNames; m_propertyBucketNames = bucketNames;
m_localActorID = actorID; m_localActorID = actorID;
m_bucketCount = propertyBucketMap.Count; //m_bucketCount = bucketNames.Count;
RegisterBucketUpdateProcessor(); RegisterBucketUpdateProcessor();
} }
@ -5373,29 +5427,51 @@ namespace OpenSim.Region.Framework.Scenes
return; return;
} }
long timeStamp = DateTime.Now.Ticks; long timeStamp = DateTime.Now.Ticks;
for (int i = 0; i < m_bucketCount; i++)
m_log.Debug("InitializeBucketSyncInfo called at " + timeStamp);
for (int i = 0; i < m_propertyBucketNames.Count; i++)
{ {
string bucketName = m_propertyBucketNames[i]; string bucketName = m_propertyBucketNames[i];
BucketSyncInfo syncInfo = new BucketSyncInfo(timeStamp, m_localActorID, bucketName); BucketSyncInfo syncInfo = new BucketSyncInfo(timeStamp, m_localActorID, bucketName);
m_bucketSyncInfoList.Add(bucketName, syncInfo);
m_bucketUpdateLocks.Add(bucketName, new Object()); //If the object is created by de-serialization, then it already has m_bucketSyncInfoList populated with the right number of buckets
if (m_bucketSyncInfoList.ContainsKey(bucketName))
{
m_bucketSyncInfoList[bucketName] = syncInfo;
}
else
{
m_bucketSyncInfoList.Add(bucketName, syncInfo);
}
if (!m_bucketSyncInfoList.ContainsKey(bucketName))
{
m_bucketUpdateLocks.Add(bucketName, new Object());
}
} }
} }
private void UpdateBucketSyncInfo(string propertyName) private void UpdateBucketSyncInfo(string propertyName)
{ {
if (m_bucketSyncInfoList != null) if (m_bucketSyncInfoList != null && m_bucketSyncInfoList.Count>0)
{ {
//int bucketIndex = m_primPropertyBucketMap[propertyName]; //int bucketIndex = m_primPropertyBucketMap[propertyName];
string bucketName = m_primPropertyBucketMap[propertyName]; string bucketName = m_primPropertyBucketMap[propertyName];
long timeStamp = DateTime.Now.Ticks; long timeStamp = DateTime.Now.Ticks;
m_bucketSyncInfoList[bucketName].UpdateSyncInfo(timeStamp, m_localActorID); if (m_bucketSyncInfoList.ContainsKey(bucketName))
{
m_bucketSyncInfoList[bucketName].UpdateSyncInfo(timeStamp, m_localActorID);
}
else
{
m_log.Warn("No SyncInfo of bucket (name: " + bucketName + ") found");
}
} }
} }
/*
public Scene.ObjectUpdateResult UpdateAllProperties(SceneObjectPart updatedPart) public Scene.ObjectUpdateResult UpdateAllProperties(SceneObjectPart updatedPart)
{ {
@ -5452,7 +5528,7 @@ namespace OpenSim.Region.Framework.Scenes
return partUpdateResult; return partUpdateResult;
} }
*/
//private void UpdateBucketProperties(string bucketDescription, //private void UpdateBucketProperties(string bucketDescription,
#endregion #endregion

View File

@ -330,9 +330,9 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
m_SOPXmlProcessors.Add("ParticleSystem", ProcessParticleSystem); m_SOPXmlProcessors.Add("ParticleSystem", ProcessParticleSystem);
//SYMMETRIC SYNC //SYMMETRIC SYNC
//m_SOPXmlProcessors.Add("LastUpdateTimeStamp", ProcessUpdateTimeStamp); m_SOPXmlProcessors.Add("LastUpdateTimeStamp", ProcessUpdateTimeStamp);
//m_SOPXmlProcessors.Add("LastUpdateActorID", ProcessLastUpdateActorID); m_SOPXmlProcessors.Add("LastUpdateActorID", ProcessLastUpdateActorID);
m_SOPXmlProcessors.Add("BucketSyncInfoList", ProcessBucketSyncInfo); // m_SOPXmlProcessors.Add("BucketSyncInfoList", ProcessBucketSyncInfo);
//end of SYMMETRIC SYNC //end of SYMMETRIC SYNC
#endregion #endregion
@ -418,6 +418,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
} }
#region SOPXmlProcessors #region SOPXmlProcessors
//SYMMETRIC SYNC NOTE: TODO -- assignments in de-serialization should directly set the values w/o triggering SceneObjectPart.UpdateBucketSyncInfo;
//That is, calling SetXXX(value) instead of "XXX = value". It's an code optimization to be done later.
private static void ProcessAllowedDrop(SceneObjectPart obj, XmlTextReader reader) private static void ProcessAllowedDrop(SceneObjectPart obj, XmlTextReader reader)
{ {
obj.AllowedDrop = Util.ReadBoolean(reader); obj.AllowedDrop = Util.ReadBoolean(reader);
@ -704,7 +706,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
obj.LastUpdateActorID = reader.ReadElementContentAsString("LastUpdateActorID", string.Empty); obj.LastUpdateActorID = reader.ReadElementContentAsString("LastUpdateActorID", string.Empty);
} }
private static void ProcessBucketSyncInfo(SceneObjectPart obj, XmlTextReader reader) public static void ProcessBucketSyncInfo(SceneObjectPart obj, XmlTextReader reader)
{ {
obj.BucketSyncInfoList = new Dictionary<string, BucketSyncInfo>(); obj.BucketSyncInfoList = new Dictionary<string, BucketSyncInfo>();
@ -1236,19 +1238,20 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
WriteBytes(writer, "ParticleSystem", sop.ParticleSystem); WriteBytes(writer, "ParticleSystem", sop.ParticleSystem);
//SYMMETRIC SYNC //SYMMETRIC SYNC
//writer.WriteElementString("LastUpdateTimeStamp", sop.LastUpdateTimeStamp.ToString()); writer.WriteElementString("LastUpdateTimeStamp", sop.LastUpdateTimeStamp.ToString());
//writer.WriteElementString("LastUpdateActorID", sop.LastUpdateActorID); writer.WriteElementString("LastUpdateActorID", sop.LastUpdateActorID);
WriteBucketSyncInfo(writer, sop.BucketSyncInfoList); //WriteBucketSyncInfo(writer, sop.BucketSyncInfoList);
//end of SYMMETRIC SYNC //end of SYMMETRIC SYNC
writer.WriteEndElement(); writer.WriteEndElement();
} }
//SYMMETRIC SYNC //SYMMETRIC SYNC
static void WriteBucketSyncInfo(XmlTextWriter writer, Dictionary<string, BucketSyncInfo> bucketSyncInfoList) public static void WriteBucketSyncInfo(XmlTextWriter writer, Dictionary<string, BucketSyncInfo> bucketSyncInfoList)
{ {
if (bucketSyncInfoList.Count > 0) // otherwise skip this if (bucketSyncInfoList!=null || bucketSyncInfoList.Count > 0) // otherwise skip this
{ {
writer.WriteStartElement("BucketSyncInfoList"); writer.WriteStartElement("BucketSyncInfoList");
foreach (KeyValuePair<string, BucketSyncInfo> pair in bucketSyncInfoList) foreach (KeyValuePair<string, BucketSyncInfo> pair in bucketSyncInfoList)
{ {
@ -1261,6 +1264,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
} }
writer.WriteEndElement(); // BucketSyncInfo writer.WriteEndElement(); // BucketSyncInfo
} }
} }