From 442b27222828381a27c7c5eddc967a0de4c82d0a Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 17 Jul 2016 13:20:56 +0100 Subject: add a Drop method to PollService Event handlers, Drop requests on connections known to be lost or delay event check if they are sending a response --- .../Linden/Caps/EventQueue/EventQueueGetModule.cs | 6 ++++- .../ClientStack/Linden/Caps/GetMeshModule.cs | 11 ++++++++- .../ClientStack/Linden/Caps/GetTextureModule.cs | 6 +++-- .../Linden/Caps/WebFetchInvDescModule.cs | 4 +++- .../CoreModules/Scripting/LSLHttp/UrlModule.cs | 26 ++++++++++++++++++++-- 5 files changed, 46 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index cc614f3..18670f5 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -372,7 +372,7 @@ namespace OpenSim.Region.ClientStack.Linden caps.RegisterPollHandler( "EventQueueGet", - new PollServiceEventArgs(null, GenerateEqgCapPath(eventQueueGetUUID), HasEvents, GetEvents, NoEvents, agentID, SERVER_EQ_TIME_NO_EVENTS)); + new PollServiceEventArgs(null, GenerateEqgCapPath(eventQueueGetUUID), HasEvents, GetEvents, NoEvents, Drop, agentID, SERVER_EQ_TIME_NO_EVENTS)); } public bool HasEvents(UUID requestID, UUID agentID) @@ -403,6 +403,10 @@ namespace OpenSim.Region.ClientStack.Linden ev["message"], m_scene.GetScenePresence(agentId).Name, m_scene.Name); } } + public void Drop(UUID requestID, UUID pAgentId) + { + // do nothing for now, hope client close will do it + } public Hashtable GetEvents(UUID requestID, UUID pAgentId) { diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs index f66ef57..7831de3 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs @@ -226,7 +226,7 @@ namespace OpenSim.Region.ClientStack.Linden private Scene m_scene; private MeshCapsDataThrottler m_throttler; public PollServiceMeshEventArgs(string uri, UUID pId, Scene scene) : - base(null, uri, null, null, null, pId, int.MaxValue) + base(null, uri, null, null, null, null, pId, int.MaxValue) { m_scene = scene; m_throttler = new MeshCapsDataThrottler(100000, 1400000, 10000, scene, pId); @@ -241,6 +241,15 @@ namespace OpenSim.Region.ClientStack.Linden } }; + + Drop= (x, y) => + { + lock (responses) + { + responses.Remove(x); + } + }; + GetEvents = (x, y) => { lock (responses) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs index 14a59fe..ee7e291 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs @@ -222,7 +222,7 @@ namespace OpenSim.Region.ClientStack.Linden private Scene m_scene; private CapsDataThrottler m_throttler = new CapsDataThrottler(100000, 1400000,10000); public PollServiceTextureEventArgs(UUID pId, Scene scene) : - base(null, "", null, null, null, pId, int.MaxValue) + base(null, "", null, null, null, null, pId, int.MaxValue) { m_scene = scene; // x is request id, y is userid @@ -236,6 +236,9 @@ namespace OpenSim.Region.ClientStack.Linden } }; + + Drop = (x, y) => { lock (responses) responses.Remove(x); }; + GetEvents = (x, y) => { lock (responses) @@ -423,7 +426,6 @@ namespace OpenSim.Region.ClientStack.Linden internal sealed class CapsDataThrottler { - private volatile int currenttime = 0; private volatile int lastTimeElapsed = 0; private volatile int BytesSent = 0; diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index ba4fb76..bde94e6 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -256,11 +256,13 @@ namespace OpenSim.Region.ClientStack.Linden private WebFetchInvDescModule m_module; public PollServiceInventoryEventArgs(WebFetchInvDescModule module, string url, UUID pId) : - base(null, url, null, null, null, pId, int.MaxValue) + base(null, url, null, null, null, null, pId, int.MaxValue) { m_module = module; HasEvents = (x, y) => { lock (responses) return responses.ContainsKey(x); }; + Drop = (x, y) => { lock (responses) responses.Remove(x); }; + GetEvents = (x, y) => { lock (responses) diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index f563c68..c118f33 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs @@ -225,7 +225,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp string uri = "/lslhttp/" + urlcode.ToString() + "/"; PollServiceEventArgs args - = new PollServiceEventArgs(HttpRequestHandler, uri, HasEvents, GetEvents, NoEvents, urlcode, 25000); + = new PollServiceEventArgs(HttpRequestHandler, uri, HasEvents, GetEvents, NoEvents, Drop, urlcode, 25000); args.Type = PollServiceEventArgs.EventType.LslHttp; m_HttpServer.AddPollServiceHTTPHandler(uri, args); @@ -276,7 +276,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp string uri = "/lslhttps/" + urlcode.ToString() + "/"; PollServiceEventArgs args - = new PollServiceEventArgs(HttpRequestHandler, uri, HasEvents, GetEvents, NoEvents, urlcode, 25000); + = new PollServiceEventArgs(HttpRequestHandler, uri, HasEvents, GetEvents, NoEvents, Drop, urlcode, 25000); args.Type = PollServiceEventArgs.EventType.LslHttp; m_HttpsServer.AddPollServiceHTTPHandler(uri, args); @@ -530,6 +530,28 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp } } } + + private void Drop(UUID requestID, UUID sessionID) + { + UrlData url = null; + lock (m_RequestMap) + { + if (m_RequestMap.ContainsKey(requestID)) + { + url = m_RequestMap[requestID]; + m_RequestMap.Remove(requestID); + if(url != null) + { + lock (url.requests) + { + if(url.requests.ContainsKey(requestID)) + url.requests.Remove(requestID); + } + } + } + } + } + private Hashtable GetEvents(UUID requestID, UUID sessionID) { UrlData url = null; -- cgit v1.1 From e881562d34bcd67b4fb09c499b008db576b7e368 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 17 Jul 2016 14:15:46 +0100 Subject: fix drop on delayed events processing --- .../ClientStack/Linden/Caps/GetMeshModule.cs | 46 ++++++++--- .../ClientStack/Linden/Caps/GetTextureModule.cs | 89 ++++++++++++++-------- .../Linden/Caps/WebFetchInvDescModule.cs | 40 +++++++++- 3 files changed, 130 insertions(+), 45 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs index 7831de3..783c3de 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs @@ -222,6 +222,7 @@ namespace OpenSim.Region.ClientStack.Linden new List(); private Dictionary responses = new Dictionary(); + private HashSet dropedResponses = new HashSet(); private Scene m_scene; private MeshCapsDataThrottler m_throttler; @@ -242,11 +243,13 @@ namespace OpenSim.Region.ClientStack.Linden } }; - Drop= (x, y) => + Drop = (x, y) => { lock (responses) { responses.Remove(x); + lock(dropedResponses) + dropedResponses.Add(x); } }; @@ -307,26 +310,47 @@ namespace OpenSim.Region.ClientStack.Linden if(m_scene.ShuttingDown) return; - // If the avatar is gone, don't bother to get the texture - if (m_scene.GetScenePresence(Id) == null) + lock(responses) { - response = new Hashtable(); + lock(dropedResponses) + { + if(dropedResponses.Contains(requestID)) + { + dropedResponses.Remove(requestID); + return; + } + } + + // If the avatar is gone, don't bother to get the texture + if (m_scene.GetScenePresence(Id) == null) + { + response = new Hashtable(); - response["int_response_code"] = 500; - response["str_response_string"] = "Script timeout"; - response["content_type"] = "text/plain"; - response["keepalive"] = false; - response["reusecontext"] = false; + response["int_response_code"] = 500; + response["str_response_string"] = "Script timeout"; + response["content_type"] = "text/plain"; + response["keepalive"] = false; + response["reusecontext"] = false; - lock (responses) responses[requestID] = new aPollResponse() { bytes = 0, response = response, lod = 0 }; - return; + return; + } } response = m_getMeshHandler.Handle(requestinfo.request); + lock (responses) { + lock(dropedResponses) + { + if(dropedResponses.Contains(requestID)) + { + dropedResponses.Remove(requestID); + return; + } + } + responses[requestID] = new aPollResponse() { bytes = (int)response["int_bytes"], diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs index ee7e291..15c0967 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs @@ -218,6 +218,7 @@ namespace OpenSim.Region.ClientStack.Linden new List(); private Dictionary responses = new Dictionary(); + private HashSet dropedResponses = new HashSet(); private Scene m_scene; private CapsDataThrottler m_throttler = new CapsDataThrottler(100000, 1400000,10000); @@ -237,7 +238,14 @@ namespace OpenSim.Region.ClientStack.Linden } }; - Drop = (x, y) => { lock (responses) responses.Remove(x); }; + Drop = (x, y) => + { + lock (responses) + { + responses.Remove(x); + dropedResponses.Add(x); + } + }; GetEvents = (x, y) => { @@ -307,52 +315,71 @@ namespace OpenSim.Region.ClientStack.Linden if(m_scene.ShuttingDown) return; - if (requestinfo.send503) + lock (responses) { - response = new Hashtable(); + lock(dropedResponses) + { + if(dropedResponses.Contains(requestID)) + { + dropedResponses.Remove(requestID); + return; + } + } - response["int_response_code"] = 503; - response["str_response_string"] = "Throttled"; - response["content_type"] = "text/plain"; - response["keepalive"] = false; - response["reusecontext"] = false; + if (requestinfo.send503) + { + response = new Hashtable(); - Hashtable headers = new Hashtable(); - headers["Retry-After"] = 30; - response["headers"] = headers; - - lock (responses) + response["int_response_code"] = 503; + response["str_response_string"] = "Throttled"; + response["content_type"] = "text/plain"; + response["keepalive"] = false; + response["reusecontext"] = false; + + Hashtable headers = new Hashtable(); + headers["Retry-After"] = 30; + response["headers"] = headers; + responses[requestID] = new aPollResponse() {bytes = 0, response = response}; - return; - } + return; + } // If the avatar is gone, don't bother to get the texture - if (m_scene.GetScenePresence(Id) == null) - { - response = new Hashtable(); + if (m_scene.GetScenePresence(Id) == null) + { + response = new Hashtable(); - response["int_response_code"] = 500; - response["str_response_string"] = "Script timeout"; - response["content_type"] = "text/plain"; - response["keepalive"] = false; - response["reusecontext"] = false; + response["int_response_code"] = 500; + response["str_response_string"] = "Script timeout"; + response["content_type"] = "text/plain"; + response["keepalive"] = false; + response["reusecontext"] = false; - lock (responses) responses[requestID] = new aPollResponse() {bytes = 0, response = response}; - return; + return; + } } - + response = m_getTextureHandler.Handle(requestinfo.request); + lock (responses) { + lock(dropedResponses) + { + if(dropedResponses.Contains(requestID)) + { + dropedResponses.Remove(requestID); + m_throttler.ProcessTime(); + return; + } + } responses[requestID] = new aPollResponse() - { - bytes = (int) response["int_bytes"], - response = response - }; - + { + bytes = (int) response["int_bytes"], + response = response + }; } m_throttler.ProcessTime(); } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index bde94e6..ed5b3dd 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -250,8 +250,8 @@ namespace OpenSim.Region.ClientStack.Linden { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private Dictionary responses = - new Dictionary(); + private Dictionary responses = new Dictionary(); + private HashSet dropedResponses = new HashSet(); private WebFetchInvDescModule m_module; @@ -261,7 +261,16 @@ namespace OpenSim.Region.ClientStack.Linden m_module = module; HasEvents = (x, y) => { lock (responses) return responses.ContainsKey(x); }; - Drop = (x, y) => { lock (responses) responses.Remove(x); }; + + Drop = (x, y) => + { + lock (responses) + { + responses.Remove(x); + lock(dropedResponses) + dropedResponses.Add(x); + } + }; GetEvents = (x, y) => { @@ -367,6 +376,19 @@ namespace OpenSim.Region.ClientStack.Linden UUID requestID = requestinfo.reqID; + + lock(responses) + { + lock(dropedResponses) + { + if(dropedResponses.Contains(requestID)) + { + dropedResponses.Remove(requestID); + return; + } + } + } + Hashtable response = new Hashtable(); response["int_response_code"] = 200; @@ -379,6 +401,18 @@ namespace OpenSim.Region.ClientStack.Linden lock (responses) { + lock(dropedResponses) + { + if(dropedResponses.Contains(requestID)) + { + dropedResponses.Remove(requestID); + requestinfo.folders.Clear(); + requestinfo.request.Clear(); + WebFetchInvDescModule.ProcessedRequestsCount++; + return; + } + } + if (responses.ContainsKey(requestID)) m_log.WarnFormat("[FETCH INVENTORY DESCENDENTS2 MODULE]: Caught in the act of loosing responses! Please report this on mantis #7054"); responses[requestID] = response; -- cgit v1.1 From eaefae7e20c95266ad84ea59912cf8c011ccd1b5 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 17 Jul 2016 22:52:58 +0100 Subject: don't loose inventory items when there are bad folders --- .../Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index ed5b3dd..0277a24 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -61,7 +61,6 @@ namespace OpenSim.Region.ClientStack.Linden public UUID reqID; public Hashtable request; public ScenePresence presence; - public List folders; } private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -296,8 +295,10 @@ namespace OpenSim.Region.ClientStack.Linden reqinfo.reqID = x; reqinfo.request = y; reqinfo.presence = sp; - reqinfo.folders = new List(); +/* why where we doing this? just to get cof ? + List folders = new List(); + // Decode the request here string request = y["body"].ToString(); @@ -333,11 +334,11 @@ namespace OpenSim.Region.ClientStack.Linden UUID folderID; if (UUID.TryParse(folder, out folderID)) { - if (!reqinfo.folders.Contains(folderID)) + if (!folders.Contains(folderID)) { if (sp.COF != UUID.Zero && sp.COF == folderID) highPriority = true; - reqinfo.folders.Add(folderID); + folders.Add(folderID); } } } @@ -345,6 +346,7 @@ namespace OpenSim.Region.ClientStack.Linden if (highPriority) m_queue.PriorityEnqueue(reqinfo); else +*/ m_queue.Enqueue(reqinfo); }; @@ -406,7 +408,6 @@ namespace OpenSim.Region.ClientStack.Linden if(dropedResponses.Contains(requestID)) { dropedResponses.Remove(requestID); - requestinfo.folders.Clear(); requestinfo.request.Clear(); WebFetchInvDescModule.ProcessedRequestsCount++; return; @@ -417,7 +418,6 @@ namespace OpenSim.Region.ClientStack.Linden m_log.WarnFormat("[FETCH INVENTORY DESCENDENTS2 MODULE]: Caught in the act of loosing responses! Please report this on mantis #7054"); responses[requestID] = response; } - requestinfo.folders.Clear(); requestinfo.request.Clear(); WebFetchInvDescModule.ProcessedRequestsCount++; } -- cgit v1.1