Size: a a a

2020 December 25

AP

Anton Petrusevich in Modern::Perl
но что там в деструкторе зоокипера?
источник

AP

Anton Petrusevich in Modern::Perl
то есть там может оказаться какой-то софтверный вариант "закройте мне соединение"
источник

b

basiliscos in Modern::Perl
Anton Petrusevich
я думаю даже во всех его дубликатах не происходит: FIN+ACK должны посылаться когда последний хенлде закроется и только тогда будет закрываться соединение
вроде да. Это типичная проблема с tcp-соединениями. При желании можно даже вручную сделать, если ZK не дают соотв. апи на close(). Что-то -типа https://metacpan.org/pod/POSIX::AtFork + пробежаться по всем моим открытым сокетам (в потомке) и сделать им close.
источник

YK

Yegor K in Modern::Perl
источник

AP

Anton Petrusevich in Modern::Perl
это ответ про деструктор. там собака зарыта?
источник

YK

Yegor K in Modern::Perl
да, но лучше проверить на практике )
(я пользовался асинхронным https://metacpan.org/pod/ZooKeeper)
источник

VG

Vadim Goncharov in Modern::Perl
Alexey Stavrov
Всем привет.
Кто-нибудь использовал ZooKeeper в perl  с fork-ами?

Собрался использовать этот модуль https://metacpan.org/pod/Net::ZooKeeper.

Там есть такие замечания:

Note also that before invoking fork() to spawn a new process, all Net::ZooKeeper handles should be destroyed so that all connections to ZooKeeper are closed and all internal POSIX threads have exited. If a child process needs to communicate with ZooKeeper it should open its own private connections after it is created by fork().

и

On occasion the ZooKeeper client code may not be able to quickly reconnect to a live server and the caller may want to destroy the existing Net::ZooKeeper handle object and attempt a fresh connection using the same session ID as before with a new Net::ZooKeeper object. To do so, save the session_id attribute value before undefining the old handle object and then pass that binary string as the value of the 'session_id' option to the new() method when creating the next handle object. After the successful completion of a method which requires communication with the server, if the new handle object's session_id attribute value matches the old session ID then the session has been successfully maintained; otherwise, the old session was expired by the cluster.

Т.е. как я понял, если я хочу форкаться, то нужно пересоздать сессию.

Правда взять сессию из хендлера zookeeper-а и подсунуть его в новый хендлер не получается (сессия не продолжается + эфемерные узлы дохнут).

Код примерно такой:

my $zkh = Net::ZooKeeper->new('zoo1:2181');
...
my $session_id = $zkh->{session_id};
$zkh = Net::ZooKeeper->new('zoo1:2181', session_id => $session_id);
# в этот момент эфемерные узлы уже сдохли
...

Из документации zookeeper-а нашёл:
When a client gets a handle to the ZooKeeper service, ZooKeeper creates a ZooKeeper session, represented as a 64-bit number, that it assigns to the client. If the client connects to a different ZooKeeper server, it will send the session id as a part of the connection handshake. As a security measure, the server creates a password for the session id that any ZooKeeper server can validate.The password is sent to the client with the session id when the client establishes the session. The client sends this password with the session id whenever it reestablishes the session with a new server.

Выше написано про пароль к сессии, которого не знаю, где взять, чтобы продолжить сессию.

В попсовой библиотеке на питоне похоже пароль можно взять:
https://kazoo.readthedocs.io/en/latest/api/client.html#kazoo.client.KazooClient.client_id


Кто сталкивался с форками и zookeeper-ом можете подсказать, как правильно сделать, чтобы не было больно потом. Zookeeper хочу использовать в parent процессе, но судя по доке handler нужно всё равно уничтожать, если есть дочерние процессы.

Версия ZooKeeper-а 3.4.х
по зависимостям AnyEvent::Fork::RPC ставится модуль Proc::FastSpawn, в котором есть функция fd_inherit, которой можно выставить автоматическое закрытие дескрипторов при форке
источник

VG

Vadim Goncharov in Modern::Perl
Anton Petrusevich
я подозреваю, проблема форка в том, что хендл дублируется и у меня всегда был вопрос как это работает с сокетами, посылается ли FIN+ACK из потомка, если он выполнит закрытие хендла родителя?
нет, но он может вызвать shutdown() специально для этого
источник

VG

Vadim Goncharov in Modern::Perl
Yegor K
- вынести коннект через Net::ZooKeeper в отдельный форк и уже общаться с ним через ipc
- можно попробовать не закрывать соединение и в форках строго не пользоваться всем что связанно с handle-ом Net::ZooKeeper
- в Net::ZooKeeper session_id это и есть client_id
- когда handle штатно закрывается, то и сессия тоже, поэтому и нет эфемерных узлов
> попробовать не закрывать соединение и в форках строго не пользоваться всем что связанно с handle-ом Net::ZooKeeper

это утечка ресурсов, в лучшем случае на клиенте, а в худшем в их протоколе может быть что-то завязано на существование коннекта
источник

SZ

Sergey Zhmylove in Modern::Perl
Anton Petrusevich
я подозреваю, проблема форка в том, что хендл дублируется и у меня всегда был вопрос как это работает с сокетами, посылается ли FIN+ACK из потомка, если он выполнит закрытие хендла родителя?
Нет, ос закрывает соединение только когда все процессы закроют сокет
источник

VG

Vadim Goncharov in Modern::Perl
Sergey Zhmylove
Нет, ос закрывает соединение только когда все процессы закроют сокет
или один из них сделает shutdown() с нужным флагом
источник

SZ

Sergey Zhmylove in Modern::Perl
Vadim Goncharov
или один из них сделает shutdown() с нужным флагом
Ей богу, не понимаю, почему эти хомячки не поставят o_cloexec и не перестанут долбить мозг проблемами с форком
источник
2020 December 26

AP

Anton Petrusevich in Modern::Perl
Sergey Zhmylove
Нет, ос закрывает соединение только когда все процессы закроют сокет
ос то может и закрывает, но у приложения свой протокол и оно вполне в деструкторе может что-то такое проворачивать
источник

AS

Alexey Stavrov in Modern::Perl
Yegor K
- вынести коннект через Net::ZooKeeper в отдельный форк и уже общаться с ним через ipc
- можно попробовать не закрывать соединение и в форках строго не пользоваться всем что связанно с handle-ом Net::ZooKeeper
- в Net::ZooKeeper session_id это и есть client_id
- когда handle штатно закрывается, то и сессия тоже, поэтому и нет эфемерных узлов
Печаль, пропустил всё общение и похоже пропущу снова)

