in apisix/plugins/ext-plugin/init.lua [398:480]
function (conf, ctx, sock, unique_key)
local token = fetch_token(unique_key)
if token then
core.log.info("fetch token from shared dict, token: ", token)
return token
end
local lock, err = resty_lock:new(shdict_name)
if not lock then
return nil, "failed to create lock: " .. err
end
local elapsed, err = lock:lock("prepare_conf")
if not elapsed then
return nil, "failed to acquire the lock: " .. err
end
local token = fetch_token(unique_key)
if token then
lock:unlock()
core.log.info("fetch token from shared dict, token: ", token)
return token
end
builder:Clear()
local key = builder:CreateString(unique_key)
local conf_vec
if conf.conf then
local len = #conf.conf
local textEntries = core.table.new(len, 0)
for i = 1, len do
local name = builder:CreateString(conf.conf[i].name)
local value = builder:CreateString(conf.conf[i].value)
text_entry.Start(builder)
text_entry.AddName(builder, name)
text_entry.AddValue(builder, value)
local c = text_entry.End(builder)
textEntries[i] = c
end
prepare_conf_req.StartConfVector(builder, len)
for i = len, 1, -1 do
builder:PrependUOffsetTRelative(textEntries[i])
end
conf_vec = builder:EndVector(len)
end
prepare_conf_req.Start(builder)
prepare_conf_req.AddKey(builder, key)
if conf_vec then
prepare_conf_req.AddConf(builder, conf_vec)
end
local req = prepare_conf_req.End(builder)
builder:Finish(req)
local ok, err = send(sock, constants.RPC_PREPARE_CONF, builder:Output())
if not ok then
lock:unlock()
return nil, "failed to send RPC_PREPARE_CONF: " .. err
end
local ty, resp = receive(sock)
if ty == nil then
lock:unlock()
return nil, "failed to receive RPC_PREPARE_CONF: " .. resp
end
if ty ~= constants.RPC_PREPARE_CONF then
lock:unlock()
return nil, "failed to receive RPC_PREPARE_CONF: unexpected type " .. ty
end
local buf = flatbuffers.binaryArray.New(resp)
local pcr = prepare_conf_resp.GetRootAsResp(buf, 0)
token = pcr:ConfToken()
core.log.notice("get conf token: ", token, " conf: ", core.json.delay_encode(conf.conf))
store_token(unique_key, token)
lock:unlock()
return token
end,