shreemaan-abhishek commented on code in PR #13066:
URL: https://github.com/apache/apisix/pull/13066#discussion_r2922048691
##########
apisix/discovery/consul/init.lua:
##########
@@ -66,53 +73,85 @@ local _M = {
}
-local function discovery_consul_callback(data, event, source, pid)
- all_services = data
- log.notice("update local variable all_services, event is: ", event,
- "source: ", source, "server pid:", pid,
- ", all services: ", json_delay_encode(all_services, true))
-end
-
-
function _M.all_nodes()
- return all_services
+ local keys = consul_dict:get_keys(0)
+ local services = core.table.new(0, #keys)
+ for i, key in ipairs(keys) do
+ local value = consul_dict:get(key)
+ if value then
+ local nodes, err = core.json.decode(value)
+ if nodes then
+ services[key] = nodes
+ else
+ log.error("failed to decode nodes for service: ", key, ",
error: ", err)
+ end
+ end
+
+ if i % 100 == 0 then
+ ngx.sleep(0)
+ end
+ end
+ return services
end
function _M.nodes(service_name)
- if not all_services then
- log.error("all_services is nil, failed to fetch nodes for : ",
service_name)
- return
+ local value = consul_dict:get(service_name)
+ if not value then
Review Comment:
> The way currently being adopted is exactly the opposite.
I don't think so, the lrucache usage helps cache the the json decode
operation.
If we use an lrucache to cache the node for a given service name we don't
have a good way to invalidate the lrucache when service data changes. Since
privileged_agent is the only one that fetches data from consul a shdict is the
only way to let other workers know that consul data has changed. Hence, we
would still need to retrieve data from shdict if we want to use lrucache like
you said.
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]