Closed
Description
Добрый день,
при работе mamonsu новой версии на реплике плагин ARCHIVECOMMAND падает с ошибкой:
[ERROR] 2021-08-26 12:07:35,762 - ARCHIVECOMMAND - catch error: {'S': 'ERROR', 'V': 'ERROR', 'C': '55000', 'M': 'recovery is in progress', 'H': 'WAL control functions cannot be execut
ed during recovery.', 'W': 'SQL function "archive_command_files" statement 1', 'F': 'xlogfuncs.c', 'L': '341', 'R': 'pg_current_wal_lsn'}
[INFO] 2021-08-26 12:07:35,762 - ARCHIVECOMMAND - hint: enable debug level to full exception trace
режим bootstrap
Предлагаю встроить в код функции проверку:
CREATE OR REPLACE FUNCTION mamonsu.archive_command_files()
RETURNS TABLE(count_files bigint, size_files bigint) AS
$BODY$
begin
if pg_is_in_recovery() then
return query select 0::bigint as count_files, 0::bigint as size_files;
else
return query
with
segment_parts_count as
(
select 4096 / (setting::bigint / 1024 / 1024) as value from pg_settings where name = 'wal_segment_size'
),
segment_size as
(
select setting::bigint as value from pg_settings where name = 'wal_segment_size'
),
last_wal_div as
(
select ('x' || substring(last_archived_wal from 9 for 8))::bit(32)::int as value from pg_stat_archiver
),
last_wal_mod as
(
select ('x' || substring(last_archived_wal from 17 for 8))::bit(32)::int as value from pg_stat_archiver
),
current_wal_div as
(
select ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 9 for 8))::bit(32)::int as value
),
current_wal_mod as
(
select ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 17 for 8))::bit(32)::int as value
)
select greatest(coalesce( (segment_parts_count.value - last_wal_mod.value)
+ ((current_wal_div.value - last_wal_div.value - 1) * segment_parts_count.value)
+ current_wal_mod.value - 1
, 0)
, 0) as count_files,
greatest(coalesce( ( (segment_parts_count.value - last_wal_mod.value)
+ ((current_wal_div.value - last_wal_div.value - 1) * segment_parts_count.value)
+ current_wal_mod.value - 1
) * segment_size.value
, 0)
, 0) as size_files
FROM segment_parts_count, segment_size, last_wal_div, last_wal_mod, current_wal_div, current_wal_mod;
end if;
end
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER PARALLEL UNSAFE COST 100 ROWS 1000;