diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs index e10c4cb5bc..4a6b07951e 100644 --- a/OpenSim/Services/HypergridService/GatekeeperService.cs +++ b/OpenSim/Services/HypergridService/GatekeeperService.cs @@ -72,11 +72,14 @@ namespace OpenSim.Services.HypergridService private static Uri m_Uri; private static GridRegion m_DefaultGatewayRegion; + private static Random m_Random; + public GatekeeperService(IConfigSource config, ISimulationService simService) { if (!m_Initialized) { m_Initialized = true; + m_Random = new Random(); IConfig serverConfig = config.Configs["GatekeeperService"]; if (serverConfig == null) @@ -220,6 +223,8 @@ namespace OpenSim.Services.HypergridService public bool LoginAgent(AgentCircuitData aCircuit, GridRegion destination, out string reason) { reason = string.Empty; + List defaultRegions; + List fallbackRegions; string authURL = string.Empty; if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) @@ -374,8 +379,14 @@ namespace OpenSim.Services.HypergridService destination = m_GridService.GetRegionByUUID(m_ScopeID, destination.RegionID); if (destination == null) { - reason = "Destination region not found"; - return false; + defaultRegions = m_GridService.GetDefaultRegions(UUID.Zero); + if (defaultRegions == null || (defaultRegions != null && defaultRegions.Count == 0)) + { + reason = "Destination region not found"; + return false; + } + int index = m_Random.Next(0, defaultRegions.Count - 1); + destination = defaultRegions[index]; } m_log.DebugFormat( @@ -415,7 +426,17 @@ namespace OpenSim.Services.HypergridService m_log.DebugFormat("[GATEKEEPER SERVICE]: Launching {0} {1}", aCircuit.Name, loginFlag); - return m_SimulationService.CreateAgent(destination, aCircuit, (uint)loginFlag, out reason); + // try login to the desired region + if (m_SimulationService.CreateAgent(destination, aCircuit, (uint)loginFlag, out reason)) + return true; + + // if that failed, try the fallbacks + fallbackRegions = m_GridService.GetFallbackRegions(UUID.Zero, destination.RegionLocX, destination.RegionLocY); + foreach (GridRegion r in fallbackRegions) + if (m_SimulationService.CreateAgent(r, aCircuit, (uint)loginFlag, out reason)) + return true; + + return false; } protected bool Authenticate(AgentCircuitData aCircuit)