Ankündigung

Einklappen
Keine Ankündigung bisher.

Database plugin + Eth reboot

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • aschwith
    antwortet
    Ich habe einen Pullrequest für das Database plugin gestellt. Damit ist das Plugin robust gegen ein Wegbrechen des Ethernets. Gewisse Aktionen werden jetzt unterdrückt, solange die DB nicht verbunden ist. Außerdem beschränke ich die Anzahl der reconnect Versuche auf ein vernünftiges Maß. Damit startet jetzt auch der Ethernetadapter des Rasperrys nach einer Nichtverfügbarkeit wieder sauber hoch.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Schau mal zB ins Viessmann- oder ggf. ins Kodi-Plugin - in jedem "Aktionsbefehl" ist eine Abfrage auf self._connected (oder so), und wenn das nicht gesetzt ist, wird gar nicht erst Aktion ausgelöst. Damit bekommst du - unabhängig vom Reconnect - auch eine hohe Anzahl an Schreibzugriffen problemlos abgefangen.

    Zur DB-Problematik kann ich nichts sagen, habe ich mich nicht ausreichend mit beschäftigt.

    Wieso das Netz nicht wieder hochkommt, wundert mich allerdings, das Problem hatte ich früher nie (heute auch nicht, aber aus den o.a. Gründen brauche ich dann eh nen Reboot )

    Hast du da ggf. noch Infos vom Raspi-Log zu? dmesg?

    Einen Kommentar schreiben:


  • aschwith
    antwortet
    Hallo Morg ,

    danke für die Rückmeldung. Ok, verstehe, in Deinem Setup kannst Du das nicht nachstellen.

    Das Plugin schaut bei jeder Operation, ob die DB connected ist und triggert andernfalls ein reconnect. Ich beschränke das reconnect jetzt im Plugin auf maximal einen Versuch pro 20s. Außerdem blockiere ich die Maintenance Funktionen (Clear maxage), solange die DB nicht connected ist. Leider führt das immer noch nicht dazu, dass das Ethernet naach einem Ausfall ohne Restart wiederhochfährt.

    Bei den Untersuchungen habe ich ein neues Problem entdeckt. Falls das Ethernet während einer Schreiboperation wegbricht, kann es sein, dass der betreffende Table in der DB noch gelockt ist. Auch nach einem Neustart von smarthomeNG schlagen die DB operationen auf dieses Item fehl. Beheben kann ich das momentan nur über einen Neustart des DB Servers. Kann jemand hier ein Problem im Plugin erkennen oder gibt es einen DB Befehl, um z.B. beim in der Plugin Init-Funktion die DB wieder komplett zu entsperren?

    Hier ein Auszug aus der Logdatei, nachdem smarthomeNG neu gestartet wurde und die DB noch gelockt ist.

    Code:
    2021-09-01 18:16:12 WARNING lib.smarthome.main -------------------- SmartHomeNG initialization finished --------------------
    2021-09-01 18:17:14 ERROR lib.db Can not execute query: INSERT INTO log(item_id, time, val_str, val_num, val_bool, duration, changed) VALUES (%(id)s,%(time)s,%(val_str)s,%(val_num)s,%(val_boo l)s,%(duration)s,%(changed)s); (args OrderedDict([('id', 35), ('time', 1630512978184), ('val_str', None), ('val_num', 285.0), ('val_bool', 1), ('duration', None), ('changed', 1630512983125)])): (1205, 'Lock wait timeout exceeded; try restarting transaction')
    2021-09-01 18:17:14 ERROR plugins.database Database: Error for query INSERT INTO log(item_id, time, val_str, val_num, val_bool, duration, changed) VALUES (35,1630512978184,None,285.0,1,None,1630512983125) ;: (1205, 'Lock wait timeout exceeded; try restarting transaction')
    2021-09-01 18:17:14 WARNING plugins.database Problem dumping darksky.currently.windBearing: (1205, 'Lock wait timeout exceeded; try restarting transaction')
    2021-09-01 18:30:56 ERROR lib.db Can not execute query: DELETE FROM log WHERE (item_id = %(id)s ) AND (time = %(time)s OR 1 = %(time_flag)s ) AND (time > %(time_start)s OR 1 = %(time_start_flag)s ) AND (time < %(time_end)s OR 1 = %(time_end_flag)s ) AND (changed = %(changed)s OR 1 = %(changed_flag)s ) AND (changed > %(changed_start)s OR 1 = %(changed_start_flag)s) AND (changed < %(changed_end)s OR 1 = %(changed_end_flag)s ); (args OrderedDict([('id', 36), ('time', None), ('time_flag', 1), ('time_start', None), ('time_start_flag', 1), ('time_end', 1627835405118), ('time_end_flag', 0), ('changed', None), ('changed_flag', 1), ('changed_start', None), ('changed_start_flag', 1), ('changed_end', None), ('changed_end_flag', 1)])): (1205, 'Lock wait timeout exceeded; try restarting transaction')
    2021-09-01 18:30:56 ERROR plugins.database Database: Error for query DELETE FROM log WHERE (item_id = 36 ) AND (time = None OR 1 = 1 ) AND (time > None OR 1 = 1 ) AND (time < 1627835405118 OR 1 = 0 ) AND (changed = None OR 1 = 1 ) AND (changed > None OR 1 = 1) AND (changed < None OR 1 = 1 ); : (1205, 'Lock wait timeout exceeded; try restarting transaction')
    2021-09-01 18:30:56 ERROR plugins.database.Remove old Method plugins.database.Remove old exception: (1205, 'Lock wait timeout exceeded; try restarting transaction')
    Traceback (most recent call last):
    File "/usr/local/smarthome/lib/scheduler.py", line 664, in _task
    obj()
    File "/usr/local/smarthome/plugins/database/__init__.py", line 1169, in remove_older_than_maxage
    self.deleteLog(item_id, time_end=timestamp_end, with_commit=False)
    File "/usr/local/smarthome/plugins/database/__init__.py", line 628, in deleteLog
    self._execute(self._prepare("DELETE FROM {log} WHERE " + condition), params, cur=cur)
    File "/usr/local/smarthome/plugins/database/__init__.py", line 1249, in _execute
    self._query(self._db.execute, query, params, cur)
    File "/usr/local/smarthome/plugins/database/__init__.py", line 1283, in _query
    raise e
    File "/usr/local/smarthome/plugins/database/__init__.py", line 1280, in _query
    tuples = func(self._prepare(query), params, cur=cur)
    File "/usr/local/smarthome/lib/db.py", line 326, in execute
    result = c.execute(stmt, args)
    File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/cursors.py", line 148, in execute
    result = self._query(query)
    File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/cursors.py", line 310, in _query
    conn.query(q)
    File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/connections.py", line 548, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
    File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/connections.py", line 775, in _read_query_result
    result.read()
    File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/connections.py", line 1156, in read
    first_packet = self.connection._read_packet()
    File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/connections.py", line 725, in _read_packet
    packet.raise_for_error()
    File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/protocol.py", line 221, in raise_for_error
    err.raise_mysql_exception(self._data)
    File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/err.py", line 143, in raise_mysql_exception
    raise errorclass(errno, errval)
    pymysql.err.OperationalError: (1205, 'Lock wait timeout exceeded; try restarting transaction')

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Ich kann das leider nicht nachvollziehen - ich nutzer zwar auch eine DB über Ethernet, aber da auch mein root-Dateisystem übers Netz eingebunden ist, hat der Ausfall vom Netz ganz andere Konsequenzen

    Es klingt aber nach einer plausiblen Anpassung, dass das Plugin eine Klassenvariable _connected o.ä. bekommt und DB-Operationen blockt, solange die nicht auf True steht. Ist bei den meisten anderen Plugins mit Netzwerkcode, die ich gesehen habe, auch so implementiert.

    Schreiboperation bei _connected == False könnte dann - mit 30 oder 60 Sekunden Timeout - einen Reconnect versuchen.

    Einen Kommentar schreiben:


  • aschwith
    hat ein Thema erstellt Database plugin + Eth reboot

    Database plugin + Eth reboot

    Hallo zusammen,

    ich habe bei mir folgendes reproduzierbares Problem auf einem Raspian (Image 1.8.2) in Verbindung mit dem Database plugin: Sobald das Ethernet wegbricht, durch ein Restart des Routers oder einfach durch kurzes Abziehen des Kabels, startet anschließend das Ethernet des Raspberry Pis nicht wieder selbständig hoch. Wenn smarthomeNG ohne database plugin läuft, funktioniert das einwandfrei.
    Der Effekt ist sehr lästig und bedeutet, dass der Raspy manuell neu gestartet werden muss.

    Das database plugin ist so konfiguriert, dass es eine externe DB auf einer Synology nutzt, sprich die DB auch über Ethernet angebunden ist. Ich habe die Vermutung, dass hier das Problem liegt. Sobald das Ethernet nicht verfübar ist, laufen alle Anfragen an die DB (Lesen und Schreiben) in ein Timeout. Diese permanenten Anfragen mit Timeout scheinen irgendwie die Auslastung so hoch zu drehen, dass das Ethernet nicht wieder von alleine hochfährt.

    Meine Fragen an Euch:

    1) Hat jemand ein ähnliches Setup (Raspberry + Database plugin via per Ethernet angebundener DB) und kann das Problem bestätigen?
    2) Seht Ihr die Möglichkeit, die DB Anfragen im plugin zu blockieren, solange in dieser Konfiguration mit exterener DB das Etherent nicht verfügbar ist? Ziel dieser Maßnahme wäre, das System nicht komplett auszulasten.

    Noch ein paar Infos:
    plugin.yaml
    Code:
    database:
    plugin_name: Database
    driver: pymysql
    connect:
    - host:192.Z.X.Y
    - user:XXX
    - passwd:YYY
    - db:smarthome_db
    count_logentries: true
    precision: -1
    logfile während nicht verfügbarem Ethernet:
    Code:
    2021-08-24 10:41:57 WARNING plugins.database Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2021-08-24 10:42:45 WARNING plugins.database Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2021-08-24 10:45:07 WARNING plugins.database Skipping dump, since an other database operation running! Data is buffered and dumped
    2021-08-24 10:46:21 WARNING plugins.database Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2021-08-24 10:46:52 WARNING plugins.database Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2021-08-24 10:48:01 WARNING plugins.database Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2021-08-24 10:48:56 WARNING plugins.database Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2021-08-24 10:49:09 WARNING plugins.database Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2021-08-24 10:49:59 WARNING plugins.database Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2021-08-24 10:50:12 WARNING lib.db Database [Database]: Connection error (2013, 'Lost connection to MySQL server during query ([Errno 101] Das Netzwerk ist nicht erreichbar)')
    2021-08-24 10:50:12 ERROR lib.db Can not execute query: SELECT 1 (args OrderedDict()): (0, '')
    2021-08-24 10:50:12 WARNING lib.db Database [Database]: Connection error (0, '')
    2021-08-24 10:50:12 ERROR lib.db Can not execute query: SELECT 1 (args OrderedDict()): (0, '')
    2021-08-24 10:50:12 WARNING lib.db Database [Database]: Connection error (0, '')
    2021-08-24 10:50:12 ERROR lib.db Can not execute query: SELECT 1 (args OrderedDict()): (0, '')
    2021-08-24 10:50:12 WARNING lib.db Database [Database]: Connection error (0, '')
    2021-08-24 10:50:12 ERROR lib.db Can not execute query: SELECT 1 (args OrderedDict()): (0, '')
    2021-08-24 10:50:12 WARNING lib.db Database [Database]: Connection error (0, '')
    2021-08-24 10:50:12 ERROR lib.db Can not execute query: SELECT 1 (args OrderedDict()): (0, '')
    2021-08-24 10:50:12 WARNING lib.db Database [Database]: Connection error (0, '')
    2021-08-24 10:50:12 ERROR lib.db Can not execute query: SELECT 1 (args OrderedDict()): (0, '')
    2021-08-24 10:50:12 WARNING lib.db Database [Database]: Connection error (0, '')
    2021-08-24 10:50:12 ERROR lib.db Can not execute query: SELECT 1 (args OrderedDict()): (0, '')
    2021-08-24 10:50:12 WARNING lib.db Database [Database]: Connection error (0, '')
    2021-08-24 10:50:12 ERROR lib.db Can not execute query: SELECT 1 (args OrderedDict()): (0, '')
    2021-08-24 10:50:12 WARNING lib.db Database [Database]: Connection error (0, '')
    2021-08-24 10:50:12 ERROR lib.db Can not execute query: SELECT 1 (args OrderedDict()): (0, '')
    2021-08-24 10:50:12 WARNING lib.db Database [Database]: Connection error (0, '')
    2021-08-24 10:50:12 WARNING lib.db fetchone: No cursor defined for stmt SELECT 1 with params ()
    2021-08-24 10:50:12 WARNING lib.db fetchone: No cursor defined for stmt SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = :id; with params {'id': 'Enocean.actor2.power'}
    2021-08-24 10:50:14 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:14 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:14 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:14 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:14 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:14 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:15 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:15 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:16 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:16 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:16 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:16 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:17 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:17 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:17 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:17 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:17 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:17 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:17 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:17 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 WARNING lib.db Database [Database]: Connection error (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")
    2021-08-24 10:50:18 ERROR lib.db Database [Database]: Could not connect to the database using 'pymysql': (2003, "Can't connect to MySQL server on '192.168.2.103' ([Errno 101] Das Netzwerk ist nicht erreichbar)")

    Danke und Gruß
    Alex
    Zuletzt geändert von aschwith; 26.08.2021, 19:37.
Lädt...
X