Страниц: [1] 2 3
  Печать  
Автор Тема: EAGAIN  (Прочитано 18175 раз)
oder
Гость
« : Декабря 12, 2010, 04:26:14 pm »

Предлагаю подиспутировать о самой трашной ошибке в POSIX - EAGAIN.
Если она вылазит, значит то, что надо было сделать - не сделано. Система, просто, "отказывается работать" и ты, как программа, никоим образом на это повлиять не можешь. Повторять операцию нет смысла ибо 1) будет жор процессора, 2) ты застрянешь на непонятно какое время, 3) нет никакого основания полагать, что второй раз получится лучше. Дальше исполняться тоже нельзя, ибо работа не сделана. Остается только валиться в кору. А если ты - системный демон, которого запускают один раз на загрузке системы, и тебе падать нельзя?
Особенно страшно, когда ты должен был отослать что-нибудь по сети и на том конце от тебя что-то ждут (и, желательно, поскорее). Например, ответ на запрос чтения из менеджера ресурсов: ты не смог ответить - клиент завис навеки. Или - аналогично - импульс на разблокировку (файлы бывают не только обычные - на файлах ещё и очереди/потоки можно делать, когда клиент висит, пока не появятся данные). Ты импульс не ответил и клиентская программа зависла. А она, может, завершаться собиралась, её пользователь ждёт и матерится. Или - ещё хуже - апаратура какая в бесконтрольном состоянии.
И, главное, EAGAIN может вылезть, практически, на каждом шагу, из каждой функции.

Можно, конечно, делать вид, что её не существует. Но как же с ней жить?
« Последнее редактирование: Декабря 12, 2010, 04:31:32 pm от oder » Записан
oder
Гость
« Ответ #1 : Декабря 12, 2010, 06:03:15 pm »

Ещё, чтоб подбросить дровишек в огонь, интерфейс библиотеки менеджера ресурсов совсем беззащитен от EAGAIN. Тоесть, тебе вызывают read, write, devctl - что угодно, ты возвращаешь код ошибки (ну, случилась у тебя ошибка!) библиотека пробует MsgError(rcvid, res), а не тут то было! Вот он, пресловутый EAGAIN! А из колбэка-обработчика ты уже вышел. И назад тебя уже не вызвут. И система ошибку просто проигнорирует. И ты об этом никак не узнаешь.
Остается только всегда самому делать MsgReply/MsgError и возвращать исключительно _RESMGR_NOREPLY.
Записан
ob1
Hero Member
*****
Offline Offline

Сообщений: 629


What has two thumbs up and doesn't give a crap?


Просмотр профиля WWW
« Ответ #2 : Декабря 12, 2010, 09:10:14 pm »

Предлагаю подиспутировать о самой трашной ошибке в POSIX - EAGAIN.

Это от слова трахаться, да? ;-} Мне, конечно, с Вами тягаться будет сложно, я пока ещё столько не выпил, но я попробую... ;-}

1) будет жор процессора

В цикле с задержкой будет жор? Я всегда это подозревал.

Остается только валиться в кору.

Сначала лучше в листья, а потом уже в кору. Хотя вот слышал, что лучше сразу головой об пень...

А если ты - системный демон, которого запускают один раз на загрузке системы, и тебе падать нельзя?

Тогда, конечно, только падать. Если системный, то все идут лесом. Я вот все свои программы так пишу, чтобы в случае ошибки падали прямо в корку. А Вы тоже? А мне не верили, что это правильно. Ну теперь я на Ваше авторитетное мнение буду ссылаться.

Особенно страшно, когда ты должен был отослать что-нибудь по сети и на том конце от тебя что-то ждут (и, желательно, поскорее).

Да, по сети это особенно страшно. Выход в открытую сеть это очень страшно. Вообще страшно, а в сеть ну очень страшно, по-особенному как-то.

Например, ответ на запрос чтения из менеджера ресурсов: ты не смог ответить - клиент завис навеки.

Да, вернуть EAGAIN это не ответ. Это значит, что ответа вовсе нет.

Ты импульс не ответил и клиентская программа зависла.

Нет, я точно пойду пивом догоняться. Ведь я пока ещё не импульс. Или мой импульс кому-то не ответил. А моя программа зависла. Блин. Я сильно запутался. Тут таки надо два пива.

А она, может, завершаться собиралась, её пользователь ждёт и матерится.

А-а-а-а-а-а... У-у-у-у... Ы-ы-ы-ы-ы...

Или - ещё хуже - апаратура какая в бесконтрольном состоянии.

Да, хрен её задери. Поназаводят всякой аппаратуры, пойди потом разбери в каком она состоянии. Никакого контроля.

И, главное, EAGAIN может вылезть, практически, на каждом шагу, из каждой функции.

Да, я давно об этом подозревал. Это ушлая скотина. Сейчас сижу с ноутом под столом, выключил свет и телевизор. Очень боюсь, что вылезет EAGAIN. Честно скажу, что отбиваться практически нечем... Опасная тварь. Это тоже страшно, почти также особенно как по сети.

Можно, конечно, делать вид, что её не существует.

Серьёзно? Об этом надо было сразу сказать. Ну я тогда из-под стола вылезаю. Свет пока не буду включать. Стрёмно пока.

Но как же с ней жить?

А-А-А-А-А-А-А-А-А-А-А-А!!!!


Hint: Если сервис вернул EAGAIN, то значит какой-то ресурс исчерпан. А раз сервис вернул именно EAGAIN, то есть надежда на то, что ресурс будет освобождён. Это, по большей части, не проблема программиста, это проблема настройки системы. Например, если я пишу драйвер, доступ к устройству которого имеет смысл только в монопольном режиме, то при повторной попытке открытия устройства, драйвер будет возвращать (трашный) EAGAIN. Удачи в борьбе.
Записан
oder
Гость
« Ответ #3 : Декабря 13, 2010, 01:04:43 am »

Нечего прикалываться - я серьезно. И когда второй раз открывают то, что можно открывать лишь однажды, то надо EBUSY возвращать. А EAGAIN - это не когда "ты сам дурак", а когда "системе хреново". Ну подохнешь ты. Упадёшь. Освободишь ресурсы. Так всё остальное тут же оживёт. И клиент/заказчик моментально спрашивает: "Чего-эт всё работает как ни в чём не бывало - лишь ты один падаешь?". И доказывай, что ты не верблюд.
Так выходит, без HAM/Watchdog ни один системный сервис работать не должен. А ведь вон их сколько работает.
Записан
ob1
Hero Member
*****
Offline Offline

Сообщений: 629


What has two thumbs up and doesn't give a crap?


Просмотр профиля WWW
« Ответ #4 : Декабря 13, 2010, 09:21:44 am »

И когда второй раз открывают то, что можно открывать лишь однажды, то надо EBUSY возвращать.

Да, верно, EAGAIN у меня при закрытии, если не все данные в железку отправлены.


UPD: Непонятно только отчего Вы падаете...
« Последнее редактирование: Декабря 13, 2010, 09:35:18 am от ob1 » Записан
oder
Гость
« Ответ #5 : Декабря 13, 2010, 11:07:59 am »

Оттого, что я говорю про случай, не когда сам возвращаешь EAGAIN и "моя хата скраю...", а когда тебе его возвращают. Это, так сказать, две стороны... Делать надо, а сделать нельзя.
И не надо про sleep() - sleep(), вообще, запрещенная функция.
Записан
ob1
Hero Member
*****
Offline Offline

Сообщений: 629


What has two thumbs up and doesn't give a crap?


Просмотр профиля WWW
« Ответ #6 : Декабря 13, 2010, 11:34:06 am »

Скажу прямо. Не вижу проблем в EAGAIN. И уж в любом случае это не должно приводить к падению программы.
Записан
oder
Гость
« Ответ #7 : Декабря 13, 2010, 11:54:56 am »

Проблема, когда у тебя распределённая система и тебе надо между ней данные согласовывать.
Вот есть у тебя управляющий узел и четыре узла на моторах. Моторы ждут команду на старт. Пользователь жмёт кнопку "поехали". Троим моторам команда отослалась, а четвёртому - EAGAIN. Три мотора поехали, четвёртый не поехал и дальше себе ждёт. А к ним тележка привязана была и на тележке мужик. Тележку перевернуло/порвало, мужик упал/убился.
Это грубый пример. Вариантов - великое множество.
Если контрольный процесс хотя бы упадёт, у моторов будет шанс увидеть, что что-то не в порядке и остановиться. А иначе как?
Записан
lesav
Sr. Member
****
Offline Offline

Сообщений: 262



Просмотр профиля
« Ответ #8 : Декабря 13, 2010, 01:21:12 pm »

Троим моторам команда отослалась, а четвёртому - EAGAIN. Три мотора поехали, четвёртый не поехал и дальше себе ждёт.  ....   А иначе как?
Опрашивать моторы, пока небудут готовы все. А потом только старт.

