diff --git a/OpenSim/Capabilities/Handlers/GetAssets/GetAssetsHandler.cs b/OpenSim/Capabilities/Handlers/GetAssets/GetAssetsHandler.cs index bacccd063f..ddb5665cc3 100644 --- a/OpenSim/Capabilities/Handlers/GetAssets/GetAssetsHandler.cs +++ b/OpenSim/Capabilities/Handlers/GetAssets/GetAssetsHandler.cs @@ -197,19 +197,9 @@ namespace OpenSim.Capabilities.Handlers response.RawBuffer = asset.Data; response.RawBufferLen = len; if (type == AssetType.Mesh || type == AssetType.Texture) - { - if(len > 8196) - { - //if(type == AssetType.Texture && ((asset.Flags & AssetFlags.AvatarBake)!= 0)) - // responsedata["prio"] = 1; - //else - response.Priority = 2; - } - else - response.Priority = 1; - } + response.Priority = 2; else - response.Priority = -1; + response.Priority = 1; } } } \ No newline at end of file diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs index 4726f1bc6b..cf166b3b3c 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureServerConnector.cs @@ -64,7 +64,7 @@ namespace OpenSim.Capabilities.Handlers throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName)); string rurl = serverConfig.GetString("GetTextureRedirectURL"); - ; + server.AddStreamHandler( new GetTextureRobustHandler("/CAPS/GetTexture", m_AssetService, "GetTexture", null, rurl)); } diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/ContextTimeoutManager.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/ContextTimeoutManager.cs index 2b75d75451..fb54d7cd8f 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/ContextTimeoutManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/ContextTimeoutManager.cs @@ -54,9 +54,7 @@ namespace OSHttpServer private static int m_ActiveSendingCount; private static double m_lastTimeOutCheckTime = 0; - private static double m_lastSendCheckTime = 0; - const int m_maxBandWidth = 10485760; //80Mbps const int m_maxConcurrenSend = 32; static ContextTimeoutManager() @@ -86,10 +84,11 @@ namespace OSHttpServer public static void Stop() { - m_shuttingDown = true; - m_processWaitEven.Set(); - //m_internalThread.Join(); - //ProcessShutDown(); + if (m_processWaitEven != null) + { + m_processWaitEven.Set(); + m_shuttingDown = true; + } } private static void ThreadRunProcess() @@ -98,13 +97,16 @@ namespace OSHttpServer { m_processWaitEven.WaitOne(500); - if(m_shuttingDown) - return; + if (m_shuttingDown) + break; double now = GetTimeStamp(); if(m_contexts.Count > 0) { - ProcessSendQueues(now); + ProcessSendQueues(); + + if (m_shuttingDown) + break; if (now - m_lastTimeOutCheckTime > 1.0) { @@ -115,26 +117,30 @@ namespace OSHttpServer else m_lastTimeOutCheckTime = now; } + ProcessShutDown(); } public static void ProcessShutDown() { try { - SocketError disconnectError = SocketError.HostDown; - for (int i = 0; i < m_contexts.Count; i++) + if(m_processWaitEven != null) { - if (m_contexts.TryDequeue(out HttpClientContext context)) + SocketError disconnectError = SocketError.HostDown; + for (int i = 0; i < m_contexts.Count; i++) { - try + if (m_contexts.TryDequeue(out HttpClientContext context)) { - context.Disconnect(disconnectError); + try + { + context.Disconnect(disconnectError); + } + catch { } } - catch { } } + m_processWaitEven.Dispose(); + m_processWaitEven = null; } - m_processWaitEven.Dispose(); - m_processWaitEven = null; } catch { @@ -142,32 +148,21 @@ namespace OSHttpServer } } - public static void ProcessSendQueues(double now) + public static void ProcessSendQueues() { int inqueues = m_highPrio.Count + m_midPrio.Count + m_lowPrio.Count; if(inqueues == 0) return; - double dt = now - m_lastSendCheckTime; - m_lastSendCheckTime = now; + const int curbytesLimit = 128 * 1024; - int totalSending = m_ActiveSendingCount; - - int curConcurrentLimit = m_maxConcurrenSend - totalSending; + int curConcurrentLimit = m_maxConcurrenSend - m_ActiveSendingCount; if(curConcurrentLimit <= 0) return; if(curConcurrentLimit > inqueues) curConcurrentLimit = inqueues; - if (dt > 0.5) - dt = 0.5; - - dt /= curConcurrentLimit; - int curbytesLimit = (int)(m_maxBandWidth * dt); - if(curbytesLimit < 1024) - curbytesLimit = 1024; - HttpClientContext ctx; int sent; while (curConcurrentLimit > 0) @@ -175,49 +170,39 @@ namespace OSHttpServer sent = 0; while (m_highPrio.TryDequeue(out ctx)) { - if(TrySend(ctx, curbytesLimit)) - m_highPrio.Enqueue(ctx); - if (m_shuttingDown) return; - --curConcurrentLimit; - if (++sent == 4) - break; + if (ctx.TrySendResponse(curbytesLimit)) + { + --curConcurrentLimit; + if (++sent == 3) + break; + } } sent = 0; while(m_midPrio.TryDequeue(out ctx)) { - if(TrySend(ctx, curbytesLimit)) - m_midPrio.Enqueue(ctx); - if (m_shuttingDown) return; - --curConcurrentLimit; - if (++sent >= 2) - break; + if (ctx.TrySendResponse(curbytesLimit)) + { + --curConcurrentLimit; + if (++sent >= 2) + break; + } } if (m_lowPrio.TryDequeue(out ctx)) { - --curConcurrentLimit; - if(TrySend(ctx, curbytesLimit)) - m_lowPrio.Enqueue(ctx); + if (m_shuttingDown) + return; + if (ctx.TrySendResponse(curbytesLimit)) + --curConcurrentLimit; } - - if (m_shuttingDown) - return; } } - private static bool TrySend(HttpClientContext ctx, int bytesLimit) - { - if(!ctx.CanSend()) - return false; - - return ctx.TrySendResponse(bytesLimit); - } - /// /// Causes the watcher to immediately check the connections. /// diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs index 4247b4ee21..6c6836ff13 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs @@ -528,7 +528,7 @@ namespace OSHttpServer LastActivityTimeMS = ContextTimeoutManager.EnvironmentTickCount(); m_currentResponse?.SendNextAsync(bytesLimit); - return false; + return true; } public void ContinueSendResponse(bool notThrottled) diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpResponse.cs index 9bc6f87282..396f0dde6c 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpResponse.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpResponse.cs @@ -352,11 +352,6 @@ namespace OSHttpServer { if(!await m_context.SendAsync(m_headerBytes, 0, m_headerBytes.Length).ConfigureAwait(false)) { - if (m_context.CanSend()) - { - m_context.ContinueSendResponse(true); - return; - } if (m_body != null) m_body.Dispose(); RawBuffer = null; @@ -367,50 +362,49 @@ namespace OSHttpServer m_headerBytes = null; if(bytesLimit <= 0) { - m_context.ContinueSendResponse(true); + m_context.ContinueSendResponse(false); return; } } - if (RawBuffer != null) + bool sendRes; + if (RawBuffer != null && RawBufferLen > 0) { - if (RawBufferLen > 0) + if (BandWitdhEvent != null) { - if(BandWitdhEvent!=null) - bytesLimit = CheckBandwidth(RawBufferLen, bytesLimit); - - bool sendRes; - if(RawBufferLen > bytesLimit) + bytesLimit = CheckBandwidth(RawBufferLen, bytesLimit); + if (bytesLimit <= 0) { - sendRes = (await m_context.SendAsync(RawBuffer, RawBufferStart, bytesLimit).ConfigureAwait(false)); - if (sendRes) - { - RawBufferLen -= bytesLimit; - RawBufferStart += bytesLimit; - } - } - else - { - sendRes = await m_context.SendAsync(RawBuffer, RawBufferStart, RawBufferLen).ConfigureAwait(false); - if(sendRes) - RawBufferLen = 0; - } - - if (!sendRes) - { - if (m_context.CanSend()) - { - m_context.ContinueSendResponse(true); - return; - } - - RawBuffer = null; - if(m_body != null) - Body.Dispose(); - Sent = true; + m_context.ContinueSendResponse(false); return; } } + + if(RawBufferLen > bytesLimit) + { + sendRes = (await m_context.SendAsync(RawBuffer, RawBufferStart, bytesLimit).ConfigureAwait(false)); + if (sendRes) + { + RawBufferLen -= bytesLimit; + RawBufferStart += bytesLimit; + } + } + else + { + sendRes = await m_context.SendAsync(RawBuffer, RawBufferStart, RawBufferLen).ConfigureAwait(false); + if(sendRes) + RawBufferLen = 0; + } + + if (!sendRes) + { + RawBuffer = null; + if(m_body != null) + Body.Dispose(); + Sent = true; + return; + } + if (RawBufferLen <= 0) RawBuffer = null; else @@ -431,7 +425,16 @@ namespace OSHttpServer if(RawBufferLen > 0) { - bool sendRes; + if (BandWitdhEvent != null) + { + bytesLimit = CheckBandwidth(RawBufferLen, bytesLimit); + if (bytesLimit <= 0) + { + m_context.ContinueSendResponse(false); + return; + } + } + if (RawBufferLen > bytesLimit) { sendRes = await m_context.SendAsync(RawBuffer, RawBufferStart, bytesLimit).ConfigureAwait(false); @@ -450,11 +453,6 @@ namespace OSHttpServer if (!sendRes) { - if (m_context.CanSend()) - { - m_context.ContinueSendResponse(true); - return; - } RawBuffer = null; Sent = true; return; @@ -475,14 +473,17 @@ namespace OSHttpServer private int CheckBandwidth(int request, int bytesLimit) { - if(request > bytesLimit) + if (request > bytesLimit) request = bytesLimit; var args = new BandWitdhEventArgs(request); - BandWitdhEvent?.Invoke(this, args); - if(args.Result > 8196) + try + { + BandWitdhEvent?.Invoke(this, args); return args.Result; + } + catch { } - return 8196; + return request; } public void Clear() diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetAssetsModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetAssetsModule.cs index 9fc44be502..421594eff1 100755 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetAssetsModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetAssetsModule.cs @@ -203,24 +203,32 @@ namespace OpenSim.Region.ClientStack.Linden { lock (responses) { + return responses.ContainsKey(requestID); + /* APollResponse response; if (responses.TryGetValue(requestID, out response)) { ScenePresence sp = m_scene.GetScenePresence(pId); - if (sp == null || sp.IsDeleted) - return true; - OSHttpResponse resp = response.osresponse; + if (sp == null || sp.IsDeleted) + { + resp.SetBandWitdh((source, value) => + { + value.Result = 8196; + }); + return true; + } + int prio = resp.Priority; - if(Util.GetTimeStamp() - resp.RequestTS > (resp.RawBufferLen > 2000000 ? 10 : 5)) - return sp.CapCanSendAsset(2, resp.RawBufferLen); - - if (resp.Priority > 0) - return sp.CapCanSendAsset(resp.Priority, resp.RawBufferLen); - return sp.CapCanSendAsset(2, resp.RawBufferLen); + resp.SetBandWitdh((source, value) => + { + value.Result = sp.BandLimit(prio, resp.RequestTS, value.Request); + }); + return true; } return false; + */ } };