This is an automated email from the ASF dual-hosted git repository.
wenming pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git
The following commit(s) were added to refs/heads/master by this push:
new aa2d061b6 chore: remove conf server (#10490)
aa2d061b6 is described below
commit aa2d061b6564b7058dc7d2aa842004d3163648f1
Author: Abhishek Choudhary <[email protected]>
AuthorDate: Wed Nov 15 18:25:40 2023 +0545
chore: remove conf server (#10490)
---
apisix/conf_server.lua | 299 -------------------------------------------------
apisix/init.lua | 2 -
2 files changed, 301 deletions(-)
diff --git a/apisix/conf_server.lua b/apisix/conf_server.lua
deleted file mode 100644
index e0ea91e77..000000000
--- a/apisix/conf_server.lua
+++ /dev/null
@@ -1,299 +0,0 @@
---
--- Licensed to the Apache Software Foundation (ASF) under one or more
--- contributor license agreements. See the NOTICE file distributed with
--- this work for additional information regarding copyright ownership.
--- The ASF licenses this file to You under the Apache License, Version 2.0
--- (the "License"); you may not use this file except in compliance with
--- the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS,
--- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--- See the License for the specific language governing permissions and
--- limitations under the License.
---
-local core = require("apisix.core")
-local fetch_local_conf = require("apisix.core.config_local").local_conf
-local picker = require("apisix.balancer.least_conn")
-local balancer = require("ngx.balancer")
-local error = error
-local ipairs = ipairs
-local ngx = ngx
-local ngx_shared = ngx.shared
-local ngx_var = ngx.var
-local tonumber = tonumber
-
-
-local _M = {}
-local servers = {}
-local resolved_results = {}
-local server_picker
-local has_domain = false
-
-local is_http = ngx.config.subsystem == "http"
-local health_check_shm_name = "etcd-cluster-health-check"
-if not is_http then
- health_check_shm_name = health_check_shm_name .. "-stream"
-end
--- an endpoint is unhealthy if it is failed for HEALTH_CHECK_MAX_FAILURE times
in
--- HEALTH_CHECK_DURATION_SECOND
-local HEALTH_CHECK_MAX_FAILURE = 3
-local HEALTH_CHECK_DURATION_SECOND = 10
-
-
-local function create_resolved_result(server)
- local host, port = core.utils.parse_addr(server)
- return {
- host = host,
- port = port,
- server = server,
- }
-end
-
-
-function _M.init()
- local conf = fetch_local_conf()
- if not (conf.deployment and conf.deployment.etcd) then
- return
- end
-
- local etcd = conf.deployment.etcd
- if etcd.health_check_timeout then
- HEALTH_CHECK_DURATION_SECOND = etcd.health_check_timeout
- end
-
- for i, s in ipairs(etcd.host) do
- local _, to = core.string.find(s, "://")
- if not to then
- error("bad etcd endpoint format")
- end
-
- local addr = s:sub(to + 1)
- local host, _, err = core.utils.parse_addr(addr)
- if err then
- error("failed to parse host: ".. err)
- end
-
- resolved_results[i] = create_resolved_result(addr)
- servers[i] = addr
-
- if not core.utils.parse_ipv4(host) and not core.utils.parse_ipv6(host)
then
- has_domain = true
- resolved_results[i].domain = host
- end
- end
-
- if #servers > 1 then
- local nodes = {}
- for _, s in ipairs(servers) do
- nodes[s] = 1
- end
- server_picker = picker.new(nodes, {})
- end
-end
-
-
-local function response_err(err)
- core.log.error("failure in conf server: ", err)
-
- if ngx.get_phase() == "balancer" then
- return
- end
-
- ngx.status = 503
- ngx.say(core.json.encode({error = err}))
- ngx.exit(0)
-end
-
-
-local function resolve_servers(ctx)
- if not has_domain then
- return
- end
-
- local changed = false
- for _, res in ipairs(resolved_results) do
- local domain = res.domain
- if not domain then
- goto CONTINUE
- end
-
- local ip, err = core.resolver.parse_domain(domain)
- if ip and res.host ~= ip then
- res.host = ip
- changed = true
- core.log.info(domain, " is resolved to: ", ip)
- end
-
- if err then
- core.log.error("dns resolver resolves domain: ", domain, " error:
", err)
- end
-
- ::CONTINUE::
- end
-
- if not changed then
- return
- end
-
- if #servers > 1 then
- local nodes = {}
- for _, res in ipairs(resolved_results) do
- local s = res.server
- nodes[s] = 1
- end
- server_picker = picker.new(nodes, {})
- end
-end
-
-
-local function gen_unhealthy_key(addr)
- return "conf_server:" .. addr
-end
-
-
-local function is_node_health(addr)
- local key = gen_unhealthy_key(addr)
- local count, err = ngx_shared[health_check_shm_name]:get(key)
- if err then
- core.log.warn("failed to get health check count, key: ", key, " err:
", err)
- return true
- end
-
- if not count then
- return true
- end
-
- return tonumber(count) < HEALTH_CHECK_MAX_FAILURE
-end
-
-
-local function report_failure(addr)
- local key = gen_unhealthy_key(addr)
- local count, err =
- ngx_shared[health_check_shm_name]:incr(key, 1, 0,
HEALTH_CHECK_DURATION_SECOND)
- if not count then
- core.log.error("failed to report failure, key: ", key, " err: ", err)
- else
- -- count might be larger than HEALTH_CHECK_MAX_FAILURE
- core.log.warn("report failure, endpoint: ", addr, " count: ", count)
- end
-end
-
-
-local function pick_node_by_server_picker(ctx)
- local server, err = ctx.server_picker.get(ctx)
- if not server then
- err = err or "no valid upstream node"
- return nil, "failed to find valid upstream server: " .. err
- end
-
- ctx.balancer_server = server
-
- for _, r in ipairs(resolved_results) do
- if r.server == server then
- return r
- end
- end
-
- return nil, "unknown server: " .. server
-end
-
-
-local function pick_node(ctx)
- local res
- if server_picker then
- if not ctx.server_picker then
- ctx.server_picker = server_picker
- end
-
- local err
- res, err = pick_node_by_server_picker(ctx)
- if not res then
- return nil, err
- end
-
- while not is_node_health(res.server) do
- core.log.warn("endpoint ", res.server, " is unhealthy, skipped")
-
- if server_picker.after_balance then
- server_picker.after_balance(ctx, true)
- end
-
- res, err = pick_node_by_server_picker(ctx)
- if not res then
- return nil, err
- end
- end
-
- else
- -- we don't do health check if there is only one candidate
- res = resolved_results[1]
- end
-
- ctx.balancer_ip = res.host
- ctx.balancer_port = res.port
-
- ngx_var.upstream_host = res.domain or res.host
- if ngx.get_phase() == "balancer" then
- balancer.recreate_request()
- end
-
- return true
-end
-
-
-function _M.access()
- local ctx = ngx.ctx
- -- Nginx's DNS resolver doesn't support search option,
- -- so we have to use our own resolver
- resolve_servers(ctx)
- local ok, err = pick_node(ctx)
- if not ok then
- return response_err(err)
- end
-end
-
-
-function _M.balancer()
- local ctx = ngx.ctx
- if not ctx.balancer_run then
- ctx.balancer_run = true
- local retries = #servers - 1
- local ok, err = balancer.set_more_tries(retries)
- if not ok then
- core.log.error("could not set upstream retries: ", err)
- elseif err then
- core.log.warn("could not set upstream retries: ", err)
- end
- else
- if ctx.server_picker and ctx.server_picker.after_balance then
- ctx.server_picker.after_balance(ctx, true)
- end
-
- report_failure(ctx.balancer_server)
-
- local ok, err = pick_node(ctx)
- if not ok then
- return response_err(err)
- end
- end
-
- local ok, err = balancer.set_current_peer(ctx.balancer_ip,
ctx.balancer_port)
- if not ok then
- return response_err(err)
- end
-end
-
-
-function _M.log()
- local ctx = ngx.ctx
- if ctx.server_picker and ctx.server_picker.after_balance then
- ctx.server_picker.after_balance(ctx, false)
- end
-end
-
-
-return _M
diff --git a/apisix/init.lua b/apisix/init.lua
index 4cfd179d2..048f5a8ca 100644
--- a/apisix/init.lua
+++ b/apisix/init.lua
@@ -27,7 +27,6 @@ require("jit.opt").start("minstitch=2", "maxtrace=4000",
require("apisix.patch").patch()
local core = require("apisix.core")
-local conf_server = require("apisix.conf_server")
local plugin = require("apisix.plugin")
local plugin_config = require("apisix.plugin_config")
local consumer_group = require("apisix.consumer_group")
@@ -102,7 +101,6 @@ function _M.http_init(args)
end
xrpc.init()
- conf_server.init()
end