Added SymSync in config file. If SymSync = true, then code in the old sync module (asym sync) that handle object updates
are disabled. Then we effectively have new ways (RegionSyncModule) of handle object updates, and old ways of handling avatar updates working together.dsg
parent
f5df61162f
commit
d84e69fefe
|
@ -47,6 +47,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
Dictionary<UUID, RegionSyncAvatar> m_remoteAvatars = new Dictionary<UUID, RegionSyncAvatar>();
|
||||
Dictionary<UUID, IClientAPI> m_localAvatars = new Dictionary<UUID, IClientAPI>();
|
||||
|
||||
private bool m_symSync = false;
|
||||
|
||||
private Dictionary<UUID, RegionSyncAvatar> RemoteAvatars
|
||||
{
|
||||
get { return m_remoteAvatars; }
|
||||
|
@ -276,6 +278,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
Send(new RegionSyncMessage(RegionSyncMessage.MsgType.AvatarAppearance, OSDParser.SerializeJsonString(data)));
|
||||
}
|
||||
|
||||
public void SetSymSync(bool symSync)
|
||||
{
|
||||
m_symSync = symSync;
|
||||
}
|
||||
|
||||
// Handle an incoming message
|
||||
// TODO: This should not be synchronous with the receive!
|
||||
// Instead, handle messages from an incoming Queue so server doesn't block sending
|
||||
|
@ -289,15 +296,20 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
RegionSyncMessage.HandleSuccess(LogHeader(), msg, String.Format("Syncing to region \"{0}\"", m_regionName));
|
||||
return;
|
||||
}
|
||||
//SYMMETRIC SYNC: do not handle terrian and object updates
|
||||
case RegionSyncMessage.MsgType.Terrain:
|
||||
{
|
||||
if(!m_symSync)
|
||||
{
|
||||
m_scene.Heightmap.LoadFromXmlString(Encoding.ASCII.GetString(msg.Data, 0, msg.Length));
|
||||
RegionSyncMessage.HandleSuccess(LogHeader(), msg, "Synchronized terrain");
|
||||
}
|
||||
return;
|
||||
}
|
||||
case RegionSyncMessage.MsgType.NewObject:
|
||||
case RegionSyncMessage.MsgType.UpdatedObject:
|
||||
{
|
||||
if(!m_symSync){
|
||||
SceneObjectGroup sog = SceneObjectSerializer.FromXml2Format(Encoding.ASCII.GetString(msg.Data, 0, msg.Length));
|
||||
if (sog.IsDeleted)
|
||||
{
|
||||
|
@ -305,22 +317,17 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
m_log.DebugFormat("{0} NewObject '{1}'", LogHeader(), sog.Name);
|
||||
sog.ForEachPart(delegate(SceneObjectPart part)
|
||||
{
|
||||
m_log.DebugFormat("{0} Part {1}, lf={2} f={3}", LogHeader(), part.Name,
|
||||
part.LocalFlags.ToString(), part.Flags.ToString());
|
||||
});
|
||||
*/
|
||||
if (m_scene.AddNewSceneObject(sog, true));
|
||||
//RegionSyncMessage.HandleSuccess(LogHeader(), msg, String.Format("Object \"{0}\" ({1}) ({1}) updated.", sog.Name, sog.UUID.ToString(), sog.LocalId.ToString()));
|
||||
//else
|
||||
//RegionSyncMessage.HandleSuccess(LogHeader(), msg, String.Format("Object \"{0}\" ({1}) ({1}) added.", sog.Name, sog.UUID.ToString(), sog.LocalId.ToString()));
|
||||
sog.ScheduleGroupForFullUpdate();
|
||||
}
|
||||
return;
|
||||
}
|
||||
case RegionSyncMessage.MsgType.RemovedObject:
|
||||
{
|
||||
if(!m_symSync)
|
||||
{
|
||||
// Get the data from message and error check
|
||||
OSDMap data = DeserializeMessage(msg);
|
||||
|
@ -345,8 +352,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
// Delete the object from the scene
|
||||
m_scene.DeleteSceneObject(sog, false);
|
||||
RegionSyncMessage.HandleSuccess(LogHeader(), msg, String.Format("localID {0} deleted.", localID.ToString()));
|
||||
}
|
||||
return;
|
||||
}
|
||||
//end of SYMMETRIC SYNC
|
||||
case RegionSyncMessage.MsgType.NewAvatar:
|
||||
{
|
||||
// Get the data from message and error check
|
||||
|
@ -815,8 +824,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
|
||||
Send(new RegionSyncMessage(RegionSyncMessage.MsgType.RegionName, m_scene.RegionInfo.RegionName));
|
||||
m_log.WarnFormat("Sending region name: \"{0}\"", m_scene.RegionInfo.RegionName);
|
||||
//SYMMETRIC SYNC: commenting out terrian and object updates
|
||||
if (!m_symSync)
|
||||
{
|
||||
Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetTerrain));
|
||||
Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetObjects));
|
||||
}
|
||||
//end of SYMMETRIC SYNC
|
||||
Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetAvatars));
|
||||
|
||||
// Register for events which will be forwarded to authoritative scene
|
||||
|
|
|
@ -75,6 +75,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
m_serverport = syncConfig.GetInt(scene.RegionInfo.RegionName+"_ServerPort", serverPortDefault);
|
||||
m_scene.RegisterModuleInterface<IRegionSyncClientModule>(this);
|
||||
|
||||
m_symsync = syncConfig.GetBoolean("SymSync", false);
|
||||
|
||||
// Setup the command line interface
|
||||
m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole;
|
||||
InstallInterfaces();
|
||||
|
@ -156,6 +158,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
private Object m_client_lock = new Object();
|
||||
private RegionSyncClient m_client = null;
|
||||
|
||||
private bool m_symsync = false;
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -239,6 +242,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
m_log.Warn("[REGION SYNC CLIENT MODULE] Starting RegionSyncClient");
|
||||
|
||||
m_client = new RegionSyncClient(m_scene, m_serveraddr, m_serverport);
|
||||
m_client.SetSymSync(m_symsync);
|
||||
m_client.Start();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -302,13 +302,19 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
RegionSyncMessage.HandleSuccess(LogHeader, msg, String.Format("Syncing to region \"{0}\"", m_regionName));
|
||||
return;
|
||||
}
|
||||
//SYMMETRIC SYNC: do not handle terrian and object updates
|
||||
case RegionSyncMessage.MsgType.GetTerrain:
|
||||
{
|
||||
if (!m_scene.RegionSyncServerModule.IsSymSync)
|
||||
{
|
||||
Send(new RegionSyncMessage(RegionSyncMessage.MsgType.Terrain, m_scene.Heightmap.SaveToXmlString()));
|
||||
RegionSyncMessage.HandleSuccess(LogHeader, msg, "Terrain sent");
|
||||
}
|
||||
return;
|
||||
}
|
||||
case RegionSyncMessage.MsgType.GetObjects:
|
||||
{
|
||||
if (!m_scene.RegionSyncServerModule.IsSymSync)
|
||||
{
|
||||
EntityBase[] entities = m_scene.GetEntities();
|
||||
foreach (EntityBase e in entities)
|
||||
|
@ -320,8 +326,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
}
|
||||
}
|
||||
RegionSyncMessage.HandleSuccess(LogHeader, msg, "Sent all scene objects");
|
||||
}
|
||||
return;
|
||||
}
|
||||
//end of SYMMETRIC SYNC
|
||||
case RegionSyncMessage.MsgType.GetAvatars:
|
||||
{
|
||||
m_scene.ForEachScenePresence(delegate(ScenePresence presence)
|
||||
|
|
|
@ -48,6 +48,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
public class RegionSyncServerModule : IRegionModule, IRegionSyncServerModule, ICommandableModule
|
||||
{
|
||||
private static int DefaultPort = 13000;
|
||||
private static int PortUnknown = -1;
|
||||
private static string IPAddrUnknown = "";
|
||||
|
||||
#region IRegionModule Members
|
||||
public void Initialise(Scene scene, IConfigSource config)
|
||||
|
@ -96,20 +98,22 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
|
||||
//Get sync server info for Client Manager actors
|
||||
string serverAddr = scene.RegionInfo.RegionName + "_ServerIPAddress";
|
||||
m_serveraddr = syncConfig.GetString(serverAddr, "127.0.0.1");
|
||||
m_serveraddr = syncConfig.GetString(serverAddr, IPAddrUnknown);
|
||||
string serverPort = scene.RegionInfo.RegionName + "_ServerPort";
|
||||
m_serverport = syncConfig.GetInt(serverPort, DefaultPort);
|
||||
m_serverport = syncConfig.GetInt(serverPort, PortUnknown);
|
||||
// Client manager load balancing
|
||||
m_maxClientsPerManager = syncConfig.GetInt("MaxClientsPerManager", 100);
|
||||
DefaultPort++;
|
||||
|
||||
//Get sync server info for Script Engine actors
|
||||
string seServerAddr = scene.RegionInfo.RegionName + "_SceneToSESyncServerIP";
|
||||
m_seSyncServeraddr = syncConfig.GetString(seServerAddr, "127.0.0.1");
|
||||
m_seSyncServeraddr = syncConfig.GetString(seServerAddr, IPAddrUnknown);
|
||||
string seServerPort = scene.RegionInfo.RegionName + "_SceneToSESyncServerPort";
|
||||
m_seSyncServerport = syncConfig.GetInt(seServerPort, DefaultPort);
|
||||
m_seSyncServerport = syncConfig.GetInt(seServerPort, PortUnknown);
|
||||
DefaultPort++;
|
||||
|
||||
m_symsync = syncConfig.GetBoolean("SymSync", false);
|
||||
|
||||
//Get quark information
|
||||
QuarkInfo.SizeX = syncConfig.GetInt("QuarkSizeX", (int)Constants.RegionSize);
|
||||
QuarkInfo.SizeY = syncConfig.GetInt("QuarkSizeY", (int)Constants.RegionSize);
|
||||
|
@ -138,23 +142,34 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
m_scene.EventManager.OnNewClient += new EventManager.OnNewClientDelegate(EventManager_OnNewClient);
|
||||
//m_scene.EventManager.OnNewPresence += new EventManager.OnNewPresenceDelegate(EventManager_OnNewPresence);
|
||||
m_scene.EventManager.OnRemovePresence += new EventManager.OnRemovePresenceDelegate(EventManager_OnRemovePresence);
|
||||
|
||||
//SYMMETRIC SYNC: do not handle object updates
|
||||
if (!m_symsync)
|
||||
{
|
||||
m_scene.SceneGraph.OnObjectCreate += new ObjectCreateDelegate(SceneGraph_OnObjectCreate);
|
||||
m_scene.SceneGraph.OnObjectDuplicate += new ObjectDuplicateDelegate(SceneGraph_OnObjectDuplicate);
|
||||
//m_scene.SceneGraph.OnObjectRemove += new ObjectDeleteDelegate(SceneGraph_OnObjectRemove);
|
||||
//m_scene.StatsReporter.OnSendStatsResult += new SimStatsReporter.SendStatResult(StatsReporter_OnSendStatsResult);
|
||||
m_scene.EventManager.OnOarFileLoaded += new EventManager.OarFileLoaded(EventManager_OnOarFileLoaded);
|
||||
|
||||
m_log.Warn("[REGION SYNC SERVER MODULE] Starting RegionSyncServer");
|
||||
}
|
||||
//end of SYMMETRIC SYNC
|
||||
// Start the server and listen for RegionSyncClients
|
||||
if (!m_serveraddr.Equals(IPAddrUnknown) && m_serverport != PortUnknown)
|
||||
{
|
||||
m_log.Warn("[REGION SYNC SERVER MODULE] Starting RegionSyncServer");
|
||||
m_server = new RegionSyncServer(m_scene, m_serveraddr, m_serverport, m_maxClientsPerManager);
|
||||
m_server.Start();
|
||||
m_statsTimer.Elapsed += new System.Timers.ElapsedEventHandler(StatsTimerElapsed);
|
||||
m_statsTimer.Start();
|
||||
}
|
||||
|
||||
if (!m_seSyncServeraddr.Equals(IPAddrUnknown) && m_seSyncServerport != PortUnknown)
|
||||
{
|
||||
m_log.Warn("[REGION SYNC SERVER MODULE] Starting SceneToScriptEngineSyncServer");
|
||||
//Start the sync server for script engines
|
||||
m_sceneToSESyncServer = new SceneToScriptEngineSyncServer(m_scene, m_seSyncServeraddr, m_seSyncServerport);
|
||||
m_sceneToSESyncServer.Start();
|
||||
}
|
||||
//m_log.Warn("[REGION SYNC SERVER MODULE] Post-Initialised");
|
||||
}
|
||||
|
||||
|
@ -259,25 +274,23 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
{
|
||||
// Sending the message when it's first queued would yield lower latency but much higher load on the simulator
|
||||
// as parts may be updated many many times very quickly. Need to implement a higher resolution send in heartbeat
|
||||
|
||||
//SYMMETRIC SYNC: do not handle object updates
|
||||
if (!m_symsync)
|
||||
{
|
||||
foreach (SceneObjectGroup sog in primUpdates)
|
||||
{
|
||||
if (!sog.IsDeleted)
|
||||
{
|
||||
/*
|
||||
string sogxml = SceneObjectSerializer.ToXml2Format(sog);
|
||||
|
||||
m_log.Debug("[REGION SYNC SERVER MODULE]: to update object " + sog.UUID + ", localID: "+sog.LocalId
|
||||
+ ", with color " + sog.RootPart.Shape.Textures.DefaultTexture.RGBA.A
|
||||
+ "," + sog.RootPart.Shape.Textures.DefaultTexture.RGBA.B + "," + sog.RootPart.Shape.Textures.DefaultTexture.RGBA.G
|
||||
+ "," + sog.RootPart.Shape.Textures.DefaultTexture.RGBA.R);
|
||||
|
||||
m_server.Broadcast(new RegionSyncMessage(RegionSyncMessage.MsgType.UpdatedObject, sogxml));
|
||||
* */
|
||||
//KittyL: modified to broadcast to different types of actors
|
||||
if (m_server != null)
|
||||
m_server.BroadcastToCM(RegionSyncMessage.MsgType.UpdatedObject, sog);
|
||||
if (m_sceneToSESyncServer != null)
|
||||
m_sceneToSESyncServer.SendToSE(RegionSyncMessage.MsgType.UpdatedObject, sog);
|
||||
}
|
||||
}
|
||||
}
|
||||
//end of SYMMETRIC SYNC
|
||||
foreach (ScenePresence presence in presenceUpdates)
|
||||
{
|
||||
try
|
||||
|
@ -363,6 +376,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
data["localID"] = OSD.FromUInteger(localID);
|
||||
RegionSyncMessage rsm = new RegionSyncMessage(RegionSyncMessage.MsgType.RemovedObject, OSDParser.SerializeJsonString(data));
|
||||
//m_server.BroadcastToCM(rsm);
|
||||
if(m_server!=null)
|
||||
m_server.Broadcast(rsm);
|
||||
|
||||
//KittyL: Second, tell script engine to remove the object, identified by UUID
|
||||
|
@ -378,6 +392,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
//when an object is deleted, this function (DeleteObject) could be triggered more than once. So we check
|
||||
//if the object part is already removed is the scene (part==null)
|
||||
m_log.Debug("Inform script engine about the deleted object");
|
||||
if(m_sceneToSESyncServer!=null)
|
||||
m_sceneToSESyncServer.SendToSE(rsm, part.ParentGroup);
|
||||
}
|
||||
|
||||
|
@ -403,8 +418,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
public void SendLoadWorldMap(ITerrainChannel heightMap)
|
||||
{
|
||||
RegionSyncMessage msg = new RegionSyncMessage(RegionSyncMessage.MsgType.Terrain, m_scene.Heightmap.SaveToXmlString());
|
||||
if(m_server!=null)
|
||||
m_server.Broadcast(msg);
|
||||
//KittyL: added for SE
|
||||
if(m_sceneToSESyncServer!=null)
|
||||
m_sceneToSESyncServer.SendToAllConnectedSE(msg);
|
||||
}
|
||||
|
||||
|
@ -469,6 +486,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
private int m_seSyncServerport;
|
||||
private SceneToScriptEngineSyncServer m_sceneToSESyncServer = null;
|
||||
|
||||
//a boolean variable to indicate in symmetric sync is configured
|
||||
private bool m_symsync = false;
|
||||
|
||||
public bool IsSymSync
|
||||
{
|
||||
get { return IsSymSync; }
|
||||
}
|
||||
//quark related information
|
||||
//private int QuarkInfo.SizeX;
|
||||
//private int QuarkInfo.SizeY;
|
||||
|
|
|
@ -302,7 +302,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
#endregion //IRegionSyncModule
|
||||
|
||||
#region ICommandableModule Members
|
||||
private readonly Commander m_commander = new Commander("sync");
|
||||
private readonly Commander m_commander = new Commander("ssync");
|
||||
public ICommander CommandInterface
|
||||
{
|
||||
get { return m_commander; }
|
||||
|
@ -340,7 +340,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
/// <param name="args">Commandline arguments</param>
|
||||
private void EventManager_OnPluginConsole(string[] args)
|
||||
{
|
||||
if (args[0] == "sync")
|
||||
if (args[0] == "ssync")
|
||||
{
|
||||
if (args.Length == 1)
|
||||
{
|
||||
|
@ -366,6 +366,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
// Synchronization related functions, NOT exposed through IRegionSyncModule interface
|
||||
/////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
private static int PortUnknown = -1;
|
||||
private static string IPAddrUnknown = "";
|
||||
|
||||
private ILog m_log;
|
||||
//private bool m_active = true;
|
||||
|
||||
|
@ -482,8 +485,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
private void StartLocalSyncListener()
|
||||
{
|
||||
RegionSyncListenerInfo localSyncListenerInfo = GetLocalSyncListenerInfo();
|
||||
|
||||
if (localSyncListenerInfo!=null)
|
||||
{
|
||||
m_log.Warn(LogHeader + " Starting SyncListener");
|
||||
m_localSyncListener = new RegionSyncListener(localSyncListenerInfo, this);
|
||||
m_localSyncListener.Start();
|
||||
}
|
||||
|
||||
//STATS TIMER: TO BE IMPLEMENTED
|
||||
//m_statsTimer.Elapsed += new System.Timers.ElapsedEventHandler(StatsTimerElapsed);
|
||||
|
@ -494,13 +502,20 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
//For now, we use configuration to access the information. Might be replaced by some Grid Service later on.
|
||||
private RegionSyncListenerInfo GetLocalSyncListenerInfo()
|
||||
{
|
||||
string addr = m_sysConfig.GetString("SyncListenerIPAddress", "127.0.0.1");
|
||||
int port = m_sysConfig.GetInt("SyncListenerPort", 13000);
|
||||
RegionSyncListenerInfo info = new RegionSyncListenerInfo(addr, port);
|
||||
string addr = m_sysConfig.GetString("SyncListenerIPAddress", IPAddrUnknown);
|
||||
int port = m_sysConfig.GetInt("SyncListenerPort", PortUnknown);
|
||||
|
||||
m_log.Warn(LogHeader + ", listener addr: " + addr + ", port: " + port);
|
||||
|
||||
if (!addr.Equals(IPAddrUnknown) && port != PortUnknown)
|
||||
{
|
||||
RegionSyncListenerInfo info = new RegionSyncListenerInfo(addr, port);
|
||||
return info;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
//Get the information for remote [IP:Port] to connect to for synchronization purpose.
|
||||
//For example, an actor may need to connect to several ScenePersistence's if the objects it operates are hosted collectively
|
||||
//by these ScenePersistence.
|
||||
|
@ -510,14 +525,15 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
{
|
||||
//For now, we assume there is only one remote listener to connect to. Later on,
|
||||
//we may need to modify the code to read in multiple listeners.
|
||||
string addr = m_sysConfig.GetString("SyncListenerIPAddress", "127.0.0.1");
|
||||
int port = m_sysConfig.GetInt("SyncListenerPort", 13000);
|
||||
string addr = m_sysConfig.GetString("SyncListenerIPAddress", IPAddrUnknown);
|
||||
int port = m_sysConfig.GetInt("SyncListenerPort", PortUnknown);
|
||||
if (!addr.Equals(IPAddrUnknown) && port != PortUnknown)
|
||||
{
|
||||
RegionSyncListenerInfo info = new RegionSyncListenerInfo(addr, port);
|
||||
|
||||
m_remoteSyncListeners = new HashSet<RegionSyncListenerInfo>();
|
||||
|
||||
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)
|
||||
|
|
|
@ -38,6 +38,9 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
|
||||
bool Active { get; }
|
||||
bool Synced { get; }
|
||||
|
||||
bool IsSymSync { get; } //If SymSync is set to true in the config file, then Symmetric Sync is running and object updates should be handled through RegionSyncModule
|
||||
|
||||
void QueuePartForUpdate(SceneObjectPart part);
|
||||
void QueuePresenceForTerseUpdate(ScenePresence presence);
|
||||
void SendUpdates();
|
||||
|
|
Loading…
Reference in New Issue