Size: a a a

2020 December 29

AS

Alexey Stavrov in Modern::Perl
И там, кстати, используется lib-а zookeeper-а. Они кннекцию создаёт. Т.е. коннекция не торчит наружу
источник

b

basiliscos in Modern::Perl
Найди в lib ZK соответсвующий метод/ф-цию, я попробую глянуть, вроде несложно должно быть
источник

b

basiliscos in Modern::Perl
> И судя по документации вызывать нужно в родителе до форка.

это странное поведение. Я что-то не слышал о телодвижениях до форка.
источник

AS

Alexey Stavrov in Modern::Perl
basiliscos
Найди в lib ZK соответсвующий метод/ф-цию, я попробую глянуть, вроде несложно должно быть
источник

AS

Alexey Stavrov 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.х
Прочитай первую цитату.
источник

AS

Alexey Stavrov in Modern::Perl
Эта появилось в новой версии libzookeeper.
А в старой этого нету:
https://github.com/apache/zookeeper/blob/branch-3.4/zookeeper-client/zookeeper-client-c/include/zookeeper.h
источник

AS

Alexey Stavrov in Modern::Perl
basiliscos
> И судя по документации вызывать нужно в родителе до форка.

это странное поведение. Я что-то не слышал о телодвижениях до форка.
Я вот как раз объяснял телодвижения до форка.

Но это чисто ГИПТОЕТИЧЕСКИ, потому что я не знаю, что там происходит.
После форка могут остаться заблокированы мьютекы всякие.
источник

b

basiliscos in Modern::Perl
ты ж close сделал, ничего не должно остаться
источник

b

basiliscos in Modern::Perl
а можно и без close, undef на ZK
источник

b

basiliscos in Modern::Perl
вроде
источник

AS

Alexey Stavrov in Modern::Perl
basiliscos
а можно и без close, undef на ZK
close-а в принципе в либе нету.
Есть DESTROY и undef (что то же самое, что и DESTROY).
Оба рвут соединения

Имеется ввиду, что рвут штатным способом, удаляя эфемерные соединения и закрывая сессию
источник

AS

Alexey Stavrov in Modern::Perl
https://github.com/apache/zookeeper/blob/master/zookeeper-client/zookeeper-client-c/src/zookeeper.c#L647
Вот, судя по коду close_zsock делает даже то, что нужно.
источник

SZ

Sergey Zhmylove in Modern::Perl
Alexey Stavrov
😊
Осталось понять, что из этого сокеты, да)
@PerlBanjoBot $ perl -MSocket=:all -MPOSIX=close -e 'close $_ for grep { open $a, "<&=", $_ and getsockopt $a, SOL_SOCKET, SO_RCVBUF } 0..255'
источник

P

PerlBanjoBot in Modern::Perl
Sergey Zhmylove
@PerlBanjoBot $ perl -MSocket=:all -MPOSIX=close -e 'close $_ for grep { open $a, "<&=", $_ and getsockopt $a, SOL_SOCKET, SO_RCVBUF } 0..255'
источник

b

basiliscos in Modern::Perl
источник

AS

Alexey Stavrov in Modern::Perl
Имелось ввиду destroy у net::zookeeper-а
https://metacpan.org/source/MAF/Net-ZooKeeper-0.41/ZooKeeper.xs#L906
источник

b

basiliscos in Modern::Perl
источник

AS

Alexey Stavrov in Modern::Perl
Я потерял нить мыслей.

Вы что пытаетесь доказать?)
источник

b

basiliscos in Modern::Perl
zk_DESTROY -> zookeeper_close -> destroy -> close_zsock
источник

b

basiliscos in Modern::Perl
делает то, что вам надо. Судя по исходникам.
источник