diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2008-10-15 20:04:46 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2008-10-15 20:04:46 +0000 |
commit | e69dcf68a2da0c2dc74ce6932b195144330a6c1b (patch) | |
tree | b187c4f2c9ca7dee3a0079760598656b89feb31c /libs | |
parent | 59b79c1746d217aa788ef38052a4c8f9b7bb2679 (diff) |
* luci/libs/httpd: fix spurious Overload errors in luci-httpd
Diffstat (limited to 'libs')
-rw-r--r-- | libs/httpd/luasrc/httpd/handler/luci.lua | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/libs/httpd/luasrc/httpd/handler/luci.lua b/libs/httpd/luasrc/httpd/handler/luci.lua index c3720ff871..6e9c6778da 100644 --- a/libs/httpd/luasrc/httpd/handler/luci.lua +++ b/libs/httpd/luasrc/httpd/handler/luci.lua @@ -27,7 +27,7 @@ function Luci.__init__(self, limit) luci.httpd.module.Handler.__init__(self) self.limit = limit or 5 self.running = {} - setmetatable(self.running, {__mode = "v"}) + setmetatable(self.running, {__mode = "k"}) end function Luci.handle_head(self, ...) @@ -40,19 +40,31 @@ function Luci.handle_post(self, ...) end 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 - if coroutine.status(v) == "dead" then - collectgarbage() - break + if coroutine.status(k) == "dead" then + self.running[k] = nil + running = running - 1 + reaped = true 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 - table.insert(self.running, coroutine.running()) - + + self.running[coroutine.running()] = true + local r = luci.http.Request( request.env, sourcein, |