mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
* [recorder] Catch more startup errors #6179 * Rebase on new recorder
This commit is contained in:
parent
4da2156ebf
commit
fbd0bf77c7
@ -153,8 +153,8 @@ class Recorder(threading.Thread):
|
|||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""Start processing events to save."""
|
"""Start processing events to save."""
|
||||||
from sqlalchemy.exc import SQLAlchemyError
|
|
||||||
from .models import States, Events
|
from .models import States, Events
|
||||||
|
from homeassistant.components import persistent_notification
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
@ -163,10 +163,15 @@ class Recorder(threading.Thread):
|
|||||||
self._setup_run()
|
self._setup_run()
|
||||||
self.hass.loop.call_soon_threadsafe(self.async_db_ready.set)
|
self.hass.loop.call_soon_threadsafe(self.async_db_ready.set)
|
||||||
break
|
break
|
||||||
except SQLAlchemyError as err:
|
except Exception as err: # pylint: disable=broad-except
|
||||||
_LOGGER.error("Error during connection setup: %s (retrying "
|
_LOGGER.error("Error during connection setup: %s (retrying "
|
||||||
"in %s seconds)", err, CONNECT_RETRY_WAIT)
|
"in %s seconds)", err, CONNECT_RETRY_WAIT)
|
||||||
time.sleep(CONNECT_RETRY_WAIT)
|
time.sleep(CONNECT_RETRY_WAIT)
|
||||||
|
retry = locals().setdefault('retry', 10) - 1
|
||||||
|
if retry == 0:
|
||||||
|
msg = "The recorder could not start, please check the log"
|
||||||
|
persistent_notification.create(self.hass, msg, 'Recorder')
|
||||||
|
return
|
||||||
|
|
||||||
purge_task = object()
|
purge_task = object()
|
||||||
shutdown_task = object()
|
shutdown_task = object()
|
||||||
|
@ -1,14 +1,17 @@
|
|||||||
"""The tests for the Recorder component."""
|
"""The tests for the Recorder component."""
|
||||||
# pylint: disable=protected-access
|
# pylint: disable=protected-access
|
||||||
import unittest
|
import unittest
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
from homeassistant.const import MATCH_ALL
|
from homeassistant.const import MATCH_ALL
|
||||||
|
from homeassistant.components.recorder import Recorder
|
||||||
from homeassistant.components.recorder.const import DATA_INSTANCE
|
from homeassistant.components.recorder.const import DATA_INSTANCE
|
||||||
from homeassistant.components.recorder.util import session_scope
|
from homeassistant.components.recorder.util import session_scope
|
||||||
from homeassistant.components.recorder.models import States, Events
|
from homeassistant.components.recorder.models import States, Events
|
||||||
|
|
||||||
from tests.common import get_test_home_assistant, init_recorder_component
|
from tests.common import get_test_home_assistant, init_recorder_component
|
||||||
|
|
||||||
|
|
||||||
@ -163,3 +166,18 @@ def test_saving_state_include_domain_exclude_entity(hass_recorder):
|
|||||||
assert len(states) == 1
|
assert len(states) == 1
|
||||||
assert hass.states.get('test.ok') == states[0]
|
assert hass.states.get('test.ok') == states[0]
|
||||||
assert hass.states.get('test.ok').state == 'state2'
|
assert hass.states.get('test.ok').state == 'state2'
|
||||||
|
|
||||||
|
|
||||||
|
def test_recorder_setup_failure():
|
||||||
|
"""Test some exceptions."""
|
||||||
|
hass = get_test_home_assistant()
|
||||||
|
|
||||||
|
with patch.object(Recorder, '_setup_connection') as setup, \
|
||||||
|
patch('homeassistant.components.recorder.time.sleep'):
|
||||||
|
setup.side_effect = ImportError("driver not found")
|
||||||
|
rec = Recorder(
|
||||||
|
hass, purge_days=0, uri='sqlite://', include={}, exclude={})
|
||||||
|
rec.start()
|
||||||
|
rec.join()
|
||||||
|
|
||||||
|
hass.stop()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user