> можно попробовать не закрывать соединение и в форках строго не пользоваться всем что связанно с handle-ом Net::ZooKeeper

Ага, у меня такая же мысль была сделать.

Когда делаются форки от процесса, где есть блокировки в различных потоках (мьютексы, фьютексы), то они остаются после fork-а и возможно могут быть какие-то проблемы.
Я знаю эту особенность в ОС и знаю, что норального решения нету (ну есть всякие перехватчики pthread_atfork, которые позволяют выполнять код непосредственно перед fork-ом, но я, как пользователь модуля, не обязан код модуля знать, а значит их ставит точно не должен 😊), поэтому в этом случае следую документации.
источник

AS

Alexey Stavrov in Modern::Perl
Да, тоже это заметил.

Получается, что undef хендлера или DESTROY вызывать нельзя перед созданием нового или после него, что вроде бы противоречит документации, если я правильно понимаю.
источник

AS

Alexey Stavrov in Modern::Perl
Да, я, кстати, нашёл, где пароль хранится)
Он хранится в session_id

Вот тут session_id берётся (т.е. структура client_id)
https://metacpan.org/source/MAF/Net-ZooKeeper-0.41/ZooKeeper.xs#L1060

Вот структура
https://github.com/apache/zookeeper/blob/1af3dcc633d4829864da74ca6b030428448fcc16/zookeeper-client/zookeeper-client-c/include/zookeeper.h#L337

Но мне это не помогло)
Единственное, что я понимаю, что password теперь искать не надо и передача session_id должна работать.
источник

OP

Oleg Pronin in Modern::Perl
Sergey Zhmylove
Ей богу, не понимаю, почему эти хомячки не поставят o_cloexec и не перестанут долбить мозг проблемами с форком
А чем поможет o_cloexec после форка без exec?)
источник

SZ

Sergey Zhmylove in Modern::Perl
Oleg Pronin
А чем поможет o_cloexec после форка без exec?)
А, так там форк без екзека, окей :) Я не особо читал тред
источник
2020 December 28

SR

Stas Raskumandrin in Modern::Perl
привет.
а тут (в DELL СПб) кто-нибудь работает/работал?
https://spb.hh.ru/vacancy/41162791
источник

DF

Denis F in Modern::Perl
@zhmylove вроде там
источник