You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by GitBox <gi...@apache.org> on 2022/02/23 03:43:11 UTC

[GitHub] [apisix] zaunist commented on a change in pull request #6202: change(server-info): use a new approach(keepalive) to report DP info

zaunist commented on a change in pull request #6202:
URL: https://github.com/apache/apisix/pull/6202#discussion_r812537266



##########
File path: apisix/plugins/server-info.lua
##########
@@ -132,51 +124,111 @@ local function get_server_info()
 end
 
 
+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}
+    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
+    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
+
+
 local function report(premature, report_ttl)
     if premature then
         return
     end
 
+    -- get apisix node info
     local server_info, err = get()
     if not server_info then
         core.log.error("failed to get server_info: ", err)
-        return
+        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
         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, 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}
+    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}
+        end
+
+        return
+    end
+
+    local ok = core.table.deep_eq(server_info, res.body.node.value)
+    -- not equal, update it
     if not ok then
-        core.log.error("failed to report server info to etcd: ", err)
+        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}
+        end
+
         return
     end
 
+    -- get lease_id from ngx dict
+    lease_id, err = internal_status:get("lease_id")
+    if not lease_id then
+        core.log.error("failed to get lease_id from shdict: ", err)
+    end

Review comment:
       Already add return code block




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org