diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | 6 | ||||
-rw-r--r-- | OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs | 182 |
2 files changed, 27 insertions, 161 deletions
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 616c673..85976ab 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | |||
@@ -1947,14 +1947,10 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
1947 | m_httpListener2.Start(64); | 1947 | m_httpListener2.Start(64); |
1948 | 1948 | ||
1949 | // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events | 1949 | // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events |
1950 | <<<<<<< HEAD | 1950 | |
1951 | PollServiceRequestManager = new PollServiceRequestManager(this, performPollResponsesAsync, 3, 25000); | 1951 | PollServiceRequestManager = new PollServiceRequestManager(this, performPollResponsesAsync, 3, 25000); |
1952 | PollServiceRequestManager.Start(); | 1952 | PollServiceRequestManager.Start(); |
1953 | 1953 | ||
1954 | ======= | ||
1955 | m_PollServiceManager = new PollServiceRequestManager(this, 4, 25000); | ||
1956 | m_PollServiceManager.Start(); | ||
1957 | >>>>>>> avn/ubitvar | ||
1958 | HTTPDRunning = true; | 1954 | HTTPDRunning = true; |
1959 | 1955 | ||
1960 | //HttpListenerContext context; | 1956 | //HttpListenerContext context; |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index 4ffe6e5..571e8d8 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs | |||
@@ -74,16 +74,11 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
74 | private Thread[] m_workerThreads; | 74 | private Thread[] m_workerThreads; |
75 | private Thread m_retrysThread; | 75 | private Thread m_retrysThread; |
76 | 76 | ||
77 | <<<<<<< HEAD | ||
78 | private SmartThreadPool m_threadPool = new SmartThreadPool(20000, 12, 2); | ||
79 | |||
80 | // private int m_timeout = 1000; // increase timeout 250; now use the event one | ||
81 | ======= | ||
82 | private bool m_running = true; | 77 | private bool m_running = true; |
83 | private int slowCount = 0; | 78 | private int slowCount = 0; |
84 | 79 | ||
85 | private SmartThreadPool m_threadPool; | 80 | private SmartThreadPool m_threadPool; |
86 | >>>>>>> avn/ubitvar | 81 | |
87 | 82 | ||
88 | public PollServiceRequestManager( | 83 | public PollServiceRequestManager( |
89 | BaseHttpServer pSrv, bool performResponsesAsync, uint pWorkerThreadCount, int pTimeout) | 84 | BaseHttpServer pSrv, bool performResponsesAsync, uint pWorkerThreadCount, int pTimeout) |
@@ -93,7 +88,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
93 | m_WorkerThreadCount = pWorkerThreadCount; | 88 | m_WorkerThreadCount = pWorkerThreadCount; |
94 | m_workerThreads = new Thread[m_WorkerThreadCount]; | 89 | m_workerThreads = new Thread[m_WorkerThreadCount]; |
95 | 90 | ||
96 | <<<<<<< HEAD | 91 | /* |
97 | StatsManager.RegisterStat( | 92 | StatsManager.RegisterStat( |
98 | new Stat( | 93 | new Stat( |
99 | "QueuedPollResponses", | 94 | "QueuedPollResponses", |
@@ -119,7 +114,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
119 | MeasuresOfInterest.AverageChangeOverTime, | 114 | MeasuresOfInterest.AverageChangeOverTime, |
120 | stat => stat.Value = ResponsesProcessed, | 115 | stat => stat.Value = ResponsesProcessed, |
121 | StatVerbosity.Debug)); | 116 | StatVerbosity.Debug)); |
122 | ======= | 117 | */ |
123 | PollServiceHttpRequestComparer preqCp = new PollServiceHttpRequestComparer(); | 118 | PollServiceHttpRequestComparer preqCp = new PollServiceHttpRequestComparer(); |
124 | m_bycontext = new Dictionary<PollServiceHttpRequest, Queue<PollServiceHttpRequest>>(preqCp); | 119 | m_bycontext = new Dictionary<PollServiceHttpRequest, Queue<PollServiceHttpRequest>>(preqCp); |
125 | 120 | ||
@@ -132,46 +127,16 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
132 | startInfo.ThreadPoolName = "PoolService"; | 127 | startInfo.ThreadPoolName = "PoolService"; |
133 | 128 | ||
134 | m_threadPool = new SmartThreadPool(startInfo); | 129 | m_threadPool = new SmartThreadPool(startInfo); |
135 | >>>>>>> avn/ubitvar | ||
136 | } | 130 | } |
137 | 131 | ||
138 | public void Start() | 132 | public void Start() |
139 | { | 133 | { |
140 | <<<<<<< HEAD | ||
141 | IsRunning = true; | ||
142 | |||
143 | if (PerformResponsesAsync) | ||
144 | { | ||
145 | //startup worker threads | ||
146 | for (uint i = 0; i < m_WorkerThreadCount; i++) | ||
147 | { | ||
148 | m_workerThreads[i] | ||
149 | = WorkManager.StartThread( | ||
150 | PoolWorkerJob, | ||
151 | string.Format("PollServiceWorkerThread{0}:{1}", i, m_server.Port), | ||
152 | ThreadPriority.Normal, | ||
153 | false, | ||
154 | false, | ||
155 | null, | ||
156 | int.MaxValue); | ||
157 | } | ||
158 | |||
159 | WorkManager.StartThread( | ||
160 | this.CheckLongPollThreads, | ||
161 | string.Format("LongPollServiceWatcherThread:{0}", m_server.Port), | ||
162 | ThreadPriority.Normal, | ||
163 | false, | ||
164 | true, | ||
165 | null, | ||
166 | 1000 * 60 * 10); | ||
167 | } | ||
168 | ======= | ||
169 | m_threadPool.Start(); | 134 | m_threadPool.Start(); |
170 | //startup worker threads | 135 | //startup worker threads |
171 | for (uint i = 0; i < m_WorkerThreadCount; i++) | 136 | for (uint i = 0; i < m_WorkerThreadCount; i++) |
172 | { | 137 | { |
173 | m_workerThreads[i] | 138 | m_workerThreads[i] |
174 | = Watchdog.StartThread( | 139 | = WorkManager.StartThread( |
175 | PoolWorkerJob, | 140 | PoolWorkerJob, |
176 | string.Format("PollServiceWorkerThread {0}:{1}", i, m_server.Port), | 141 | string.Format("PollServiceWorkerThread {0}:{1}", i, m_server.Port), |
177 | ThreadPriority.Normal, | 142 | ThreadPriority.Normal, |
@@ -181,7 +146,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
181 | int.MaxValue); | 146 | int.MaxValue); |
182 | } | 147 | } |
183 | 148 | ||
184 | m_retrysThread = Watchdog.StartThread( | 149 | m_retrysThread = WorkManager.StartThread( |
185 | this.CheckRetries, | 150 | this.CheckRetries, |
186 | string.Format("PollServiceWatcherThread:{0}", m_server.Port), | 151 | string.Format("PollServiceWatcherThread:{0}", m_server.Port), |
187 | ThreadPriority.Normal, | 152 | ThreadPriority.Normal, |
@@ -189,7 +154,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
189 | true, | 154 | true, |
190 | null, | 155 | null, |
191 | 1000 * 60 * 10); | 156 | 1000 * 60 * 10); |
192 | >>>>>>> avn/ubitvar | 157 | |
193 | } | 158 | } |
194 | 159 | ||
195 | private void ReQueueEvent(PollServiceHttpRequest req) | 160 | private void ReQueueEvent(PollServiceHttpRequest req) |
@@ -258,36 +223,13 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
258 | 223 | ||
259 | private void CheckRetries() | 224 | private void CheckRetries() |
260 | { | 225 | { |
261 | <<<<<<< HEAD | ||
262 | // The only purpose of this thread is to check the EQs for events. | ||
263 | // If there are events, that thread will be placed in the "ready-to-serve" queue, m_requests. | ||
264 | // If there are no events, that thread will be back to its "waiting" queue, m_longPollRequests. | ||
265 | // All other types of tasks (Inventory handlers, http-in, etc) don't have the long-poll nature, | ||
266 | // so if they aren't ready to be served by a worker thread (no events), they are placed | ||
267 | // directly back in the "ready-to-serve" queue by the worker thread. | ||
268 | while (IsRunning) | ||
269 | ======= | ||
270 | while (m_running) | 226 | while (m_running) |
271 | >>>>>>> avn/ubitvar | 227 | |
272 | { | 228 | { |
273 | Thread.Sleep(100); // let the world move .. back to faster rate | 229 | Thread.Sleep(100); // let the world move .. back to faster rate |
274 | Watchdog.UpdateThread(); | 230 | Watchdog.UpdateThread(); |
275 | lock (m_retryRequests) | 231 | lock (m_retryRequests) |
276 | { | 232 | { |
277 | <<<<<<< HEAD | ||
278 | if (m_longPollRequests.Count > 0 && IsRunning) | ||
279 | { | ||
280 | List<PollServiceHttpRequest> ready = m_longPollRequests.FindAll(req => | ||
281 | (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id) || // there are events in this EQ | ||
282 | (Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) // no events, but timeout | ||
283 | ); | ||
284 | |||
285 | ready.ForEach(req => | ||
286 | { | ||
287 | m_requests.Enqueue(req); | ||
288 | m_longPollRequests.Remove(req); | ||
289 | }); | ||
290 | ======= | ||
291 | while (m_retryRequests.Count > 0 && m_running) | 233 | while (m_retryRequests.Count > 0 && m_running) |
292 | m_requests.Enqueue(m_retryRequests.Dequeue()); | 234 | m_requests.Enqueue(m_retryRequests.Dequeue()); |
293 | } | 235 | } |
@@ -295,7 +237,6 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
295 | if (slowCount >= 10) | 237 | if (slowCount >= 10) |
296 | { | 238 | { |
297 | slowCount = 0; | 239 | slowCount = 0; |
298 | >>>>>>> avn/ubitvar | ||
299 | 240 | ||
300 | lock (m_slowRequests) | 241 | lock (m_slowRequests) |
301 | { | 242 | { |
@@ -308,12 +249,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
308 | 249 | ||
309 | public void Stop() | 250 | public void Stop() |
310 | { | 251 | { |
311 | <<<<<<< HEAD | ||
312 | IsRunning = false; | ||
313 | // m_timeout = -10000; // cause all to expire | ||
314 | ======= | ||
315 | m_running = false; | 252 | m_running = false; |
316 | >>>>>>> avn/ubitvar | 253 | |
317 | Thread.Sleep(1000); // let the world move | 254 | Thread.Sleep(1000); // let the world move |
318 | 255 | ||
319 | foreach (Thread t in m_workerThreads) | 256 | foreach (Thread t in m_workerThreads) |
@@ -341,13 +278,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
341 | 278 | ||
342 | lock (m_slowRequests) | 279 | lock (m_slowRequests) |
343 | { | 280 | { |
344 | <<<<<<< HEAD | ||
345 | if (m_longPollRequests.Count > 0 && IsRunning) | ||
346 | m_longPollRequests.ForEach(req => m_requests.Enqueue(req)); | ||
347 | ======= | ||
348 | while (m_slowRequests.Count > 0) | 281 | while (m_slowRequests.Count > 0) |
349 | m_requests.Enqueue(m_slowRequests.Dequeue()); | 282 | m_requests.Enqueue(m_slowRequests.Dequeue()); |
350 | >>>>>>> avn/ubitvar | 283 | |
351 | } | 284 | } |
352 | 285 | ||
353 | while (m_requests.Count() > 0) | 286 | while (m_requests.Count() > 0) |
@@ -355,13 +288,8 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
355 | try | 288 | try |
356 | { | 289 | { |
357 | wreq = m_requests.Dequeue(0); | 290 | wreq = m_requests.Dequeue(0); |
358 | <<<<<<< HEAD | ||
359 | ResponsesProcessed++; | ||
360 | wreq.DoHTTPGruntWork( | ||
361 | m_server, wreq.PollServiceArgs.NoEvents(wreq.RequestID, wreq.PollServiceArgs.Id)); | ||
362 | ======= | ||
363 | wreq.DoHTTPstop(m_server); | 291 | wreq.DoHTTPstop(m_server); |
364 | >>>>>>> avn/ubitvar | 292 | |
365 | } | 293 | } |
366 | catch | 294 | catch |
367 | { | 295 | { |
@@ -375,91 +303,35 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
375 | 303 | ||
376 | private void PoolWorkerJob() | 304 | private void PoolWorkerJob() |
377 | { | 305 | { |
378 | while (IsRunning) | 306 | while (m_running) |
379 | { | 307 | { |
380 | <<<<<<< HEAD | ||
381 | ======= | ||
382 | PollServiceHttpRequest req = m_requests.Dequeue(5000); | 308 | PollServiceHttpRequest req = m_requests.Dequeue(5000); |
383 | 309 | ||
384 | >>>>>>> avn/ubitvar | ||
385 | Watchdog.UpdateThread(); | 310 | Watchdog.UpdateThread(); |
386 | WaitPerformResponse(); | 311 | if (req != null) |
387 | } | ||
388 | } | ||
389 | |||
390 | public void WaitPerformResponse() | ||
391 | { | ||
392 | PollServiceHttpRequest req = m_requests.Dequeue(5000); | ||
393 | // m_log.DebugFormat("[YYY]: Dequeued {0}", (req == null ? "null" : req.PollServiceArgs.Type.ToString())); | ||
394 | |||
395 | if (req != null) | ||
396 | { | ||
397 | try | ||
398 | { | 312 | { |
399 | if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id)) | 313 | try |
400 | { | 314 | { |
401 | Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id); | 315 | if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id)) |
402 | |||
403 | <<<<<<< HEAD | ||
404 | if (responsedata == null) | ||
405 | return; | ||
406 | |||
407 | // This is the event queue. | ||
408 | // Even if we're not running we can still perform responses by explicit request. | ||
409 | if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.LongPoll | ||
410 | || !PerformResponsesAsync) | ||
411 | { | 316 | { |
412 | try | 317 | Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id); |
413 | { | 318 | |
414 | ResponsesProcessed++; | ||
415 | req.DoHTTPGruntWork(m_server, responsedata); | ||
416 | } | ||
417 | catch (ObjectDisposedException e) // Browser aborted before we could read body, server closed the stream | ||
418 | { | ||
419 | // Ignore it, no need to reply | ||
420 | m_log.Error(e); | ||
421 | } | ||
422 | } | ||
423 | else | ||
424 | { | ||
425 | m_threadPool.QueueWorkItem(x => | ||
426 | ======= | ||
427 | if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.LongPoll) // This is the event queue | 319 | if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.LongPoll) // This is the event queue |
428 | >>>>>>> avn/ubitvar | ||
429 | { | 320 | { |
430 | try | 321 | try |
431 | { | 322 | { |
432 | ResponsesProcessed++; | ||
433 | req.DoHTTPGruntWork(m_server, responsedata); | 323 | req.DoHTTPGruntWork(m_server, responsedata); |
434 | byContextDequeue(req); | 324 | byContextDequeue(req); |
435 | } | 325 | } |
436 | catch (ObjectDisposedException e) // Browser aborted before we could read body, server closed the stream | 326 | catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream |
437 | { | 327 | { |
438 | // Ignore it, no need to reply | 328 | // Ignore it, no need to reply |
439 | m_log.Error(e); | ||
440 | } | 329 | } |
441 | catch (Exception e) | 330 | } |
331 | else | ||
332 | { | ||
333 | m_threadPool.QueueWorkItem(x => | ||
442 | { | 334 | { |
443 | <<<<<<< HEAD | ||
444 | m_log.Error(e); | ||
445 | } | ||
446 | |||
447 | return null; | ||
448 | }, null); | ||
449 | } | ||
450 | } | ||
451 | else | ||
452 | { | ||
453 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) | ||
454 | { | ||
455 | ResponsesProcessed++; | ||
456 | req.DoHTTPGruntWork( | ||
457 | m_server, req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); | ||
458 | } | ||
459 | else | ||
460 | { | ||
461 | ReQueueEvent(req); | ||
462 | ======= | ||
463 | try | 335 | try |
464 | { | 336 | { |
465 | req.DoHTTPGruntWork(m_server, responsedata); | 337 | req.DoHTTPGruntWork(m_server, responsedata); |
@@ -478,7 +350,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
478 | { | 350 | { |
479 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) | 351 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) |
480 | { | 352 | { |
481 | req.DoHTTPGruntWork(m_server, | 353 | req.DoHTTPGruntWork(m_server, |
482 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); | 354 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); |
483 | byContextDequeue(req); | 355 | byContextDequeue(req); |
484 | } | 356 | } |
@@ -486,17 +358,15 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
486 | { | 358 | { |
487 | ReQueueEvent(req); | 359 | ReQueueEvent(req); |
488 | } | 360 | } |
489 | >>>>>>> avn/ubitvar | ||
490 | } | 361 | } |
491 | } | 362 | } |
492 | } | 363 | catch (Exception e) |
493 | catch (Exception e) | 364 | { |
494 | { | 365 | m_log.ErrorFormat("Exception in poll service thread: " + e.ToString()); |
495 | m_log.ErrorFormat("Exception in poll service thread: " + e.ToString()); | 366 | } |
496 | } | 367 | } |
497 | } | 368 | } |
498 | } | 369 | } |
499 | 370 | ||
500 | } | 371 | } |
501 | } | 372 | } |
502 | |||