From 5d0b8cc1efcb4c59e9945ae3757df6754c98ecc1 Mon Sep 17 00:00:00 2001 From: zaunist Date: Tue, 25 Jan 2022 22:26:06 +0800 Subject: [PATCH 01/21] feat: use keepalive in server-info plugin --- apisix/core/etcd.lua | 19 +++++ apisix/plugins/server-info.lua | 122 ++++++++++++++++++++++++--------- 2 files changed, 109 insertions(+), 32 deletions(-) diff --git a/apisix/core/etcd.lua b/apisix/core/etcd.lua index 793ece52bd2d..3e50bda21849 100644 --- a/apisix/core/etcd.lua +++ b/apisix/core/etcd.lua @@ -219,6 +219,10 @@ local function set(key, value, ttl) return nil, grant_err end res, err = etcd_cli:set(prefix .. key, value, {prev_kv = true, lease = data.body.ID}) + if not res then + return nil, err + end + res.body.lease_id = data.body.ID else res, err = etcd_cli:set(prefix .. key, value, {prev_kv = true}) end @@ -372,4 +376,19 @@ function _M.server_version() end +function _M.keepalive(id) + local etcd_cli, _, err = new() + if not etcd_cli then + return nil, err + end + + local res, err = etcd_cli:keepalive(id) + if not res then + return nil, err + end + + return res, nil +end + + return _M diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index 91ee347683b8..96683dcedbea 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -15,7 +15,7 @@ -- limitations under the License. -- local require = require -local core = require("apisix.core") +local core = require("apisix.core") local timers = require("apisix.timers") local plugin = require("apisix.plugin") @@ -26,8 +26,8 @@ local type = type local load_time = os.time() local plugin_name = "server-info" -local default_report_interval = 60 -local default_report_ttl = 7200 +-- local default_report_interval = 60 +local default_report_ttl = 30 local schema = { type = "object", @@ -35,18 +35,11 @@ local schema = { local attr_schema = { type = "object", properties = { - report_interval = { - type = "integer", - description = "server info reporting interval (unit: second)", - default = default_report_interval, - minimum = 60, - maximum = 3600, - }, report_ttl = { type = "integer", description = "live time for server info in etcd", default = default_report_ttl, - minimum = 3600, + minimum = 3, maximum = 86400, } } @@ -87,16 +80,15 @@ local function get_boot_time() end -local function uninitialized_server_info() +local function initialize_server_info() local boot_time = get_boot_time() + core.log.error("boot_time: ", boot_time) return { etcd_version = "unknown", hostname = core.utils.gethostname(), id = core.id.get(), version = core.version.VERSION, - up_time = ngx_time() - boot_time, boot_time = boot_time, - last_report_time = -1, } end @@ -104,20 +96,22 @@ end local function get() local data, err = internal_status:get("server_info") if err ~= nil then + core.log.error("get error: ",err) return nil, err end if not data then - return uninitialized_server_info() + return initialize_server_info() -- first time end + core.log.error("server_info: ", data) local server_info, err = core.json.decode(data) if not server_info then + core.log.error("failed to decode server_info: ", err) return nil, err end - server_info.up_time = ngx_time() - server_info.boot_time - return server_info + return server_info -- return a copy end @@ -125,24 +119,40 @@ local function get_server_info() local info, err = get() if not info then core.log.error("failed to get server_info: ", err) - return 500 + return 500 -- internal server error end return 200, info end +local function heartbeat(id) + local res, err = core.etcd.keepalive(id) + core.log.error("keepalive: ", res, err) + if not res then + core.log.error("send heartbeat failed: ", err) + return false, err + end + return true, nil +end local function report(premature, report_ttl) if premature then return end + -- get apisix server info data local server_info, err = get() if not server_info then core.log.error("failed to get server_info: ", err) - return end + local lease_id, err =internal_status.get("lease_id") + if err ~= nil then + core.log.error("get error: ",err) + return nil, err + end + + if server_info.etcd_version == "unknown" then local res, err = core.etcd.server_version() if not res then @@ -158,29 +168,79 @@ local function report(premature, report_ttl) end end - server_info.last_report_time = ngx_time() - + -- get inside etcd data, if not exist, create it local key = "/data_plane/server_info/" .. server_info.id - local ok, err = core.etcd.set(key, server_info, report_ttl) + local res, _ = core.etcd.get(key) + if not res.body.node then + local newres, err = core.etcd.set(key, server_info, report_ttl) + if not newres then + core.log.error("failed to set server_info: ", err) + end + core.log.error("initial server_info: ", core.json.encode(server_info)) + core.log.error("first lease_id: ", newres.body.lease_id) + lease_id = newres.body.lease_id + return + end + + local _, err = internal_status:set("lease_id", res.body.node.lease_id) + if err ~= nil then + core.log.error("failed to save boot_time to shdict: ", err) + end + + core.log.error("second lease_id: ", lease_id) + + core.log.error("write new server_info data", core.json.encode(server_info)) + + local ok = core.table.deep_eq(server_info, res.body.node.value) if not ok then - core.log.error("failed to report server info to etcd: ", err) + + core.log.error("server_info: ", core.json.encode(server_info)) + core.log.error("etcd_info: ", core.json.encode(res.body.node)) + + + local newres, err = core.etcd.set(key, server_info, report_ttl) + if not newres then + core.log.error("failed to set server_info to etcd: ", err) + return false, err + end + + -- lease_id Need to convert from dec to hex + + local _, err = internal_status:set("lease_id", res.body.node.lease_id) + if err ~= nil then + core.log.error("failed to save boot_time to shdict: ", err) + end + + core.log.error("lease_id: ", lease_id) return end + -- call keepalive + core.log.error("third lease_id: ", lease_id) + local hexid = string.format("%x", lease_id) + local h, err = heartbeat(hexid) + if not h then + core.log.error("report server_info failed: ", err) + return false, err + end + core.log.error("log keepalive: ", h) + + local data, err = core.json.encode(server_info) if not data then core.log.error("failed to encode server_info: ", err) - return + return false, err end local ok, err = internal_status:set("server_info", data) if not ok then core.log.error("failed to encode and save server info: ", err) - return + return false, err end end + function _M.check_schema(conf) local ok, err = core.schema.check(schema, conf) if not ok then @@ -203,8 +263,7 @@ end function _M.init() - core.log.info("server info: ", core.json.delay_encode(get())) - + -- core.log.info("server info: ", core.json.delay_encode(get())) if core.config ~= require("apisix.core.config_etcd") then -- we don't need to report server info if etcd is not in use. return @@ -217,13 +276,13 @@ function _M.init() return end - local report_ttl = attr and attr.report_ttl or default_report_ttl - local report_interval = attr and attr.report_interval or default_report_interval + -- local report_ttl = attr and attr.report_ttl or default_report_ttl + local report_ttl = 30 local start_at = ngx_time() local fn = function() local now = ngx_time() - if now - start_at >= report_interval then + if now - start_at >= (report_ttl / 2) then start_at = now report(nil, report_ttl) end @@ -239,8 +298,7 @@ function _M.init() timers.register_timer("plugin#server-info", fn, true) - core.log.info("timer created to report server info, interval: ", - report_interval) + core.log.info("timer update the server info ttl, current ttl: ", report_ttl) end From a4a71a5673e352c85876acf59c0ec99c6a54469e Mon Sep 17 00:00:00 2001 From: zaunist Date: Wed, 9 Feb 2022 23:33:15 +0800 Subject: [PATCH 02/21] feat: support keepalive --- apisix/plugins/server-info.lua | 86 ++++++++++++---------------------- conf/config-default.yaml | 3 +- 2 files changed, 31 insertions(+), 58 deletions(-) diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index 96683dcedbea..7a85d79c664a 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -26,8 +26,8 @@ local type = type local load_time = os.time() local plugin_name = "server-info" --- local default_report_interval = 60 -local default_report_ttl = 30 +local default_report_ttl = 36 +local lease_id local schema = { type = "object", @@ -80,9 +80,8 @@ local function get_boot_time() end -local function initialize_server_info() +local function uninitialize_server_info() local boot_time = get_boot_time() - core.log.error("boot_time: ", boot_time) return { etcd_version = "unknown", hostname = core.utils.gethostname(), @@ -101,17 +100,16 @@ local function get() end if not data then - return initialize_server_info() -- first time + return uninitialize_server_info() end - core.log.error("server_info: ", data) local server_info, err = core.json.decode(data) if not server_info then core.log.error("failed to decode server_info: ", err) return nil, err end - return server_info -- return a copy + return server_info end @@ -119,40 +117,24 @@ local function get_server_info() local info, err = get() if not info then core.log.error("failed to get server_info: ", err) - return 500 -- internal server error + return 500 end return 200, info end -local function heartbeat(id) - local res, err = core.etcd.keepalive(id) - core.log.error("keepalive: ", res, err) - if not res then - core.log.error("send heartbeat failed: ", err) - return false, err - end - return true, nil -end local function report(premature, report_ttl) if premature then return end - -- get apisix server info data + -- get apisix node info local server_info, err = get() if not server_info then core.log.error("failed to get server_info: ", err) end - local lease_id, err =internal_status.get("lease_id") - if err ~= nil then - core.log.error("get error: ",err) - return nil, err - end - - if server_info.etcd_version == "unknown" then local res, err = core.etcd.server_version() if not res then @@ -176,55 +158,47 @@ local function report(premature, report_ttl) if not newres then core.log.error("failed to set server_info: ", err) end - core.log.error("initial server_info: ", core.json.encode(server_info)) - core.log.error("first lease_id: ", newres.body.lease_id) - lease_id = newres.body.lease_id - return - end - local _, err = internal_status:set("lease_id", res.body.node.lease_id) - if err ~= nil then - core.log.error("failed to save boot_time to shdict: ", err) - end + -- set lease_id to ngx dict + local ok, err = internal_status:set("lease_id", newres.body.lease_id) + if not ok then + core.log.error("failed to save boot_time to shdict: ", err) + end - core.log.error("second lease_id: ", lease_id) + return + end - core.log.error("write new server_info data", core.json.encode(server_info)) - + local res, _ = core.etcd.get(key) local ok = core.table.deep_eq(server_info, res.body.node.value) + -- not equal, update it if not ok then - - core.log.error("server_info: ", core.json.encode(server_info)) - core.log.error("etcd_info: ", core.json.encode(res.body.node)) - - local newres, err = core.etcd.set(key, server_info, report_ttl) if not newres then core.log.error("failed to set server_info to etcd: ", err) return false, err end - - -- lease_id Need to convert from dec to hex - local _, err = internal_status:set("lease_id", res.body.node.lease_id) + -- update lease_id + local _, err = internal_status:set("lease_id", res.body.lease_id) if err ~= nil then - core.log.error("failed to save boot_time to shdict: ", err) + core.log.error("failed to set lease_id to shdict: ", err) end - core.log.error("lease_id: ", lease_id) return end + -- get lease_id from ngx dict + lease_id, err = internal_status:get("lease_id") + if err ~= nil then + core.log.error("failed to get lease_id from shdict: ",err) + end + -- call keepalive - core.log.error("third lease_id: ", lease_id) - local hexid = string.format("%x", lease_id) - local h, err = heartbeat(hexid) - if not h then - core.log.error("report server_info failed: ", err) + local _, err = core.etcd.keepalive(lease_id) + if err ~= nil then + core.log.error("send heartbeat failed: ", err) return false, err end - core.log.error("log keepalive: ", h) - local data, err = core.json.encode(server_info) if not data then @@ -240,7 +214,6 @@ local function report(premature, report_ttl) end - function _M.check_schema(conf) local ok, err = core.schema.check(schema, conf) if not ok then @@ -277,11 +250,12 @@ function _M.init() end -- local report_ttl = attr and attr.report_ttl or default_report_ttl - local report_ttl = 30 + local report_ttl = attr and attr.report_ttl or default_report_ttl local start_at = ngx_time() local fn = function() local now = ngx_time() + -- If ttl remaining time is less than half, then flush the ttl if now - start_at >= (report_ttl / 2) then start_at = now report(nil, report_ttl) diff --git a/conf/config-default.yaml b/conf/config-default.yaml index 3383d4469b01..9c3023667450 100644 --- a/conf/config-default.yaml +++ b/conf/config-default.yaml @@ -420,8 +420,7 @@ plugin_attr: ip: 127.0.0.1 port: 9091 server-info: - report_interval: 60 # server info report interval (unit: second) - report_ttl: 3600 # live time for server info in etcd (unit: second) + report_ttl: 36 # live time for server info in etcd (unit: second) dubbo-proxy: upstream_multiplex_count: 32 request-id: From 847e967803d3cd826650546f22fbd56be920194e Mon Sep 17 00:00:00 2001 From: zaunist Date: Wed, 9 Feb 2022 23:41:33 +0800 Subject: [PATCH 03/21] fix: lint style --- apisix/core/etcd.lua | 2 +- apisix/plugins/server-info.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apisix/core/etcd.lua b/apisix/core/etcd.lua index 3e50bda21849..3670bb86fe80 100644 --- a/apisix/core/etcd.lua +++ b/apisix/core/etcd.lua @@ -386,7 +386,7 @@ function _M.keepalive(id) if not res then return nil, err end - + return res, nil end diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index 7a85d79c664a..8a9b0e5e5aee 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -255,7 +255,7 @@ function _M.init() local fn = function() local now = ngx_time() - -- If ttl remaining time is less than half, then flush the ttl + -- If ttl remaining time is less than half, then flush the ttl if now - start_at >= (report_ttl / 2) then start_at = now report(nil, report_ttl) From 5da8ae6d7582024f1dd40ed622b2b55df9c5c038 Mon Sep 17 00:00:00 2001 From: zaunist Date: Thu, 10 Feb 2022 09:27:40 +0800 Subject: [PATCH 04/21] fix: test case --- t/plugin/server-info.t | 50 +++++------------------------------------- 1 file changed, 5 insertions(+), 45 deletions(-) diff --git a/t/plugin/server-info.t b/t/plugin/server-info.t index 2e382a596d2f..f0b7ff8e346e 100644 --- a/t/plugin/server-info.t +++ b/t/plugin/server-info.t @@ -46,7 +46,7 @@ plugins: - server-info plugin_attr: server-info: - report_interval: 60 + report_ttl: 60 --- config location /t { content_by_lua_block { @@ -68,55 +68,15 @@ location /t { --- request GET /t --- response_body eval -qr/^{"boot_time":\d+,"etcd_version":"[\d\.]+","hostname":"[a-zA-Z\-0-9\.]+","id":[a-zA-Z\-0-9]+,"last_report_time":\d+,"up_time":\d+,"version":"[\d\.]+"}$/ +qr/^{"boot_time":\d+,"etcd_version":"[\d\.]+","hostname":"[a-zA-Z\-0-9\.]+","id":[a-zA-Z\-0-9]+,"version":"[\d\.]+"}$/ --- no_error_log [error] --- error_log -timer created to report server info, interval: 60 +timer created to report server info, ttl: 60 -=== TEST 2: verify the data integrity after reloading ---- yaml_config -apisix: - id: 123456 -plugins: - - server-info -plugin_attr: - server-info: - report_interval: 60 ---- config -location /t { - content_by_lua_block { - local core = require("apisix.core") - local key = "/data_plane/server_info/" .. core.id.get() - local res, err = core.etcd.get(key) - if err ~= nil then - ngx.status = 500 - ngx.say(err) - return - end - - local value = res.body.node.value - if value.up_time >= 2 then - ngx.say("integral") - else - ngx.say("reset") - end - } -} ---- request -GET /t ---- response_body -integral ---- no_error_log -[error] ---- error_log -timer created to report server info, interval: 60 - - - -=== TEST 3: get server_info from plugin control API +=== TEST 2: get server_info from plugin control API --- yaml_config apisix: id: 123456 @@ -139,6 +99,6 @@ location /t { --- request GET /t --- response_body eval -qr/^{"boot_time":\d+,"etcd_version":"[\d\.]+","hostname":"[a-zA-Z\-0-9\.]+","id":[a-zA-Z\-0-9]+,"last_report_time":\d+,"up_time":\d+,"version":"[\d\.]+"}$/ +qr/^{"boot_time":\d+,"etcd_version":"[\d\.]+","hostname":"[a-zA-Z\-0-9\.]+","id":[a-zA-Z\-0-9]+,"version":"[\d\.]+"}$/ --- no_error_log [error] From 3708a0e3d0eac11463eb06070b64a0d006174ab7 Mon Sep 17 00:00:00 2001 From: zaunist Date: Thu, 10 Feb 2022 11:08:25 +0800 Subject: [PATCH 05/21] fix: test case --- t/plugin/server-info.t | 2 -- 1 file changed, 2 deletions(-) diff --git a/t/plugin/server-info.t b/t/plugin/server-info.t index f0b7ff8e346e..ff78952cae98 100644 --- a/t/plugin/server-info.t +++ b/t/plugin/server-info.t @@ -71,8 +71,6 @@ GET /t qr/^{"boot_time":\d+,"etcd_version":"[\d\.]+","hostname":"[a-zA-Z\-0-9\.]+","id":[a-zA-Z\-0-9]+,"version":"[\d\.]+"}$/ --- no_error_log [error] ---- error_log -timer created to report server info, ttl: 60 From 431228fdb112aceef17fcf216290f86f6c877dbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=9D=B0=E9=B2=81?= Date: Thu, 10 Feb 2022 13:42:51 +0800 Subject: [PATCH 06/21] docs: update description --- docs/en/latest/plugins/server-info.md | 12 +++--------- docs/zh/latest/plugins/server-info.md | 23 ++++++++--------------- 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/docs/en/latest/plugins/server-info.md b/docs/en/latest/plugins/server-info.md index 6aacab2233db..9ca682d4f511 100644 --- a/docs/en/latest/plugins/server-info.md +++ b/docs/en/latest/plugins/server-info.md @@ -38,9 +38,7 @@ The meaning of each item in server information is following: | Name | Type | Description | |---------|------|-------------| -| up_time | integer | Elapsed time (in seconds) since APISIX instance was launched, value will be reset when you hot updating APISIX but is kept for intact if you just reloading APISIX. | | boot_time | integer | Bootstrap time (UNIX timestamp) of the APISIX instance, value will be reset when you hot updating APISIX but is kept for intact if you just reloading APISIX. | -| last_report_time | integer | Last reporting time (UNIX timestamp). | | id | string | APISIX instance id. | | etcd_version | string | The etcd cluster version that APISIX is using, value will be `"unknown"` if the network (to etcd) is partitioned. | | version | string | APISIX version. | @@ -75,16 +73,14 @@ We can change the report configurations in the `plugin_attr` section of `conf/co | Name | Type | Default | Description | | ------------ | ------ | -------- | -------------------------------------------------------------------- | -| report_interval | integer | 60 | the interval to report server info to etcd (unit: second, maximum: 3600, minimum: 60). | -| report_ttl | integer | 7200 | the live time for server info in etcd (unit: second, maximum: 86400, minimum: 3600). | +| report_ttl | integer | 36 | the live time for server info in etcd (unit: second, maximum: 86400, minimum: 3). | -Here is an example, which modifies the `report_interval` to 10 minutes and sets the `report_ttl` to one hour. +Here is an example, which modifies the `report_ttl` to one minute. ```yaml plugin_attr: server-info: - report_interval: 600, - report_ttl: 3600 + report_ttl: 60 ``` ## Test Plugin @@ -95,8 +91,6 @@ After enabling this plugin, you can access these data through the plugin Control $ curl http://127.0.0.1:9090/v1/server_info -s | jq . { "etcd_version": "3.5.0", - "up_time": 9460, - "last_report_time": 1608531519, "id": "b7ce1c5c-b1aa-4df7-888a-cbe403f3e948", "hostname": "fedora32", "version": "2.1", diff --git a/docs/zh/latest/plugins/server-info.md b/docs/zh/latest/plugins/server-info.md index 3abe7799c233..8db06b0ee294 100644 --- a/docs/zh/latest/plugins/server-info.md +++ b/docs/zh/latest/plugins/server-info.md @@ -39,14 +39,12 @@ title: server-info 服务信息中每一项的含义如下: | 名称 | 类型 | 描述 | -| ---------------- | ------- | ----------------------------------------------------------------------------------------------------------------------- | -| up_time | integer | APISIX 服务实例当前的运行时间(单位:秒), 如果对 APISIX 进行热更新操作,该值将被重置;普通的 reload 操作不会影响该值。 | -| boot_time | integer | APISIX 服务实例的启动时间(UNIX 时间戳),如果对 APIISIX 进行热更新操作,该值将被重置;普通的 reload 操作不会影响该值。 | -| last_report_time | integer | 最近一次服务信息上报的时间 (UNIX 时间戳)。 | +| ---------------- | ------- | --------------------------------------------------------------------------------------------------------------------- | +| boot_time | integer | APISIX 服务实例的启动时间(UNIX 时间戳),如果对 APIISIX 进行热更新操作,该值将被重置;普通的 reload 操作不会影响该值。 | | id | string | APISIX 服务实例 id 。 | -| etcd_version | string | etcd 集群的版本信息,如果 APISIX 和 etcd 集群之间存在网络分区,该值将设置为 `"unknown"`。 | +| etcd_version | string | etcd 集群的版本信息,如果 APISIX 和 etcd 集群之间存在网络分区,该值将设置为 `"unknown"`。 | | version | string | APISIX 版本信息。 | -| hostname | string | APISIX 所部署的机器或 pod 的主机名信息。 | +| hostname | string | APISIX 所部署的机器或 pod 的主机名信息。 | ## 插件属性 @@ -76,18 +74,15 @@ plugins: # plugin list 我们可以在 `conf/config.yaml` 文件的 `plugin_attr` 一节中修改上报配置。 | 名称 | 类型 | 默认值 | 描述 | -| --------------- | ------- | ------ | ------------------------------------------------------------------ | -| report_interval | integer | 60 | 上报服务信息至 etcd 的间隔(单位:秒,最大值:3600,最小值:60) | -| report_ttl | integer | 7200 | etcd 中服务信息保存的 TTL(单位:秒,最大值:86400,最小值:3600) | +| --------------- | ------- | ------ | --------------------------------------------------------------- | +| report_ttl | integer | 36 | etcd 中服务信息保存的 TTL(单位:秒,最大值:86400,最小值:3) | -下面的例子将 `report_interval` 修改成了 10 分钟,并将 `report_ttl` 修改成了 1 -小时: +下面的例子将 `report_ttl` 修改成了 1 分钟: ```yaml plugin_attr: server-info: - report_interval: 600 - report_ttl: 3600 + report_ttl: 60 ``` ## 测试插件 @@ -98,8 +93,6 @@ plugin_attr: $ curl http://127.0.0.1:9090/v1/server_info -s | jq . { "etcd_version": "3.5.0", - "up_time": 9460, - "last_report_time": 1608531519, "id": "b7ce1c5c-b1aa-4df7-888a-cbe403f3e948", "hostname": "fedora32", "version": "2.1", From 2a9379067a822ecb0cf63cba5cfb4fb832d700f6 Mon Sep 17 00:00:00 2001 From: zaunist Date: Thu, 10 Feb 2022 23:43:24 +0800 Subject: [PATCH 07/21] fix: review --- apisix/plugins/server-info.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index 8a9b0e5e5aee..f9af667d0023 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -152,23 +152,27 @@ local function report(premature, report_ttl) -- get inside etcd data, if not exist, create it local key = "/data_plane/server_info/" .. server_info.id - local res, _ = core.etcd.get(key) + local res, err = core.etcd.get(key) + if err ~= nil then + core.log.error("failed to get server_info from etcd: ", err) + end + if not res.body.node then local newres, err = core.etcd.set(key, server_info, report_ttl) if not newres then core.log.error("failed to set server_info: ", err) + return end -- set lease_id to ngx dict - local ok, err = internal_status:set("lease_id", newres.body.lease_id) - if not ok then + local _, err = internal_status:set("lease_id", newres.body.lease_id) + if err ~= nil then core.log.error("failed to save boot_time to shdict: ", err) end return end - local res, _ = core.etcd.get(key) local ok = core.table.deep_eq(server_info, res.body.node.value) -- not equal, update it if not ok then @@ -236,7 +240,6 @@ end function _M.init() - -- core.log.info("server info: ", core.json.delay_encode(get())) if core.config ~= require("apisix.core.config_etcd") then -- we don't need to report server info if etcd is not in use. return @@ -249,7 +252,6 @@ function _M.init() return end - -- local report_ttl = attr and attr.report_ttl or default_report_ttl local report_ttl = attr and attr.report_ttl or default_report_ttl local start_at = ngx_time() From 4c28650b18d17e5dc5dbb3d6d70c81e73e85c66e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=9D=B0=E9=B2=81?= Date: Fri, 11 Feb 2022 14:18:52 +0800 Subject: [PATCH 08/21] fix: merge code to function for reuse --- apisix/plugins/server-info.lua | 45 ++++++++++++++++------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index f9af667d0023..8c636f14e8d4 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -80,7 +80,7 @@ local function get_boot_time() end -local function uninitialize_server_info() +local function uninitialized_server_info() local boot_time = get_boot_time() return { etcd_version = "unknown", @@ -100,7 +100,7 @@ local function get() end if not data then - return uninitialize_server_info() + return uninitialized_server_info() end local server_info, err = core.json.decode(data) @@ -113,6 +113,21 @@ local function get() end +local function set(key, value, ttl, modified_index) + local res, err = core.etcd.atomic_set(key, value, ttl, modified_index) + if not res then + core.log.error("failed to set server_info: ", err) + return + end + + -- set lease_id to ngx dict + local _, err = internal_status:set("lease_id", res.body.lease_id) + if err ~= nil then + core.log.error("failed to save lease_id to shdict: ", err) + end +end + + local function get_server_info() local info, err = get() if not info then @@ -157,18 +172,10 @@ local function report(premature, report_ttl) core.log.error("failed to get server_info from etcd: ", err) end - if not res.body.node then - local newres, err = core.etcd.set(key, server_info, report_ttl) - if not newres then - core.log.error("failed to set server_info: ", err) - return - end + local modified_index = res.body.node.modifiedIndex - -- set lease_id to ngx dict - local _, err = internal_status:set("lease_id", newres.body.lease_id) - if err ~= nil then - core.log.error("failed to save boot_time to shdict: ", err) - end + if not res.body.node then + set(key, server_info, report_ttl, modified_index) return end @@ -176,17 +183,7 @@ local function report(premature, report_ttl) local ok = core.table.deep_eq(server_info, res.body.node.value) -- not equal, update it if not ok then - local newres, err = core.etcd.set(key, server_info, report_ttl) - if not newres then - core.log.error("failed to set server_info to etcd: ", err) - return false, err - end - - -- update lease_id - local _, err = internal_status:set("lease_id", res.body.lease_id) - if err ~= nil then - core.log.error("failed to set lease_id to shdict: ", err) - end + set(key, server_info, report_ttl, modified_index) return end From eef4ff48ef985045f96bad5061a0774bbee5730d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=9D=B0=E9=B2=81?= Date: Fri, 11 Feb 2022 15:47:05 +0800 Subject: [PATCH 09/21] fix: ci failed --- apisix/plugins/server-info.lua | 45 ++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index 8c636f14e8d4..c54fd741907b 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -113,21 +113,6 @@ local function get() end -local function set(key, value, ttl, modified_index) - local res, err = core.etcd.atomic_set(key, value, ttl, modified_index) - if not res then - core.log.error("failed to set server_info: ", err) - return - end - - -- set lease_id to ngx dict - local _, err = internal_status:set("lease_id", res.body.lease_id) - if err ~= nil then - core.log.error("failed to save lease_id to shdict: ", err) - end -end - - local function get_server_info() local info, err = get() if not info then @@ -139,6 +124,15 @@ local function get_server_info() end +local function set_lease_id(id) + -- update lease_id + local _, err = internal_status:set("lease_id", id) + if err ~= nil then + core.log.error("failed to set lease_id to shdict: ", err) + end +end + + local function report(premature, report_ttl) if premature then return @@ -172,18 +166,31 @@ local function report(premature, report_ttl) core.log.error("failed to get server_info from etcd: ", err) end - local modified_index = res.body.node.modifiedIndex - if not res.body.node then - set(key, server_info, report_ttl, modified_index) + local res_new, err = core.etcd.set(key, server_info, report_ttl) + if not res_new then + core.log.error("failed to set server_info: ", err) + return + end + + -- set lease_id to ngx dict + set_lease_id(res_new.body.lease_id) return end + local modified_index = res.body.node.modifiedIndex local ok = core.table.deep_eq(server_info, res.body.node.value) -- not equal, update it if not ok then - set(key, server_info, report_ttl, modified_index) + local res_new, err = core.etcd.atomic_set(key, server_info, report_ttl, modified_index) + if not res_new then + core.log.error("failed to set server_info to etcd: ", err) + return + end + -- update lease_id to ngx dict + set_lease_id(res_new.body.lease_id) + return end From 97a1447e9c21a2efb02f45353cc56a37505fc207 Mon Sep 17 00:00:00 2001 From: zaunist Date: Mon, 14 Feb 2022 00:15:44 +0800 Subject: [PATCH 10/21] fix: review --- apisix/core/etcd.lua | 5 +-- apisix/plugins/server-info.lua | 70 +++++++++++++++++++--------------- 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/apisix/core/etcd.lua b/apisix/core/etcd.lua index 3670bb86fe80..165d196df083 100644 --- a/apisix/core/etcd.lua +++ b/apisix/core/etcd.lua @@ -219,10 +219,6 @@ local function set(key, value, ttl) return nil, grant_err end res, err = etcd_cli:set(prefix .. key, value, {prev_kv = true, lease = data.body.ID}) - if not res then - return nil, err - end - res.body.lease_id = data.body.ID else res, err = etcd_cli:set(prefix .. key, value, {prev_kv = true}) end @@ -302,6 +298,7 @@ function _M.atomic_set(key, value, ttl, mod_revision) value = value, } res.status = 201 + res.body.lease_id = lease_id return res, nil end diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index c54fd741907b..79bce04fe555 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -15,7 +15,7 @@ -- limitations under the License. -- local require = require -local core = require("apisix.core") +local core = require("apisix.core") local timers = require("apisix.timers") local plugin = require("apisix.plugin") @@ -27,6 +27,7 @@ local type = type local load_time = os.time() local plugin_name = "server-info" local default_report_ttl = 36 +local modified_index = 0 local lease_id local schema = { @@ -95,7 +96,7 @@ end local function get() local data, err = internal_status:get("server_info") if err ~= nil then - core.log.error("get error: ",err) + core.log.error("get error: ", err) return nil, err end @@ -124,12 +125,23 @@ local function get_server_info() end -local function set_lease_id(id) - -- update lease_id - local _, err = internal_status:set("lease_id", id) - if err ~= nil then - core.log.error("failed to set lease_id to shdict: ", err) - end +local function set(key,value,ttl, modified_index) + local res_new, err = core.etcd.atomic_set(key, value, ttl, modified_index) + if not res_new then + core.log.error("failed to set server_info: ", err) + return 503, {error_msg = err} + end + + lease_id = res_new.body.lease_id + + -- set or update lease_id + local ok, err = internal_status:set("lease_id", lease_id) + if not ok then + core.log.error("failed to set lease_id to shdict: ", err) + return 503, {error_msg = err} + end + + return 200, nil end @@ -142,17 +154,18 @@ local function report(premature, report_ttl) local server_info, err = get() if not server_info then core.log.error("failed to get server_info: ", err) + return 500, {error_msg = err} end if server_info.etcd_version == "unknown" then local res, err = core.etcd.server_version() if not res then core.log.error("failed to fetch etcd version: ", err) - return + return 500, {error_msg = err} elseif type(res.body) ~= "table" then core.log.error("failed to fetch etcd version: bad version info") - return + return 500, {error_msg = err} else server_info.etcd_version = res.body.etcdcluster @@ -162,50 +175,45 @@ local function report(premature, report_ttl) -- get inside etcd data, if not exist, create it local key = "/data_plane/server_info/" .. server_info.id local res, err = core.etcd.get(key) - if err ~= nil then + if not res or (res.status ~= 200 and res.status ~= 404) then core.log.error("failed to get server_info from etcd: ", err) + return 503, {error_msg = err} end - if not res.body.node then - local res_new, err = core.etcd.set(key, server_info, report_ttl) - if not res_new then - core.log.error("failed to set server_info: ", err) - return + if not res.body.node then + local ok, err = set(key, server_info, report_ttl, modified_index) + if not ok then + core.log.error("failed to set server_info to etcd: ", err) + return 503, {error_msg = err} end - -- set lease_id to ngx dict - set_lease_id(res_new.body.lease_id) - return end - local modified_index = res.body.node.modifiedIndex + modified_index = res.body.node.modifiedIndex local ok = core.table.deep_eq(server_info, res.body.node.value) -- not equal, update it if not ok then - local res_new, err = core.etcd.atomic_set(key, server_info, report_ttl, modified_index) - if not res_new then + local ok, err = set(key, server_info, report_ttl, modified_index) + if not ok then core.log.error("failed to set server_info to etcd: ", err) - return + return 503, {error_msg = err} end - -- update lease_id to ngx dict - set_lease_id(res_new.body.lease_id) - return end -- get lease_id from ngx dict lease_id, err = internal_status:get("lease_id") - if err ~= nil then - core.log.error("failed to get lease_id from shdict: ",err) + if not lease_id then + core.log.error("failed to get lease_id from shdict: ", err) end -- call keepalive - local _, err = core.etcd.keepalive(lease_id) - if err ~= nil then + local res, err = core.etcd.keepalive(lease_id) + if not res then core.log.error("send heartbeat failed: ", err) - return false, err + return 503, {error_msg = err} end local data, err = core.json.encode(server_info) From b1217f59f989cbf76a5c98881b2b9305c68e7605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=9D=B0=E9=B2=81?= Date: Mon, 14 Feb 2022 09:10:14 +0800 Subject: [PATCH 11/21] fix: disable default server_info plugin --- conf/config-default.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/config-default.yaml b/conf/config-default.yaml index 9c3023667450..50e8685028b1 100644 --- a/conf/config-default.yaml +++ b/conf/config-default.yaml @@ -359,7 +359,7 @@ plugins: # plugin list (sorted by priority) - limit-req # priority: 1001 #- node-status # priority: 1000 - gzip # priority: 995 - - server-info # priority: 990 + # - server-info # priority: 990 - traffic-split # priority: 966 - redirect # priority: 900 - response-rewrite # priority: 899 From 054f7e9a4ce711171539895fb9cc0c786c0429bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=9D=B0=E9=B2=81?= Date: Mon, 14 Feb 2022 14:37:28 +0800 Subject: [PATCH 12/21] fix: review --- apisix/plugins/server-info.lua | 7 ++++++- conf/config-default.yaml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index 79bce04fe555..1f830ee5b549 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -125,13 +125,18 @@ local function get_server_info() end -local function set(key,value,ttl, modified_index) +local function set(key, value, ttl, modified_index) local res_new, err = core.etcd.atomic_set(key, value, ttl, modified_index) if not res_new then core.log.error("failed to set server_info: ", err) return 503, {error_msg = err} end + if not res_new.body.lease_id then + core.log.error("failed to get lease_id: ", err) + return 503, {error_msg = err} + end + lease_id = res_new.body.lease_id -- set or update lease_id diff --git a/conf/config-default.yaml b/conf/config-default.yaml index 50e8685028b1..9c3023667450 100644 --- a/conf/config-default.yaml +++ b/conf/config-default.yaml @@ -359,7 +359,7 @@ plugins: # plugin list (sorted by priority) - limit-req # priority: 1001 #- node-status # priority: 1000 - gzip # priority: 995 - # - server-info # priority: 990 + - server-info # priority: 990 - traffic-split # priority: 966 - redirect # priority: 900 - response-rewrite # priority: 899 From c4f5e3db2aa730d7e02bb11b3aac222c772d5452 Mon Sep 17 00:00:00 2001 From: zaunist Date: Mon, 14 Feb 2022 22:47:55 +0800 Subject: [PATCH 13/21] debug: tmate --- .github/workflows/centos7-ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/centos7-ci.yml b/.github/workflows/centos7-ci.yml index bb306f9160df..e282d6fe63fa 100644 --- a/.github/workflows/centos7-ci.yml +++ b/.github/workflows/centos7-ci.yml @@ -80,3 +80,8 @@ jobs: - name: Run test cases run: | docker exec centos7Instance bash -c "cd apisix && ./ci/centos7-ci.sh run_case" + + - name: Set up tmate session + if: ${{ failure() }} + uses: ./.github/actions/action-tmate + timeout-minutes: 15 \ No newline at end of file From ea635b58db66704b54a0afd7777a18f485c4623f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=9D=B0=E9=B2=81?= Date: Tue, 15 Feb 2022 15:24:18 +0800 Subject: [PATCH 14/21] debug: tmate From 819d4fdd200b4c590422ccdc1b1de5c41ba6b9c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=9D=B0=E9=B2=81?= Date: Wed, 16 Feb 2022 14:25:51 +0800 Subject: [PATCH 15/21] fix: disable default server-info plugin --- conf/config-default.yaml | 2 +- t/admin/plugins.t | 1 - t/debug/debug-mode.t | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/conf/config-default.yaml b/conf/config-default.yaml index 9c3023667450..50e8685028b1 100644 --- a/conf/config-default.yaml +++ b/conf/config-default.yaml @@ -359,7 +359,7 @@ plugins: # plugin list (sorted by priority) - limit-req # priority: 1001 #- node-status # priority: 1000 - gzip # priority: 995 - - server-info # priority: 990 + # - server-info # priority: 990 - traffic-split # priority: 966 - redirect # priority: 900 - response-rewrite # priority: 899 diff --git a/t/admin/plugins.t b/t/admin/plugins.t index 344f0b73ec8d..7a9082c91687 100644 --- a/t/admin/plugins.t +++ b/t/admin/plugins.t @@ -96,7 +96,6 @@ limit-conn limit-count limit-req gzip -server-info traffic-split redirect response-rewrite diff --git a/t/debug/debug-mode.t b/t/debug/debug-mode.t index fea9461a830a..95013b00c2cc 100644 --- a/t/debug/debug-mode.t +++ b/t/debug/debug-mode.t @@ -70,7 +70,6 @@ loaded plugin and sort by priority: 1003 name: limit-conn loaded plugin and sort by priority: 1002 name: limit-count loaded plugin and sort by priority: 1001 name: limit-req loaded plugin and sort by priority: 995 name: gzip -loaded plugin and sort by priority: 990 name: server-info loaded plugin and sort by priority: 966 name: traffic-split loaded plugin and sort by priority: 900 name: redirect loaded plugin and sort by priority: 899 name: response-rewrite From 778d8cabcdc68af07b3e3d168203deb66fadafcf Mon Sep 17 00:00:00 2001 From: zaunist Date: Wed, 16 Feb 2022 23:23:10 +0800 Subject: [PATCH 16/21] debug: remove tmate --- .github/workflows/centos7-ci.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/centos7-ci.yml b/.github/workflows/centos7-ci.yml index e282d6fe63fa..bb306f9160df 100644 --- a/.github/workflows/centos7-ci.yml +++ b/.github/workflows/centos7-ci.yml @@ -80,8 +80,3 @@ jobs: - name: Run test cases run: | docker exec centos7Instance bash -c "cd apisix && ./ci/centos7-ci.sh run_case" - - - name: Set up tmate session - if: ${{ failure() }} - uses: ./.github/actions/action-tmate - timeout-minutes: 15 \ No newline at end of file From 44c4201b6a52a1526b61bbb94baee102216b6d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=9D=B0=E9=B2=81?= Date: Thu, 17 Feb 2022 15:46:27 +0800 Subject: [PATCH 17/21] fix: change atomic_set to set --- apisix/plugins/server-info.lua | 10 ++++------ conf/config-default.yaml | 2 +- t/admin/plugins.t | 1 + t/debug/debug-mode.t | 1 + t/plugin/server-info.t | 22 ++++++++++++++-------- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index 1f830ee5b549..4c170a06202c 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -27,7 +27,6 @@ local type = type local load_time = os.time() local plugin_name = "server-info" local default_report_ttl = 36 -local modified_index = 0 local lease_id local schema = { @@ -125,8 +124,8 @@ local function get_server_info() end -local function set(key, value, ttl, modified_index) - local res_new, err = core.etcd.atomic_set(key, value, ttl, modified_index) +local function set(key, value, ttl) + local res_new, err = core.etcd.set(key, value, ttl) if not res_new then core.log.error("failed to set server_info: ", err) return 503, {error_msg = err} @@ -186,7 +185,7 @@ local function report(premature, report_ttl) end if not res.body.node then - local ok, err = set(key, server_info, report_ttl, modified_index) + local ok, err = set(key, server_info, report_ttl) if not ok then core.log.error("failed to set server_info to etcd: ", err) return 503, {error_msg = err} @@ -195,11 +194,10 @@ local function report(premature, report_ttl) return end - modified_index = res.body.node.modifiedIndex local ok = core.table.deep_eq(server_info, res.body.node.value) -- not equal, update it if not ok then - local ok, err = set(key, server_info, report_ttl, modified_index) + local ok, err = set(key, server_info, report_ttl) if not ok then core.log.error("failed to set server_info to etcd: ", err) return 503, {error_msg = err} diff --git a/conf/config-default.yaml b/conf/config-default.yaml index 50e8685028b1..9c3023667450 100644 --- a/conf/config-default.yaml +++ b/conf/config-default.yaml @@ -359,7 +359,7 @@ plugins: # plugin list (sorted by priority) - limit-req # priority: 1001 #- node-status # priority: 1000 - gzip # priority: 995 - # - server-info # priority: 990 + - server-info # priority: 990 - traffic-split # priority: 966 - redirect # priority: 900 - response-rewrite # priority: 899 diff --git a/t/admin/plugins.t b/t/admin/plugins.t index 7a9082c91687..344f0b73ec8d 100644 --- a/t/admin/plugins.t +++ b/t/admin/plugins.t @@ -96,6 +96,7 @@ limit-conn limit-count limit-req gzip +server-info traffic-split redirect response-rewrite diff --git a/t/debug/debug-mode.t b/t/debug/debug-mode.t index 95013b00c2cc..fea9461a830a 100644 --- a/t/debug/debug-mode.t +++ b/t/debug/debug-mode.t @@ -70,6 +70,7 @@ loaded plugin and sort by priority: 1003 name: limit-conn loaded plugin and sort by priority: 1002 name: limit-count loaded plugin and sort by priority: 1001 name: limit-req loaded plugin and sort by priority: 995 name: gzip +loaded plugin and sort by priority: 990 name: server-info loaded plugin and sort by priority: 966 name: traffic-split loaded plugin and sort by priority: 900 name: redirect loaded plugin and sort by priority: 899 name: response-rewrite diff --git a/t/plugin/server-info.t b/t/plugin/server-info.t index ff78952cae98..6963fd2f98b6 100644 --- a/t/plugin/server-info.t +++ b/t/plugin/server-info.t @@ -34,6 +34,20 @@ no_long_string(); no_root_location(); no_shuffle(); +add_block_preprocessor(sub { + my ($block) = @_; + + if (!defined $block->request) { + $block->set_value("request", "GET /t"); + } + + if (!defined $block->error_log && !defined $block->no_error_log) { + $block->set_value("no_error_log", "[error]"); + } + + $block; +}); + run_tests; __DATA__ @@ -65,12 +79,8 @@ location /t { ngx.say(json.encode(value)) } } ---- request -GET /t --- response_body eval qr/^{"boot_time":\d+,"etcd_version":"[\d\.]+","hostname":"[a-zA-Z\-0-9\.]+","id":[a-zA-Z\-0-9]+,"version":"[\d\.]+"}$/ ---- no_error_log -[error] @@ -94,9 +104,5 @@ location /t { ngx.say(json.encode(body)) } } ---- request -GET /t --- response_body eval qr/^{"boot_time":\d+,"etcd_version":"[\d\.]+","hostname":"[a-zA-Z\-0-9\.]+","id":[a-zA-Z\-0-9]+,"version":"[\d\.]+"}$/ ---- no_error_log -[error] From 5f1fd9edee6da8f2c54713991b41670ba460f533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=9D=B0=E9=B2=81?= Date: Thu, 17 Feb 2022 17:04:47 +0800 Subject: [PATCH 18/21] fix: etcd.set should return lease_id --- apisix/core/etcd.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apisix/core/etcd.lua b/apisix/core/etcd.lua index 165d196df083..de1c020fc58b 100644 --- a/apisix/core/etcd.lua +++ b/apisix/core/etcd.lua @@ -219,6 +219,7 @@ local function set(key, value, ttl) return nil, grant_err end res, err = etcd_cli:set(prefix .. key, value, {prev_kv = true, lease = data.body.ID}) + res.body.lease_id = data.body.ID else res, err = etcd_cli:set(prefix .. key, value, {prev_kv = true}) end @@ -298,7 +299,6 @@ function _M.atomic_set(key, value, ttl, mod_revision) value = value, } res.status = 201 - res.body.lease_id = lease_id return res, nil end From d5166c4c794ffe594c4bc70811394711d59a5d9a Mon Sep 17 00:00:00 2001 From: zaunist Date: Thu, 17 Feb 2022 21:16:22 +0800 Subject: [PATCH 19/21] ci: rerun ci From dfc7601501038f9857091ec956c37af4a77be4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=9D=B0=E9=B2=81?= Date: Wed, 23 Feb 2022 10:47:47 +0800 Subject: [PATCH 20/21] fix: return error uniformly --- apisix/plugins/server-info.lua | 15 ++++++++------- conf/config-default.yaml | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index 4c170a06202c..72f7fa785239 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -26,7 +26,7 @@ local type = type local load_time = os.time() local plugin_name = "server-info" -local default_report_ttl = 36 +local default_report_ttl = 60 local lease_id local schema = { @@ -117,7 +117,7 @@ local function get_server_info() local info, err = get() if not info then core.log.error("failed to get server_info: ", err) - return 500 + return 503 end return 200, info @@ -158,18 +158,18 @@ local function report(premature, report_ttl) local server_info, err = get() if not server_info then core.log.error("failed to get server_info: ", err) - return 500, {error_msg = err} + return 503, {error_msg = err} end if server_info.etcd_version == "unknown" then local res, err = core.etcd.server_version() if not res then core.log.error("failed to fetch etcd version: ", err) - return 500, {error_msg = err} + return 503, {error_msg = err} elseif type(res.body) ~= "table" then core.log.error("failed to fetch etcd version: bad version info") - return 500, {error_msg = err} + return 503, {error_msg = err} else server_info.etcd_version = res.body.etcdcluster @@ -210,6 +210,7 @@ local function report(premature, report_ttl) lease_id, err = internal_status:get("lease_id") if not lease_id then core.log.error("failed to get lease_id from shdict: ", err) + return 503, {error_msg = err} end -- call keepalive @@ -222,13 +223,13 @@ local function report(premature, report_ttl) local data, err = core.json.encode(server_info) if not data then core.log.error("failed to encode server_info: ", err) - return false, err + return 503, {error_msg = err} end local ok, err = internal_status:set("server_info", data) if not ok then core.log.error("failed to encode and save server info: ", err) - return false, err + return 503, {error_msg = err} end end diff --git a/conf/config-default.yaml b/conf/config-default.yaml index 84c93c759e30..0b45bdb4a352 100644 --- a/conf/config-default.yaml +++ b/conf/config-default.yaml @@ -438,7 +438,7 @@ plugin_attr: ip: 127.0.0.1 port: 9091 server-info: - report_ttl: 36 # live time for server info in etcd (unit: second) + report_ttl: 60 # live time for server info in etcd (unit: second) dubbo-proxy: upstream_multiplex_count: 32 request-id: From e3ee7aa7d35cb10dad05a3dfaf85234074d8dd0e Mon Sep 17 00:00:00 2001 From: zaunist Date: Thu, 24 Feb 2022 23:34:30 +0800 Subject: [PATCH 21/21] fix: remove redundant return message --- apisix/plugins/server-info.lua | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index 72f7fa785239..055bafa2858c 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -117,7 +117,7 @@ local function get_server_info() local info, err = get() if not info then core.log.error("failed to get server_info: ", err) - return 503 + return 500 end return 200, info @@ -128,12 +128,12 @@ local function set(key, value, ttl) local res_new, err = core.etcd.set(key, value, ttl) if not res_new then core.log.error("failed to set server_info: ", err) - return 503, {error_msg = err} + return nil, err end if not res_new.body.lease_id then core.log.error("failed to get lease_id: ", err) - return 503, {error_msg = err} + return nil, err end lease_id = res_new.body.lease_id @@ -142,10 +142,10 @@ local function set(key, value, ttl) local ok, err = internal_status:set("lease_id", lease_id) if not ok then core.log.error("failed to set lease_id to shdict: ", err) - return 503, {error_msg = err} + return nil, err end - return 200, nil + return true end @@ -158,18 +158,18 @@ local function report(premature, report_ttl) local server_info, err = get() if not server_info then core.log.error("failed to get server_info: ", err) - return 503, {error_msg = err} + return end if server_info.etcd_version == "unknown" then local res, err = core.etcd.server_version() if not res then core.log.error("failed to fetch etcd version: ", err) - return 503, {error_msg = err} + return elseif type(res.body) ~= "table" then core.log.error("failed to fetch etcd version: bad version info") - return 503, {error_msg = err} + return else server_info.etcd_version = res.body.etcdcluster @@ -181,14 +181,14 @@ local function report(premature, report_ttl) local res, err = core.etcd.get(key) if not res or (res.status ~= 200 and res.status ~= 404) then core.log.error("failed to get server_info from etcd: ", err) - return 503, {error_msg = err} + return end if not res.body.node then local ok, err = set(key, server_info, report_ttl) if not ok then core.log.error("failed to set server_info to etcd: ", err) - return 503, {error_msg = err} + return end return @@ -200,7 +200,7 @@ local function report(premature, report_ttl) local ok, err = set(key, server_info, report_ttl) if not ok then core.log.error("failed to set server_info to etcd: ", err) - return 503, {error_msg = err} + return end return @@ -210,26 +210,26 @@ local function report(premature, report_ttl) lease_id, err = internal_status:get("lease_id") if not lease_id then core.log.error("failed to get lease_id from shdict: ", err) - return 503, {error_msg = err} + return end -- call keepalive local res, err = core.etcd.keepalive(lease_id) if not res then core.log.error("send heartbeat failed: ", err) - return 503, {error_msg = err} + return end local data, err = core.json.encode(server_info) if not data then core.log.error("failed to encode server_info: ", err) - return 503, {error_msg = err} + return end local ok, err = internal_status:set("server_info", data) if not ok then core.log.error("failed to encode and save server info: ", err) - return 503, {error_msg = err} + return end end