mirror of
https://github.com/opensim/opensim.git
synced 2026-08-10 03:06:05 +08:00
Merge branch 'master' into careminster
Conflicts: OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs OpenSim/Region/Framework/Scenes/Scene.cs OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs OpenSim/Region/Framework/Scenes/SceneObjectPart.cs OpenSim/Region/Framework/Scenes/ScenePresence.cs OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs OpenSim/Server/Handlers/Simulation/AgentHandlers.cs OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs OpenSim/Services/HypergridService/UserAgentService.cs
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using log4net;
|
||||
@@ -37,6 +38,7 @@ using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Console;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using Caps=OpenSim.Framework.Capabilities.Caps;
|
||||
@@ -57,8 +59,9 @@ namespace OpenSim.Region.CoreModules.Framework
|
||||
/// </summary>
|
||||
protected Dictionary<uint, Caps> m_capsObjects = new Dictionary<uint, Caps>();
|
||||
|
||||
protected Dictionary<UUID, string> capsPaths = new Dictionary<UUID, string>();
|
||||
protected Dictionary<UUID, Dictionary<ulong, string>> childrenSeeds
|
||||
protected Dictionary<UUID, string> m_capsPaths = new Dictionary<UUID, string>();
|
||||
|
||||
protected Dictionary<UUID, Dictionary<ulong, string>> m_childrenSeeds
|
||||
= new Dictionary<UUID, Dictionary<ulong, string>>();
|
||||
|
||||
public void Initialise(IConfigSource source)
|
||||
@@ -70,9 +73,24 @@ namespace OpenSim.Region.CoreModules.Framework
|
||||
m_scene = scene;
|
||||
m_scene.RegisterModuleInterface<ICapabilitiesModule>(this);
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand("Comms", false, "show caps",
|
||||
"show caps",
|
||||
"Shows all registered capabilities for users", HandleShowCapsCommand);
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Comms", false, "show caps list",
|
||||
"show caps list",
|
||||
"Shows list of registered capabilities for users.", HandleShowCapsListCommand);
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Comms", false, "show caps stats by user",
|
||||
"show caps stats [<first-name> <last-name>]",
|
||||
"Shows statistics on capabilities use by user.",
|
||||
"If a user name is given, then prints a detailed breakdown of caps use ordered by number of requests received.",
|
||||
HandleShowCapsStatsByUserCommand);
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Comms", false, "show caps stats by cap",
|
||||
"show caps stats by cap [<cap-name>]",
|
||||
"Shows statistics on capabilities use by capability.",
|
||||
"If a capability name is given, then prints a detailed breakdown of use by each user.",
|
||||
HandleShowCapsStatsByCapCommand);
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene scene)
|
||||
@@ -106,35 +124,42 @@ namespace OpenSim.Region.CoreModules.Framework
|
||||
if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId, flags))
|
||||
return;
|
||||
|
||||
Caps caps;
|
||||
String capsObjectPath = GetCapsPath(agentId);
|
||||
|
||||
if (m_capsObjects.ContainsKey(circuitCode))
|
||||
lock (m_capsObjects)
|
||||
{
|
||||
Caps oldCaps = m_capsObjects[circuitCode];
|
||||
|
||||
m_log.DebugFormat(
|
||||
"[CAPS]: Recreating caps for agent {0}. Old caps path {1}, new caps path {2}. ",
|
||||
agentId, oldCaps.CapsObjectPath, capsObjectPath);
|
||||
// This should not happen. The caller code is confused. We need to fix that.
|
||||
// CAPs can never be reregistered, or the client will be confused.
|
||||
// Hence this return here.
|
||||
//return;
|
||||
if (m_capsObjects.ContainsKey(circuitCode))
|
||||
{
|
||||
Caps oldCaps = m_capsObjects[circuitCode];
|
||||
|
||||
m_log.DebugFormat(
|
||||
"[CAPS]: Recreating caps for agent {0}. Old caps path {1}, new caps path {2}. ",
|
||||
agentId, oldCaps.CapsObjectPath, capsObjectPath);
|
||||
// This should not happen. The caller code is confused. We need to fix that.
|
||||
// CAPs can never be reregistered, or the client will be confused.
|
||||
// Hence this return here.
|
||||
//return;
|
||||
}
|
||||
|
||||
caps = new Caps(MainServer.Instance, m_scene.RegionInfo.ExternalHostName,
|
||||
(MainServer.Instance == null) ? 0: MainServer.Instance.Port,
|
||||
capsObjectPath, agentId, m_scene.RegionInfo.RegionName);
|
||||
|
||||
m_capsObjects[circuitCode] = caps;
|
||||
}
|
||||
|
||||
Caps caps = new Caps(MainServer.Instance, m_scene.RegionInfo.ExternalHostName,
|
||||
(MainServer.Instance == null) ? 0: MainServer.Instance.Port,
|
||||
capsObjectPath, agentId, m_scene.RegionInfo.RegionName);
|
||||
|
||||
m_capsObjects[circuitCode] = caps;
|
||||
|
||||
m_scene.EventManager.TriggerOnRegisterCaps(agentId, caps);
|
||||
}
|
||||
|
||||
public void RemoveCaps(UUID agentId, uint circuitCode)
|
||||
{
|
||||
if (childrenSeeds.ContainsKey(agentId))
|
||||
lock (m_childrenSeeds)
|
||||
{
|
||||
childrenSeeds.Remove(agentId);
|
||||
if (m_childrenSeeds.ContainsKey(agentId))
|
||||
{
|
||||
m_childrenSeeds.Remove(agentId);
|
||||
}
|
||||
}
|
||||
|
||||
lock (m_capsObjects)
|
||||
@@ -180,16 +205,22 @@ namespace OpenSim.Region.CoreModules.Framework
|
||||
|
||||
public void SetAgentCapsSeeds(AgentCircuitData agent)
|
||||
{
|
||||
capsPaths[agent.AgentID] = agent.CapsPath;
|
||||
childrenSeeds[agent.AgentID]
|
||||
= ((agent.ChildrenCapSeeds == null) ? new Dictionary<ulong, string>() : agent.ChildrenCapSeeds);
|
||||
lock (m_capsPaths)
|
||||
m_capsPaths[agent.AgentID] = agent.CapsPath;
|
||||
|
||||
lock (m_childrenSeeds)
|
||||
m_childrenSeeds[agent.AgentID]
|
||||
= ((agent.ChildrenCapSeeds == null) ? new Dictionary<ulong, string>() : agent.ChildrenCapSeeds);
|
||||
}
|
||||
|
||||
public string GetCapsPath(UUID agentId)
|
||||
{
|
||||
if (capsPaths.ContainsKey(agentId))
|
||||
lock (m_capsPaths)
|
||||
{
|
||||
return capsPaths[agentId];
|
||||
if (m_capsPaths.ContainsKey(agentId))
|
||||
{
|
||||
return m_capsPaths[agentId];
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -198,17 +229,24 @@ namespace OpenSim.Region.CoreModules.Framework
|
||||
public Dictionary<ulong, string> GetChildrenSeeds(UUID agentID)
|
||||
{
|
||||
Dictionary<ulong, string> seeds = null;
|
||||
if (childrenSeeds.TryGetValue(agentID, out seeds))
|
||||
return seeds;
|
||||
|
||||
lock (m_childrenSeeds)
|
||||
if (m_childrenSeeds.TryGetValue(agentID, out seeds))
|
||||
return seeds;
|
||||
|
||||
return new Dictionary<ulong, string>();
|
||||
}
|
||||
|
||||
public void DropChildSeed(UUID agentID, ulong handle)
|
||||
{
|
||||
Dictionary<ulong, string> seeds;
|
||||
if (childrenSeeds.TryGetValue(agentID, out seeds))
|
||||
|
||||
lock (m_childrenSeeds)
|
||||
{
|
||||
seeds.Remove(handle);
|
||||
if (m_childrenSeeds.TryGetValue(agentID, out seeds))
|
||||
{
|
||||
seeds.Remove(handle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,53 +254,285 @@ namespace OpenSim.Region.CoreModules.Framework
|
||||
{
|
||||
Dictionary<ulong, string> seeds;
|
||||
string returnval;
|
||||
if (childrenSeeds.TryGetValue(agentID, out seeds))
|
||||
|
||||
lock (m_childrenSeeds)
|
||||
{
|
||||
if (seeds.TryGetValue(handle, out returnval))
|
||||
return returnval;
|
||||
if (m_childrenSeeds.TryGetValue(agentID, out seeds))
|
||||
{
|
||||
if (seeds.TryGetValue(handle, out returnval))
|
||||
return returnval;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void SetChildrenSeed(UUID agentID, Dictionary<ulong, string> seeds)
|
||||
{
|
||||
//m_log.DebugFormat(" !!! Setting child seeds in {0} to {1}", m_scene.RegionInfo.RegionName, seeds.Count);
|
||||
childrenSeeds[agentID] = seeds;
|
||||
|
||||
lock (m_childrenSeeds)
|
||||
m_childrenSeeds[agentID] = seeds;
|
||||
}
|
||||
|
||||
public void DumpChildrenSeeds(UUID agentID)
|
||||
{
|
||||
m_log.Info("================ ChildrenSeed "+m_scene.RegionInfo.RegionName+" ================");
|
||||
foreach (KeyValuePair<ulong, string> kvp in childrenSeeds[agentID])
|
||||
|
||||
lock (m_childrenSeeds)
|
||||
{
|
||||
uint x, y;
|
||||
Utils.LongToUInts(kvp.Key, out x, out y);
|
||||
x = x / Constants.RegionSize;
|
||||
y = y / Constants.RegionSize;
|
||||
m_log.Info(" >> "+x+", "+y+": "+kvp.Value);
|
||||
foreach (KeyValuePair<ulong, string> kvp in m_childrenSeeds[agentID])
|
||||
{
|
||||
uint x, y;
|
||||
Utils.LongToUInts(kvp.Key, out x, out y);
|
||||
x = x / Constants.RegionSize;
|
||||
y = y / Constants.RegionSize;
|
||||
m_log.Info(" >> "+x+", "+y+": "+kvp.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleShowCapsCommand(string module, string[] cmdparams)
|
||||
private void HandleShowCapsListCommand(string module, string[] cmdParams)
|
||||
{
|
||||
if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
|
||||
return;
|
||||
|
||||
StringBuilder caps = new StringBuilder();
|
||||
caps.AppendFormat("Region {0}:\n", m_scene.RegionInfo.RegionName);
|
||||
|
||||
foreach (KeyValuePair<uint, Caps> kvp in m_capsObjects)
|
||||
lock (m_capsObjects)
|
||||
{
|
||||
caps.AppendFormat("** Circuit {0}:\n", kvp.Key);
|
||||
|
||||
for (IDictionaryEnumerator kvp2 = kvp.Value.CapsHandlers.GetCapsDetails(false, null).GetEnumerator(); kvp2.MoveNext(); )
|
||||
foreach (KeyValuePair<uint, Caps> kvp in m_capsObjects)
|
||||
{
|
||||
Uri uri = new Uri(kvp2.Value.ToString());
|
||||
caps.AppendFormat(m_showCapsCommandFormat, kvp2.Key, uri.PathAndQuery);
|
||||
}
|
||||
caps.AppendFormat("** Circuit {0}:\n", kvp.Key);
|
||||
|
||||
foreach (KeyValuePair<string, string> kvp3 in kvp.Value.ExternalCapsHandlers)
|
||||
caps.AppendFormat(m_showCapsCommandFormat, kvp3.Key, kvp3.Value);
|
||||
for (IDictionaryEnumerator kvp2 = kvp.Value.CapsHandlers.GetCapsDetails(false, null).GetEnumerator(); kvp2.MoveNext(); )
|
||||
{
|
||||
Uri uri = new Uri(kvp2.Value.ToString());
|
||||
caps.AppendFormat(m_showCapsCommandFormat, kvp2.Key, uri.PathAndQuery);
|
||||
}
|
||||
|
||||
foreach (KeyValuePair<string, string> kvp3 in kvp.Value.ExternalCapsHandlers)
|
||||
caps.AppendFormat(m_showCapsCommandFormat, kvp3.Key, kvp3.Value);
|
||||
}
|
||||
}
|
||||
|
||||
MainConsole.Instance.Output(caps.ToString());
|
||||
}
|
||||
|
||||
private void HandleShowCapsStatsByCapCommand(string module, string[] cmdParams)
|
||||
{
|
||||
if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
|
||||
return;
|
||||
|
||||
if (cmdParams.Length != 5 && cmdParams.Length != 6)
|
||||
{
|
||||
MainConsole.Instance.Output("Usage: show caps stats by cap [<cap-name>]");
|
||||
return;
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendFormat("Region {0}:\n", m_scene.Name);
|
||||
|
||||
if (cmdParams.Length == 5)
|
||||
{
|
||||
BuildSummaryStatsByCapReport(sb);
|
||||
}
|
||||
else if (cmdParams.Length == 6)
|
||||
{
|
||||
BuildDetailedStatsByCapReport(sb, cmdParams[5]);
|
||||
}
|
||||
|
||||
MainConsole.Instance.Output(sb.ToString());
|
||||
}
|
||||
|
||||
private void BuildDetailedStatsByCapReport(StringBuilder sb, string capName)
|
||||
{
|
||||
/*
|
||||
sb.AppendFormat("Capability name {0}\n", capName);
|
||||
|
||||
ConsoleDisplayTable cdt = new ConsoleDisplayTable();
|
||||
cdt.AddColumn("User Name", 34);
|
||||
cdt.AddColumn("Req Received", 12);
|
||||
cdt.AddColumn("Req Handled", 12);
|
||||
cdt.Indent = 2;
|
||||
|
||||
Dictionary<string, int> receivedStats = new Dictionary<string, int>();
|
||||
Dictionary<string, int> handledStats = new Dictionary<string, int>();
|
||||
|
||||
m_scene.ForEachScenePresence(
|
||||
sp =>
|
||||
{
|
||||
Caps caps = m_scene.CapsModule.GetCapsForUser(sp.UUID);
|
||||
|
||||
if (caps == null)
|
||||
return;
|
||||
|
||||
Dictionary<string, IRequestHandler> capsHandlers = caps.CapsHandlers.GetCapsHandlers();
|
||||
|
||||
IRequestHandler reqHandler;
|
||||
if (capsHandlers.TryGetValue(capName, out reqHandler))
|
||||
{
|
||||
receivedStats[sp.Name] = reqHandler.RequestsReceived;
|
||||
handledStats[sp.Name] = reqHandler.RequestsHandled;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
foreach (KeyValuePair<string, int> kvp in receivedStats.OrderByDescending(kp => kp.Value))
|
||||
{
|
||||
cdt.AddRow(kvp.Key, kvp.Value, handledStats[kvp.Key]);
|
||||
}
|
||||
|
||||
sb.Append(cdt.ToString());
|
||||
*/
|
||||
}
|
||||
|
||||
private void BuildSummaryStatsByCapReport(StringBuilder sb)
|
||||
{
|
||||
/*
|
||||
ConsoleDisplayTable cdt = new ConsoleDisplayTable();
|
||||
cdt.AddColumn("Name", 34);
|
||||
cdt.AddColumn("Req Received", 12);
|
||||
cdt.AddColumn("Req Handled", 12);
|
||||
cdt.Indent = 2;
|
||||
|
||||
Dictionary<string, int> receivedStats = new Dictionary<string, int>();
|
||||
Dictionary<string, int> handledStats = new Dictionary<string, int>();
|
||||
|
||||
m_scene.ForEachScenePresence(
|
||||
sp =>
|
||||
{
|
||||
Caps caps = m_scene.CapsModule.GetCapsForUser(sp.UUID);
|
||||
|
||||
if (caps == null)
|
||||
return;
|
||||
|
||||
Dictionary<string, IRequestHandler> capsHandlers = caps.CapsHandlers.GetCapsHandlers();
|
||||
|
||||
foreach (IRequestHandler reqHandler in capsHandlers.Values)
|
||||
{
|
||||
string reqName = reqHandler.Name ?? "";
|
||||
|
||||
if (!receivedStats.ContainsKey(reqName))
|
||||
{
|
||||
receivedStats[reqName] = reqHandler.RequestsReceived;
|
||||
handledStats[reqName] = reqHandler.RequestsHandled;
|
||||
}
|
||||
else
|
||||
{
|
||||
receivedStats[reqName] += reqHandler.RequestsReceived;
|
||||
handledStats[reqName] += reqHandler.RequestsHandled;
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
foreach (KeyValuePair<string, int> kvp in receivedStats.OrderByDescending(kp => kp.Value))
|
||||
cdt.AddRow(kvp.Key, kvp.Value, handledStats[kvp.Key]);
|
||||
|
||||
sb.Append(cdt.ToString());
|
||||
*/
|
||||
}
|
||||
|
||||
private void HandleShowCapsStatsByUserCommand(string module, string[] cmdParams)
|
||||
{
|
||||
/*
|
||||
if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
|
||||
return;
|
||||
|
||||
if (cmdParams.Length != 5 && cmdParams.Length != 7)
|
||||
{
|
||||
MainConsole.Instance.Output("Usage: show caps stats by user [<first-name> <last-name>]");
|
||||
return;
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendFormat("Region {0}:\n", m_scene.Name);
|
||||
|
||||
if (cmdParams.Length == 5)
|
||||
{
|
||||
BuildSummaryStatsByUserReport(sb);
|
||||
}
|
||||
else if (cmdParams.Length == 7)
|
||||
{
|
||||
string firstName = cmdParams[5];
|
||||
string lastName = cmdParams[6];
|
||||
|
||||
ScenePresence sp = m_scene.GetScenePresence(firstName, lastName);
|
||||
|
||||
if (sp == null)
|
||||
return;
|
||||
|
||||
BuildDetailedStatsByUserReport(sb, sp);
|
||||
}
|
||||
|
||||
MainConsole.Instance.Output(sb.ToString());
|
||||
*/
|
||||
}
|
||||
|
||||
private void BuildDetailedStatsByUserReport(StringBuilder sb, ScenePresence sp)
|
||||
{
|
||||
/*
|
||||
sb.AppendFormat("Avatar name {0}, type {1}\n", sp.Name, sp.IsChildAgent ? "child" : "root");
|
||||
|
||||
ConsoleDisplayTable cdt = new ConsoleDisplayTable();
|
||||
cdt.AddColumn("Cap Name", 34);
|
||||
cdt.AddColumn("Req Received", 12);
|
||||
cdt.AddColumn("Req Handled", 12);
|
||||
cdt.Indent = 2;
|
||||
|
||||
Caps caps = m_scene.CapsModule.GetCapsForUser(sp.UUID);
|
||||
|
||||
if (caps == null)
|
||||
return;
|
||||
|
||||
Dictionary<string, IRequestHandler> capsHandlers = caps.CapsHandlers.GetCapsHandlers();
|
||||
|
||||
foreach (IRequestHandler reqHandler in capsHandlers.Values.OrderByDescending(rh => rh.RequestsReceived))
|
||||
{
|
||||
cdt.AddRow(reqHandler.Name, reqHandler.RequestsReceived, reqHandler.RequestsHandled);
|
||||
}
|
||||
|
||||
sb.Append(cdt.ToString());
|
||||
*/
|
||||
}
|
||||
|
||||
private void BuildSummaryStatsByUserReport(StringBuilder sb)
|
||||
{
|
||||
/*
|
||||
ConsoleDisplayTable cdt = new ConsoleDisplayTable();
|
||||
cdt.AddColumn("Name", 32);
|
||||
cdt.AddColumn("Type", 5);
|
||||
cdt.AddColumn("Req Received", 12);
|
||||
cdt.AddColumn("Req Handled", 12);
|
||||
cdt.Indent = 2;
|
||||
|
||||
m_scene.ForEachScenePresence(
|
||||
sp =>
|
||||
{
|
||||
Caps caps = m_scene.CapsModule.GetCapsForUser(sp.UUID);
|
||||
|
||||
if (caps == null)
|
||||
return;
|
||||
|
||||
Dictionary<string, IRequestHandler> capsHandlers = caps.CapsHandlers.GetCapsHandlers();
|
||||
|
||||
int totalRequestsReceived = 0;
|
||||
int totalRequestsHandled = 0;
|
||||
|
||||
foreach (IRequestHandler reqHandler in capsHandlers.Values)
|
||||
{
|
||||
totalRequestsReceived += reqHandler.RequestsReceived;
|
||||
totalRequestsHandled += reqHandler.RequestsHandled;
|
||||
}
|
||||
|
||||
cdt.AddRow(sp.Name, sp.IsChildAgent ? "child" : "root", totalRequestsReceived, totalRequestsHandled);
|
||||
}
|
||||
);
|
||||
|
||||
sb.Append(cdt.ToString());
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -822,7 +822,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
"[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1} from {2}. Keeping avatar in source region.",
|
||||
sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName);
|
||||
|
||||
Fail(sp, finalDestination, logout, "Connection between viewer and destination region could not be established.");
|
||||
Fail(sp, finalDestination, logout, currentAgentCircuit.SessionID.ToString(), "Connection between viewer and destination region could not be established.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -834,7 +834,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
"[ENTITY TRANSFER MODULE]: Cancelled teleport of {0} to {1} from {2} after UpdateAgent on client request",
|
||||
sp.Name, finalDestination.RegionName, sp.Scene.Name);
|
||||
|
||||
CleanupFailedInterRegionTeleport(sp, finalDestination);
|
||||
CleanupFailedInterRegionTeleport(sp, currentAgentCircuit.SessionID.ToString(), finalDestination);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -878,7 +878,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
"[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.",
|
||||
sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName);
|
||||
|
||||
Fail(sp, finalDestination, logout, "Destination region did not signal teleport completion.");
|
||||
Fail(sp, finalDestination, logout, currentAgentCircuit.SessionID.ToString(), "Destination region did not signal teleport completion.");
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -932,7 +932,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
/// <remarks>
|
||||
/// <param name='sp'> </param>
|
||||
/// <param name='finalDestination'></param>
|
||||
protected virtual void CleanupFailedInterRegionTeleport(ScenePresence sp, GridRegion finalDestination)
|
||||
protected virtual void CleanupFailedInterRegionTeleport(ScenePresence sp, string auth_token, GridRegion finalDestination)
|
||||
{
|
||||
m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp);
|
||||
|
||||
@@ -943,7 +943,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
|
||||
// Finally, kill the agent we just created at the destination.
|
||||
// XXX: Possibly this should be done asynchronously.
|
||||
Scene.SimulationService.CloseAgent(finalDestination, sp.UUID);
|
||||
Scene.SimulationService.CloseAgent(finalDestination, sp.UUID, auth_token);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -953,9 +953,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
/// <param name='finalDestination'></param>
|
||||
/// <param name='logout'></param>
|
||||
/// <param name='reason'>Human readable reason for teleport failure. Will be sent to client.</param>
|
||||
protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout, string reason)
|
||||
protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout, string auth_code, string reason)
|
||||
{
|
||||
CleanupFailedInterRegionTeleport(sp, finalDestination);
|
||||
CleanupFailedInterRegionTeleport(sp, auth_code, finalDestination);
|
||||
|
||||
m_interRegionTeleportFailures.Value++;
|
||||
|
||||
|
||||
@@ -171,11 +171,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
if (!so.IsAttachment)
|
||||
return;
|
||||
|
||||
if (so.Scene.UserManagementModule.IsLocalGridUser(so.AttachedAvatar))
|
||||
if (so.AttachedAvatar == UUID.Zero || Scene.UserManagementModule.IsLocalGridUser(so.AttachedAvatar))
|
||||
return;
|
||||
|
||||
// foreign user
|
||||
AgentCircuitData aCircuit = so.Scene.AuthenticateHandler.GetAgentCircuitData(so.AttachedAvatar);
|
||||
AgentCircuitData aCircuit = Scene.AuthenticateHandler.GetAgentCircuitData(so.AttachedAvatar);
|
||||
if (aCircuit != null && (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0)
|
||||
{
|
||||
if (aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("AssetServerURI"))
|
||||
@@ -183,7 +183,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
string url = aCircuit.ServiceURLs["AssetServerURI"].ToString();
|
||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Incoming attachement {0} for HG user {1} with asset server {2}", so.Name, so.AttachedAvatar, url);
|
||||
Dictionary<UUID, AssetType> ids = new Dictionary<UUID, AssetType>();
|
||||
HGUuidGatherer uuidGatherer = new HGUuidGatherer(so.Scene.AssetService, url);
|
||||
HGUuidGatherer uuidGatherer = new HGUuidGatherer(Scene.AssetService, url);
|
||||
uuidGatherer.GatherAssetUuids(so, ids);
|
||||
|
||||
foreach (KeyValuePair<UUID, AssetType> kvp in ids)
|
||||
@@ -207,6 +207,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
{
|
||||
m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService);
|
||||
m_UAS = scene.RequestModuleInterface<IUserAgentService>();
|
||||
if (m_UAS == null)
|
||||
m_UAS = new UserAgentServiceConnector(m_ThisHomeURI);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -571,12 +574,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
if (uMan != null && uMan.IsLocalGridUser(obj.AgentId))
|
||||
{
|
||||
// local grid user
|
||||
m_UAS.LogoutAgent(obj.AgentId, obj.SessionId);
|
||||
return;
|
||||
}
|
||||
|
||||
AgentCircuitData aCircuit = ((Scene)(obj.Scene)).AuthenticateHandler.GetAgentCircuitData(obj.CircuitCode);
|
||||
|
||||
if (aCircuit.ServiceURLs.ContainsKey("HomeURI"))
|
||||
if (aCircuit != null && aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("HomeURI"))
|
||||
{
|
||||
string url = aCircuit.ServiceURLs["HomeURI"].ToString();
|
||||
IUserAgentService security = new UserAgentServiceConnector(url);
|
||||
|
||||
@@ -0,0 +1,163 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
using Mono.Addins;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Framework.Monitoring;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Framework
|
||||
{
|
||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "GridServiceThrottleModule")]
|
||||
public class GridServiceThrottleModule : ISharedRegionModule
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(
|
||||
MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private readonly List<Scene> m_scenes = new List<Scene>();
|
||||
|
||||
private OpenSim.Framework.BlockingQueue<GridRegionRequest> m_RequestQueue = new OpenSim.Framework.BlockingQueue<GridRegionRequest>();
|
||||
|
||||
public void Initialise(IConfigSource config)
|
||||
{
|
||||
Watchdog.StartThread(
|
||||
ProcessQueue,
|
||||
"GridServiceRequestThread",
|
||||
ThreadPriority.BelowNormal,
|
||||
true,
|
||||
false);
|
||||
}
|
||||
|
||||
public void AddRegion(Scene scene)
|
||||
{
|
||||
lock (m_scenes)
|
||||
{
|
||||
m_scenes.Add(scene);
|
||||
scene.EventManager.OnNewClient += OnNewClient;
|
||||
}
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene scene)
|
||||
{
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene scene)
|
||||
{
|
||||
lock (m_scenes)
|
||||
{
|
||||
m_scenes.Remove(scene);
|
||||
scene.EventManager.OnNewClient -= OnNewClient;
|
||||
}
|
||||
}
|
||||
|
||||
void OnNewClient(IClientAPI client)
|
||||
{
|
||||
client.OnRegionHandleRequest += OnRegionHandleRequest;
|
||||
}
|
||||
|
||||
public void PostInitialise()
|
||||
{
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return "GridServiceThrottleModule"; }
|
||||
}
|
||||
|
||||
public Type ReplaceableInterface
|
||||
{
|
||||
get { return null; }
|
||||
}
|
||||
|
||||
public void OnRegionHandleRequest(IClientAPI client, UUID regionID)
|
||||
{
|
||||
//m_log.DebugFormat("[GRIDSERVICE THROTTLE]: RegionHandleRequest {0}", regionID);
|
||||
ulong handle = 0;
|
||||
if (IsLocalRegionHandle(regionID, out handle))
|
||||
{
|
||||
client.SendRegionHandle(regionID, handle);
|
||||
return;
|
||||
}
|
||||
|
||||
GridRegionRequest request = new GridRegionRequest(client, regionID);
|
||||
m_RequestQueue.Enqueue(request);
|
||||
|
||||
}
|
||||
|
||||
private bool IsLocalRegionHandle(UUID regionID, out ulong regionHandle)
|
||||
{
|
||||
regionHandle = 0;
|
||||
foreach (Scene s in m_scenes)
|
||||
if (s.RegionInfo.RegionID == regionID)
|
||||
{
|
||||
regionHandle = s.RegionInfo.RegionHandle;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void ProcessQueue()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
Watchdog.UpdateThread();
|
||||
|
||||
GridRegionRequest request = m_RequestQueue.Dequeue();
|
||||
GridRegion r = m_scenes[0].GridService.GetRegionByUUID(UUID.Zero, request.regionID);
|
||||
|
||||
if (r != null && r.RegionHandle != 0)
|
||||
request.client.SendRegionHandle(request.regionID, r.RegionHandle);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class GridRegionRequest
|
||||
{
|
||||
public IClientAPI client;
|
||||
public UUID regionID;
|
||||
|
||||
public GridRegionRequest(IClientAPI c, UUID r)
|
||||
{
|
||||
client = c;
|
||||
regionID = r;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -135,7 +135,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||
if (sp is ScenePresence)
|
||||
{
|
||||
AgentCircuitData aCircuit = ((ScenePresence)sp).Scene.AuthenticateHandler.GetAgentCircuitData(client.AgentId);
|
||||
if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0)
|
||||
if (aCircuit != null && (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0)
|
||||
{
|
||||
if (m_RestrictInventoryAccessAbroad)
|
||||
{
|
||||
|
||||
@@ -176,7 +176,7 @@ namespace OpenSim.Region.CoreModules.Framework.Library
|
||||
m_log.InfoFormat("[LIBRARY MODULE]: Loading library archive {0} ({1})...", iarFileName, simpleName);
|
||||
simpleName = GetInventoryPathFromName(simpleName);
|
||||
|
||||
InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, simpleName, iarFileName, false);
|
||||
InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene.InventoryService, m_MockScene.AssetService, m_MockScene.UserAccountService, uinfo, simpleName, iarFileName, false);
|
||||
try
|
||||
{
|
||||
HashSet<InventoryNodeBase> nodes = archread.Execute();
|
||||
@@ -185,7 +185,7 @@ namespace OpenSim.Region.CoreModules.Framework.Library
|
||||
// didn't find the subfolder with the given name; place it on the top
|
||||
m_log.InfoFormat("[LIBRARY MODULE]: Didn't find {0} in library. Placing archive on the top level", simpleName);
|
||||
archread.Close();
|
||||
archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, "/", iarFileName, false);
|
||||
archread = new InventoryArchiveReadRequest(m_MockScene.InventoryService, m_MockScene.AssetService, m_MockScene.UserAccountService, uinfo, "/", iarFileName, false);
|
||||
archread.Execute();
|
||||
}
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||
if (umanmod == Name)
|
||||
{
|
||||
m_Enabled = true;
|
||||
RegisterConsoleCmds();
|
||||
Init();
|
||||
m_log.DebugFormat("[USER MANAGEMENT MODULE]: {0} is enabled", Name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,9 +28,11 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Console;
|
||||
using OpenSim.Framework.Monitoring;
|
||||
using OpenSim.Region.ClientStack.LindenUDP;
|
||||
using OpenSim.Region.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
@@ -57,6 +59,10 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||
// The cache
|
||||
protected Dictionary<UUID, UserData> m_UserCache = new Dictionary<UUID, UserData>();
|
||||
|
||||
// Throttle the name requests
|
||||
private OpenSim.Framework.BlockingQueue<NameRequest> m_RequestQueue = new OpenSim.Framework.BlockingQueue<NameRequest>();
|
||||
|
||||
|
||||
#region ISharedRegionModule
|
||||
|
||||
public void Initialise(IConfigSource config)
|
||||
@@ -65,7 +71,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||
if (umanmod == Name)
|
||||
{
|
||||
m_Enabled = true;
|
||||
RegisterConsoleCmds();
|
||||
Init();
|
||||
m_log.DebugFormat("[USER MANAGEMENT MODULE]: {0} is enabled", Name);
|
||||
}
|
||||
}
|
||||
@@ -160,16 +166,9 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||
}
|
||||
else
|
||||
{
|
||||
string[] names;
|
||||
bool foundRealName = TryGetUserNames(uuid, out names);
|
||||
NameRequest request = new NameRequest(remote_client, uuid);
|
||||
m_RequestQueue.Enqueue(request);
|
||||
|
||||
if (names.Length == 2)
|
||||
{
|
||||
if (!foundRealName)
|
||||
m_log.DebugFormat("[USER MANAGEMENT MODULE]: Sending {0} {1} for {2} to {3} since no bound name found", names[0], names[1], uuid, remote_client.Name);
|
||||
|
||||
remote_client.SendNameReply(uuid, names[0], names[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -514,9 +513,8 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||
return;
|
||||
}
|
||||
|
||||
//try update unknown users
|
||||
//and creator's home URL's
|
||||
if ((oldUser.FirstName == "Unknown" && !creatorData.Contains("Unknown")) || (oldUser.HomeURL != null && !creatorData.StartsWith(oldUser.HomeURL)))
|
||||
//try update unknown users, but don't update anyone else
|
||||
if (oldUser.FirstName == "Unknown" && !creatorData.Contains("Unknown"))
|
||||
{
|
||||
lock (m_UserCache)
|
||||
m_UserCache.Remove(id);
|
||||
@@ -597,6 +595,18 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||
|
||||
#endregion IUserManagement
|
||||
|
||||
protected void Init()
|
||||
{
|
||||
RegisterConsoleCmds();
|
||||
Watchdog.StartThread(
|
||||
ProcessQueue,
|
||||
"NameRequestThread",
|
||||
ThreadPriority.BelowNormal,
|
||||
true,
|
||||
false);
|
||||
|
||||
}
|
||||
|
||||
protected void RegisterConsoleCmds()
|
||||
{
|
||||
MainConsole.Instance.Commands.AddCommand("Users", true,
|
||||
@@ -663,5 +673,40 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||
|
||||
MainConsole.Instance.Output(cdt.ToString());
|
||||
}
|
||||
|
||||
private void ProcessQueue()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
Watchdog.UpdateThread();
|
||||
|
||||
NameRequest request = m_RequestQueue.Dequeue();
|
||||
string[] names;
|
||||
bool foundRealName = TryGetUserNames(request.uuid, out names);
|
||||
|
||||
if (names.Length == 2)
|
||||
{
|
||||
if (!foundRealName)
|
||||
m_log.DebugFormat("[USER MANAGEMENT MODULE]: Sending {0} {1} for {2} to {3} since no bound name found", names[0], names[1], request.uuid, request.client.Name);
|
||||
|
||||
request.client.SendNameReply(request.uuid, names[0], names[1]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class NameRequest
|
||||
{
|
||||
public IClientAPI client;
|
||||
public UUID uuid;
|
||||
|
||||
public NameRequest(IClientAPI c, UUID n)
|
||||
{
|
||||
client = c;
|
||||
uuid = n;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user