diff --git a/apisix/plugin.lua b/apisix/plugin.lua index dbcce7fed8ea..cee49bddf801 100644 --- a/apisix/plugin.lua +++ b/apisix/plugin.lua @@ -244,11 +244,14 @@ function _M.load(config) http_plugin_names = {} stream_plugin_names = {} local plugins_conf = config.value - for _, conf in ipairs(plugins_conf) do - if conf.stream then - core.table.insert(stream_plugin_names, conf.name) - else - core.table.insert(http_plugin_names, conf.name) + -- plugins_conf can be nil when another instance writes into etcd key "/apisix/plugins/" + if plugins_conf then + for _, conf in ipairs(plugins_conf) do + if conf.stream then + core.table.insert(stream_plugin_names, conf.name) + else + core.table.insert(http_plugin_names, conf.name) + end end end end diff --git a/t/cli/test_admin.sh b/t/cli/test_admin.sh index 2ec2f7c74d0e..ac691b175f5b 100755 --- a/t/cli/test_admin.sh +++ b/t/cli/test_admin.sh @@ -208,3 +208,24 @@ if ! echo "$out" | grep "Admin API can only be used with etcd config_center"; th fi echo "passed: Admin API can only be used with etcd config_center" + +# disable Admin API and init plugins syncer +echo ' +apisix: + enable_admin: false +' > conf/config.yaml + +rm logs/error.log +make init +make run + +make init + +if grep -E "failed to fetch data from etcd" logs/error.log; then + echo "failed: should sync /apisix/plugins from etcd when disabling admin normal" + exit 1 +fi + +make stop + +echo "pass: sync /apisix/plugins from etcd when disabling admin successfully"