
Andrey
23.08.2018
21:35:18
https://github.com/postgres/postgres/blob/322548a8abe225f2cfd6a48e07b99e2711d28ef7/src/interfaces/libpq/fe-misc.c#L618
а, уже)
там же написано, что закрытие соединения считается ошибкой, поэтому с -1 сравнивается

Denis
23.08.2018
21:37:34
дык прочитанное будет == 0 а не -1 же?
Ведь признак удалённого закрытия это read event + 0 данных

Google

Andrey
23.08.2018
21:38:55
при чем тут, сколько будет прочитано. это логика этой функции, не надо путать ее с read

Denis
23.08.2018
21:39:45
какой - той?
вот мы выше обсудили, щас процитирую

Andrey
23.08.2018
21:40:12
этой - pqReadData

Denis
23.08.2018
21:40:12
зачем? просто читаешь. елси прчел 0 - сокет закрылся
если -1 - это ошибка
В моём случае ошибки нет - удалённый сервер корректно закрыл сокет.
А я этого "не увидел"

Andrey
23.08.2018
21:40:47
это если ты читаешь сисколом read или recv.
а pqReadData - это постгревая функция. ты же с помощью ее читаешь, а не через read
непосредственно

Denis
23.08.2018
21:45:41
она не проверяет количество данных == 0 или нет

Google

Andrey
23.08.2018
21:45:59
само собой, что она внутри вызывает read/recv, но вот возвращаемые значения она меняет, как написано в доке

Denis
23.08.2018
21:46:06
а это значит что она пропустит удалённое закрытие сокета же
вот значит попробую щас проверять if(status == CONNECTION_BAD) после неё

Andrey
23.08.2018
21:47:44
да не пропустит она ничего. 20 лет не пропускала, а тут на тебе

Denis
23.08.2018
21:48:45
человек жалуется что после отключения докера коннекты остаются в неведении
и при обращении по ним отваливаются по таймауту сокета (у меня в софтине задан)

Andrey
23.08.2018
21:50:23
всякие pgboucer-ы не стоят?

Denis
23.08.2018
21:50:33
нет
телнетом попробовал - телнет обрывается, значит дело в моём коде
т.е. в коде библиотеки vibe-postgres

Andrey
23.08.2018
21:52:56
ну я с этим и не спорю, что дело скорей всего в твоей либе)
ладно, спать пора, лень уже разбираться

Denis
23.08.2018
21:57:00
ну тут ещё не понятно почему даже если сокеты портятся то при последующих обращениях это не вылазит?

Andrey
23.08.2018
21:58:53
https://github.com/postgres/postgres/blob/322548a8abe225f2cfd6a48e07b99e2711d28ef7/src/interfaces/libpq/fe-misc.c#L804
ну там я смотрю достаточно навороченная логика, в pqReadData. но по идее, закрытие соединения должно определяться
возможно надо юзать pqSocketPoll, что бы корректно определялось состояние, все, спать

Denis
23.08.2018
22:05:00
Понахуевертили сокетов и обёрток...

Andrey
23.08.2018
22:05:06
вово

Oleg
23.08.2018
22:13:31

Google

Denis
23.08.2018
22:15:56
Не, вот гляди. Есть пул коннектов. Базу выключили. Приложение с пулом об этом ничего не узнало почему-то.
Ну или узнало но обработало неверно эту инфу и как бы не узнало.
далее я пытаюсь взять конект из пула и что-то послать
и в ответ ошибка таймаута
вместо, например, обшибочного сокета типа "недоступен сервер" или навроде того
странно. я сам не перепроверял - всё со слов клиента. Заслал ему патч попробует скажет

Oleg
23.08.2018
22:19:13
на стороне сервера такое закрытие должно быть
https://github.com/deviator/modbus/blob/master/source/modbus/connection/tcp.d#L93

Denis
23.08.2018
22:20:31
да, и сервер его произвёл
да, я проверил телнетом - всё отлично закрывается.

Oleg
23.08.2018
22:21:22
я когда с этим разбирался тоже не мог отловить сначала, что сервер завершился

Denis
23.08.2018
22:21:27
т.е. наша софтина получает тоже эту инфу, но почему-то никак не использует и потом что-то странное тоже насчёт таймаута

Oleg
23.08.2018
22:21:47
зачем тебе блокирующие сокеты?

