LINUX.ORG.RU

Что вы делаете при неудачном close?

 надёжное по


0

3

Системный вызов close возвращает код ошибки:

https://man7.org/linux/man-pages/man2/close.2.html

Опустим тривиальные случаи типа EINTR. Например, возвращается EIO - «An I/O error occurred», что не сильно более информативно, чем «иди на …». Фактически, ничего дельного, кроме разве что отправки лога (или попапа об ошибке, если это гуишное ПО), сделать нельзя. Можно попытаться повторить операцию close. Но откуда мы знаем, что во второй раз она завершится удачно? В общем случае она теоретически может завершиться удачно на (N+1)’й попытке, где N может быть произвольно большим числом.

UPD: а ещё не специфицировано, освободится ли дескриптор файла при EIO, так что в такой ситуации ещё может быть исчерпание лимита открытых файлов.

А вы что делаете в таких случаях, когда вообще непонятно, как программе обработать ошибочное состояние?

★★★★★

Последнее исправление: seiken (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Одна из осмысленных вещей что можно сделать - retry every X seconds

Логично, хотя и довольно специфический кейс. Впрочем, с SQL-транзакциями, падающими с retriable-ошибками, я так делаю.

Этого делать вообще никогда нельзя ))

Ну дык close() частенько в деструкторе и вызывается. И логировать его ошибку… ну такое: (1) либо на глобальный лог завязываться, либо тащить лог зависимостью; (2) лог должен быть noexcept, что приводит к вопросу о проездном.

pr849
()
Последнее исправление: pr849 (всего исправлений: 1)
Ответ на: комментарий от x905

а что говорит статистика ошибок на close ?

Не по вероятности оценивать надо, а по возможному ущербу. Если мы чего то не видели, то из этого не вытекает, что этого быть не может. Откуда вообще пошло такое понятие «черный лебедь»? Европейцы долго считали, что таких не бывает) Пока в Австралии не встретили.

dvetutnev
()
Ответ на: комментарий от dvetutnev

Ошибки делятся на два группы: ожидаемые и нет.

Это мало полезная классификация. Понятно, что каждой нештатной ситуации можно присвоить вероятность возникновения. Ошибки, по аналогии с неисправностями, в первую очередь делятся на исправимые в данном контексте/модуле, и неисправимые (которые передаются наверх). Ещё есть классификация по времени, типа, постоянные, периодические, спорадические. В случае с close/EIO ошибко можно зафиксировать, но не исправлять, пока не появится больше инфы о причине её возникновения.

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

Ошибки делятся на два группы: ожидаемые и нет.

Это мало полезная классификация.

Самая полезная классификация. Происходящее делиться на две категории: то, на что мы повлиять можем, и то на что повлиять не можем. Затрачивать усилия на вторую категорию неверно - затраты есть, а пользы нет.

присвоить вероятность возникновения

Ну чего вы все к вероятности то цепляетесь? Она оценивает затраты на эксплуатацию в среднем. Но она не оценивает возможный ущерб когда что-то пойдет не так. Когда на твое творение свалится редкое событие и поломает напрочь его логику, то, что оно редкое, погоды уже не сделает (ибо уже произошло).

В случае с close/EIO ошибко можно зафиксировать, но не исправлять, пока не появится больше инфы о причине её возникновения.

Ну то, о чем я и вещал - переносим ошибку из категории не ожидаемых в категорию ожидаемых. Разве что ее анализ (в рантайме) и вычисление в какую группу она входит состоит уже из нескольких шагов.

dvetutnev
()
Последнее исправление: dvetutnev (всего исправлений: 1)
Ответ на: комментарий от dvetutnev

Самая полезная классификация. Происходящее делиться на две категории: то, на что мы повлиять можем, и то на что повлиять не можем.

Если мы говорим о ближайшем будущем то последнее множество близко к пустому. Всегда приходится принимать решения «что делать?». Зачастую приходится выбирать между «плохим» и «очень плохим» вероятным исходом, но выбор - есть всегда. Имхо.

bugfixer ★★★★★
()
Ответ на: комментарий от dvetutnev

Не по вероятности оценивать надо, а по возможному ущербу.

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

bugfixer ★★★★★
()
Ответ на: комментарий от dvetutnev

Вот именно. Это или ошибка в ядре, либо аппаратный сбой.

Не обязательно. Возможно, просто закончилось свободное место. По крайней мере, нужно сообщить об этом пользователю, а делать вид что всё хорошо.

debugger ★★★★★
()
Ответ на: комментарий от SkyMaverick

Если можем продолжать дальше - ну и хрен с ним, если не можем - ну assert, что ещё делать.

Ещё один, который не умеет пользоваться ассертами. Хотя бы ман почитал, что ли. В первом же предложении написано:

$ man assert
...
DESCRIPTION
This macro can help programmers find bugs in their programs...
...

Если close возвращает -1, это run-time error, not a bug.

debugger ★★★★★
()