Skip to content

Commit a18573a

Browse files
authored
fix(etcd): reloaded data may be in res.body.node (#8736)
Fixes #8682
1 parent bbff579 commit a18573a

File tree

2 files changed

+99
-4
lines changed

2 files changed

+99
-4
lines changed

apisix/core/config_etcd.lua

+2-4
Original file line numberDiff line numberDiff line change
@@ -367,12 +367,9 @@ local function sync_data(self)
367367
return false, err
368368
end
369369

370-
local dir_res, headers = res.body.list or {}, res.headers
370+
local dir_res, headers = res.body.list or res.body.node or {}, res.headers
371371
log.debug("readdir key: ", self.key, " res: ",
372372
json.delay_encode(dir_res))
373-
if not dir_res then
374-
return false, err
375-
end
376373

377374
if self.values then
378375
for i, val in ipairs(self.values) do
@@ -673,6 +670,7 @@ local function _automatic_fetch(premature, self)
673670
end
674671

675672
-- for test
673+
_M.test_sync_data = sync_data
676674
_M.test_automatic_fetch = _automatic_fetch
677675
function _M.inject_sync_data(f)
678676
sync_data = f

t/core/config_etcd.t

+97
Original file line numberDiff line numberDiff line change
@@ -347,3 +347,100 @@ GET /t
347347
reconnected to etcd
348348
--- response_body
349349
passed
350+
351+
352+
353+
=== TEST 11: reloaded data may be in res.body.node (special kvs structure)
354+
--- yaml_config
355+
deployment:
356+
role: traditional
357+
role_traditional:
358+
config_provider: etcd
359+
admin:
360+
admin_key: null
361+
--- config
362+
location /t {
363+
content_by_lua_block {
364+
local config_etcd = require("apisix.core.config_etcd")
365+
local etcd_cli = {}
366+
function etcd_cli.readdir()
367+
return {
368+
status = 200,
369+
headers = {},
370+
body = {
371+
header = {revision = 1},
372+
kvs = {{key = "foo", value = "bar"}},
373+
}
374+
}
375+
end
376+
config_etcd.test_sync_data({
377+
etcd_cli = etcd_cli,
378+
key = "fake",
379+
single_item = true,
380+
-- need_reload because something wrong happened before
381+
need_reload = true,
382+
upgrade_version = function() end,
383+
conf_version = 1,
384+
})
385+
}
386+
}
387+
--- request
388+
GET /t
389+
--- log_level: debug
390+
--- grep_error_log eval
391+
qr/readdir key: fake res: .+/
392+
--- grep_error_log_out eval
393+
qr/readdir key: fake res: \{("value":"bar","key":"foo"|"key":"foo","value":"bar")\}/
394+
--- wait: 1
395+
--- no_error_log
396+
[error]
397+
398+
399+
400+
=== TEST 12: reloaded data may be in res.body.node (admin_api_version is v2)
401+
--- yaml_config
402+
deployment:
403+
role: traditional
404+
role_traditional:
405+
config_provider: etcd
406+
admin:
407+
admin_key: null
408+
admin_api_version: v2
409+
--- config
410+
location /t {
411+
content_by_lua_block {
412+
local config_etcd = require("apisix.core.config_etcd")
413+
local etcd_cli = {}
414+
function etcd_cli.readdir()
415+
return {
416+
status = 200,
417+
headers = {},
418+
body = {
419+
header = {revision = 1},
420+
kvs = {
421+
{key = "/foo"},
422+
{key = "/foo/bar", value = {"bar"}}
423+
},
424+
}
425+
}
426+
end
427+
config_etcd.test_sync_data({
428+
etcd_cli = etcd_cli,
429+
key = "fake",
430+
-- need_reload because something wrong happened before
431+
need_reload = true,
432+
upgrade_version = function() end,
433+
conf_version = 1,
434+
})
435+
}
436+
}
437+
--- request
438+
GET /t
439+
--- log_level: debug
440+
--- grep_error_log eval
441+
qr/readdir key: fake res: .+/
442+
--- grep_error_log_out eval
443+
qr/readdir key: fake res: \{.*"nodes":\[\{.*"value":\["bar"\].*\}\].*\}/
444+
--- wait: 1
445+
--- no_error_log
446+
[error]

0 commit comments

Comments
 (0)