From 943be095004a28cedb6a3717ebb97497801cd638 Mon Sep 17 00:00:00 2001 From: dabue <53054094+dabue@users.noreply.github.com> Date: Mon, 19 Oct 2020 10:49:01 +0800 Subject: [PATCH] feature(core): implement `core.sleep` (#2397) --- apisix/core.lua | 5 ++++- apisix/core/config_etcd.lua | 2 +- apisix/core/config_yaml.lua | 2 +- apisix/core/timer.lua | 2 +- apisix/core/utils.lua | 20 +++++++++++++++++++- apisix/plugins/fault-injection.lua | 2 +- apisix/plugins/limit-conn.lua | 2 +- apisix/plugins/limit-req.lua | 2 +- apisix/plugins/wolf-rbac.lua | 3 ++- 9 files changed, 31 insertions(+), 9 deletions(-) diff --git a/apisix/core.lua b/apisix/core.lua index fbed57712363..f9432e0757c6 100644 --- a/apisix/core.lua +++ b/apisix/core.lua @@ -15,6 +15,7 @@ -- limitations under the License. -- local log = require("apisix.core.log") +local utils = require("apisix.core.utils") local local_conf, err = require("apisix.core.config_local").local_conf() if not local_conf then error("failed to parse yaml config: " .. err) @@ -26,10 +27,12 @@ log.info("use config_center: ", config_center) local config = require("apisix.core.config_" .. config_center) config.type = config_center + return { version = require("apisix.core.version"), log = log, config = config, + sleep = utils.sleep, json = require("apisix.core.json"), table = require("apisix.core.table"), request = require("apisix.core.request"), @@ -40,7 +43,7 @@ return { ctx = require("apisix.core.ctx"), timer = require("apisix.core.timer"), id = require("apisix.core.id"), - utils = require("apisix.core.utils"), + utils = utils, etcd = require("apisix.core.etcd"), http = require("apisix.core.http"), tablepool= require("tablepool"), diff --git a/apisix/core/config_etcd.lua b/apisix/core/config_etcd.lua index 4f3fd558020b..7fb12411963a 100644 --- a/apisix/core/config_etcd.lua +++ b/apisix/core/config_etcd.lua @@ -29,7 +29,7 @@ local insert_tab = table.insert local type = type local ipairs = ipairs local setmetatable = setmetatable -local ngx_sleep = ngx.sleep +local ngx_sleep = require("apisix.core.utils").sleep local ngx_timer_at = ngx.timer.at local ngx_time = ngx.time local sub_str = string.sub diff --git a/apisix/core/config_yaml.lua b/apisix/core/config_yaml.lua index 61d40d6f1ef8..f5d3b0e52817 100644 --- a/apisix/core/config_yaml.lua +++ b/apisix/core/config_yaml.lua @@ -28,7 +28,7 @@ local insert_tab = table.insert local type = type local ipairs = ipairs local setmetatable = setmetatable -local ngx_sleep = ngx.sleep +local ngx_sleep = require("apisix.core.utils").sleep local ngx_timer_at = ngx.timer.at local ngx_time = ngx.time local sub_str = string.sub diff --git a/apisix/core/timer.lua b/apisix/core/timer.lua index 7982d69d30eb..210067580e55 100644 --- a/apisix/core/timer.lua +++ b/apisix/core/timer.lua @@ -15,7 +15,7 @@ -- limitations under the License. -- local log = require("apisix.core.log") -local sleep = ngx.sleep +local sleep = require("apisix.core.utils").sleep local timer_every = ngx.timer.every local timer_at = ngx.timer.at local update_time = ngx.update_time diff --git a/apisix/core/utils.lua b/apisix/core/utils.lua index e29784fdd700..61963a9e0ad7 100644 --- a/apisix/core/utils.lua +++ b/apisix/core/utils.lua @@ -29,7 +29,9 @@ local type = type local C = ffi.C local ffi_string = ffi.string local get_string_buf = base.get_string_buf - +local exiting = ngx.worker.exiting +local ngx_sleep = ngx.sleep +local max_sleep_interval = 1 ffi.cdef[[ int ngx_escape_uri(char *dst, const char *src, @@ -200,4 +202,20 @@ function _M.validate_header_value(value) end +local function sleep(sec) + if sec <= max_sleep_interval then + return ngx_sleep(sec) + end + ngx_sleep(max_sleep_interval) + if exiting() then + return + end + sec = sec - max_sleep_interval + return sleep(sec) +end + + +_M.sleep = sleep + + return _M diff --git a/apisix/plugins/fault-injection.lua b/apisix/plugins/fault-injection.lua index 8484352571ce..8cf8b8dffea5 100644 --- a/apisix/plugins/fault-injection.lua +++ b/apisix/plugins/fault-injection.lua @@ -15,7 +15,7 @@ -- limitations under the License. -- local core = require("apisix.core") -local sleep = ngx.sleep +local sleep = core.sleep local plugin_name = "fault-injection" diff --git a/apisix/plugins/limit-conn.lua b/apisix/plugins/limit-conn.lua index cf0f31f1ce8d..7979b5fd128e 100644 --- a/apisix/plugins/limit-conn.lua +++ b/apisix/plugins/limit-conn.lua @@ -16,7 +16,7 @@ -- local limit_conn_new = require("resty.limit.conn").new local core = require("apisix.core") -local sleep = ngx.sleep +local sleep = core.sleep local plugin_name = "limit-conn" diff --git a/apisix/plugins/limit-req.lua b/apisix/plugins/limit-req.lua index 7602e9bf3ec3..3274f7aad09c 100644 --- a/apisix/plugins/limit-req.lua +++ b/apisix/plugins/limit-req.lua @@ -17,7 +17,7 @@ local limit_req_new = require("resty.limit.req").new local core = require("apisix.core") local plugin_name = "limit-req" -local sleep = ngx.sleep +local sleep = core.sleep local schema = { diff --git a/apisix/plugins/wolf-rbac.lua b/apisix/plugins/wolf-rbac.lua index 9d0d151cec2d..4a4535ee154b 100644 --- a/apisix/plugins/wolf-rbac.lua +++ b/apisix/plugins/wolf-rbac.lua @@ -18,6 +18,7 @@ local core = require("apisix.core") local consumer = require("apisix.consumer") local json = require("apisix.core.json") +local sleep = core.sleep local ngx_re = require("ngx.re") local http = require("resty.http") local ipairs = ipairs @@ -206,7 +207,7 @@ local function check_url_permission(server, appid, action, resName, client_ip, w else core.log.info("request [curl -v ", url, "] failed! status:", res.status) if i < retry_max then - ngx.sleep(0.1) + sleep(0.1) end end end