А непонятно, чем там мотор четвертый занимается ?
Чтото у вас в коде мотора не то. 

ЗЫ
Я писал программный комплекс из десяти процессов. Один процесс у меня изредка возвращал EAGAIN, так как он работал с БД, и дискомфорта остальные процессы не испытывали. Решение: Нужно научиться ждать, и минимилизировать простои в моторах.
Записан

oder
Гость
« Ответ #9 : Декабря 13, 2010, 03:13:33 pm »

Троим моторам команда отослалась, а четвёртому - EAGAIN. Три мотора поехали, четвёртый не поехал и дальше себе ждёт.  ....   А иначе как?
Опрашивать моторы, пока небудут готовы все. А потом только старт.

Так они и будут готовы все. Просто, старт одному не придёт по причине того, что системе не хватило где-нибудь какого-нибудь ресурса. Гарантированного броадкаста нет же. Сообщение каждому узлу по отдельности отправлять нужно.
« Последнее редактирование: Декабря 13, 2010, 03:23:04 pm от oder » Записан
lesav
Sr. Member
****
Offline Offline

Сообщений: 262



Просмотр профиля
« Ответ #10 : Декабря 13, 2010, 04:34:25 pm »

Так они и будут готовы все. Просто, старт одному не придёт по причине того, что системе не хватило где-нибудь какого-нибудь ресурса. Гарантированного броадкаста нет же. Сообщение каждому узлу по отдельности отправлять нужно.
Тогда остальным СТОП!  Я уже начинаю предвидеть ваши следующие реплики Sad    

Э-ээех, жалко мужика!
А всего то надо  было отдать команду на старт, а потом в телегу садиться.
Записан

oder
Гость
« Ответ #11 : Декабря 13, 2010, 04:36:25 pm »

Так они и будут готовы все. Просто, старт одному не придёт по причине того, что системе не хватило где-нибудь какого-нибудь ресурса. Гарантированного броадкаста нет же. Сообщение каждому узлу по отдельности отправлять нужно.
Тогда остальным СТОП!  Я уже начинаю предвидеть ваши следующие реплики Sad    

А как же им сделаешь стоп, если ресурса нет? Если его нет, то его нигде нет - ни для старта ни для стопа. Smiley
Записан
aluv
Sr. Member
****
Offline Offline

Сообщений: 301


Просмотр профиля
« Ответ #12 : Декабря 13, 2010, 04:57:39 pm »

Так они и будут готовы все. Просто, старт одному не придёт по причине того, что системе не хватило где-нибудь какого-нибудь ресурса. Гарантированного броадкаста нет же. Сообщение каждому узлу по отдельности отправлять нужно.

Тогда вешать все моторы на один (если надо дублированный/троированный) интерфейс и делать одну команду старт/стоп. Проще всего это сделать по CAN, задав MsgID_Start и MsgID_Sop. Причем, желательно сразу задавать старт на определенный интервал времени.

Иными словами, изначально проектировать систему надо таким образом, чтобы любой сбой не приводил к отказу всей системы.
Записан
oder
Гость
« Ответ #13 : Декабря 13, 2010, 05:01:01 pm »

Это не мы решаем. Smiley Нужна универсальная система, а не узкоспециализированная: чтоб ездило на всём, вплоть до дрелей. Wink
Записан
lesav
Sr. Member
****
Offline Offline

Сообщений: 262



Просмотр профиля
« Ответ #14 : Декабря 13, 2010, 05:29:09 pm »

Это не мы решаем. Smiley
А кто решает? Разве не разработчик?

Такие штуки так не поектируются! Изначально, перед тем как садиться чтото делать нужно потратить не один день на осмысление затеянного.
И по ходу продвижения разработки "предвидеть" возможные варианты развития событий.
В группе разработчиков должно быть единоначалие, чтобы один человек держал весь проект в голове.  Это важно!  Чтобы потом, такие как вы, не задавали вопросы о пресловутом EAGAIN, и кто в нем виноват.
Мне довелось один раз поработать в команде разработчиков.  Одному работать легче, так как Сам отвечаешь за свой проект. И знаешь детально как каждый "мотор" работает.

Иными словами, изначально проектировать систему надо таким образом, чтобы любой сбой не приводил к отказу всей системы.
Поддерживаю! ++
Записан

Страниц: [1] 2 3
  Печать  
 
Перейти в: