Software / code / prosody
Comparison
plugins/mod_bosh.lua @ 1864:b9389286eece
mod_bosh: Fix for 'invalid key to next' error when 2 clients lose connection at the same time
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 02 Oct 2009 21:23:32 +0100 |
| parent | 1633:7812459eeed7 |
| child | 1865:388b125b784a |
comparison
equal
deleted
inserted
replaced
| 1863:51b1612325e6 | 1864:b9389286eece |
|---|---|
| 243 end | 243 end |
| 244 core_process_stanza(session, stanza); | 244 core_process_stanza(session, stanza); |
| 245 end | 245 end |
| 246 end | 246 end |
| 247 | 247 |
| 248 local dead_sessions = {}; | |
| 248 function on_timer() | 249 function on_timer() |
| 249 -- log("debug", "Checking for requests soon to timeout..."); | 250 -- log("debug", "Checking for requests soon to timeout..."); |
| 250 -- Identify requests timing out within the next few seconds | 251 -- Identify requests timing out within the next few seconds |
| 251 local now = os_time() + 3; | 252 local now = os_time() + 3; |
| 252 for request in pairs(waiting_requests) do | 253 for request in pairs(waiting_requests) do |
| 259 end | 260 end |
| 260 end | 261 end |
| 261 end | 262 end |
| 262 | 263 |
| 263 now = now - 3; | 264 now = now - 3; |
| 265 local n_dead_sessions = 0; | |
| 264 for session, inactive_since in pairs(inactive_sessions) do | 266 for session, inactive_since in pairs(inactive_sessions) do |
| 265 if session.bosh_max_inactive then | 267 if session.bosh_max_inactive then |
| 266 if now - inactive_since > session.bosh_max_inactive then | 268 if now - inactive_since > session.bosh_max_inactive then |
| 267 (session.log or log)("debug", "BOSH client inactive too long, destroying session at %d", now); | 269 (session.log or log)("debug", "BOSH client inactive too long, destroying session at %d", now); |
| 268 sessions[session.sid] = nil; | 270 sessions[session.sid] = nil; |
| 269 inactive_sessions[session] = nil; | 271 inactive_sessions[session] = nil; |
| 270 sm_destroy_session(session, "BOSH client silent for over "..session.bosh_max_inactive.." seconds"); | 272 n_dead_sessions = n_dead_sessions + 1; |
| 273 dead_sessions[n_dead_sessions] = session; | |
| 271 end | 274 end |
| 272 else | 275 else |
| 273 inactive_sessions[session] = nil; | 276 inactive_sessions[session] = nil; |
| 274 end | 277 end |
| 275 end | 278 end |
| 279 | |
| 280 for i=1,n_dead_sessions do | |
| 281 local session = dead_sessions[i]; | |
| 282 dead_sessions[i] = nil; | |
| 283 sm_destroy_session(session, "BOSH client silent for over "..session.bosh_max_inactive.." seconds"); | |
| 284 end | |
| 276 end | 285 end |
| 277 | 286 |
| 278 local ports = config.get(module.host, "core", "bosh_ports") or { 5280 }; | 287 local ports = config.get(module.host, "core", "bosh_ports") or { 5280 }; |
| 279 httpserver.new_from_config(ports, "http-bind", handle_request); | 288 httpserver.new_from_config(ports, "http-bind", handle_request); |
| 280 | 289 |