# HG changeset patch # User Matthew Wild # Date 1487582776 0 # Node ID 72cbec10370905df63ce621a3a7ea6efc38040ab # Parent 66b81e144ded00d671f1a37949a559df6bc84195 mod_firewall: Improve HTTP polling logic diff -r 66b81e144ded -r 72cbec103709 mod_firewall/definitions.lib.lua --- a/mod_firewall/definitions.lib.lua Sun Feb 19 22:24:21 2017 +0000 +++ b/mod_firewall/definitions.lib.lua Mon Feb 20 09:26:16 2017 +0000 @@ -96,12 +96,15 @@ self.hash_function = hashes[opts.hash]; end local etag; + local failure_count = 0; + local retry_intervals = { 60, 120, 300 }; local function update_list() http.request(url, { headers = { ["If-None-Match"] = etag; }; }, function (body, code, response) + local next_poll = poll_interval; if code == 200 and body then etag = response.headers.etag; local items = {}; @@ -112,16 +115,18 @@ module:log("debug", "Fetched updated list from <%s>", url); elseif code == 304 then module:log("debug", "List at <%s> is unchanged", url); - else + elseif code == 0 or (code >= 400 and code <=599) then module:log("warn", "Failed to fetch list from <%s>: %d %s", url, code, tostring(body)); + next_poll = 300; + failure_count = failure_count + 1; + next_poll = retry_intervals[failure_count] or retry_intervals[#retry_intervals]; end - if poll_interval > 0 then - timer.add_task(poll_interval, update_list); + if next_poll > 0 then + timer.add_task(next_poll+math.random(0, 60), update_list); end end); end update_list(); - timer.add_task(0, update_list); end; contains = function (self, item) if self.hash_function then