in kong/kong/runloop/plugins_iterator.lua [422:617]
function PluginsIterator.new(version)
if kong.db.strategy ~= "off" then
if not version then
error("version must be given", 2)
end
end
loaded_plugins = loaded_plugins or get_loaded_plugins()
enabled_plugins = enabled_plugins or kong.configuration.loaded_plugins
local ws_id = workspaces.get_workspace_id() or kong.default_workspace
local ws = {
[ws_id] = new_ws_data()
}
local cache_full
local counter = 0
local page_size = kong.db.plugins.pagination.max_page_size
for plugin, err in kong.db.plugins:each(page_size, GLOBAL_QUERY_OPTS) do
if err then
return nil, err
end
local name = plugin.name
if not enabled_plugins[name] then
return nil, name .. " plugin is in use but not enabled"
end
local data = ws[plugin.ws_id]
if not data then
data = new_ws_data()
ws[plugin.ws_id] = data
end
local plugins = data.plugins
local combos = data.combos
if kong.core_cache and counter > 0 and counter % page_size == 0 and kong.db.strategy ~= "off" then
local new_version, err = kong.core_cache:get("plugins_iterator:version", TTL_ZERO, utils.uuid)
if err then
return nil, "failed to retrieve plugins iterator version: " .. err
end
if new_version ~= version then
kong.log.info("plugins iterator was changed while rebuilding it")
return
end
end
if should_process_plugin(plugin) then
plugins[name] = true
local combo_key = (plugin.route and 1 or 0)
+ (plugin.service and 2 or 0)
+ (plugin.consumer and 4 or 0)
if combo_key == 0 then
data.globals = data.globals + 1
end
if kong.db.strategy == "off" then
if plugin.enabled then
local cfg = plugin.config or {}
cfg.route_id = plugin.route and plugin.route.id
cfg.service_id = plugin.service and plugin.service.id
cfg.consumer_id = plugin.consumer and plugin.consumer.id
local key = kong.db.plugins:cache_key(name,
cfg.route_id,
cfg.service_id,
cfg.consumer_id,
nil,
ws_id)
if not cfg.__key__ then
cfg.__key__ = key
cfg.__seq__ = next_seq
next_seq = next_seq + 1
end
combos[name] = combos[name] or {}
combos[name].rsc = combos[name].rsc or {}
combos[name].rc = combos[name].rc or {}
combos[name].sc = combos[name].sc or {}
combos[name].rs = combos[name].rs or {}
combos[name].c = combos[name].c or {}
combos[name].r = combos[name].r or {}
combos[name].s = combos[name].s or {}
combos[name][combo_key] = cfg
if cfg.route_id and cfg.service_id and cfg.consumer_id then
combos[name].rsc[cfg.route_id] =
combos[name].rsc[cfg.route_id] or {}
combos[name].rsc[cfg.route_id][cfg.service_id] =
combos[name].rsc[cfg.route_id][cfg.service_id] or {}
combos[name].rsc[cfg.route_id][cfg.service_id][cfg.consumer_id] = cfg
elseif cfg.route_id and cfg.consumer_id then
combos[name].rc[cfg.route_id] =
combos[name].rc[cfg.route_id] or {}
combos[name].rc[cfg.route_id][cfg.consumer_id] = cfg
elseif cfg.service_id and cfg.consumer_id then
combos[name].sc[cfg.service_id] =
combos[name].sc[cfg.service_id] or {}
combos[name].sc[cfg.service_id][cfg.consumer_id] = cfg
elseif cfg.route_id and cfg.service_id then
combos[name].rs[cfg.route_id] =
combos[name].rs[cfg.route_id] or {}
combos[name].rs[cfg.route_id][cfg.service_id] = cfg
elseif cfg.consumer_id then
combos[name].c[cfg.consumer_id] = cfg
elseif cfg.route_id then
combos[name].r[cfg.route_id] = cfg
elseif cfg.service_id then
combos[name].s[cfg.service_id] = cfg
end
end
else
if version == "init" and not cache_full then
local ok
ok, err = warmup.single_entity(kong.db.plugins, plugin)
if not ok then
if err ~= "no memory" then
return nil, err
end
kong.log.warn("cache warmup of plugins has been stopped because ",
"cache memory is exhausted, please consider increasing ",
"the value of 'mem_cache_size' (currently at ",
kong.configuration.mem_cache_size, ")")
cache_full = true
end
end
combos[name] = combos[name] or {}
combos[name].both = combos[name].both or {}
combos[name].routes = combos[name].routes or {}
combos[name].services = combos[name].services or {}
combos[name][combo_key] = true
if plugin.route and plugin.service then
combos[name].both[plugin.route.id] = plugin.service.id
elseif plugin.route then
combos[name].routes[plugin.route.id] = true
elseif plugin.service then
combos[name].services[plugin.service.id] = true
end
end
end
counter = counter + 1
end
for _, plugin in ipairs(loaded_plugins) do
local name = plugin.name
for _, data in pairs(ws) do
for phase_name, phase in pairs(data.phases) do
if data.combos[name] then
if plugin.handler[phase_name] then
phase[name] = true
end
end
end
local plugins = data.plugins
if plugins[name] then
local n = plugins[0] + 1
plugins[n] = plugin
plugins[0] = n
plugins[name] = nil
end
end
end
return {
version = version,
ws = ws,
loaded = loaded_plugins,
iterate = iterate,
iterate_collected_plugins = iterate_collected_plugins,
iterate_init_worker = iterate_init_worker,
}
end