diff options
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | 101 |
1 files changed, 56 insertions, 45 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index 025ffea..8d4e561 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | |||
@@ -34,9 +34,7 @@ using log4net; | |||
34 | using Nini.Config; | 34 | using Nini.Config; |
35 | using Mono.Addins; | 35 | using Mono.Addins; |
36 | using OpenMetaverse; | 36 | using OpenMetaverse; |
37 | using OpenMetaverse.StructuredData; | ||
38 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
39 | using OpenSim.Framework.Monitoring; | ||
40 | using OpenSim.Framework.Servers; | 38 | using OpenSim.Framework.Servers; |
41 | using OpenSim.Framework.Servers.HttpServer; | 39 | using OpenSim.Framework.Servers.HttpServer; |
42 | using OpenSim.Region.Framework.Interfaces; | 40 | using OpenSim.Region.Framework.Interfaces; |
@@ -45,6 +43,9 @@ using OpenSim.Framework.Capabilities; | |||
45 | using OpenSim.Services.Interfaces; | 43 | using OpenSim.Services.Interfaces; |
46 | using Caps = OpenSim.Framework.Capabilities.Caps; | 44 | using Caps = OpenSim.Framework.Capabilities.Caps; |
47 | using OpenSim.Capabilities.Handlers; | 45 | using OpenSim.Capabilities.Handlers; |
46 | using OpenSim.Framework.Monitoring; | ||
47 | |||
48 | using OpenMetaverse.StructuredData; | ||
48 | 49 | ||
49 | namespace OpenSim.Region.ClientStack.Linden | 50 | namespace OpenSim.Region.ClientStack.Linden |
50 | { | 51 | { |
@@ -63,7 +64,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
63 | public List<UUID> folders; | 64 | public List<UUID> folders; |
64 | } | 65 | } |
65 | 66 | ||
66 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 67 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
67 | 68 | ||
68 | /// <summary> | 69 | /// <summary> |
69 | /// Control whether requests will be processed asynchronously. | 70 | /// Control whether requests will be processed asynchronously. |
@@ -92,14 +93,16 @@ namespace OpenSim.Region.ClientStack.Linden | |||
92 | private bool m_Enabled; | 93 | private bool m_Enabled; |
93 | 94 | ||
94 | private string m_fetchInventoryDescendents2Url; | 95 | private string m_fetchInventoryDescendents2Url; |
95 | private string m_webFetchInventoryDescendentsUrl; | 96 | // private string m_webFetchInventoryDescendentsUrl; |
96 | 97 | ||
97 | private static FetchInvDescHandler m_webFetchHandler; | 98 | private static FetchInvDescHandler m_webFetchHandler; |
98 | 99 | ||
99 | private static Thread[] m_workerThreads = null; | 100 | private static Thread[] m_workerThreads = null; |
100 | 101 | ||
101 | private static DoubleQueue<aPollRequest> m_queue = | 102 | private static OpenSim.Framework.BlockingQueue<aPollRequest> m_queue = |
102 | new DoubleQueue<aPollRequest>(); | 103 | new OpenSim.Framework.BlockingQueue<aPollRequest>(); |
104 | |||
105 | private static int m_NumberScenes = 0; | ||
103 | 106 | ||
104 | #region ISharedRegionModule Members | 107 | #region ISharedRegionModule Members |
105 | 108 | ||
@@ -117,9 +120,10 @@ namespace OpenSim.Region.ClientStack.Linden | |||
117 | return; | 120 | return; |
118 | 121 | ||
119 | m_fetchInventoryDescendents2Url = config.GetString("Cap_FetchInventoryDescendents2", string.Empty); | 122 | m_fetchInventoryDescendents2Url = config.GetString("Cap_FetchInventoryDescendents2", string.Empty); |
120 | m_webFetchInventoryDescendentsUrl = config.GetString("Cap_WebFetchInventoryDescendents", string.Empty); | 123 | // m_webFetchInventoryDescendentsUrl = config.GetString("Cap_WebFetchInventoryDescendents", string.Empty); |
121 | 124 | ||
122 | if (m_fetchInventoryDescendents2Url != string.Empty || m_webFetchInventoryDescendentsUrl != string.Empty) | 125 | // if (m_fetchInventoryDescendents2Url != string.Empty || m_webFetchInventoryDescendentsUrl != string.Empty) |
126 | if (m_fetchInventoryDescendents2Url != string.Empty) | ||
123 | { | 127 | { |
124 | m_Enabled = true; | 128 | m_Enabled = true; |
125 | } | 129 | } |
@@ -143,17 +147,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
143 | StatsManager.DeregisterStat(s_processedRequestsStat); | 147 | StatsManager.DeregisterStat(s_processedRequestsStat); |
144 | StatsManager.DeregisterStat(s_queuedRequestsStat); | 148 | StatsManager.DeregisterStat(s_queuedRequestsStat); |
145 | 149 | ||
146 | if (ProcessQueuedRequestsAsync) | 150 | m_NumberScenes--; |
147 | { | ||
148 | if (m_workerThreads != null) | ||
149 | { | ||
150 | foreach (Thread t in m_workerThreads) | ||
151 | Watchdog.AbortThread(t.ManagedThreadId); | ||
152 | |||
153 | m_workerThreads = null; | ||
154 | } | ||
155 | } | ||
156 | |||
157 | Scene = null; | 151 | Scene = null; |
158 | } | 152 | } |
159 | 153 | ||
@@ -187,7 +181,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
187 | "httpfetch", | 181 | "httpfetch", |
188 | StatType.Pull, | 182 | StatType.Pull, |
189 | MeasuresOfInterest.AverageChangeOverTime, | 183 | MeasuresOfInterest.AverageChangeOverTime, |
190 | stat => { stat.Value = m_queue.Count; }, | 184 | stat => { stat.Value = m_queue.Count(); }, |
191 | StatVerbosity.Debug); | 185 | StatVerbosity.Debug); |
192 | 186 | ||
193 | StatsManager.RegisterStat(s_processedRequestsStat); | 187 | StatsManager.RegisterStat(s_processedRequestsStat); |
@@ -201,6 +195,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
201 | 195 | ||
202 | Scene.EventManager.OnRegisterCaps += RegisterCaps; | 196 | Scene.EventManager.OnRegisterCaps += RegisterCaps; |
203 | 197 | ||
198 | m_NumberScenes++; | ||
199 | |||
204 | int nworkers = 2; // was 2 | 200 | int nworkers = 2; // was 2 |
205 | if (ProcessQueuedRequestsAsync && m_workerThreads == null) | 201 | if (ProcessQueuedRequestsAsync && m_workerThreads == null) |
206 | { | 202 | { |
@@ -211,7 +207,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
211 | m_workerThreads[i] = WorkManager.StartThread(DoInventoryRequests, | 207 | m_workerThreads[i] = WorkManager.StartThread(DoInventoryRequests, |
212 | String.Format("InventoryWorkerThread{0}", i), | 208 | String.Format("InventoryWorkerThread{0}", i), |
213 | ThreadPriority.Normal, | 209 | ThreadPriority.Normal, |
214 | false, | 210 | true, |
215 | true, | 211 | true, |
216 | null, | 212 | null, |
217 | int.MaxValue); | 213 | int.MaxValue); |
@@ -223,7 +219,23 @@ namespace OpenSim.Region.ClientStack.Linden | |||
223 | { | 219 | { |
224 | } | 220 | } |
225 | 221 | ||
226 | public void Close() { } | 222 | public void Close() |
223 | { | ||
224 | if (!m_Enabled) | ||
225 | return; | ||
226 | |||
227 | if (ProcessQueuedRequestsAsync) | ||
228 | { | ||
229 | if (m_NumberScenes <= 0 && m_workerThreads != null) | ||
230 | { | ||
231 | m_log.DebugFormat("[WebFetchInvDescModule] Closing"); | ||
232 | foreach (Thread t in m_workerThreads) | ||
233 | Watchdog.AbortThread(t.ManagedThreadId); | ||
234 | |||
235 | m_workerThreads = null; | ||
236 | } | ||
237 | } | ||
238 | } | ||
227 | 239 | ||
228 | public string Name { get { return "WebFetchInvDescModule"; } } | 240 | public string Name { get { return "WebFetchInvDescModule"; } } |
229 | 241 | ||
@@ -312,16 +324,17 @@ namespace OpenSim.Region.ClientStack.Linden | |||
312 | { | 324 | { |
313 | if (!reqinfo.folders.Contains(folderID)) | 325 | if (!reqinfo.folders.Contains(folderID)) |
314 | { | 326 | { |
315 | //TODO: Port COF handling from Avination | 327 | if (sp.COF != UUID.Zero && sp.COF == folderID) |
328 | highPriority = true; | ||
316 | reqinfo.folders.Add(folderID); | 329 | reqinfo.folders.Add(folderID); |
317 | } | 330 | } |
318 | } | 331 | } |
319 | } | 332 | } |
320 | 333 | ||
321 | if (highPriority) | 334 | if (highPriority) |
322 | m_queue.EnqueueHigh(reqinfo); | 335 | m_queue.PriorityEnqueue(reqinfo); |
323 | else | 336 | else |
324 | m_queue.EnqueueLow(reqinfo); | 337 | m_queue.Enqueue(reqinfo); |
325 | }; | 338 | }; |
326 | 339 | ||
327 | NoEvents = (x, y) => | 340 | NoEvents = (x, y) => |
@@ -347,6 +360,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
347 | 360 | ||
348 | public void Process(aPollRequest requestinfo) | 361 | public void Process(aPollRequest requestinfo) |
349 | { | 362 | { |
363 | if(m_module == null || m_module.Scene == null || m_module.Scene.ShuttingDown) | ||
364 | return; | ||
365 | |||
350 | UUID requestID = requestinfo.reqID; | 366 | UUID requestID = requestinfo.reqID; |
351 | 367 | ||
352 | Hashtable response = new Hashtable(); | 368 | Hashtable response = new Hashtable(); |
@@ -365,7 +381,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
365 | m_log.WarnFormat("[FETCH INVENTORY DESCENDENTS2 MODULE]: Caught in the act of loosing responses! Please report this on mantis #7054"); | 381 | m_log.WarnFormat("[FETCH INVENTORY DESCENDENTS2 MODULE]: Caught in the act of loosing responses! Please report this on mantis #7054"); |
366 | responses[requestID] = response; | 382 | responses[requestID] = response; |
367 | } | 383 | } |
368 | 384 | requestinfo.folders.Clear(); | |
385 | requestinfo.request.Clear(); | ||
369 | WebFetchInvDescModule.ProcessedRequestsCount++; | 386 | WebFetchInvDescModule.ProcessedRequestsCount++; |
370 | } | 387 | } |
371 | } | 388 | } |
@@ -422,31 +439,25 @@ namespace OpenSim.Region.ClientStack.Linden | |||
422 | // } | 439 | // } |
423 | // } | 440 | // } |
424 | 441 | ||
425 | private void DoInventoryRequests() | 442 | private static void DoInventoryRequests() |
426 | { | 443 | { |
427 | while (true) | 444 | while (true) |
428 | { | 445 | { |
446 | aPollRequest poolreq = m_queue.Dequeue(4500); | ||
429 | Watchdog.UpdateThread(); | 447 | Watchdog.UpdateThread(); |
430 | 448 | ||
431 | WaitProcessQueuedInventoryRequest(); | 449 | if (poolreq != null && poolreq.thepoll != null) |
432 | } | ||
433 | } | ||
434 | |||
435 | public void WaitProcessQueuedInventoryRequest() | ||
436 | { | ||
437 | aPollRequest poolreq = m_queue.Dequeue(); | ||
438 | |||
439 | if (poolreq != null && poolreq.thepoll != null) | ||
440 | { | ||
441 | try | ||
442 | { | ||
443 | poolreq.thepoll.Process(poolreq); | ||
444 | } | ||
445 | catch (Exception e) | ||
446 | { | 450 | { |
447 | m_log.ErrorFormat( | 451 | try |
448 | "[INVENTORY]: Failed to process queued inventory request {0} for {1} in {2}. Exception {3}", | 452 | { |
449 | poolreq.reqID, poolreq.presence != null ? poolreq.presence.Name : "unknown", Scene.Name, e); | 453 | poolreq.thepoll.Process(poolreq); |
454 | } | ||
455 | catch (Exception e) | ||
456 | { | ||
457 | m_log.ErrorFormat( | ||
458 | "[INVENTORY]: Failed to process queued inventory request {0} for {1}. Exception {2}", | ||
459 | poolreq.reqID, poolreq.presence != null ? poolreq.presence.Name : "unknown", e); | ||
460 | } | ||
450 | } | 461 | } |
451 | } | 462 | } |
452 | } | 463 | } |