diff options
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs | 20 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | 145 |
2 files changed, 43 insertions, 122 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs b/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs index e0a11cc..87d3d1c 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/FetchInventory2Module.cs | |||
@@ -25,16 +25,20 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using Mono.Addins; | 28 | using System; |
29 | using System.Collections; | ||
30 | using System.Reflection; | ||
31 | using log4net; | ||
29 | using Nini.Config; | 32 | using Nini.Config; |
33 | using Mono.Addins; | ||
30 | using OpenMetaverse; | 34 | using OpenMetaverse; |
31 | using OpenSim.Capabilities.Handlers; | 35 | using OpenSim.Framework; |
32 | using OpenSim.Framework.Servers.HttpServer; | 36 | using OpenSim.Framework.Servers.HttpServer; |
33 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
34 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
35 | using OpenSim.Services.Interfaces; | 39 | using OpenSim.Services.Interfaces; |
36 | using System; | ||
37 | using Caps = OpenSim.Framework.Capabilities.Caps; | 40 | using Caps = OpenSim.Framework.Capabilities.Caps; |
41 | using OpenSim.Capabilities.Handlers; | ||
38 | 42 | ||
39 | namespace OpenSim.Region.ClientStack.Linden | 43 | namespace OpenSim.Region.ClientStack.Linden |
40 | { | 44 | { |
@@ -54,6 +58,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
54 | 58 | ||
55 | private string m_fetchInventory2Url; | 59 | private string m_fetchInventory2Url; |
56 | 60 | ||
61 | private FetchInventory2Handler m_fetchHandler; | ||
62 | |||
57 | #region ISharedRegionModule Members | 63 | #region ISharedRegionModule Members |
58 | 64 | ||
59 | public void Initialise(IConfigSource source) | 65 | public void Initialise(IConfigSource source) |
@@ -92,6 +98,10 @@ namespace OpenSim.Region.ClientStack.Linden | |||
92 | 98 | ||
93 | m_inventoryService = m_scene.InventoryService; | 99 | m_inventoryService = m_scene.InventoryService; |
94 | 100 | ||
101 | // We'll reuse the same handler for all requests. | ||
102 | if (m_fetchInventory2Url == "localhost") | ||
103 | m_fetchHandler = new FetchInventory2Handler(m_inventoryService); | ||
104 | |||
95 | m_scene.EventManager.OnRegisterCaps += RegisterCaps; | 105 | m_scene.EventManager.OnRegisterCaps += RegisterCaps; |
96 | } | 106 | } |
97 | 107 | ||
@@ -121,11 +131,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
121 | { | 131 | { |
122 | capUrl = "/CAPS/" + UUID.Random(); | 132 | capUrl = "/CAPS/" + UUID.Random(); |
123 | 133 | ||
124 | FetchInventory2Handler fetchHandler = new FetchInventory2Handler(m_inventoryService, agentID); | ||
125 | |||
126 | IRequestHandler reqHandler | 134 | IRequestHandler reqHandler |
127 | = new RestStreamHandler( | 135 | = new RestStreamHandler( |
128 | "POST", capUrl, fetchHandler.FetchInventoryRequest, capName, agentID.ToString()); | 136 | "POST", capUrl, m_fetchHandler.FetchInventoryRequest, capName, agentID.ToString()); |
129 | 137 | ||
130 | caps.RegisterHandler(capName, reqHandler); | 138 | caps.RegisterHandler(capName, reqHandler); |
131 | } | 139 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index 2a252e1..5f3e66a 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | |||
@@ -66,26 +66,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
66 | 66 | ||
67 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 67 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
68 | 68 | ||
69 | /// <summary> | 69 | private Scene m_scene; |
70 | /// Control whether requests will be processed asynchronously. | ||
71 | /// </summary> | ||
72 | /// <remarks> | ||
73 | /// Defaults to true. Can currently not be changed once a region has been added to the module. | ||
74 | /// </remarks> | ||
75 | public bool ProcessQueuedRequestsAsync { get; private set; } | ||
76 | |||
77 | /// <summary> | ||
78 | /// Number of inventory requests processed by this module. | ||
79 | /// </summary> | ||
80 | /// <remarks> | ||
81 | /// It's the PollServiceRequestManager that actually sends completed requests back to the requester. | ||
82 | /// </remarks> | ||
83 | public static int ProcessedRequestsCount { get; set; } | ||
84 | |||
85 | private static Stat s_queuedRequestsStat; | ||
86 | private static Stat s_processedRequestsStat; | ||
87 | |||
88 | public Scene Scene { get; private set; } | ||
89 | 70 | ||
90 | private IInventoryService m_InventoryService; | 71 | private IInventoryService m_InventoryService; |
91 | private ILibraryService m_LibraryService; | 72 | private ILibraryService m_LibraryService; |
@@ -95,7 +76,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
95 | private string m_fetchInventoryDescendents2Url; | 76 | private string m_fetchInventoryDescendents2Url; |
96 | private string m_webFetchInventoryDescendentsUrl; | 77 | private string m_webFetchInventoryDescendentsUrl; |
97 | 78 | ||
98 | private static FetchInvDescHandler m_webFetchHandler; | 79 | private static WebFetchInvDescHandler m_webFetchHandler; |
99 | 80 | ||
100 | private static Thread[] m_workerThreads = null; | 81 | private static Thread[] m_workerThreads = null; |
101 | 82 | ||
@@ -104,13 +85,6 @@ namespace OpenSim.Region.ClientStack.Linden | |||
104 | 85 | ||
105 | #region ISharedRegionModule Members | 86 | #region ISharedRegionModule Members |
106 | 87 | ||
107 | public WebFetchInvDescModule() : this(true) {} | ||
108 | |||
109 | public WebFetchInvDescModule(bool processQueuedResultsAsync) | ||
110 | { | ||
111 | ProcessQueuedRequestsAsync = processQueuedResultsAsync; | ||
112 | } | ||
113 | |||
114 | public void Initialise(IConfigSource source) | 88 | public void Initialise(IConfigSource source) |
115 | { | 89 | { |
116 | IConfig config = source.Configs["ClientStack.LindenCaps"]; | 90 | IConfig config = source.Configs["ClientStack.LindenCaps"]; |
@@ -118,9 +92,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
118 | return; | 92 | return; |
119 | 93 | ||
120 | m_fetchInventoryDescendents2Url = config.GetString("Cap_FetchInventoryDescendents2", string.Empty); | 94 | m_fetchInventoryDescendents2Url = config.GetString("Cap_FetchInventoryDescendents2", string.Empty); |
121 | // m_webFetchInventoryDescendentsUrl = config.GetString("Cap_WebFetchInventoryDescendents", string.Empty); | 95 | m_webFetchInventoryDescendentsUrl = config.GetString("Cap_WebFetchInventoryDescendents", string.Empty); |
122 | 96 | ||
123 | // if (m_fetchInventoryDescendents2Url != string.Empty || m_webFetchInventoryDescendentsUrl != string.Empty) | ||
124 | if (m_fetchInventoryDescendents2Url != string.Empty || m_webFetchInventoryDescendentsUrl != string.Empty) | 97 | if (m_fetchInventoryDescendents2Url != string.Empty || m_webFetchInventoryDescendentsUrl != string.Empty) |
125 | { | 98 | { |
126 | m_Enabled = true; | 99 | m_Enabled = true; |
@@ -132,7 +105,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
132 | if (!m_Enabled) | 105 | if (!m_Enabled) |
133 | return; | 106 | return; |
134 | 107 | ||
135 | Scene = s; | 108 | m_scene = s; |
136 | } | 109 | } |
137 | 110 | ||
138 | public void RemoveRegion(Scene s) | 111 | public void RemoveRegion(Scene s) |
@@ -140,23 +113,12 @@ namespace OpenSim.Region.ClientStack.Linden | |||
140 | if (!m_Enabled) | 113 | if (!m_Enabled) |
141 | return; | 114 | return; |
142 | 115 | ||
143 | Scene.EventManager.OnRegisterCaps -= RegisterCaps; | 116 | m_scene.EventManager.OnRegisterCaps -= RegisterCaps; |
144 | 117 | ||
145 | StatsManager.DeregisterStat(s_processedRequestsStat); | 118 | foreach (Thread t in m_workerThreads) |
146 | StatsManager.DeregisterStat(s_queuedRequestsStat); | 119 | Watchdog.AbortThread(t.ManagedThreadId); |
147 | |||
148 | if (ProcessQueuedRequestsAsync) | ||
149 | { | ||
150 | if (m_workerThreads != null) | ||
151 | { | ||
152 | foreach (Thread t in m_workerThreads) | ||
153 | Watchdog.AbortThread(t.ManagedThreadId); | ||
154 | 120 | ||
155 | m_workerThreads = null; | 121 | m_scene = null; |
156 | } | ||
157 | } | ||
158 | |||
159 | Scene = null; | ||
160 | } | 122 | } |
161 | 123 | ||
162 | public void RegionLoaded(Scene s) | 124 | public void RegionLoaded(Scene s) |
@@ -164,51 +126,19 @@ namespace OpenSim.Region.ClientStack.Linden | |||
164 | if (!m_Enabled) | 126 | if (!m_Enabled) |
165 | return; | 127 | return; |
166 | 128 | ||
167 | if (s_processedRequestsStat == null) | 129 | m_InventoryService = m_scene.InventoryService; |
168 | s_processedRequestsStat = | 130 | m_LibraryService = m_scene.LibraryService; |
169 | new Stat( | ||
170 | "ProcessedFetchInventoryRequests", | ||
171 | "Number of processed fetch inventory requests", | ||
172 | "These have not necessarily yet been dispatched back to the requester.", | ||
173 | "", | ||
174 | "inventory", | ||
175 | "httpfetch", | ||
176 | StatType.Pull, | ||
177 | MeasuresOfInterest.AverageChangeOverTime, | ||
178 | stat => { stat.Value = ProcessedRequestsCount; }, | ||
179 | StatVerbosity.Debug); | ||
180 | |||
181 | if (s_queuedRequestsStat == null) | ||
182 | s_queuedRequestsStat = | ||
183 | new Stat( | ||
184 | "QueuedFetchInventoryRequests", | ||
185 | "Number of fetch inventory requests queued for processing", | ||
186 | "", | ||
187 | "", | ||
188 | "inventory", | ||
189 | "httpfetch", | ||
190 | StatType.Pull, | ||
191 | MeasuresOfInterest.AverageChangeOverTime, | ||
192 | stat => { stat.Value = m_queue.Count; }, | ||
193 | StatVerbosity.Debug); | ||
194 | |||
195 | StatsManager.RegisterStat(s_processedRequestsStat); | ||
196 | StatsManager.RegisterStat(s_queuedRequestsStat); | ||
197 | |||
198 | m_InventoryService = Scene.InventoryService; | ||
199 | m_LibraryService = Scene.LibraryService; | ||
200 | 131 | ||
201 | // We'll reuse the same handler for all requests. | 132 | // We'll reuse the same handler for all requests. |
202 | m_webFetchHandler = new FetchInvDescHandler(m_InventoryService, m_LibraryService, Scene); | 133 | m_webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService); |
203 | 134 | ||
204 | Scene.EventManager.OnRegisterCaps += RegisterCaps; | 135 | m_scene.EventManager.OnRegisterCaps += RegisterCaps; |
205 | 136 | ||
206 | int nworkers = 2; // was 2 | 137 | if (m_workerThreads == null) |
207 | if (ProcessQueuedRequestsAsync && m_workerThreads == null) | ||
208 | { | 138 | { |
209 | m_workerThreads = new Thread[nworkers]; | 139 | m_workerThreads = new Thread[2]; |
210 | 140 | ||
211 | for (uint i = 0; i < nworkers; i++) | 141 | for (uint i = 0; i < 2; i++) |
212 | { | 142 | { |
213 | m_workerThreads[i] = WorkManager.StartThread(DoInventoryRequests, | 143 | m_workerThreads[i] = WorkManager.StartThread(DoInventoryRequests, |
214 | String.Format("InventoryWorkerThread{0}", i), | 144 | String.Format("InventoryWorkerThread{0}", i), |
@@ -243,12 +173,12 @@ namespace OpenSim.Region.ClientStack.Linden | |||
243 | private Dictionary<UUID, Hashtable> responses = | 173 | private Dictionary<UUID, Hashtable> responses = |
244 | new Dictionary<UUID, Hashtable>(); | 174 | new Dictionary<UUID, Hashtable>(); |
245 | 175 | ||
246 | private WebFetchInvDescModule m_module; | 176 | private Scene m_scene; |
247 | 177 | ||
248 | public PollServiceInventoryEventArgs(WebFetchInvDescModule module, string url, UUID pId) : | 178 | public PollServiceInventoryEventArgs(Scene scene, string url, UUID pId) : |
249 | base(null, url, null, null, null, pId, int.MaxValue) | 179 | base(null, url, null, null, null, pId, int.MaxValue) |
250 | { | 180 | { |
251 | m_module = module; | 181 | m_scene = scene; |
252 | 182 | ||
253 | HasEvents = (x, y) => { lock (responses) return responses.ContainsKey(x); }; | 183 | HasEvents = (x, y) => { lock (responses) return responses.ContainsKey(x); }; |
254 | GetEvents = (x, y) => | 184 | GetEvents = (x, y) => |
@@ -268,7 +198,12 @@ namespace OpenSim.Region.ClientStack.Linden | |||
268 | 198 | ||
269 | Request = (x, y) => | 199 | Request = (x, y) => |
270 | { | 200 | { |
271 | ScenePresence sp = m_module.Scene.GetScenePresence(Id); | 201 | ScenePresence sp = m_scene.GetScenePresence(Id); |
202 | if (sp == null) | ||
203 | { | ||
204 | m_log.ErrorFormat("[INVENTORY]: Unable to find ScenePresence for {0}", Id); | ||
205 | return; | ||
206 | } | ||
272 | 207 | ||
273 | aPollRequest reqinfo = new aPollRequest(); | 208 | aPollRequest reqinfo = new aPollRequest(); |
274 | reqinfo.thepoll = this; | 209 | reqinfo.thepoll = this; |
@@ -363,13 +298,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
363 | requestinfo.request["body"].ToString(), String.Empty, String.Empty, null, null); | 298 | requestinfo.request["body"].ToString(), String.Empty, String.Empty, null, null); |
364 | 299 | ||
365 | lock (responses) | 300 | lock (responses) |
366 | { | ||
367 | if (responses.ContainsKey(requestID)) | ||
368 | m_log.WarnFormat("[FETCH INVENTORY DESCENDENTS2 MODULE]: Caught in the act of loosing responses! Please report this on mantis #7054"); | ||
369 | responses[requestID] = response; | 301 | responses[requestID] = response; |
370 | } | ||
371 | |||
372 | WebFetchInvDescModule.ProcessedRequestsCount++; | ||
373 | } | 302 | } |
374 | } | 303 | } |
375 | 304 | ||
@@ -393,7 +322,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
393 | capUrl = "/CAPS/" + UUID.Random() + "/"; | 322 | capUrl = "/CAPS/" + UUID.Random() + "/"; |
394 | 323 | ||
395 | // Register this as a poll service | 324 | // Register this as a poll service |
396 | PollServiceInventoryEventArgs args = new PollServiceInventoryEventArgs(this, capUrl, agentID); | 325 | PollServiceInventoryEventArgs args = new PollServiceInventoryEventArgs(m_scene, capUrl, agentID); |
397 | args.Type = PollServiceEventArgs.EventType.Inventory; | 326 | args.Type = PollServiceEventArgs.EventType.Inventory; |
398 | 327 | ||
399 | caps.RegisterPollHandler(capName, args); | 328 | caps.RegisterPollHandler(capName, args); |
@@ -402,7 +331,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
402 | else | 331 | else |
403 | { | 332 | { |
404 | capUrl = url; | 333 | capUrl = url; |
405 | IExternalCapsModule handler = Scene.RequestModuleInterface<IExternalCapsModule>(); | 334 | IExternalCapsModule handler = m_scene.RequestModuleInterface<IExternalCapsModule>(); |
406 | if (handler != null) | 335 | if (handler != null) |
407 | handler.RegisterExternalUserCapsHandler(agentID,caps,capName,capUrl); | 336 | handler.RegisterExternalUserCapsHandler(agentID,caps,capName,capUrl); |
408 | else | 337 | else |
@@ -431,26 +360,10 @@ namespace OpenSim.Region.ClientStack.Linden | |||
431 | { | 360 | { |
432 | Watchdog.UpdateThread(); | 361 | Watchdog.UpdateThread(); |
433 | 362 | ||
434 | WaitProcessQueuedInventoryRequest(); | 363 | aPollRequest poolreq = m_queue.Dequeue(); |
435 | } | ||
436 | } | ||
437 | |||
438 | public void WaitProcessQueuedInventoryRequest() | ||
439 | { | ||
440 | aPollRequest poolreq = m_queue.Dequeue(); | ||
441 | 364 | ||
442 | if (poolreq != null && poolreq.thepoll != null) | 365 | if (poolreq != null && poolreq.thepoll != null) |
443 | { | ||
444 | try | ||
445 | { | ||
446 | poolreq.thepoll.Process(poolreq); | 366 | poolreq.thepoll.Process(poolreq); |
447 | } | ||
448 | catch (Exception e) | ||
449 | { | ||
450 | m_log.ErrorFormat( | ||
451 | "[INVENTORY]: Failed to process queued inventory request {0} for {1} in {2}. Exception {3}", | ||
452 | poolreq.reqID, poolreq.presence != null ? poolreq.presence.Name : "unknown", Scene.Name, e); | ||
453 | } | ||
454 | } | 367 | } |
455 | } | 368 | } |
456 | } | 369 | } |