Skip to content

Conversation

kr1llin
Copy link

@kr1llin kr1llin commented Sep 17, 2025

Add compression and decompression of ptrack.map using internal libraries.

… taken from backup state (pgBackup current). Compression itself processed using internal libraries. Compute CRC using pgFileGetCRCgz, because of compression.

Add decompression of ptrack.map during restore.
@dlepikhova
Copy link
Contributor

Напишу здесь единым комментарием.

  1. Что если в момент записи ptrack.map произойдет обрыв соединения (если запись ведется в удаленном режиме) или что-то с файловой системой? Останется частично записанный файл? Лучше использовать атомарные операции и временный файл + rename
  2. В copy_ptrackmap_file всегда устанавливается file->compress_alg = current.compress_alg. Но если сжатие не произошло (компрессия не уменьшила размер файла), при распаковке возможны проблемы, поскольку restore_non_data_file всегда проверяет глобальную опцию включения компрессии. Здесь напрашивается проверка, был ли файл явно сжат, и добавление file->compress_alg = NONE_COMPRESS, если компрессия не сработала
  3. Также в copy_ptrackmap_file используется pgFileGetCRCgz(to_fullpath, use_crc32c, missing_ok) независимо от того, применено ли сжатие. Если файл не был сжат , CRC-функция может давать неверную трактовку. Кроме того, при восстановлении полезно иметь crc по распакованному содержимому, чтобы отличать ошибочную распаковку/повреждение данных.
  4. В нескольких местах pg_malloc, slurpFile и т.п. используются без проверки NULL. Нужны проверки и cleanup, если что-то не так.
  5. Мелочи. В коде есть строка elog(WARNING, "An error occured during compressing ptrack.map: %s", errormsg); — опечатки (occured → occurred, compressing vs decompressing). Точно надо исправлять, а то будут проблемы с чтением логов
  6. Нужны тесты, хотя бы минимальный набор
  7. Убрать лишний ; в file->crc = ...;;. - файл util.c, строка 530
  8. Размер выходного буфера в do_compress
    Сейчас выделяется compressed = pg_malloc(size) (равный входному размеру). Это может быть OK, но лучше:
    Выделять compressBound(size) (для zlib) или использовать тот размер, который возвращает do_compress

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants