From 0174e326e3680ebc76dbd525191ad9b07634ec6d Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 24 Nov 2011 20:27:11 +0000 Subject: Add a "debug eq" console command for debugging. This will log outgoing event queue message names if turned on. --- .../Linden/Caps/EventQueue/EventQueueGetModule.cs | 85 ++++++++++++++++++++-- 1 file changed, 79 insertions(+), 6 deletions(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index 7d73b3e..f5feb71 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -39,6 +39,7 @@ using OpenMetaverse.Messages.Linden; using OpenMetaverse.Packets; using OpenMetaverse.StructuredData; using OpenSim.Framework; +using OpenSim.Framework.Console; using OpenSim.Framework.Servers; using OpenSim.Framework.Servers.HttpServer; using OpenSim.Region.Framework.Interfaces; @@ -58,9 +59,15 @@ namespace OpenSim.Region.ClientStack.Linden public class EventQueueGetModule : IEventQueue, IRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected Scene m_scene = null; + + /// + /// Debug level. + /// + public int DebugLevel { get; set; } + + protected Scene m_scene; private IConfigSource m_gConfig; - bool enabledYN = false; + bool enabledYN; private Dictionary m_ids = new Dictionary(); @@ -97,6 +104,15 @@ namespace OpenSim.Region.ClientStack.Linden scene.EventManager.OnClientClosed += ClientClosed; scene.EventManager.OnMakeChildAgent += MakeChildAgent; scene.EventManager.OnRegisterCaps += OnRegisterCaps; + + MainConsole.Instance.Commands.AddCommand( + "event queue", + false, + "debug eq", + "debug eq [0|1]", + "debug eq 1 will turn on event queue debugging. This will log all outgoing event queue messages to clients.\n" + + "debug eq 1 will turn off event queue debugging.", + HandleDebugEq); } else { @@ -128,6 +144,22 @@ namespace OpenSim.Region.ClientStack.Linden } #endregion + protected void HandleDebugEq(string module, string[] args) + { + int debugLevel; + + if (!(args.Length == 3 && int.TryParse(args[2], out debugLevel))) + { + MainConsole.Instance.OutputFormat("Usage: debug eq [0|1]"); + } + else + { + DebugLevel = debugLevel; + MainConsole.Instance.OutputFormat( + "Set event queue debug level to {0} in {1}", DebugLevel, m_scene.RegionInfo.RegionName); + } + } + /// /// Always returns a valid queue /// @@ -323,7 +355,9 @@ namespace OpenSim.Region.ClientStack.Linden // This will persist this beyond the expiry of the caps handlers MainServer.Instance.AddPollServiceHTTPHandler( - capsBase + EventQueueGetUUID.ToString() + "/", EventQueuePoll, new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID)); + capsBase + EventQueueGetUUID.ToString() + "/", + EventQueuePoll, + new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID)); Random rnd = new Random(Environment.TickCount); lock (m_ids) @@ -370,12 +404,31 @@ namespace OpenSim.Region.ClientStack.Linden } else { + if (DebugLevel > 0 && element is OSDMap) + { + OSDMap ev = (OSDMap)element; + m_log.DebugFormat( + "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", + ev["message"], m_scene.GetScenePresence(pAgentId).Name); + } + array.Add(element); + lock (queue) { while (queue.Count > 0) { - array.Add(queue.Dequeue()); + element = queue.Dequeue(); + + if (DebugLevel > 0 && element is OSDMap) + { + OSDMap ev = (OSDMap)element; + m_log.DebugFormat( + "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", + ev["message"], m_scene.GetScenePresence(pAgentId).Name); + } + + array.Add(element); thisID++; } } @@ -471,11 +524,29 @@ namespace OpenSim.Region.ClientStack.Linden { array.Add(element); + if (element is OSDMap) + { + OSDMap ev = (OSDMap)element; + m_log.DebugFormat( + "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", + ev["message"], m_scene.GetScenePresence(agentID).Name); + } + lock (queue) { while (queue.Count > 0) { - array.Add(queue.Dequeue()); + element = queue.Dequeue(); + + if (element is OSDMap) + { + OSDMap ev = (OSDMap)element; + m_log.DebugFormat( + "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", + ev["message"], m_scene.GetScenePresence(agentID).Name); + } + + array.Add(element); thisID++; } } @@ -494,7 +565,8 @@ namespace OpenSim.Region.ClientStack.Linden responsedata["content_type"] = "application/xml"; responsedata["keepalive"] = false; responsedata["str_response_string"] = OSDParser.SerializeLLSDXmlString(events); - //m_log.DebugFormat("[EVENTQUEUE]: sending response for {0} in region {1}: {2}", agentID, m_scene.RegionInfo.RegionName, responsedata["str_response_string"]); + + m_log.DebugFormat("[EVENTQUEUE]: sending response for {0} in region {1}: {2}", agentID, m_scene.RegionInfo.RegionName, responsedata["str_response_string"]); return responsedata; } @@ -717,6 +789,7 @@ namespace OpenSim.Region.ClientStack.Linden OSD item = EventQueueHelper.GroupMembership(groupUpdate); Enqueue(item, avatarID); } + public void QueryReply(PlacesReplyPacket groupUpdate, UUID avatarID) { OSD item = EventQueueHelper.PlacesQuery(groupUpdate); -- cgit v1.1 From 63c137820b44e9d1e248ba32ccd6df5110a2bdb9 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 24 Nov 2011 21:27:35 +0000 Subject: Stop passing a request handler to the initial caps.RegisterHandler in EventQueueGetModule since this is immediatley replaced by a poll server handler. This allows us to comment out a bunch of code and simplify the codebase and readability. --- .../Linden/Caps/EventQueue/EventQueueGetModule.cs | 319 +++++++++++---------- 1 file changed, 162 insertions(+), 157 deletions(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index f5feb71..24f76d69 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -346,12 +346,16 @@ namespace OpenSim.Region.ClientStack.Linden } // Register this as a caps handler + // FIXME: Confusingly, we need to register separate as a capability so that the client is told about + // EventQueueGet when it receive capability information, but then we replace the rest handler immediately + // afterwards with the poll service. So for now, we'll pass a null instead to simplify code reading, but + // really it should be possible to directly register the poll handler as a capability. caps.RegisterHandler("EventQueueGet", - new RestHTTPHandler("POST", capsBase + EventQueueGetUUID.ToString() + "/", - delegate(Hashtable m_dhttpMethod) - { - return ProcessQueue(m_dhttpMethod, agentID, caps); - })); + new RestHTTPHandler("POST", capsBase + EventQueueGetUUID.ToString() + "/", null)); +// delegate(Hashtable m_dhttpMethod) +// { +// return ProcessQueue(m_dhttpMethod, agentID, caps); +// })); // This will persist this beyond the expiry of the caps handlers MainServer.Instance.AddPollServiceHTTPHandler( @@ -382,6 +386,8 @@ namespace OpenSim.Region.ClientStack.Linden public Hashtable GetEvents(UUID requestID, UUID pAgentId, string request) { + m_log.DebugFormat("[EVENT QUEUE GET MODULE]: Invoked GetEvents() for {0}", pAgentId); + Queue queue = TryGetQueue(pAgentId); OSD element; lock (queue) @@ -465,167 +471,166 @@ namespace OpenSim.Region.ClientStack.Linden return responsedata; } - public Hashtable ProcessQueue(Hashtable request, UUID agentID, Caps caps) - { - // TODO: this has to be redone to not busy-wait (and block the thread), - // TODO: as soon as we have a non-blocking way to handle HTTP-requests. - -// if (m_log.IsDebugEnabled) -// { -// String debug = "[EVENTQUEUE]: Got request for agent {0} in region {1} from thread {2}: [ "; -// foreach (object key in request.Keys) +// public Hashtable ProcessQueue(Hashtable request, UUID agentID, Caps caps) +// { +// // TODO: this has to be redone to not busy-wait (and block the thread), +// // TODO: as soon as we have a non-blocking way to handle HTTP-requests. +// +//// if (m_log.IsDebugEnabled) +//// { +//// String debug = "[EVENTQUEUE]: Got request for agent {0} in region {1} from thread {2}: [ "; +//// foreach (object key in request.Keys) +//// { +//// debug += key.ToString() + "=" + request[key].ToString() + " "; +//// } +//// m_log.DebugFormat(debug + " ]", agentID, m_scene.RegionInfo.RegionName, System.Threading.Thread.CurrentThread.Name); +//// } +// +// Queue queue = TryGetQueue(agentID); +// OSD element; +// +// lock (queue) +// element = queue.Dequeue(); // 15s timeout +// +// Hashtable responsedata = new Hashtable(); +// +// int thisID = 0; +// lock (m_ids) +// thisID = m_ids[agentID]; +// +// if (element == null) +// { +// //m_log.ErrorFormat("[EVENTQUEUE]: Nothing to process in " + m_scene.RegionInfo.RegionName); +// if (thisID == -1) // close-request // { -// debug += key.ToString() + "=" + request[key].ToString() + " "; +// m_log.ErrorFormat("[EVENTQUEUE]: 404 in " + m_scene.RegionInfo.RegionName); +// responsedata["int_response_code"] = 404; //501; //410; //404; +// responsedata["content_type"] = "text/plain"; +// responsedata["keepalive"] = false; +// responsedata["str_response_string"] = "Closed EQG"; +// return responsedata; // } -// m_log.DebugFormat(debug + " ]", agentID, m_scene.RegionInfo.RegionName, System.Threading.Thread.CurrentThread.Name); +// responsedata["int_response_code"] = 502; +// responsedata["content_type"] = "text/plain"; +// responsedata["keepalive"] = false; +// responsedata["str_response_string"] = "Upstream error: "; +// responsedata["error_status_text"] = "Upstream error:"; +// responsedata["http_protocol_version"] = "HTTP/1.0"; +// return responsedata; // } - - Queue queue = TryGetQueue(agentID); - OSD element; - - lock (queue) - element = queue.Dequeue(); // 15s timeout - - Hashtable responsedata = new Hashtable(); - - int thisID = 0; - lock (m_ids) - thisID = m_ids[agentID]; - - if (element == null) - { - //m_log.ErrorFormat("[EVENTQUEUE]: Nothing to process in " + m_scene.RegionInfo.RegionName); - if (thisID == -1) // close-request - { - m_log.ErrorFormat("[EVENTQUEUE]: 404 in " + m_scene.RegionInfo.RegionName); - responsedata["int_response_code"] = 404; //501; //410; //404; - responsedata["content_type"] = "text/plain"; - responsedata["keepalive"] = false; - responsedata["str_response_string"] = "Closed EQG"; - return responsedata; - } - responsedata["int_response_code"] = 502; - responsedata["content_type"] = "text/plain"; - responsedata["keepalive"] = false; - responsedata["str_response_string"] = "Upstream error: "; - responsedata["error_status_text"] = "Upstream error:"; - responsedata["http_protocol_version"] = "HTTP/1.0"; - return responsedata; - } - - OSDArray array = new OSDArray(); - if (element == null) // didn't have an event in 15s - { - // Send it a fake event to keep the client polling! It doesn't like 502s like the proxys say! - array.Add(EventQueueHelper.KeepAliveEvent()); - //m_log.DebugFormat("[EVENTQUEUE]: adding fake event for {0} in region {1}", agentID, m_scene.RegionInfo.RegionName); - } - else - { - array.Add(element); - - if (element is OSDMap) - { - OSDMap ev = (OSDMap)element; - m_log.DebugFormat( - "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", - ev["message"], m_scene.GetScenePresence(agentID).Name); - } - - lock (queue) - { - while (queue.Count > 0) - { - element = queue.Dequeue(); - - if (element is OSDMap) - { - OSDMap ev = (OSDMap)element; - m_log.DebugFormat( - "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", - ev["message"], m_scene.GetScenePresence(agentID).Name); - } - - array.Add(element); - thisID++; - } - } - } - - OSDMap events = new OSDMap(); - events.Add("events", array); - - events.Add("id", new OSDInteger(thisID)); - lock (m_ids) - { - m_ids[agentID] = thisID + 1; - } - - responsedata["int_response_code"] = 200; - responsedata["content_type"] = "application/xml"; - responsedata["keepalive"] = false; - responsedata["str_response_string"] = OSDParser.SerializeLLSDXmlString(events); - - m_log.DebugFormat("[EVENTQUEUE]: sending response for {0} in region {1}: {2}", agentID, m_scene.RegionInfo.RegionName, responsedata["str_response_string"]); - - return responsedata; - } +// +// OSDArray array = new OSDArray(); +// if (element == null) // didn't have an event in 15s +// { +// // Send it a fake event to keep the client polling! It doesn't like 502s like the proxys say! +// array.Add(EventQueueHelper.KeepAliveEvent()); +// //m_log.DebugFormat("[EVENTQUEUE]: adding fake event for {0} in region {1}", agentID, m_scene.RegionInfo.RegionName); +// } +// else +// { +// array.Add(element); +// +// if (element is OSDMap) +// { +// OSDMap ev = (OSDMap)element; +// m_log.DebugFormat( +// "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", +// ev["message"], m_scene.GetScenePresence(agentID).Name); +// } +// +// lock (queue) +// { +// while (queue.Count > 0) +// { +// element = queue.Dequeue(); +// +// if (element is OSDMap) +// { +// OSDMap ev = (OSDMap)element; +// m_log.DebugFormat( +// "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", +// ev["message"], m_scene.GetScenePresence(agentID).Name); +// } +// +// array.Add(element); +// thisID++; +// } +// } +// } +// +// OSDMap events = new OSDMap(); +// events.Add("events", array); +// +// events.Add("id", new OSDInteger(thisID)); +// lock (m_ids) +// { +// m_ids[agentID] = thisID + 1; +// } +// +// responsedata["int_response_code"] = 200; +// responsedata["content_type"] = "application/xml"; +// responsedata["keepalive"] = false; +// responsedata["str_response_string"] = OSDParser.SerializeLLSDXmlString(events); +// +// m_log.DebugFormat("[EVENTQUEUE]: sending response for {0} in region {1}: {2}", agentID, m_scene.RegionInfo.RegionName, responsedata["str_response_string"]); +// +// return responsedata; +// } public Hashtable EventQueuePoll(Hashtable request) { return new Hashtable(); } - public Hashtable EventQueuePath2(Hashtable request) - { - string capuuid = (string)request["uri"]; //path.Replace("/CAPS/EQG/",""); - // pull off the last "/" in the path. - Hashtable responsedata = new Hashtable(); - capuuid = capuuid.Substring(0, capuuid.Length - 1); - capuuid = capuuid.Replace("/CAPS/EQG/", ""); - UUID AvatarID = UUID.Zero; - UUID capUUID = UUID.Zero; - - // parse the path and search for the avatar with it registered - if (UUID.TryParse(capuuid, out capUUID)) - { - lock (m_QueueUUIDAvatarMapping) - { - if (m_QueueUUIDAvatarMapping.ContainsKey(capUUID)) - { - AvatarID = m_QueueUUIDAvatarMapping[capUUID]; - } - } - - if (AvatarID != UUID.Zero) - { - return ProcessQueue(request, AvatarID, m_scene.CapsModule.GetCapsForUser(AvatarID)); - } - else - { - responsedata["int_response_code"] = 404; - responsedata["content_type"] = "text/plain"; - responsedata["keepalive"] = false; - responsedata["str_response_string"] = "Not Found"; - responsedata["error_status_text"] = "Not Found"; - responsedata["http_protocol_version"] = "HTTP/1.0"; - return responsedata; - // return 404 - } - } - else - { - responsedata["int_response_code"] = 404; - responsedata["content_type"] = "text/plain"; - responsedata["keepalive"] = false; - responsedata["str_response_string"] = "Not Found"; - responsedata["error_status_text"] = "Not Found"; - responsedata["http_protocol_version"] = "HTTP/1.0"; - return responsedata; - // return 404 - } - - } +// public Hashtable EventQueuePath2(Hashtable request) +// { +// string capuuid = (string)request["uri"]; //path.Replace("/CAPS/EQG/",""); +// // pull off the last "/" in the path. +// Hashtable responsedata = new Hashtable(); +// capuuid = capuuid.Substring(0, capuuid.Length - 1); +// capuuid = capuuid.Replace("/CAPS/EQG/", ""); +// UUID AvatarID = UUID.Zero; +// UUID capUUID = UUID.Zero; +// +// // parse the path and search for the avatar with it registered +// if (UUID.TryParse(capuuid, out capUUID)) +// { +// lock (m_QueueUUIDAvatarMapping) +// { +// if (m_QueueUUIDAvatarMapping.ContainsKey(capUUID)) +// { +// AvatarID = m_QueueUUIDAvatarMapping[capUUID]; +// } +// } +// +// if (AvatarID != UUID.Zero) +// { +// return ProcessQueue(request, AvatarID, m_scene.CapsModule.GetCapsForUser(AvatarID)); +// } +// else +// { +// responsedata["int_response_code"] = 404; +// responsedata["content_type"] = "text/plain"; +// responsedata["keepalive"] = false; +// responsedata["str_response_string"] = "Not Found"; +// responsedata["error_status_text"] = "Not Found"; +// responsedata["http_protocol_version"] = "HTTP/1.0"; +// return responsedata; +// // return 404 +// } +// } +// else +// { +// responsedata["int_response_code"] = 404; +// responsedata["content_type"] = "text/plain"; +// responsedata["keepalive"] = false; +// responsedata["str_response_string"] = "Not Found"; +// responsedata["error_status_text"] = "Not Found"; +// responsedata["http_protocol_version"] = "HTTP/1.0"; +// return responsedata; +// // return 404 +// } +// } public OSD EventQueueFallBack(string path, OSD request, string endpoint) { -- cgit v1.1 From 0a60e9537f2a1aa30fd1d9c23ada5bf1fcfed889 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 24 Nov 2011 21:30:40 +0000 Subject: comment out a noisy log line I accidentally left in from the last commit --- .../Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index 24f76d69..5c721d4 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -386,7 +386,7 @@ namespace OpenSim.Region.ClientStack.Linden public Hashtable GetEvents(UUID requestID, UUID pAgentId, string request) { - m_log.DebugFormat("[EVENT QUEUE GET MODULE]: Invoked GetEvents() for {0}", pAgentId); +// m_log.DebugFormat("[EVENT QUEUE GET MODULE]: Invoked GetEvents() for {0}", pAgentId); Queue queue = TryGetQueue(pAgentId); OSD element; -- cgit v1.1 From a58f5b2f6679bfb8565741afaead7e6d8dc8c299 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 24 Nov 2011 22:08:34 +0000 Subject: When setting packet level logging via "debug packet", apply to all clients, not just root ones. Also adds scene name and client type (root|child) to logged information. --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 133da0f..7d39ddc 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -11621,7 +11621,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP logPacket = false; if (logPacket) - m_log.DebugFormat("[CLIENT]: Packet OUT {0} to {1}", packet.Type, Name); + m_log.DebugFormat( + "[CLIENT]: PACKET OUT to {0} ({1}) in {2} - {3}", + Name, ChildAgentStatus() ? "child" : "root ", m_scene.RegionInfo.RegionName, packet.Type); } m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, doAutomaticSplitting, method); @@ -11664,19 +11666,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP { if (DebugPacketLevel > 0) { - bool outputPacket = true; + bool logPacket = true; if (DebugPacketLevel <= 255 && packet.Type == PacketType.AgentUpdate) - outputPacket = false; + logPacket = false; if (DebugPacketLevel <= 200 && packet.Type == PacketType.RequestImage) - outputPacket = false; + logPacket = false; if (DebugPacketLevel <= 100 && (packet.Type == PacketType.ViewerEffect || packet.Type == PacketType.AgentAnimation)) - outputPacket = false; + logPacket = false; - if (outputPacket) - m_log.DebugFormat("[CLIENT]: Packet IN {0} from {1}", packet.Type, Name); + if (logPacket) + m_log.DebugFormat( + "[CLIENT]: PACKET IN from {0} ({1}) in {2} - {3}", + Name, ChildAgentStatus() ? "child" : "root ", m_scene.RegionInfo.RegionName, packet.Type); } if (!ProcessPacketMethod(packet)) -- cgit v1.1 From 8c82ff16ad07635b9bf1ccebd8ecc52c2aadf751 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 25 Nov 2011 21:54:31 +0000 Subject: Fix WebFetchInventoryDescendents cap to use Utils.AssetTypeTostring/InventoryTypeToString to convert types to strings These cover a wider range of types. --- OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | 2 ++ 1 file changed, 2 insertions(+) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index 94629a2..1c1d83c 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -122,11 +122,13 @@ namespace OpenSim.Region.ClientStack.Linden WebFetchInvDescHandler webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService); IRequestHandler reqHandler = new RestStreamHandler("POST", "/CAPS/" + UUID.Random(), webFetchHandler.FetchInventoryDescendentsRequest); caps.RegisterHandler("WebFetchInventoryDescendents", reqHandler); +// caps.RegisterHandler("FetchInventoryDescendents2", reqHandler); } else { m_log.InfoFormat("[WEBFETCHINVENTORYDESCENDANTS]: {0} in region {1}", m_URL, m_scene.RegionInfo.RegionName); caps.RegisterHandler("WebFetchInventoryDescendents", m_URL); +// caps.RegisterHandler("FetchInventoryDescendents2", m_URL); } } -- cgit v1.1 From 676d32974adc913b2902db6cfa456c77bd52cd85 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 25 Nov 2011 22:46:42 +0000 Subject: Implement the FetchInventoryDescendents2 capability using the same code as WebFetchInventoryDescendents. Enabling this by setting Cap_FetchInventoryDescendents2 = "localhost" in the [ClientStack.LindenCaps] section of OpenSim.ini downloads inventory via http rather than udp in later viewers. --- .../Linden/Caps/WebFetchInvDescModule.cs | 55 +++++++++++++++------- 1 file changed, 38 insertions(+), 17 deletions(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index 1c1d83c..2a41b87 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -42,18 +42,24 @@ using OpenSim.Capabilities.Handlers; namespace OpenSim.Region.ClientStack.Linden { - + /// + /// This module implements both WebFetchInventoryDescendents and FetchInventoryDescendents2 capabilities. + /// [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] public class WebFetchInvDescModule : INonSharedRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private Scene m_scene; private IInventoryService m_InventoryService; private ILibraryService m_LibraryService; - private bool m_Enabled = false; - private string m_URL; + + private bool m_Enabled; + + private string m_fetchInventoryDescendents2Url; + private string m_webFetchInventoryDescendentsUrl; #region ISharedRegionModule Members @@ -63,9 +69,10 @@ namespace OpenSim.Region.ClientStack.Linden if (config == null) return; - m_URL = config.GetString("Cap_WebFetchInventoryDescendents", string.Empty); - // Cap doesn't exist - if (m_URL != string.Empty) + m_fetchInventoryDescendents2Url = config.GetString("Cap_FetchInventoryDescendents2", string.Empty); + m_webFetchInventoryDescendentsUrl = config.GetString("Cap_WebFetchInventoryDescendents", string.Empty); + + if (m_fetchInventoryDescendents2Url != string.Empty || m_webFetchInventoryDescendentsUrl != string.Empty) m_Enabled = true; } @@ -111,26 +118,40 @@ namespace OpenSim.Region.ClientStack.Linden #endregion - public void RegisterCaps(UUID agentID, Caps caps) + private void RegisterCaps(UUID agentID, Caps caps) { UUID capID = UUID.Random(); - //caps.RegisterHandler("GetTexture", new StreamHandler("GET", "/CAPS/" + capID, ProcessGetTexture)); - if (m_URL == "localhost") + if (m_webFetchInventoryDescendentsUrl != "") + RegisterFetchCap(agentID, caps, "WebFetchInventoryDescendents", m_webFetchInventoryDescendentsUrl); + else if (m_fetchInventoryDescendents2Url != "") + RegisterFetchCap(agentID, caps, "FetchInventoryDescendents2", m_fetchInventoryDescendents2Url); + } + + private void RegisterFetchCap(UUID agentID, Caps caps, string capName, string url) + { + string capUrl; + + if (url == "localhost") { - m_log.InfoFormat("[WEBFETCHINVENTORYDESCENDANTS]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); + capUrl = "/CAPS/" + UUID.Random(); + WebFetchInvDescHandler webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService); - IRequestHandler reqHandler = new RestStreamHandler("POST", "/CAPS/" + UUID.Random(), webFetchHandler.FetchInventoryDescendentsRequest); - caps.RegisterHandler("WebFetchInventoryDescendents", reqHandler); -// caps.RegisterHandler("FetchInventoryDescendents2", reqHandler); + IRequestHandler reqHandler + = new RestStreamHandler("POST", capUrl, webFetchHandler.FetchInventoryDescendentsRequest); + + caps.RegisterHandler(capName, reqHandler); } else { - m_log.InfoFormat("[WEBFETCHINVENTORYDESCENDANTS]: {0} in region {1}", m_URL, m_scene.RegionInfo.RegionName); - caps.RegisterHandler("WebFetchInventoryDescendents", m_URL); -// caps.RegisterHandler("FetchInventoryDescendents2", m_URL); + capUrl = url; + + caps.RegisterHandler(capName, capUrl); } - } +// m_log.DebugFormat( +// "[WEB FETCH INV DESC MODULE]: Registered capability {0} at {1} in region {2} for {3}", +// capName, capUrl, m_scene.RegionInfo.RegionName, agentID); + } } } -- cgit v1.1 From 5b4fe23f7f1877a150ed50dd63beaac762fe8674 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 25 Nov 2011 23:43:57 +0000 Subject: Resolve error where an unknown asset type would cause the fetch inventory descendents cap to fail. Introduced just a few commits ago in 0688861 --- OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index 2a41b87..a49d619 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -48,8 +48,7 @@ namespace OpenSim.Region.ClientStack.Linden [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] public class WebFetchInvDescModule : INonSharedRegionModule { - private static readonly ILog m_log = - LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private Scene m_scene; @@ -120,8 +119,6 @@ namespace OpenSim.Region.ClientStack.Linden private void RegisterCaps(UUID agentID, Caps caps) { - UUID capID = UUID.Random(); - if (m_webFetchInventoryDescendentsUrl != "") RegisterFetchCap(agentID, caps, "WebFetchInventoryDescendents", m_webFetchInventoryDescendentsUrl); else if (m_fetchInventoryDescendents2Url != "") -- cgit v1.1 From 95a686dbf5fce50b332c16231e5ebfdd07add0e4 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 25 Nov 2011 23:45:29 +0000 Subject: Fix config so that you can have both WebFetchInventoryDescendents and FetchInvnetoryDescendents2 caps active at once --- OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index a49d619..72177a8 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -121,7 +121,8 @@ namespace OpenSim.Region.ClientStack.Linden { if (m_webFetchInventoryDescendentsUrl != "") RegisterFetchCap(agentID, caps, "WebFetchInventoryDescendents", m_webFetchInventoryDescendentsUrl); - else if (m_fetchInventoryDescendents2Url != "") + + if (m_fetchInventoryDescendents2Url != "") RegisterFetchCap(agentID, caps, "FetchInventoryDescendents2", m_fetchInventoryDescendents2Url); } -- cgit v1.1 From 11c19b0d2ea97e82f3da3bb8fde665a25b044943 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Sat, 26 Nov 2011 00:29:01 +0000 Subject: Use the same web fetch handler for every request from every avatar, since it contains no instance code --- .../ClientStack/Linden/Caps/WebFetchInvDescModule.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index 72177a8..10f43d1 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -60,6 +60,8 @@ namespace OpenSim.Region.ClientStack.Linden private string m_fetchInventoryDescendents2Url; private string m_webFetchInventoryDescendentsUrl; + private WebFetchInvDescHandler m_webFetchHandler; + #region ISharedRegionModule Members public void Initialise(IConfigSource source) @@ -72,7 +74,9 @@ namespace OpenSim.Region.ClientStack.Linden m_webFetchInventoryDescendentsUrl = config.GetString("Cap_WebFetchInventoryDescendents", string.Empty); if (m_fetchInventoryDescendents2Url != string.Empty || m_webFetchInventoryDescendentsUrl != string.Empty) + { m_Enabled = true; + } } public void AddRegion(Scene s) @@ -97,8 +101,13 @@ namespace OpenSim.Region.ClientStack.Linden if (!m_Enabled) return; - m_InventoryService = m_scene.InventoryService; ; + m_InventoryService = m_scene.InventoryService; m_LibraryService = m_scene.LibraryService; + + // We'll reuse the same handler for all requests. + if (m_fetchInventoryDescendents2Url == "localhost" || m_webFetchInventoryDescendentsUrl == "localhost") + m_webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService); + m_scene.EventManager.OnRegisterCaps += RegisterCaps; } @@ -134,9 +143,8 @@ namespace OpenSim.Region.ClientStack.Linden { capUrl = "/CAPS/" + UUID.Random(); - WebFetchInvDescHandler webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService); IRequestHandler reqHandler - = new RestStreamHandler("POST", capUrl, webFetchHandler.FetchInventoryDescendentsRequest); + = new RestStreamHandler("POST", capUrl, m_webFetchHandler.FetchInventoryDescendentsRequest); caps.RegisterHandler(capName, reqHandler); } -- cgit v1.1 From bafea2282a95017099578a0a31a908e746161414 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Sat, 26 Nov 2011 01:39:23 +0000 Subject: Rip out unused Scene.HandleFetchInventoryDescendentsCAPS(). This has been handled by WebFetchInvDescHandler.Fetch() for some time. --- OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 1 - 1 file changed, 1 deletion(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index b93a41b..8f0ae76 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -134,7 +134,6 @@ namespace OpenSim.Region.ClientStack.Linden AddNewInventoryItem = m_Scene.AddUploadedInventoryItem; ItemUpdatedCall = m_Scene.CapsUpdateInventoryItemAsset; TaskScriptUpdatedCall = m_Scene.CapsUpdateTaskInventoryScriptAsset; - CAPSFetchInventoryDescendents = m_Scene.HandleFetchInventoryDescendentsCAPS; GetClient = m_Scene.SceneGraph.GetControllingClient; } -- cgit v1.1