* luci/libs/httpd: fix spurious Overload errors in luci-httpd
This commit is contained in:
parent
59b79c1746
commit
e69dcf68a2
1 changed files with 21 additions and 9 deletions
|
@ -27,7 +27,7 @@ function Luci.__init__(self, limit)
|
||||||
luci.httpd.module.Handler.__init__(self)
|
luci.httpd.module.Handler.__init__(self)
|
||||||
self.limit = limit or 5
|
self.limit = limit or 5
|
||||||
self.running = {}
|
self.running = {}
|
||||||
setmetatable(self.running, {__mode = "v"})
|
setmetatable(self.running, {__mode = "k"})
|
||||||
end
|
end
|
||||||
|
|
||||||
function Luci.handle_head(self, ...)
|
function Luci.handle_head(self, ...)
|
||||||
|
@ -40,18 +40,30 @@ function Luci.handle_post(self, ...)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Luci.handle_get(self, request, sourcein, sinkerr)
|
function Luci.handle_get(self, request, sourcein, sinkerr)
|
||||||
if self.limit and #self.running >= self.limit then
|
local reaped = false
|
||||||
|
local running = 0
|
||||||
|
|
||||||
|
for _, v in pairs(self.running) do
|
||||||
|
if v then running = running + 1 end
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.limit and running >= self.limit then
|
||||||
for k, v in ipairs(self.running) do
|
for k, v in ipairs(self.running) do
|
||||||
if coroutine.status(v) == "dead" then
|
if coroutine.status(k) == "dead" then
|
||||||
collectgarbage()
|
self.running[k] = nil
|
||||||
break
|
running = running - 1
|
||||||
|
reaped = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if #self.running >= self.limit then
|
|
||||||
return self:failure(503, "Overload")
|
if reaped then collectgarbage() end
|
||||||
|
|
||||||
|
if running >= self.limit then
|
||||||
|
return self:failure(503, "Overload %i/%i" % { running, self.limit } )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
table.insert(self.running, coroutine.running())
|
|
||||||
|
self.running[coroutine.running()] = true
|
||||||
|
|
||||||
local r = luci.http.Request(
|
local r = luci.http.Request(
|
||||||
request.env,
|
request.env,
|
||||||
|
|
Loading…
Reference in a new issue