powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostgreSQL уже 20 лет не может в fsync()
4 сообщений из 4, страница 1 из 1
PostgreSQL уже 20 лет не может в fsync()
    #39774105
varidu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сформированы корректирующие обновления для всех поддерживаемых веток PostgreSQL: 11.2, 10.7, 9.6.12, 9.5.16 и 9.4.21, в которых исправлено около 70 ошибок. Наиболее значительным изменением стала переработка механизма использования вызова fsync() для обеспечения целостности записываемых на диск данных.

Оказалось, что вызов fsync() некорректно используется в PostgreSQL уже около 20 лет, что потенциально могло приводить к потере записываемых данных в случае аппаратных сбоев (проблема свойственна как Linux, так и некоторым BSD-системам). Разработчики PostgreSQL полагали, что успешно завершившийся вызов fsync() гарантирует, что поступившие данные записаны на постоянный носитель, но оказалось, что существуют ситуации когда это не так.

В случае когда ядро не может записать данные, например из-за сбоя буферизированного ввода/вывода вследствие аппаратной ошибки, некоторые операционные системы возвращают код ошибки в fsync() и очищают содержимое ожидающих записи буферов. Таким образом, ранее переданные данные отбрасываются, а блоки помечаются как очищенные. Получив код ошибки PostgreSQL опять попытается сбросить на диск данные и ещё раз вызывает fsync(). Так как буферы были очищены повторный вызов будет завершён успешно и PostgreSQL посчитает, что все данные записаны успешно. Но на деле, при чтении блоков, которые PostgreSQL полагает записанными, будет возвращено не то, что ожидается.

Начиная с выпусков PostgreSQL 11.2, 10.7, 9.6.12, 9.5.16 и 9.4.21 логика обработки ошибок fsync() изменена и PostgreSQL теперь не пытается после сбоя выполнения fsync() повторно вызвать fsync(), а завершается с выдачей фатальной ошибки. Данный шаг даёт возможность при перезапуске восстановить корректное состояние данных на основе WAL-лога, минуя скрытое повреждение содержимого базы. Подобная логика обработки ошибки может показаться неоптимальной, но разработчики сочли данное решение достаточным так как указанные проблемы возникают крайне редко.

Для систем ядро которых не сбрасывает содержимое буфера записи после сбоя в настройки добавлена опция data_sync_retry, позволяющая вернуть старое поведение с двойным вызовом fsync(). Можно отметить, что компания Google для обхода описанной проблемы использует альтернативный метод обработки ошибок ввода/вывода, основанный на сборе сведений об ошибках напрямую из ядра через netlink-сокет.

источник www.opennet.ru
...
Рейтинг: 0 / 0
PostgreSQL уже 20 лет не может в fsync()
    #39774116
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
varidu,

а теперь прочитайте то что вы скопировали. Postgresql прекрасно умеет делать fsync, а вот ОС иногда делает fsync довольно удивительным образом. Мне бы в голову не пришло при невозможности сделать fsync скидывать dirty флаги блоков.
...
Рейтинг: 0 / 0
PostgreSQL уже 20 лет не может в fsync()
    #39776123
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторголову не пришло при невозможности сделать fsync скидывать dirty флаги блоков.

копируется большой файл на флешку. флешка вынимается не окончив копирование. ваши действия?
...
Рейтинг: 0 / 0
PostgreSQL уже 20 лет не может в fsync()
    #39780251
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

Вот это и вызывает невообразимое раздражение: линукс хочет быть и на ноутбуке домохозяйки и на суперсервере под базой данных. И всем там похеру по сути.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostgreSQL уже 20 лет не может в fsync()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]