From 650b0bfe54efa2e94c6736ba0681988d48c63fbf Mon Sep 17 00:00:00 2001 From: "Huaiyu (Kitty) Liu" Date: Thu, 23 Dec 2010 11:33:12 -0800 Subject: [PATCH] 1. Restored SceneObjectSerializer.SOGToXml2() as in opensim trunk (master), so that objects are serialized properly. 2. Added code to pass ActorType from a particular ActorSyncModule to RegionSyncModule. --- .../SymmetricSync/RegionSyncModule.cs | 31 ++++++-- .../ScenePersistenceSyncModule.cs | 75 ++++++------------- OpenSim/Region/Framework/Scenes/Scene.cs | 20 ++++- .../Serialization/SceneObjectSerializer.cs | 9 +-- 4 files changed, 70 insertions(+), 65 deletions(-) diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index d4fc648788..9b44ee37f1 100755 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -53,17 +53,18 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_actorID = m_sysConfig.GetString("ActorID", ""); if (m_actorID == "") { - m_log.Error("ActorID not defined in [RegionSyncModule] section in config file"); + m_log.Error("ActorID not defined in [RegionSyncModule] section in config file. Shutting down."); return; } m_isSyncRelay = m_sysConfig.GetBoolean("IsSyncRelay", false); - m_isSyncListenerLocal = m_sysConfig.GetBoolean("IsSyncListenerLocal", false); m_active = true; m_log.Warn("[REGION SYNC MODULE] Initialised for actor "+ m_actorID); + + //The ActorType configuration will be read in and process by an ActorSyncModule, not here. } //Called after Initialise() @@ -127,10 +128,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule // Synchronization related members and functions, exposed through IRegionSyncModule interface /////////////////////////////////////////////////////////////////////////////////////////////////// - private DSGActorTypes m_actorType; + private DSGActorTypes m_actorType = DSGActorTypes.Unknown; + /// + /// The type of the actor running locally. This value will be set by an ActorSyncModule, so that + /// no hard code needed in RegionSyncModule to recoganize the actor's type, thus make it easier + /// to add new ActorSyncModules w/o chaning the code in RegionSyncModule. + /// public DSGActorTypes DSGActorType { get { return m_actorType; } + set { m_actorType = value; } } private string m_actorID; @@ -298,8 +305,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_remoteSyncListeners.Add(info); } + //Start SyncListener if a listener is supposed to run on this actor; Otherwise, initiate connections to remote listeners. private void SyncStart(Object[] args) { + if (m_actorType == DSGActorTypes.Unknown) + { + m_log.Error(LogHeader + ": SyncStart -- ActorType not set yet. Either it's not defined in config file (DSGActorType), or the ActorSyncModule (ScenePersistenceSyncModule, etc) didn't pass it on to RegionSyncModule"); + return; + } if (m_isSyncListenerLocal) { @@ -421,7 +434,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_log.WarnFormat("Sending region name: \"{0}\"", m_scene.RegionInfo.RegionName); SendSyncMessage(SymmetricSyncMessage.MsgType.GetTerrain); - //Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetObjects)); + SendSyncMessage(SymmetricSyncMessage.MsgType.GetObjects); //Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetAvatars)); //We'll deal with Event a bit later @@ -532,8 +545,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule private void HandleAddNewObject(SceneObjectGroup sog) { - if (m_scene.AddNewSceneObject(sog, true)){ + bool attachToBackup = false; + //only need to persist the scene if this is the ScenePersistence + if (m_actorType == DSGActorTypes.ScenePersistence) + { + attachToBackup = true; + } + if (m_scene.AddNewSceneObject(sog, attachToBackup)) + { + m_log.Debug(LogHeader + ": added obj " + sog.UUID); } } diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/ScenePersistenceSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/ScenePersistenceSyncModule.cs index a5eab9ef47..f91fb20fbc 100755 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/ScenePersistenceSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/ScenePersistenceSyncModule.cs @@ -38,7 +38,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } * */ - public class ScenePersistenceSyncModule : INonSharedRegionModule, IScenePersistenceSyncModule + public class ScenePersistenceSyncModule : INonSharedRegionModule, IDSGActorSyncModule { #region INonSharedRegionModule @@ -77,8 +77,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //connect with scene m_scene = scene; - //register the module - m_scene.RegisterModuleInterface(this); + //register the module with SceneGraph. If needed, SceneGraph checks the module's ActorType to know what type of module it is. + m_scene.RegisterModuleInterface(this); // Setup the command line interface //m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole; @@ -88,7 +88,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //Called after AddRegion() has been called for all region modules of the scene public void RegionLoaded(Scene scene) { - + if (m_scene.RegionSyncModule != null) + { + m_scene.RegionSyncModule.DSGActorType = m_actorType; + } + else + { + m_log.Warn("RegionSyncModule is not initiated!!"); + } } public void RemoveRegion(Scene scene) @@ -114,8 +121,17 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule #endregion //IRegionModule - #region RegionSyncModule members and functions + #region IDSGActorSyncModule members and functions + private DSGActorTypes m_actorType = DSGActorTypes.ScenePersistence; + public DSGActorTypes ActorType + { + get { return m_actorType; } + } + + #endregion //INonSharedRegionModule + + #region ScenePersistenceSyncModule memebers and functions private ILog m_log; private bool m_active = false; public bool Active @@ -124,56 +140,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } private Scene m_scene; - public Scene LocalScene - { - get { return m_scene; } - } - #endregion //INonSharedRegionModule members and functions + + #endregion //ScenePersistenceSyncModule } - /* - public class RegionSyncListener - { - // Start the listener - public void Start() - { - m_listenerThread = new Thread(new ThreadStart(Listen)); - m_listenerThread.Name = "RegionSyncServer Listener"; - m_log.WarnFormat("[REGION SYNC SERVER] Starting {0} thread", m_listenerThread.Name); - m_listenerThread.Start(); - //m_log.Warn("[REGION SYNC SERVER] Started"); - } - // Listen for connections from a new RegionSyncClient - // When connected, start the ReceiveLoop for the new client - private void Listen() - { - m_listener = new TcpListener(m_addr, m_port); - - try - { - // Start listening for clients - m_listener.Start(); - while (true) - { - // *** Move/Add TRY/CATCH to here, but we don't want to spin loop on the same error - m_log.WarnFormat("[REGION SYNC SERVER] Listening for new connections on {0}:{1}...", m_addr.ToString(), m_port.ToString()); - TcpClient tcpclient = m_listener.AcceptTcpClient(); - IPAddress addr = ((IPEndPoint)tcpclient.Client.RemoteEndPoint).Address; - int port = ((IPEndPoint)tcpclient.Client.RemoteEndPoint).Port; - - //pass the tcpclient information to RegionSyncModule, who will then create a SyncConnector - } - } - catch (SocketException e) - { - m_log.WarnFormat("[REGION SYNC SERVER] [Listen] SocketException: {0}", e); - } - } - - } - * */ - } \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index a7fdd4bb3d..bc5565a0d4 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -406,7 +406,10 @@ namespace OpenSim.Region.Framework.Scenes { get { return m_AvatarFactory; } } - #region REGION SYNC + + + #region REGION SYNC -- Asymmetric sync, old style, depreciated --------- + protected IRegionSyncServerModule m_regionSyncServerModule; protected IRegionSyncClientModule m_regionSyncClientModule; @@ -574,6 +577,21 @@ namespace OpenSim.Region.Framework.Scenes // } #endregion + + + #region SYMMETRIC SYNC + /////////////////////////////////////////////////////////////////////////////////////////////// + //KittyL: 12/23/2010. SYMMETRIC SYNC: Implementation for the symmetric synchronization model. + /////////////////////////////////////////////////////////////////////////////////////////////// + + private IRegionSyncModule m_regionSyncModule = null; + public IRegionSyncModule RegionSyncModule + { + get { return m_regionSyncModule; } + set { m_regionSyncModule = value; } + } + #endregion //SYMMETRIC SYNC + public ICapabilitiesModule CapsModule { get { return m_capsModule; } diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 125581e109..1b06550aa1 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -1057,15 +1057,10 @@ namespace OpenSim.Region.Framework.Scenes.Serialization ////////// Write ///////// - public static void SOGToXml2(XmlTextWriter writer, SceneObjectGroup sog, Dictionaryoptions) + public static void SOGToXml2(XmlTextWriter writer, SceneObjectGroup sog, Dictionary options) { writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty); - - //REGION SYNG - //Need to add LocX,LocY of the Scene that the object is located in. - //writer.WriteStartElement(String.Empty, "LocX", String.Empty); - //end of REGION SYGN - + SOPToXml2(writer, sog.RootPart, options); writer.WriteStartElement(String.Empty, "OtherParts", String.Empty); sog.ForEachPart(delegate(SceneObjectPart sop)