Merge branch 'master' into httptests

httptests
UbitUmarov 2017-06-07 20:12:49 +01:00
commit 7bea4f1578
2 changed files with 18 additions and 263 deletions

View File

@ -257,36 +257,6 @@ namespace OpenSim.Region.Framework.Scenes
public bool m_useFlySlow; public bool m_useFlySlow;
public bool m_useTrashOnDelete = true; public bool m_useTrashOnDelete = true;
/// <summary>
/// Temporarily setting to trigger appearance resends at 60 second intervals.
/// </summary>
public bool SendPeriodicAppearanceUpdates { get; set; }
/// <summary>
/// How much a root agent has to change position before updates are sent to viewers.
/// </summary>
public float RootPositionUpdateTolerance { get; set; }
/// <summary>
/// How much a root agent has to rotate before updates are sent to viewers.
/// </summary>
public float RootRotationUpdateTolerance { get; set; }
/// <summary>
/// How much a root agent has to change velocity before updates are sent to viewers.
/// </summary>
public float RootVelocityUpdateTolerance { get; set; }
/// <summary>
/// If greater than 1, we only send terse updates to other root agents on every n updates.
/// </summary>
public int RootTerseUpdatePeriod { get; set; }
/// <summary>
/// If greater than 1, we only send terse updates to child agents on every n updates.
/// </summary>
public int ChildTerseUpdatePeriod { get; set; }
protected float m_defaultDrawDistance = 255f; protected float m_defaultDrawDistance = 255f;
protected float m_defaultCullingDrawDistance = 16f; protected float m_defaultCullingDrawDistance = 16f;
public float DefaultDrawDistance public float DefaultDrawDistance
@ -375,11 +345,6 @@ namespace OpenSim.Region.Framework.Scenes
protected set; protected set;
} }
/// <summary>
/// Current maintenance run number
/// </summary>
public uint MaintenanceRun { get; private set; }
/// <summary> /// <summary>
/// Frame time /// Frame time
/// </remarks> /// </remarks>
@ -391,14 +356,6 @@ namespace OpenSim.Region.Framework.Scenes
// see SimStatsReporter.cs // see SimStatsReporter.cs
public bool Normalized55FPS { get; private set; } public bool Normalized55FPS { get; private set; }
/// <summary>
/// The minimum length of time in seconds that will be taken for a scene frame.
/// </summary>
/// <remarks>
/// Always derived from MinFrameTicks.
/// </remarks>
public float MinMaintenanceTime { get; private set; }
private int m_update_physics = 1; private int m_update_physics = 1;
private int m_update_entitymovement = 1; private int m_update_entitymovement = 1;
private int m_update_objects = 1; private int m_update_objects = 1;
@ -407,9 +364,8 @@ namespace OpenSim.Region.Framework.Scenes
private int m_update_backup = 200; private int m_update_backup = 200;
private int m_update_terrain = 1000; private int m_update_terrain = 1000;
private int m_update_land = 10;
private int m_update_coarse_locations = 50; private int m_update_coarse_locations = 5;
private int m_update_temp_cleaning = 180; private int m_update_temp_cleaning = 180;
private float agentMS; private float agentMS;
@ -428,11 +384,6 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
private int m_lastFrameTick; private int m_lastFrameTick;
/// <summary>
/// Tick at which the last maintenance run occurred.
/// </summary>
private int m_lastMaintenanceTick;
/// <summary> /// <summary>
/// Total script execution time (in Stopwatch Ticks) since the last frame /// Total script execution time (in Stopwatch Ticks) since the last frame
/// </summary> /// </summary>
@ -449,11 +400,6 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
private ManualResetEvent m_updateWaitEvent = new ManualResetEvent(false); private ManualResetEvent m_updateWaitEvent = new ManualResetEvent(false);
/// <summary>
/// Used to control maintenance thread runs.
/// </summary>
private ManualResetEvent m_maintenanceWaitEvent = new ManualResetEvent(false);
// TODO: Possibly stop other classes being able to manipulate this directly. // TODO: Possibly stop other classes being able to manipulate this directly.
private SceneGraph m_sceneGraph; private SceneGraph m_sceneGraph;
private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing
@ -497,7 +443,7 @@ namespace OpenSim.Region.Framework.Scenes
/// Is the scene active? /// Is the scene active?
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// If false, maintenance and update loops are not being run, though after setting to false update may still /// If false, update loop is not being run, though after setting to false update may still
/// be active for a period (and IsRunning will still be true). Updates can still be triggered manually if /// be active for a period (and IsRunning will still be true). Updates can still be triggered manually if
/// the scene is not active. /// the scene is not active.
/// </remarks> /// </remarks>
@ -527,7 +473,6 @@ namespace OpenSim.Region.Framework.Scenes
public bool IsRunning { get { return m_isRunning; } } public bool IsRunning { get { return m_isRunning; } }
private volatile bool m_isRunning; private volatile bool m_isRunning;
// private int m_lastUpdate;
private bool m_firstHeartbeat = true; private bool m_firstHeartbeat = true;
// private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; // private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time;
@ -883,7 +828,6 @@ namespace OpenSim.Region.Framework.Scenes
FrameTimeWarnPercent = 60; FrameTimeWarnPercent = 60;
FrameTimeCritPercent = 40; FrameTimeCritPercent = 40;
Normalized55FPS = true; Normalized55FPS = true;
MinMaintenanceTime = 1;
SeeIntoRegion = true; SeeIntoRegion = true;
Random random = new Random(); Random random = new Random();
@ -1147,17 +1091,6 @@ namespace OpenSim.Region.Framework.Scenes
} }
// FIXME: Ultimately this should be in a module.
SendPeriodicAppearanceUpdates = false;
IConfig appearanceConfig = m_config.Configs["Appearance"];
if (appearanceConfig != null)
{
SendPeriodicAppearanceUpdates
= appearanceConfig.GetBoolean("ResendAppearanceUpdates", SendPeriodicAppearanceUpdates);
}
#endregion Region Config #endregion Region Config
IConfig entityTransferConfig = m_config.Configs["EntityTransfer"]; IConfig entityTransferConfig = m_config.Configs["EntityTransfer"];
@ -1197,16 +1130,6 @@ namespace OpenSim.Region.Framework.Scenes
ObjectsCullingByDistance ObjectsCullingByDistance
= interestConfig.GetBoolean("ObjectsCullingByDistance", ObjectsCullingByDistance); = interestConfig.GetBoolean("ObjectsCullingByDistance", ObjectsCullingByDistance);
RootTerseUpdatePeriod = interestConfig.GetInt("RootTerseUpdatePeriod", RootTerseUpdatePeriod);
ChildTerseUpdatePeriod = interestConfig.GetInt("ChildTerseUpdatePeriod", ChildTerseUpdatePeriod);
RootPositionUpdateTolerance
= interestConfig.GetFloat("RootPositionUpdateTolerance", RootPositionUpdateTolerance);
RootRotationUpdateTolerance
= interestConfig.GetFloat("RootRotationUpdateTolerance", RootRotationUpdateTolerance);
RootVelocityUpdateTolerance
= interestConfig.GetFloat("RootVelocityUpdateTolerance", RootVelocityUpdateTolerance);
} }
m_log.DebugFormat("[SCENE]: Using the {0} prioritization scheme", UpdatePrioritizationScheme); m_log.DebugFormat("[SCENE]: Using the {0} prioritization scheme", UpdatePrioritizationScheme);
@ -1275,9 +1198,6 @@ namespace OpenSim.Region.Framework.Scenes
UpdatePrioritizationScheme = UpdatePrioritizationSchemes.Time; UpdatePrioritizationScheme = UpdatePrioritizationSchemes.Time;
ReprioritizationInterval = 5000; ReprioritizationInterval = 5000;
RootRotationUpdateTolerance = 0.1f;
RootVelocityUpdateTolerance = 0.001f;
RootPositionUpdateTolerance = 0.05f;
ReprioritizationDistance = m_minReprioritizationDistance; ReprioritizationDistance = m_minReprioritizationDistance;
m_eventManager = new EventManager(); m_eventManager = new EventManager();
@ -1668,100 +1588,12 @@ namespace OpenSim.Region.Framework.Scenes
// alarms for scenes with many objects. // alarms for scenes with many objects.
Update(1); Update(1);
WorkManager.StartThread(
Maintenance, string.Format("Maintenance ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, true);
Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true; Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true;
m_lastFrameTick = Util.EnvironmentTickCount(); m_lastFrameTick = Util.EnvironmentTickCount();
Update(-1); Update(-1);
Watchdog.RemoveThread(); Watchdog.RemoveThread();
} }
private void Maintenance()
{
DoMaintenance(-1);
Watchdog.RemoveThread();
}
public void DoMaintenance(int runs)
{
long? endRun = null;
int runtc, tmpMS;
int previousMaintenanceTick;
if (runs >= 0)
endRun = MaintenanceRun + runs;
List<Vector3> coarseLocations;
List<UUID> avatarUUIDs;
while (!m_shuttingDown && ((endRun == null && Active) || MaintenanceRun < endRun))
{
runtc = Util.EnvironmentTickCount();
++MaintenanceRun;
// m_log.DebugFormat("[SCENE]: Maintenance run {0} in {1}", MaintenanceRun, Name);
// Coarse locations relate to positions of green dots on the mini-map (on a SecondLife client)
if (MaintenanceRun % (m_update_coarse_locations / 10) == 0)
{
SceneGraph.GetCoarseLocations(out coarseLocations, out avatarUUIDs, 60);
// Send coarse locations to clients
ForEachScenePresence(delegate(ScenePresence presence)
{
presence.SendCoarseLocations(coarseLocations, avatarUUIDs);
});
}
if (SendPeriodicAppearanceUpdates && MaintenanceRun % 60 == 0)
{
// m_log.DebugFormat("[SCENE]: Sending periodic appearance updates");
if (AvatarFactory != null)
{
ForEachRootScenePresence(sp => AvatarFactory.SendAppearance(sp.UUID));
}
}
// Delete temp-on-rez stuff
if (MaintenanceRun % m_update_temp_cleaning == 0 && !m_cleaningTemps)
{
// m_log.DebugFormat("[SCENE]: Running temp-on-rez cleaning in {0}", Name);
tmpMS = Util.EnvironmentTickCount();
m_cleaningTemps = true;
WorkManager.RunInThread(
delegate { CleanTempObjects(); m_cleaningTemps = false; },
null,
string.Format("CleanTempObjects ({0})", Name));
tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpMS);
}
Watchdog.UpdateThread();
previousMaintenanceTick = m_lastMaintenanceTick;
m_lastMaintenanceTick = Util.EnvironmentTickCount();
runtc = Util.EnvironmentTickCountSubtract(m_lastMaintenanceTick, runtc);
runtc = (int)(MinMaintenanceTime * 1000) - runtc;
if (runtc > 0)
m_maintenanceWaitEvent.WaitOne(runtc);
// Optionally warn if a frame takes double the amount of time that it should.
if (DebugUpdates
&& Util.EnvironmentTickCountSubtract(
m_lastMaintenanceTick, previousMaintenanceTick) > (int)(MinMaintenanceTime * 1000 * 2))
m_log.WarnFormat(
"[SCENE]: Maintenance took {0} ms (desired max {1} ms) in {2}",
Util.EnvironmentTickCountSubtract(m_lastMaintenanceTick, previousMaintenanceTick),
MinMaintenanceTime * 1000,
RegionInfo.RegionName);
}
}
public override void Update(int frames) public override void Update(int frames)
{ {
long? endFrame = null; long? endFrame = null;
@ -1822,6 +1654,18 @@ namespace OpenSim.Region.Framework.Scenes
if (Frame % m_update_entitymovement == 0) if (Frame % m_update_entitymovement == 0)
m_sceneGraph.UpdateScenePresenceMovement(); m_sceneGraph.UpdateScenePresenceMovement();
if (Frame % (m_update_coarse_locations) == 0)
{
List<Vector3> coarseLocations;
List<UUID> avatarUUIDs;
SceneGraph.GetCoarseLocations(out coarseLocations, out avatarUUIDs, 60);
// Send coarse locations to clients
ForEachScenePresence(delegate(ScenePresence presence)
{
presence.SendCoarseLocations(coarseLocations, avatarUUIDs);
});
}
// Get the simulation frame time that the avatar force input // Get the simulation frame time that the avatar force input
// took // took
tmpMS2 = Util.GetTimeStampMS(); tmpMS2 = Util.GetTimeStampMS();
@ -1864,7 +1708,8 @@ namespace OpenSim.Region.Framework.Scenes
if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps) if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps)
{ {
m_cleaningTemps = true; m_cleaningTemps = true;
Util.FireAndForget(delegate { CleanTempObjects(); m_cleaningTemps = false; }); WorkManager.RunInThread(
delegate { CleanTempObjects(); m_cleaningTemps = false; }, null, string.Format("CleanTempObjects ({0})", Name));
tmpMS2 = Util.GetTimeStampMS(); tmpMS2 = Util.GetTimeStampMS();
tempOnRezMS = (float)(tmpMS2 - tmpMS); // bad.. counts the FireAndForget, not CleanTempObjects tempOnRezMS = (float)(tmpMS2 - tmpMS); // bad.. counts the FireAndForget, not CleanTempObjects
tmpMS = tmpMS2; tmpMS = tmpMS2;
@ -2091,7 +1936,7 @@ namespace OpenSim.Region.Framework.Scenes
if (!m_backingup) if (!m_backingup)
{ {
m_backingup = true; m_backingup = true;
WorkManager.RunInThread(o => Backup(false), null, string.Format("BackupWaitCallback ({0})", Name)); WorkManager.RunInThread(o => Backup(false), null, string.Format("BackupWorker ({0})", Name));
} }
} }

