postgrespro/mamonsu

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

sgrinko opened this issue · 4 comments

Добрый день,

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

Добрый день! Исправлено в патче 3.0.1

Проверил версию 3.0.1
Падает...

[INFO] 2021-09-06 15:41:32,844 - PGSQL-(host=localhost db=mamonsu user=mamonsu port=5432)       -       Found mamonsu bootstrap
[INFO] 2021-09-06 15:41:32,877 - PGSQL-(host=localhost db=publishing user=mamonsu port=5432)    -       connecting
[ERROR] 2021-09-06 15:41:32,933 - ARCHIVECOMMAND        -       catch error: {'S': 'ERROR', 'V': 'ERROR', 'C': '55000', 'M': 'recovery is in progress', 'H': 'WAL control functions cannot be executed during recovery.', 'W': 'SQL function archive_command_files" statement 1', 'F': 'xlogfuncs.c', 'L': '341', 'R':'pg_current_wal_lsn'}
[INFO] 2021-09-06 15:41:32,934 - ARCHIVECOMMAND -       hint: enable debug level to full exception trace

в функции mamonsu.archive_command_files() нет проверки на работу на реплике...

(я предлагал добавить эту проверку внутрь функции)

в коде плагина эта функция также вызывается
изображение

режим bootstrap!

Добавили изменения в bootstrap в новом патче.

Спасибо, посмотрю