С Zookeeper выясняется, что вы можете выполнить хак, чтобы продолжить сеанс, прерванный в GDB. Этот хак использует несколько свойств Zookeeper и gdb:
- Вы можете иметь несколько клиентов Zookeeper с одинаковым идентификатором сессии
- GDB не останавливает дочерние процессы в родительских точках останова
- Вы можете игнорировать сигналы GDB в дочернем процессе, не затрагивая родительский
Исходя из этого, решение порождает дочерний процесс, который подключается к Zookeeper с тем же идентификатором клиента, что и родительский, и больше ничего не делает. Однако клиенты Zookeeper имеют понятие перемещения сеансов, когда клиент очень часто переключается с тем сервером, к которому он подключен. Если у вас есть два клиента с одинаковым идентификатором сеанса, один из них может переместиться, оставив другого подключенным к серверу, который не держит их сеанс. Чтобы предотвратить это, дочерний элемент должен подключаться только к серверу, к которому в данный момент подключен родительский элемент. Таким образом, родитель и ребенок выглядят следующим образом:
Parent(zh):
host = zookeeper_get_connected_host(zh)
client_id = zoo_client_id(zh)
if fork == 0
exec child host client_id
end
Child(host, client_id):
ignore SIGINT
zh = zookeeper_init(host, client_id)
while(true)
sleep
end
Я протестировал это с помощью libzookeeper_mt-0.3.3, и он работает как описано. Некоторая гадость начинает извергаться из логов Zookeeper, когда вы делаете этот хак, что может быть неприятно. Если вы не можете игнорировать журналы, вы можете отключить их следующим образом:
zoo_set_debug_level((ZooLogLevel)0);
Это недокументированный способ в Zookeeper отключить ведение журнала.