View File

@ -96,18 +96,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
"List current scene options.", "List current scene options.",
"active - if false then main scene update and maintenance loops are suspended.\n" "active - if false then main scene update and maintenance loops are suspended.\n"
+ "animations - if true then extra animations debug information is logged.\n" + "animations - if true then extra animations debug information is logged.\n"
+ "appear-refresh - if true then appearance is resent to other avatars every 60 seconds.\n"
+ "client-pos-upd - the tolerance before clients are updated with new rotation information for an avatar.\n"
+ "client-rot-upd - the tolerance before clients are updated with new rotation information for an avatar.\n"
+ "client-vel-upd - the tolerance before clients are updated with new velocity information for an avatar.\n"
+ "root-upd-per - if greater than 1, terse updates are only sent to root agents other than the originator on every n updates.\n"
+ "child-upd-per - if greater than 1, terse updates are only sent to child agents on every n updates.\n"
+ "collisions - if false then collisions with other objects are turned off.\n" + "collisions - if false then collisions with other objects are turned off.\n"
+ "pbackup - if false then periodic scene backup is turned off.\n" + "pbackup - if false then periodic scene backup is turned off.\n"
+ "physics - if false then all physics objects are non-physical.\n" + "physics - if false then all physics objects are non-physical.\n"
+ "scripting - if false then no scripting operations happen.\n" + "scripting - if false then no scripting operations happen.\n"
+ "teleport - if true then some extra teleport debug information is logged.\n" + "teleport - if true then some extra teleport debug information is logged.\n"
+ "update-on-timer - If true then the scene is updated via a timer. If false then a thread with sleep is used.\n"
+ "updates - if true then any frame which exceeds double the maximum desired frame time is logged.", + "updates - if true then any frame which exceeds double the maximum desired frame time is logged.",
HandleDebugSceneGetCommand); HandleDebugSceneGetCommand);
@ -117,18 +110,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
"Turn on scene debugging options.", "Turn on scene debugging options.",
"active - if false then main scene update and maintenance loops are suspended.\n" "active - if false then main scene update and maintenance loops are suspended.\n"
+ "animations - if true then extra animations debug information is logged.\n" + "animations - if true then extra animations debug information is logged.\n"
+ "appear-refresh - if true then appearance is resent to other avatars every 60 seconds.\n"
+ "client-pos-upd - the tolerance before clients are updated with new rotation information for an avatar.\n"
+ "client-rot-upd - the tolerance before clients are updated with new rotation information for an avatar.\n"
+ "client-vel-upd - the tolerance before clients are updated with new velocity information for an avatar.\n"
+ "root-upd-per - if greater than 1, terse updates are only sent to root agents other than the originator on every n updates.\n"
+ "child-upd-per - if greater than 1, terse updates are only sent to child agents on every n updates.\n"
+ "collisions - if false then collisions with other objects are turned off.\n" + "collisions - if false then collisions with other objects are turned off.\n"
+ "pbackup - if false then periodic scene backup is turned off.\n" + "pbackup - if false then periodic scene backup is turned off.\n"
+ "physics - if false then all physics objects are non-physical.\n" + "physics - if false then all physics objects are non-physical.\n"
+ "scripting - if false then no scripting operations happen.\n" + "scripting - if false then no scripting operations happen.\n"
+ "teleport - if true then some extra teleport debug information is logged.\n" + "teleport - if true then some extra teleport debug information is logged.\n"
+ "update-on-timer - If true then the scene is updated via a timer. If false then a thread with sleep is used.\n"
+ "updates - if true then any frame which exceeds double the maximum desired frame time is logged.", + "updates - if true then any frame which exceeds double the maximum desired frame time is logged.",
HandleDebugSceneSetCommand); HandleDebugSceneSetCommand);
} }
@ -153,17 +139,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
ConsoleDisplayList cdl = new ConsoleDisplayList(); ConsoleDisplayList cdl = new ConsoleDisplayList();
cdl.AddRow("active", m_scene.Active); cdl.AddRow("active", m_scene.Active);
cdl.AddRow("animations", m_scene.DebugAnimations); cdl.AddRow("animations", m_scene.DebugAnimations);
cdl.AddRow("appear-refresh", m_scene.SendPeriodicAppearanceUpdates);
cdl.AddRow("client-pos-upd", m_scene.RootPositionUpdateTolerance);
cdl.AddRow("client-rot-upd", m_scene.RootRotationUpdateTolerance);
cdl.AddRow("client-vel-upd", m_scene.RootVelocityUpdateTolerance);
cdl.AddRow("root-upd-per", m_scene.RootTerseUpdatePeriod);
cdl.AddRow("child-upd-per", m_scene.ChildTerseUpdatePeriod);
cdl.AddRow("pbackup", m_scene.PeriodicBackup); cdl.AddRow("pbackup", m_scene.PeriodicBackup);
cdl.AddRow("physics", m_scene.PhysicsEnabled); cdl.AddRow("physics", m_scene.PhysicsEnabled);
cdl.AddRow("scripting", m_scene.ScriptsEnabled); cdl.AddRow("scripting", m_scene.ScriptsEnabled);
cdl.AddRow("teleport", m_scene.DebugTeleporting); cdl.AddRow("teleport", m_scene.DebugTeleporting);
// cdl.AddRow("update-on-timer", m_scene.UpdateOnTimer);
cdl.AddRow("updates", m_scene.DebugUpdates); cdl.AddRow("updates", m_scene.DebugUpdates);
MainConsole.Instance.OutputFormat("Scene {0} options:", m_scene.Name); MainConsole.Instance.OutputFormat("Scene {0} options:", m_scene.Name);
@ -207,60 +186,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
m_scene.DebugAnimations = active; m_scene.DebugAnimations = active;
} }
if (options.ContainsKey("appear-refresh"))
{
bool newValue;
// FIXME: This can only come from the console at the moment but might not always be true.
if (ConsoleUtil.TryParseConsoleBool(MainConsole.Instance, options["appear-refresh"], out newValue))
m_scene.SendPeriodicAppearanceUpdates = newValue;
}
if (options.ContainsKey("client-pos-upd"))
{
float newValue;
// FIXME: This can only come from the console at the moment but might not always be true.
if (ConsoleUtil.TryParseConsoleFloat(MainConsole.Instance, options["client-pos-upd"], out newValue))
m_scene.RootPositionUpdateTolerance = newValue;
}
if (options.ContainsKey("client-rot-upd"))
{
float newValue;
// FIXME: This can only come from the console at the moment but might not always be true.
if (ConsoleUtil.TryParseConsoleFloat(MainConsole.Instance, options["client-rot-upd"], out newValue))
m_scene.RootRotationUpdateTolerance = newValue;
}
if (options.ContainsKey("client-vel-upd"))
{
float newValue;
// FIXME: This can only come from the console at the moment but might not always be true.
if (ConsoleUtil.TryParseConsoleFloat(MainConsole.Instance, options["client-vel-upd"], out newValue))
m_scene.RootVelocityUpdateTolerance = newValue;
}
if (options.ContainsKey("root-upd-per"))
{
int newValue;
// FIXME: This can only come from the console at the moment but might not always be true.
if (ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, options["root-upd-per"], out newValue))
m_scene.RootTerseUpdatePeriod = newValue;
}
if (options.ContainsKey("child-upd-per"))
{
int newValue;
// FIXME: This can only come from the console at the moment but might not always be true.
if (ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, options["child-upd-per"], out newValue))
m_scene.ChildTerseUpdatePeriod = newValue;
}
if (options.ContainsKey("pbackup")) if (options.ContainsKey("pbackup"))
{ {
bool active; bool active;
@ -296,21 +221,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
m_scene.DebugTeleporting = enableTeleportDebugging; m_scene.DebugTeleporting = enableTeleportDebugging;
} }
if (options.ContainsKey("update-on-timer"))
{
bool enableUpdateOnTimer;
if (bool.TryParse(options["update-on-timer"], out enableUpdateOnTimer))
{
// m_scene.UpdateOnTimer = enableUpdateOnTimer;
m_scene.Active = false;
while (m_scene.IsRunning)
Thread.Sleep(20);
m_scene.Active = true;
}
}
if (options.ContainsKey("updates")) if (options.ContainsKey("updates"))
{ {
bool enableUpdateDebugging; bool enableUpdateDebugging;