Verbindung getrennt Wir verwenden die Apache Zookeeper Client C-Bindungen in unserer Anwendung. Client-Bibliothek Version ist 3.5.1. Wenn die Verbindung zum Zookeeper getrennt wird, ist die Anwendung so konfiguriert, dass sie mit Fehlercode 116 beendet wird.Prozess mit zookeeper C-Client wird auf SIGTERM
System wird zum automatischen Starten/Stoppen der Anwendung verwendet. Die Einheitendatei überschreibt nicht die Standardeinstellung für KillMode
, also send SIGTERM to the application.
Wenn der Prozess der systemctl Stopp-Richtlinie gestoppt verwendet, scheinen die Zookeeper Client-Threads zu Zookeeper zu versuchen, wieder zu verbinden:
2016-04-12 22:34:45,799:4506(0xf14f7b40):[email protected][email protected]: Socket [128.0.0.4:61758] zk retcode=-4, errno=112(Host is down): failed while receiving a server response
2016-04-12 22:34:45,799:4506(0xf14f7b40):[email protected][email protected]: initiated connection to server [128.0.0.4:61758]
Apr 12 22:34:45 main thread: zookeeperWatcher: event type ZOO_SESSION_EVENT state ZOO_CONNECTING_STATE path
2016-04-12 22:34:45,801:4506(0xf14f7b40):[email protected][email protected]: session establishment complete on server [128.0.0.4:61758], sessionId=0x40000015b8d0077, negotiated timeout=20000
2016-04-12 22:34:46,476:4506(0xf14f7b40):[email protected][email protected]: Delaying connection after exhaustively trying all servers [128.0.0.4:61758]
2016-04-12 22:34:46,810:4506(0xf14f7b40):[email protected][email protected]: initiated connection to server [128.0.0.4:61758]
2016-04-12 22:34:46,811:4506(0xf14f7b40):[email protected][email protected]: Socket [128.0.0.4:61758] zk retcode=-112, errno=116(Stale file handle): sessionId=0x40000015b8d0077 h
Aus diesem Grund wird der Prozess mit einem Fehlercode verlässt. Systemd sieht beim Beenden einen Fehlercode und versucht nicht, die Anwendung neu zu starten. Weiß jemand, warum der Client die Verbindung trennt?
Ich bin mir bewusst, dass ich umgehen kann, indem Sie SuccessExitStatus=116
in der Unit-Datei einstellen, aber ich möchte echte Fehler nicht ausblenden. Ich habe versucht, einen Signalhandler für SIGTERM zu registrieren und den Zookeeper-Client im Handler zu schließen. Aber der Handler-Code scheint nie getroffen zu werden, wenn ich systemctl stop ausstelle.
EDIT: Der Handler wurde nicht aufgerufen, weil ich es asynchron gemacht hatte - es wurde nicht sofort nach Empfang des Signals ausgeführt. OTOH der Prozess wird sofort beendet, nachdem der Zookeeper die Verbindung getrennt hat.
Dies ist, warum "nicht mehr reproduziert", OP im Chat angegeben "Ich habe herausgefunden, was in meiner Situation passiert, und es ist nicht mit der Beschreibung, die ich gab. Grundsätzlich jemand in meiner Organisation lief ein Skript, das tötete eine Verbindung, mir unbekannt ", daher auch letzte Abstimmung von OP –