Skip to content

Commit

Permalink
feat(clustering) atomic export of declarative config with Postgres
Browse files Browse the repository at this point in the history
This minimizes the possibilities of inconsistencies in exported config, especially under high Admin API update traffic.
  • Loading branch information
bungle committed Apr 21, 2022
1 parent 579537b commit 39dd728
Showing 1 changed file with 37 additions and 0 deletions.
37 changes: 37 additions & 0 deletions kong/db/declarative/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,33 @@ function declarative.load_into_db(entities, meta)
end


local function begin_transaction(db)
if db.strategy == "postgres" then
local ok, err = db.connector:connect("read")
if not ok then
return nil, err
end

ok, err = db.connector:query("BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY;", "read")
if not ok then
return nil, err
end
end

return true
end


local function end_transaction(db)
if db.strategy == "postgres" then
-- just finish up the read-only transaction,
-- either COMMIT or ROLLBACK is fine.
db.connector:query("ROLLBACK;", "read")
db.connector:setkeepalive()
end
end


local function export_from_db(emitter, skip_ws, skip_disabled_entities, expand_foreigns)
local schemas = {}

Expand All @@ -408,11 +435,18 @@ local function export_from_db(emitter, skip_ws, skip_disabled_entities, expand_f
insert(schemas, dao.schema)
end
end

local sorted_schemas, err = schema_topological_sort(schemas)
if not sorted_schemas then
return nil, err
end

local ok
ok, err = begin_transaction(db)
if not ok then
return nil, err
end

emitter:emit_toplevel({
_format_version = "2.1",
_transform = false,
Expand All @@ -439,6 +473,7 @@ local function export_from_db(emitter, skip_ws, skip_disabled_entities, expand_f
end
for row, err in db[name]:each(page_size, GLOBAL_QUERY_OPTS) do
if not row then
end_transaction(db)
kong.log.err(err)
return nil, err
end
Expand Down Expand Up @@ -475,6 +510,8 @@ local function export_from_db(emitter, skip_ws, skip_disabled_entities, expand_f
::continue::
end

end_transaction(db)

return emitter:done()
end

Expand Down

0 comments on commit 39dd728

Please sign in to comment.