Skip to content

Ошибка плагина ARCHIVECOMMAND на реплике (версия 3.0.0) #163

Closed
@sgrinko

Description

@sgrinko

Добрый день,

при работе 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;

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions