@@ -342,7 +342,6 @@ def async_purge(now):
342342 # has changed. This reduces the disk io.
343343 while True:
344344 event = self.queue.get()
345-
346345 if event is None:
347346 self._close_run()
348347 self._close_connection()
@@ -356,7 +355,7 @@ def async_purge(now):
356355 self.queue.task_done()
357356 if self.commit_interval:
358357 self._timechanges_seen += 1
359- if self.commit_interval >= self._timechanges_seen :
358+ if self._timechanges_seen >= self.commit_interval :
360359 self._timechanges_seen = 0
361360 self._commit_event_session_or_retry()
362361 continue
@@ -376,6 +375,9 @@ def async_purge(now):
376375 self.event_session.flush()
377376 except (TypeError, ValueError):
378377 _LOGGER.warning("Event is not JSON serializable: %s", event)
378+ except Exception as err: # pylint: disable=broad-except
379+ # Must catch the exception to prevent the loop from collapsing
380+ _LOGGER.exception("Error adding event: %s", err)
379381
380382 if dbevent and event.event_type == EVENT_STATE_CHANGED:
381383 try:
@@ -387,6 +389,9 @@ def async_purge(now):
387389 "State is not JSON serializable: %s",
388390 event.data.get("new_state"),
389391 )
392+ except Exception as err: # pylint: disable=broad-except
393+ # Must catch the exception to prevent the loop from collapsing
394+ _LOGGER.exception("Error adding state change: %s", err)
390395
391396 # If they do not have a commit interval
392397 # than we commit right away
@@ -404,17 +409,26 @@ def _commit_event_session_or_retry(self):
404409 try:
405410 self._commit_event_session()
406411 return
407-
408- except exc.OperationalError as err:
409- _LOGGER.error(
410- "Error in database connectivity: %s. " "(retrying in %s seconds)",
411- err,
412- self.db_retry_wait,
413- )
412+ except (exc.InternalError, exc.OperationalError) as err:
413+ if err.connection_invalidated:
414+ _LOGGER.error(
415+ "Database connection invalidated: %s. "
416+ "(retrying in %s seconds)",
417+ err,
418+ self.db_retry_wait,
419+ )
420+ else:
421+ _LOGGER.error(
422+ "Error in database connectivity: %s. "
423+ "(retrying in %s seconds)",
424+ err,
425+ self.db_retry_wait,
426+ )
414427 tries += 1
415428
416- except exc.SQLAlchemyError:
417- _LOGGER.exception("Error saving events")
429+ except Exception as err: # pylint: disable=broad-except
430+ # Must catch the exception to prevent the loop from collapsing
431+ _LOGGER.exception("Error saving events: %s", err)
418432 return
419433
420434 _LOGGER.error(
@@ -423,10 +437,15 @@ def _commit_event_session_or_retry(self):
423437 )
424438 try:
425439 self.event_session.close()
426- except exc.SQLAlchemyError:
427- _LOGGER.exception("Failed to close event session.")
440+ except Exception as err: # pylint: disable=broad-except
441+ # Must catch the exception to prevent the loop from collapsing
442+ _LOGGER.exception("Error while closing event session: %s", err)
428443
429- self.event_session = self.get_session()
444+ try:
445+ self.event_session = self.get_session()
446+ except Exception as err: # pylint: disable=broad-except
447+ # Must catch the exception to prevent the loop from collapsing
448+ _LOGGER.exception("Error while creating new event session: %s", err)
430449
431450 def _commit_event_session(self):
432451 try:
0 commit comments