Fix recorder run history during schema migration and startup (#87492)

Fix recorder run history during schema migration

RunHistory.get and RunHistory.current can be called before
RunHistory.start. We need to return a RecorderRuns object
with the recording_start time that will be used when start
it called to ensure history queries still work as expected.

fixes #87112
pull/87507/head^2
J. Nick Koston 2023-02-05 21:12:41 -06:00 committed by GitHub
parent f475446ebf
commit c7980bda82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 2 deletions

View File

@ -64,8 +64,13 @@ class RunHistory:
@property
def current(self) -> RecorderRuns:
"""Get the current run."""
assert self._current_run_info is not None
return self._current_run_info
# If start has not been called yet because the recorder is
# still starting up we want history to use the current time
# as the created time to ensure we can still return results
# and we do not try to pull data from the previous run.
return self._current_run_info or RecorderRuns(
start=self.recording_start, created=dt_util.utcnow()
)
def get(self, start: datetime) -> RecorderRuns | None:
"""Return the recorder run that started before or at start.

View File

@ -45,3 +45,14 @@ async def test_run_history(recorder_mock, hass):
process_timestamp(instance.run_history.get(now).start)
== instance.run_history.recording_start
)
async def test_run_history_during_schema_migration(recorder_mock, hass):
"""Test the run history during schema migration."""
instance = recorder.get_instance(hass)
run_history = instance.run_history
assert run_history.current.start == run_history.recording_start
with instance.get_session() as session:
run_history.start(session)
assert run_history.current.start == run_history.recording_start
assert run_history.current.created >= run_history.recording_start