aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs11
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs51
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs74
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneBase.cs18
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs2
7 files changed, 115 insertions, 45 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs
index aa4a757..136ca92 100644
--- a/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IRegionReadyModule.cs
@@ -25,14 +25,23 @@
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28
29using System; 28using System;
29using OpenSim.Framework;
30 30
31namespace OpenSim.Region.Framework.Interfaces 31namespace OpenSim.Region.Framework.Interfaces
32{ 32{
33 public interface IRegionReadyModule 33 public interface IRegionReadyModule
34 { 34 {
35 void OarLoadingAlert(string msg); 35 void OarLoadingAlert(string msg);
36
37 /// <summary>
38 /// Trigger region ready status manually.
39 /// </summary>
40 /// <remarks>
41 /// This should be called by the scene if the IRegionReadyModule has set Scene.LoginLock == true
42 /// </remarks>
43 /// <param name='scene'></param>
44 void TriggerRegionReady(IScene scene);
36 } 45 }
37} 46}
38 47
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index d783e57..418904f 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -500,15 +500,25 @@ namespace OpenSim.Region.Framework.Scenes
500 public delegate void RegionHeartbeatEnd(Scene scene); 500 public delegate void RegionHeartbeatEnd(Scene scene);
501 public event RegionHeartbeatEnd OnRegionHeartbeatEnd; 501 public event RegionHeartbeatEnd OnRegionHeartbeatEnd;
502 502
503 public delegate void LoginsEnabled(string regionName); 503 /// <summary>
504 /// Fired when logins to a region are enabled or disabled.
505 /// </summary>
506 /// <remarks>
507 ///
508 /// </remarks>
509 /// Fired
510 public event RegionLoginsStatusChange OnRegionLoginsStatusChange;
511 public delegate void RegionLoginsStatusChange(IScene scene);
504 512
505 /// <summary> 513 /// <summary>
506 /// This should only fire in all circumstances if the RegionReady module is active. 514 /// Fired when a region is considered ready for use.
507 /// </summary> 515 /// </summary>
508 /// <remarks> 516 /// <remarks>
509 /// TODO: Fire this even when the RegionReady module is not active. 517 /// A region is considered ready when startup operations such as loading of scripts already on the region
518 /// have been completed.
510 /// </remarks> 519 /// </remarks>
511 public event LoginsEnabled OnLoginsEnabled; 520 public event RegionReady OnRegionReady;
521 public delegate void RegionReady(IScene scene);
512 522
513 public delegate void PrimsLoaded(Scene s); 523 public delegate void PrimsLoaded(Scene s);
514 public event PrimsLoaded OnPrimsLoaded; 524 public event PrimsLoaded OnPrimsLoaded;
@@ -2502,21 +2512,42 @@ namespace OpenSim.Region.Framework.Scenes
2502 } 2512 }
2503 } 2513 }
2504 2514
2505 public void TriggerLoginsEnabled (string regionName) 2515 public void TriggerRegionLoginsStatusChange(IScene scene)
2506 { 2516 {
2507 LoginsEnabled handler = OnLoginsEnabled; 2517 RegionLoginsStatusChange handler = OnRegionLoginsStatusChange;
2508 2518
2509 if ( handler != null) 2519 if (handler != null)
2510 { 2520 {
2511 foreach (LoginsEnabled d in handler.GetInvocationList()) 2521 foreach (RegionLoginsStatusChange d in handler.GetInvocationList())
2512 { 2522 {
2513 try 2523 try
2514 { 2524 {
2515 d(regionName); 2525 d(scene);
2526 }
2527 catch (Exception e)
2528 {
2529 m_log.ErrorFormat("[EVENT MANAGER]: Delegate for OnRegionLoginsStatusChange failed - continuing {0} - {1}",
2530 e.Message, e.StackTrace);
2531 }
2532 }
2533 }
2534 }
2535
2536 public void TriggerRegionReady(IScene scene)
2537 {
2538 RegionReady handler = OnRegionReady;
2539
2540 if (handler != null)
2541 {
2542 foreach (RegionReady d in handler.GetInvocationList())
2543 {
2544 try
2545 {
2546 d(scene);
2516 } 2547 }
2517 catch (Exception e) 2548 catch (Exception e)
2518 { 2549 {
2519 m_log.ErrorFormat("[EVENT MANAGER]: Delegate for LoginsEnabled failed - continuing {0} - {1}", 2550 m_log.ErrorFormat("[EVENT MANAGER]: Delegate for OnRegionReady failed - continuing {0} - {1}",
2520 e.Message, e.StackTrace); 2551 e.Message, e.StackTrace);
2521 } 2552 }
2522 } 2553 }
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f501828..645b3d5 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -129,9 +129,10 @@ namespace OpenSim.Region.Framework.Scenes
129 public bool m_strictAccessControl = true; 129 public bool m_strictAccessControl = true;
130 public bool m_seeIntoBannedRegion = false; 130 public bool m_seeIntoBannedRegion = false;
131 public int MaxUndoCount = 5; 131 public int MaxUndoCount = 5;
132
132 // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet; 133 // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet;
133 public bool LoginLock = false; 134 public bool LoginLock = false;
134 public bool LoginsDisabled = true; 135
135 public bool StartDisabled = false; 136 public bool StartDisabled = false;
136 public bool LoadingPrims; 137 public bool LoadingPrims;
137 public IXfer XferManager; 138 public IXfer XferManager;
@@ -727,6 +728,8 @@ namespace OpenSim.Region.Framework.Scenes
727 { 728 {
728 IConfig startupConfig = m_config.Configs["Startup"]; 729 IConfig startupConfig = m_config.Configs["Startup"];
729 730
731 StartDisabled = startupConfig.GetBoolean("StartDisabled", false);
732
730 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance); 733 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
731 m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup); 734 m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup);
732 if (!m_useBackup) 735 if (!m_useBackup)
@@ -1530,7 +1533,7 @@ namespace OpenSim.Region.Framework.Scenes
1530 // landMS = Util.EnvironmentTickCountSubtract(ldMS); 1533 // landMS = Util.EnvironmentTickCountSubtract(ldMS);
1531 //} 1534 //}
1532 1535
1533 if (LoginsDisabled && Frame == 20) 1536 if (!LoginsEnabled && Frame == 20)
1534 { 1537 {
1535 // m_log.DebugFormat("{0} {1} {2}", LoginsDisabled, m_sceneGraph.GetActiveScriptsCount(), LoginLock); 1538 // m_log.DebugFormat("{0} {1} {2}", LoginsDisabled, m_sceneGraph.GetActiveScriptsCount(), LoginLock);
1536 1539
@@ -1538,31 +1541,34 @@ namespace OpenSim.Region.Framework.Scenes
1538 // this is a rare case where we know we have just went through a long cycle of heap 1541 // this is a rare case where we know we have just went through a long cycle of heap
1539 // allocations, and there is no more work to be done until someone logs in 1542 // allocations, and there is no more work to be done until someone logs in
1540 GC.Collect(); 1543 GC.Collect();
1541 1544
1542 IConfig startupConfig = m_config.Configs["Startup"]; 1545 if (!LoginLock)
1543 if (startupConfig == null || !startupConfig.GetBoolean("StartDisabled", false))
1544 { 1546 {
1545 // This handles a case of a region having no scripts for the RegionReady module 1547 if (!StartDisabled)
1546 if (m_sceneGraph.GetActiveScriptsCount() == 0)
1547 {
1548 // need to be able to tell these have changed in RegionReady
1549 LoginLock = false;
1550 EventManager.TriggerLoginsEnabled(RegionInfo.RegionName);
1551 }
1552
1553 // For RegionReady lockouts
1554 if (!LoginLock)
1555 { 1548 {
1556 m_log.InfoFormat("[REGION]: Enabling logins for {0}", RegionInfo.RegionName); 1549 m_log.InfoFormat("[REGION]: Enabling logins for {0}", RegionInfo.RegionName);
1557 LoginsDisabled = false; 1550 LoginsEnabled = true;
1558 } 1551 }
1559 1552
1560 m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface<INeighbourService>(), RegionInfo); 1553 m_sceneGridService.InformNeighborsThatRegionisUp(
1554 RequestModuleInterface<INeighbourService>(), RegionInfo);
1555
1556 // Region ready should always be triggered whether logins are immediately enabled or not.
1557 EventManager.TriggerRegionReady(this);
1561 } 1558 }
1562 else 1559 else
1563 { 1560 {
1564 StartDisabled = true; 1561 // This handles a case of a region having no scripts for the RegionReady module
1565 LoginsDisabled = true; 1562 if (m_sceneGraph.GetActiveScriptsCount() == 0)
1563 {
1564 // In this case, we leave it to the IRegionReadyModule to enable logins
1565
1566 // LoginLock can currently only be set by a region module implementation.
1567 // If somehow this hasn't been done then the quickest way to bugfix is to see the
1568 // NullReferenceException
1569 IRegionReadyModule rrm = RequestModuleInterface<IRegionReadyModule>();
1570 rrm.TriggerRegionReady(this);
1571 }
1566 } 1572 }
1567 } 1573 }
1568 } 1574 }
@@ -3487,25 +3493,31 @@ namespace OpenSim.Region.Framework.Scenes
3487 if (AgentTransactionsModule != null) 3493 if (AgentTransactionsModule != null)
3488 AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); 3494 AgentTransactionsModule.RemoveAgentAssetTransactions(agentID);
3489 3495
3490 avatar.Close();
3491
3492 m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); 3496 m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode);
3493 m_log.Debug("[Scene] The avatar has left the building"); 3497 m_log.Debug("[Scene] The avatar has left the building");
3494 } 3498 }
3495 catch (Exception e) 3499 catch (Exception e)
3496 { 3500 {
3497 m_log.Error( 3501 m_log.Error(
3498 string.Format("[SCENE]: Exception removing {0} from {1}, ", avatar.Name, RegionInfo.RegionName), e); 3502 string.Format("[SCENE]: Exception removing {0} from {1}. Cleaning up. Exception ", avatar.Name, Name), e);
3499 } 3503 }
3500 finally 3504 finally
3501 { 3505 {
3502 // Always clean these structures up so that any failure above doesn't cause them to remain in the 3506 try
3503 // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering 3507 {
3504 // the same cleanup exception continually. 3508 // Always clean these structures up so that any failure above doesn't cause them to remain in the
3505 // TODO: This should probably extend to the whole method, but we don't want to also catch the NRE 3509 // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering
3506 // since this would hide the underlying failure and other associated problems. 3510 // the same cleanup exception continually.
3507 m_sceneGraph.RemoveScenePresence(agentID); 3511 m_sceneGraph.RemoveScenePresence(agentID);
3508 m_clientManager.Remove(agentID); 3512 m_clientManager.Remove(agentID);
3513
3514 avatar.Close();
3515 }
3516 catch (Exception e)
3517 {
3518 m_log.Error(
3519 string.Format("[SCENE]: Exception in final clean up of {0} in {1}. Exception ", avatar.Name, Name), e);
3520 }
3509 } 3521 }
3510 3522
3511 //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); 3523 //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false));
@@ -3619,7 +3631,7 @@ namespace OpenSim.Region.Framework.Scenes
3619 agent.startpos 3631 agent.startpos
3620 ); 3632 );
3621 3633
3622 if (LoginsDisabled) 3634 if (!LoginsEnabled)
3623 { 3635 {
3624 reason = "Logins Disabled"; 3636 reason = "Logins Disabled";
3625 return false; 3637 return false;
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs
index 8db4397..d55b082 100644
--- a/OpenSim/Region/Framework/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs
@@ -106,6 +106,24 @@ namespace OpenSim.Region.Framework.Scenes
106 106
107 protected readonly ClientManager m_clientManager = new ClientManager(); 107 protected readonly ClientManager m_clientManager = new ClientManager();
108 108
109 public bool LoginsEnabled
110 {
111 get
112 {
113 return m_loginsEnabled;
114 }
115
116 set
117 {
118 if (m_loginsEnabled != value)
119 {
120 m_loginsEnabled = value;
121 EventManager.TriggerRegionLoginsStatusChange(this);
122 }
123 }
124 }
125 private bool m_loginsEnabled;
126
109 public float TimeDilation 127 public float TimeDilation
110 { 128 {
111 get { return 1.0f; } 129 get { return 1.0f; }
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 5d8447b..775a4c2 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -100,7 +100,7 @@ namespace OpenSim.Region.Framework.Scenes
100 { 100 {
101 m_log.WarnFormat( 101 m_log.WarnFormat(
102 "[SCENE COMMUNICATION SERVICE]: Region {0} failed to inform neighbour at {1}-{2} that it is up.", 102 "[SCENE COMMUNICATION SERVICE]: Region {0} failed to inform neighbour at {1}-{2} that it is up.",
103 x / Constants.RegionSize, y / Constants.RegionSize); 103 m_scene.Name, x / Constants.RegionSize, y / Constants.RegionSize);
104 } 104 }
105 } 105 }
106 106
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 6ab0027..08c7a58 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1991,7 +1991,7 @@ namespace OpenSim.Region.Framework.Scenes
1991 try 1991 try
1992 { 1992 {
1993 if (!m_scene.ShuttingDown || // if shutting down then there will be nothing to handle the return so leave till next restart 1993 if (!m_scene.ShuttingDown || // if shutting down then there will be nothing to handle the return so leave till next restart
1994 m_scene.LoginsDisabled || // We're starting up or doing maintenance, don't mess with things 1994 !m_scene.LoginsEnabled || // We're starting up or doing maintenance, don't mess with things
1995 m_scene.LoadingPrims) // Land may not be valid yet 1995 m_scene.LoadingPrims) // Land may not be valid yet
1996 1996
1997 { 1997 {
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
index a407f01..37b5184 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
@@ -301,7 +301,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
301 sp.AbsolutePosition = preTeleportPosition; 301 sp.AbsolutePosition = preTeleportPosition;
302 302
303 // Make sceneB refuse CreateAgent 303 // Make sceneB refuse CreateAgent
304 sceneB.LoginsDisabled = true; 304 sceneB.LoginsEnabled = false;
305 305
306 sceneA.RequestTeleportLocation( 306 sceneA.RequestTeleportLocation(
307 sp.ControllingClient, 307 sp.ControllingClient,