This is an automated email from the ASF dual-hosted git repository.

spacewander 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 a18573a3b fix(etcd): reloaded data may be in res.body.node (#8736)
a18573a3b is described below

commit a18573a3b8775f5a92ba92b948e8212affbf7057
Author: 罗泽轩 <[email protected]>
AuthorDate: Wed Feb 8 10:07:15 2023 +0800

    fix(etcd): reloaded data may be in res.body.node (#8736)
    
    Fixes https://github.com/apache/apisix/issues/8682
---
 apisix/core/config_etcd.lua |  6 +--
 t/core/config_etcd.t        | 97 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 99 insertions(+), 4 deletions(-)

diff --git a/apisix/core/config_etcd.lua b/apisix/core/config_etcd.lua
index d671c6ed2..4946cc5c2 100644
--- a/apisix/core/config_etcd.lua
+++ b/apisix/core/config_etcd.lua
@@ -367,12 +367,9 @@ local function sync_data(self)
             return false, err
         end
 
-        local dir_res, headers = res.body.list or {}, res.headers
+        local dir_res, headers = res.body.list or res.body.node or {}, 
res.headers
         log.debug("readdir key: ", self.key, " res: ",
                   json.delay_encode(dir_res))
-        if not dir_res then
-            return false, err
-        end
 
         if self.values then
             for i, val in ipairs(self.values) do
@@ -673,6 +670,7 @@ local function _automatic_fetch(premature, self)
 end
 
 -- for test
+_M.test_sync_data = sync_data
 _M.test_automatic_fetch = _automatic_fetch
 function _M.inject_sync_data(f)
     sync_data = f
diff --git a/t/core/config_etcd.t b/t/core/config_etcd.t
index 825e0f225..380b82522 100644
--- a/t/core/config_etcd.t
+++ b/t/core/config_etcd.t
@@ -347,3 +347,100 @@ GET /t
 reconnected to etcd
 --- response_body
 passed
+
+
+
+=== TEST 11: reloaded data may be in res.body.node (special kvs structure)
+--- yaml_config
+deployment:
+    role: traditional
+    role_traditional:
+        config_provider: etcd
+    admin:
+        admin_key: null
+--- config
+    location /t {
+        content_by_lua_block {
+            local config_etcd = require("apisix.core.config_etcd")
+            local etcd_cli = {}
+            function etcd_cli.readdir()
+                return {
+                    status = 200,
+                    headers = {},
+                    body = {
+                        header = {revision = 1},
+                        kvs = {{key = "foo", value = "bar"}},
+                    }
+                }
+            end
+            config_etcd.test_sync_data({
+                etcd_cli = etcd_cli,
+                key = "fake",
+                single_item = true,
+                -- need_reload because something wrong happened before
+                need_reload = true,
+                upgrade_version = function() end,
+                conf_version = 1,
+            })
+        }
+    }
+--- request
+GET /t
+--- log_level: debug
+--- grep_error_log eval
+qr/readdir key: fake res: .+/
+--- grep_error_log_out eval
+qr/readdir key: fake res: 
\{("value":"bar","key":"foo"|"key":"foo","value":"bar")\}/
+--- wait: 1
+--- no_error_log
+[error]
+
+
+
+=== TEST 12: reloaded data may be in res.body.node (admin_api_version is v2)
+--- yaml_config
+deployment:
+    role: traditional
+    role_traditional:
+        config_provider: etcd
+    admin:
+        admin_key: null
+        admin_api_version: v2
+--- config
+    location /t {
+        content_by_lua_block {
+            local config_etcd = require("apisix.core.config_etcd")
+            local etcd_cli = {}
+            function etcd_cli.readdir()
+                return {
+                    status = 200,
+                    headers = {},
+                    body = {
+                        header = {revision = 1},
+                        kvs = {
+                            {key = "/foo"},
+                            {key = "/foo/bar", value = {"bar"}}
+                        },
+                    }
+                }
+            end
+            config_etcd.test_sync_data({
+                etcd_cli = etcd_cli,
+                key = "fake",
+                -- need_reload because something wrong happened before
+                need_reload = true,
+                upgrade_version = function() end,
+                conf_version = 1,
+            })
+        }
+    }
+--- request
+GET /t
+--- log_level: debug
+--- grep_error_log eval
+qr/readdir key: fake res: .+/
+--- grep_error_log_out eval
+qr/readdir key: fake res: \{.*"nodes":\[\{.*"value":\["bar"\].*\}\].*\}/
+--- wait: 1
+--- no_error_log
+[error]

Reply via email to