Denis
23.08.2018
22:21:51
я бы не удивился если бы просто из сокета полезли ошибки при обращении, но тишина - загадка

Oleg
23.08.2018
22:22:15
тогда -1 не всегда ошибка

Denis
23.08.2018
22:22:28
я не могу читать из сокета - читает из него libpq

Oleg
23.08.2018
22:22:30
это может значить что нет данных

Denis
23.08.2018
22:22:39
поэтому никаких -1 мне недоступно

Google

Denis
23.08.2018
22:22:46
я могу getsockopt

Oleg
23.08.2018
22:22:46

Denis
23.08.2018
22:22:58
там моя поверх libpq
https://github.com/denizzzka/vibe.d.db.postgresql/blob/master/source/vibe/db/postgresql/package.d собсно, вся либа целиком, практически
в функции waitEndOfRead оно не детектит этой проблемы с сокетом
https://github.com/denizzzka/vibe.d.db.postgresql/pull/22/files патч сделал, проверим

Toha
24.08.2018
02:41:32
а в ди не принято ифы оборачивать в фигурные скобки?
когда там какая то одна инструкция только

Dmitry
24.08.2018
05:51:32
Петь, хватит с этим каналом. Он не тематичский. Ссылку тру.

Admin
ERROR: S client not available

Evil
24.08.2018
05:58:23
Схуяли он не тематический? Канал про существующие интересные программные алгоритмы генерации всякого разного.
На D тоже будут

Igor
24.08.2018
06:15:12

Denis
24.08.2018
07:29:36
Вот, и этот момент с закрытием базы сейчас нигде не отлавливается, похоже
И не ясно почему при попытке моего клиента использовать сокеты закрытые на том конце тоже нет никаких ошибок

Andrey
24.08.2018
07:39:55
а он как пишет, через евентлуп, waitWrite какой нить?

Denis
24.08.2018
07:44:27

Andrey
24.08.2018
07:44:43
да
там же твоя эта либа тоже юзается? или это не твой клиент

Denis
24.08.2018
07:46:40
Неё, там libpq

Google

Denis
24.08.2018
07:47:31
И сокеты она создаёт и закрывает, я только у нее попросить его могу чтобы асинхронные ожидания, например, сделать чтобы пул организовать
Щас не на месте, но код открыт, можно глянуть детали.

Pavel
24.08.2018
10:30:06
https://forum.dlang.org/thread/ncbawciyybdksecurmsc@forum.dlang.org как же грустно от таких статей :(

Karbin
24.08.2018
10:36:14
в этой теме ещё много подобных историй

Igor
24.08.2018
10:40:09
я согласен с тем что негатива не больше чем раньше. с другой стороны позитива - больше
есть более-менее стабильный workflow по dip-ам
появляются полезные библиотеки более ориентированные на юзера а не на крутого хакера

Andrey
24.08.2018
10:41:09
я там согласен с Joakim. развели нытье...))

Maxim
24.08.2018
10:42:53
ну вообще, в статье правильные мысли высказаны)
нельзя писать взрослый софт, когда ты не уверен, что следующий релиз компилятора не поломает его)

Igor
24.08.2018
10:44:37
есть разные методы борьбы с этим - не используй bleeding edge фичи, дави на разработчиков компилятора, включай свой пакет в ci тесты компилятора

Maxim
24.08.2018
10:46:32
форкай компилятор

Pavel
24.08.2018
10:47:17
Но код выглядит гораздо приятнее чем vibed

Maxim
24.08.2018
10:47:39
сосбственно, про то и статься, что в какой-то момент разработка превращается в борьбу с компилятором и сообществом за выживание, и успешные в этой борьбе компании окукливаются в свой мирок

Igor
24.08.2018
10:47:58

Pavel
24.08.2018
10:48:02
да

Igor
24.08.2018
10:48:27
хм, должно быть не сложно. http прокси там как-то всунут
можем вместе разобраться

Pavel
24.08.2018
10:50:11
http это другой уровень. Там в классе HTTPRequest есть метод private setupConnection и вот туда надо подсунуть. Но там new TCPStream создается жестко. Надо через фабрику или подобную жава-магию.
И вообще по теории dependency injection надо стараться чтобы не было нигде оператора new в библиотечном коде. Все компоненты должны внедряться как зависимость или создаваться через фабрики.