Seite 1 von 1

Persistence Service automatisch neu starten

Verfasst: 21. Sep 2024 08:52
von nw378
Moinsen,

als Persistenz habe habe ich Influxdb in einem Docker Container.
Wenn dieser mal nicht erreichbar ist (Update oder ähnliches), ballert mir OH Fehlermeldungen ins Log.
Und zwar solange, bis ich in OH den Persistence Service neu starte, indem ich die Einstellungen (unverändert) speichere.

Die erste Fehlermeldung lautet:

Code: Alles auswählen

2024-09-20 16:30:55.814 [WARN ] [rnal.influx2.InfluxDB2RepositoryImpl] - database not ready
Und anschließend bei jedem Zugriffsversuch:

Code: Alles auswählen

2024-09-20 16:30:55.805 [WARN ] [influxdb.internal.AbstractRestClient] - Ping request wasn't successful
java.net.ConnectException: Failed to connect to /192.168.178.26:8087
	at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:297) ~[?:?]
	at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:207) ~[?:?]
	at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226) ~[?:?]
	at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106) ~[?:?]
	at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74) ~[?:?]
	at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255) ~[?:?]
	at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32) ~[?:?]
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) ~[?:?]
	at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95) ~[?:?]
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) ~[?:?]
	at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83) ~[?:?]
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) ~[?:?]
	at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76) ~[?:?]
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) ~[?:?]
	at com.influxdb.client.internal.GzipInterceptor.intercept(GzipInterceptor.java:91) ~[?:?]
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) ~[?:?]
	at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.kt:154) ~[?:?]
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) ~[?:?]
	at com.influxdb.client.internal.AuthenticateInterceptor.intercept(AuthenticateInterceptor.java:103) ~[?:?]
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) ~[?:?]
	at com.influxdb.internal.UserAgentInterceptor.intercept(UserAgentInterceptor.java:60) ~[?:?]
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) ~[?:?]
	at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201) ~[?:?]
	at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154) ~[?:?]
	at retrofit2.OkHttpCall.execute(OkHttpCall.java:207) ~[?:?]
	at com.influxdb.internal.AbstractRestClient.ping(AbstractRestClient.java:194) ~[?:?]
	at com.influxdb.client.internal.InfluxDBClientImpl.ping(InfluxDBClientImpl.java:277) ~[?:?]
	at org.openhab.persistence.influxdb.internal.influx2.InfluxDB2RepositoryImpl.checkConnectionStatus(InfluxDB2RepositoryImpl.java:127) ~[?:?]
	at org.openhab.persistence.influxdb.internal.influx2.InfluxDB2RepositoryImpl.connect(InfluxDB2RepositoryImpl.java:104) ~[?:?]
	at org.openhab.persistence.influxdb.InfluxDBPersistenceService.checkConnection(InfluxDBPersistenceService.java:277) ~[?:?]
	at org.openhab.persistence.influxdb.InfluxDBPersistenceService.commit(InfluxDBPersistenceService.java:283) ~[?:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [?:?]
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) [?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) [?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]
	at java.lang.Thread.run(Thread.java:840) [?:?]
Caused by: java.net.ConnectException: Verbindungsaufbau abgelehnt
	at sun.nio.ch.Net.pollConnect(Native Method) ~[?:?]
	at sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[?:?]
	at sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:554) ~[?:?]
	at sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:602) ~[?:?]
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[?:?]
	at java.net.Socket.connect(Socket.java:633) ~[?:?]
	at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:128) ~[?:?]
	at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:295) ~[?:?]
	... 36 more
Nach dem "Neustart" folgt dann:

Code: Alles auswählen

2024-09-20 16:36:10.860 [INFO ] [.influxdb.InfluxDBPersistenceService] - InfluxDB persistence service stopped.
2024-09-20 16:36:10.887 [INFO ] [.influxdb.InfluxDBPersistenceService] - InfluxDB persistence service started.
Die Fehlermeldungen im Log sind nicht das Problem, das wird ja rollierend überschrieben.
Aber die Datenbank wird nicht mehr gefüttert.

Meine Frage: kann man das Erkennen der Nichterreichbarkeit und den Neustart über eine Regel automatisieren?

Re: Persistence Service automatisch neu starten

Verfasst: 21. Sep 2024 12:48
von udo1toni
Eigentlich sollte die Persistence selbständig neu starten...

Den Neustart kannst Du übrigens auch über die Karaf Konsole auslösen:
bundle:restart org.openhab.persistence.influxdb
Ob das auch über die API geht (also z.B. mit einem http-get-request) weiß ich nicht, der Karaf Aufruf lässt sich aber z.B über executeCommandLine aus einer Rule heraus automatisieren.

Das größere Problem dabei ist aber, auszuwerten, ob die Persistence gerade ein Problem hat, mir wäre jedenfalls kein Event bekannt, welches ich dazu heranziehen könnte.

Mein Tipp an der Stelle wäre daher, eine Anfrage im englischen Forum zu stellen, denn (siehe Eingangssatz) openHAB merkt ja, dass da was nicht ganz so läuft, wie es soll, warum also klappt der automatische Reconnect nicht?

Re: Persistence Service automatisch neu starten

Verfasst: 21. Sep 2024 13:40
von nw378
Hallo Udo,

danke für Deine Einschätzung.
Dann probiere ich mein Glück mal im englischen Forum.

Gruß
Nico

Re: Persistence Service automatisch neu starten

Verfasst: 22. Sep 2024 09:12
von nw378
Für den Trigger habe ich aus dem englischen Forum den heißen Tipp des https://www.openhab.org/addons/bindings/logreader/ bekommen.

Dann habe ich noch eine Bool-Variabel und einen Timer ergänzt, sonst kommen viiiiiiele Meldungen...
Den Karaf Aufruf habe ich in ein SH File ausgelagert.
Die Regel sieht jetzt so aus:

Code: Alles auswählen

var boolean bInflux = false

rule "LogReader: Influx neustarten"
when
    Channel "logreader:reader:openhablog:newWarningEvent" triggered
then
    if (bInflux)      
      return;
    var warning = logreaderLastWarning.state.toString.split("-").get(3)
    if (warning == " database not ready") {
      bInflux = true
      createTimer(now.plusMinutess(2),[        
        logInfo("Test","Influx" + warning)
        sendNotification("mail@gmx.de","Influx" + warning)  
        restart_influx.sendCommand(ON) 
        bInflux = false]) }
end
und das SH-File:

Code: Alles auswählen

#!/bin/sh
echo bundle:restart org.openhab.persistence.influxdb | /usr/bin/openhab-cli console -p habopen
Mal gucken, ob's klappt...

Re: Persistence Service automatisch neu starten

Verfasst: 22. Sep 2024 12:57
von nw378
Ergebnis: klappt!

Interessant: Dein
udo1toni hat geschrieben: 21. Sep 2024 12:48 Eigentlich sollte die Persistence selbständig neu starten...
stimmt auch, eigentlich.

Wenn ich zu Testzwecken den Docker Container stoppe und wieder neu starte, startet auch OH die Persistence wieder.

Aber eben nicht, wenn ich ein Update des Docker Images einspiele.
Hintergrund: ich wollte den Watchtower installieren, um Updates zu automatisieren.
Aber wenn dann eben OH ins Nirvana speichert und ich davon nix mitkriege... Egal, ist ja jetzt Vergangenheit.

Edit: oder war ich dann nicht geduldig genug?
Rückmeldung aus dem englischen Forum ist ebenfalls, dass OH das selbständig macht. ich werde beobachten und berichten.